pax_global_header00006660000000000000000000000064145221227320014512gustar00rootroot0000000000000052 comment=30b3dcba8021a17a59dbb39bbbde5fb9783e4974 django-allauth-0.58.2/000077500000000000000000000000001452212273200145005ustar00rootroot00000000000000django-allauth-0.58.2/.dir-locals.el000066400000000000000000000001501452212273200171250ustar00rootroot00000000000000;;; This file contains project-specific emacs configuration ((nil . ((python-sort-imports-on-save t)))) django-allauth-0.58.2/.djlintrc000066400000000000000000000000531452212273200163100ustar00rootroot00000000000000{ "custom_blocks": "element,slot,setvar" } django-allauth-0.58.2/.editorconfig000066400000000000000000000005551452212273200171620ustar00rootroot00000000000000# http://editorconfig.org root = true [*] charset = utf-8 indent_style = space indent_size = 2 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true [*.ini] indent_size = 4 [*.py] indent_size = 4 [*.html] indent_size = 4 [Makefile] indent_style = tab indent_size = 8 [*.md] insert_final_newline = false trim_trailing_whitespace = false django-allauth-0.58.2/.envrc000066400000000000000000000000101452212273200156050ustar00rootroot00000000000000use nix django-allauth-0.58.2/.github/000077500000000000000000000000001452212273200160405ustar00rootroot00000000000000django-allauth-0.58.2/.github/FUNDING.yml000066400000000000000000000012021452212273200176500ustar00rootroot00000000000000# These are supported funding model platforms github: pennersr patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] django-allauth-0.58.2/.github/pull_request_template.md000066400000000000000000000017331452212273200230050ustar00rootroot00000000000000# Submitting Pull Requests ## General - [ ] Make sure you use [semantic commit messages](https://seesparkbox.com/foundry/semantic_commit_messages). Examples: `"fix(google): Fixed foobar bug"`, `"feat(accounts): Added foobar feature"`. - [ ] All Python code must formatted using Black, and clean from pep8 and isort issues. - [ ] JavaScript code should adhere to [StandardJS](https://standardjs.com). - [ ] If your changes are significant, please update `ChangeLog.rst`. - [ ] If your change is substantial, feel free to add yourself to `AUTHORS`. ## Provider Specifics In case you add a new provider: - [ ] Make sure unit tests are available. - [ ] Add an entry of your provider in `test_settings.py::INSTALLED_APPS` and `docs/installation.rst::INSTALLED_APPS`. - [ ] Add documentation to `docs/providers/.rst` and `docs/providers/index.rst` Provider Specifics toctree. - [ ] Add an entry to the list of supported providers over at `docs/overview.rst`. django-allauth-0.58.2/.github/workflows/000077500000000000000000000000001452212273200200755ustar00rootroot00000000000000django-allauth-0.58.2/.github/workflows/ci.yml000066400000000000000000000051141452212273200212140ustar00rootroot00000000000000name: CI on: push: branches: [ main, '0.55.x' ] pull_request: branches: [ main, '0.55.x' ] jobs: testenv: runs-on: ubuntu-22.04 strategy: fail-fast: false matrix: python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12'] django-version: ['main', '3.2', '4.0', '4.1', '4.2', '5.0'] exclude: - python-version: '3.11' django-version: '3.2' - python-version: '3.12' django-version: '3.2' - python-version: '3.7' django-version: '4.0' - python-version: '3.7' django-version: '4.1' - python-version: '3.7' django-version: '4.2' - python-version: '3.7' django-version: '5.0' - python-version: '3.8' django-version: '5.0' - python-version: '3.9' django-version: '5.0' - python-version: '3.7' django-version: 'main' - python-version: '3.8' django-version: 'main' - python-version: '3.9' django-version: 'main' steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install xmlsec run: sudo apt-get install -y xmlsec1 libxmlsec1-dev - name: Install dependencies run: | python -m pip install --upgrade pip pip install tox tox-gh-actions coveralls - name: Tox Test run: tox env: PYTHON_VER: ${{ matrix.python-version }} DJANGO: ${{ matrix.django-version }} - name: Coverage (Coveralls) if: ${{ success() }} run: coveralls --service=github env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} extra: runs-on: ubuntu-22.04 strategy: matrix: extra-env: ['docs', 'black', 'isort', 'flake8', 'standardjs', 'djlint', 'compilemessages'] steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v3 if: ${{ matrix.extra-env == 'standardjs' }} with: node-version: '8' - name: Set up Python 3.11 uses: actions/setup-python@v4 with: python-version: '3.11' - name: Install xmlsec run: sudo apt-get install -y xmlsec1 libxmlsec1-dev - name: Install gettext run: sudo apt-get install -y gettext - name: Install dependencies run: | python -m pip install --upgrade pip pip install tox - name: Tox Test run: tox env: TOXENV: ${{ matrix.extra-env }} django-allauth-0.58.2/.gitignore000066400000000000000000000004571452212273200164760ustar00rootroot00000000000000*.pyc *~ .idea .project .pydevproject *.geany docs/_build build dist *.egg* example/local_settings.py node_modules/ # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* coverage.xml .ropeproject/* pep8.txt *.bak .#* \#* *.db *.tmp virtualenv .DS_Store *.prefs *.mo /.stfolder .direnv/ django-allauth-0.58.2/.readthedocs.yaml000066400000000000000000000011341452212273200177260ustar00rootroot00000000000000# Read the Docs configuration file for Sphinx projects # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the OS, Python version and other tools you might need build: os: ubuntu-22.04 tools: python: "3.11" # Build documentation in the "docs/" directory with Sphinx sphinx: configuration: docs/conf.py # Optional but recommended, declare the Python requirements required # to build your documentation # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html python: install: - requirements: docs/requirements.txt django-allauth-0.58.2/AUTHORS000066400000000000000000000055021452212273200155520ustar00rootroot00000000000000django-allauth was started by Raymond Penners ( or @pennersr) in October 2010, inspired by and partly based on existing projects such as Pinax (account app), Django-Socialauth, django-socialregistration. Contributors ============ Aaron van Derlip Abhinav Johri Abhishek Kumar Jaiswal Adam Johnson Adam McKerlie Agustin Perez Paladini Ahmet Emre Aladağ Aiden Lu Aldiantoro Nugroho Alexander Gaevsky Andrean Franc Andrew Chen Wang Andrey Akolpakov Andrey Balandin Andy Matthews Ani Vera Anna Sirota Antonin Delpeuch Aron Griffis Bas ten Berge Basil Shubin Ben Timby Benjamin Jorand Benjamin Howes Bhavani Ravi Biel Massot Björn Andersson Bojan Mihelac Bruno Alla Chris Beaven Chris Davis Christian Carter Christopher Grebs Dani Hodovic Daniel Eriksson Daniel Widerin David Ascher David Cain David Evans David Friedman David Hummel Dimitris Tsimpitas Dmytro Litvinov Egor Poderyagin Eran Rundstein Eric Amador Eric Delord Fabio Caritas Barrionuevo da Luz Facundo Gaich Filip Dobrovolný Francis Brito Frantisek Malina Fred Palmer Fábio Santos Felipe Faria George Whewell Griffith Rees Guignard Javier Guilhem Saurel Guillaume Schurck Guillaume Vincent Guoyu Hao Haesung Park Hatem Nassrat Hyunwoo Shim Ian R-P Ignacio Ocampo Illia Volochii J. Erm J. Fernando Sánchez Jack Shedd Jakob Gerhard Martinussen James Rivett-Carnac James Thompson Jannis Leidel Jannis Vajen Jason Wallace Jeff Bowen Jeff Triplett Jeremy Satterfield Jerome Leclanche Jesse Gerard Brands Jihoon Park Jiyoon Ha Joe Vanderstelt Joel Fernandes John Bazik John Whitlock Jonas Aule JoonHwan Kim Josh Owen Josh Wright Joshua Butler Joshua Sorenson Julen Ruiz Aizpuru Justin Michalicek Justin Pogrob Karthikeyan Singaravelan Karun Shrestha Kevin Dice Koichi Harakawa Kun Liu Kyle Harrison Kimsia Sim Lee Semel Lev Predan Kowarski Luis Diego García Luiz Guilherme Pais dos Santos Luke Burden Luke Crouch Maksim Rukomoynikov Marcin Skarbek Marcin Spoczynski Marco Fucci Marjori Pomarole Markus Kaiserswerth Markus Thielen Martin Bächtold Matt Nishi-Broach Mauro Stettler Mikhail Mitiaev Morgante Pell Nariman Gharib Nathan Strobbe Nicolas Acosta Niklas A Emanuelsson Oleg Sergeev Patrick Paul Paul Juergen Fischer Paulo Eduardo Neves Pavel Oborin Pavel Savchenko Peter Bittner Peter Rowlands Peter Stein Philip John James Rabi Alam Radek Czajka Rense VanderHoek Rick Westera Robert Balfre Roberto Novaes Rod Xavier Bondoc Roman Tomjak Roumen Antonov Ryan Jarvis Ryan Verner Safwan Rahman Sam Solomon Sanghyeok Lee Seizan Shimazaki Serafeim Papastefanos Sergey Silaev Shane Rice Stephen Kent Stuart Ross Terry Jones Tiago Loureiro Tim Gates Tom Hacohen Tomas Babej Tomas Marcik Trey Corple Tuk Bredsdorff Udi Oron Victor Semionov Volodymyr Yatsyk Vuong Nguyen Vlad Dmitrievich Wendy Edwards Will Gordon Will Ross William Li Yaroslav Muravsky Yuri Kriachko Youcef Mammar Anton Goncharov django-allauth-0.58.2/ChangeLog.rst000066400000000000000000000374151452212273200170730ustar00rootroot000000000000000.58.2 (2023-11-06) ******************* Fixes ----- - Added rate limiting to the MFA login form. 0.58.1 (2023-10-29) ******************* Fixes ----- - Fixed missing ``{% load allauth %}`` in the login cancelled and verified email required template. 0.58.0 (2023-10-26) ******************* Note worthy changes ------------------- - The ``SocialAccount.exra_data`` field was a custom JSON field that used ``TextField`` as the underlying implementation. It was once needed because Django had no ``JSONField`` support. Now, this field is changed to use the official ``JSONField()``. Migrations are in place. - Officially support Django 5.0. - In previous versions, users could never remove their primary email address. This is constraint is now relaxed. In case the email address is not required, for example, because the user logs in by username, removal of the email address is allowed. - Added a new setting ``ACCOUNT_REAUTHENTICATION_REQUIRED`` that, when enabled, requires the user to reauthenticate before changes (such as changing the primary email address, adding a new email address, etc.) can be performed. Backwards incompatible changes ------------------------------ - Refactored the built-in templates, with the goal of being able to adjust the look and feel of the whole project by only overriding a few core templates. This approach allows you to achieve visual results fast, but is of course more limited compared to styling all templates yourself. If your project provided its own templates then this change will not affect anything, but if you rely on (some of) the built-in templates your project may be affected. - The Azure provider has been removed in favor of keeping the Microsoft provider. Both providers were targeting the same goal. Security notice --------------- - Facebook: Using the JS SDK flow, it was possible to post valid access tokens originating from other apps. Facebook user IDs are scoped per app. By default that user ID (not the email address) is used as key while authenticating. Therefore, such access tokens can not be abused by default. However, in case ``SOCIALACCOUNT_EMAIL_AUTHENTICATION`` was explicitly enabled for the Facebook provider, these tokens could be used to login. 0.57.0 (2023-09-24) ******************* Note worthy changes ------------------- - Added Django password validation help text to ``password1`` on set/change/signup forms. - Microsoft: the tenant parameter can now be configured per app. - SAML: Added support for additional configuration parameters, such as contacts, and support for certificate rotation. - The enumeration prevention behavior at signup is now configurable. Whether or not enumeration can be prevented during signup depends on the email verification method. In case of mandatory verification, enumeration can be properly prevented because the case where an email address is already taken is indistinguishable from the case where it is not. However, in case of optional or disabled email verification, enumeration can only be prevented by allowing the signup to go through, resulting in multiple accounts sharing same email address (although only one of the accounts can ever have it verified). When enumeration is set to ``True``, email address uniqueness takes precedence over enumeration prevention, and the issue of multiple accounts having the same email address will be avoided, thus leaking information. Set it to ``"strict"`` to allow for signups to go through. Fixes ===== - Fixed ``?next=`` URL handling in the SAML provider. - During 2FA, pending logins were incorrectly removed when e.g. Django was asked to serve a ``/favicon.ico`` URL. 0.56.1 (2023-09-08) ******************* Security notice --------------- - ``ImmediateHttpResponse`` exceptions were not handled properly when raised inside ``adapter.pre_login()``. If you relied on aborting the login using this mechanism, that would not work. Most notably, django-allauth-2fa uses this approach, resulting in 2FA not being triggered. 0.56.0 (2023-09-07) ******************* Note worthy changes ------------------- - Added builtin support for Two-Factor Authentication via the ``allauth.mfa`` app. - The fact that ``request`` is not available globally has left its mark on the code over the years. Some functions get explicitly passed a request, some do not, and some constructs have it available both as a parameter and as ``self.request``. As having request available is essential, especially when trying to implement adapter hooks, the request has now been made globally available via:: from allauth.core import context context.request - Previously, ``SOCIALACCOUNT_STORE_TOKENS = True`` did not work when the social app was configured in the settings instead of in the database. Now, this functionality works regardless of how you configure the app. Backwards incompatible changes ------------------------------ - Dropped support for Django 3.1. - The ``"allauth.account.middleware.AccountMiddleware"`` middleware is required to be present in your ``settings.MIDDLEWARE``. - Starting from September 1st 2023, CERN upgraded their SSO to a standard OpenID Connect based solution. As a result, the previously builtin CERN provider is no longer needed and has been removed. Instead, use the regular OpenID Connect configuration:: SOCIALACCOUNT_PROVIDERS = { "openid_connect": { "APPS": [ { "provider_id": "cern", "name": "CERN", "client_id": "", "secret": "", "settings": { "server_url": "https://auth.cern.ch/auth/realms/cern/.well-known/openid-configuration", }, } ] } } - The Keycloak provider was added before the OpenID Connect functionality landed. Afterwards, the Keycloak implementation was refactored to reuse the regular OIDC provider. As this approach led to bugs (see 0.55.1), it was decided to remove the Keycloak implementation altogether. Instead, use the regular OpenID Connect configuration:: SOCIALACCOUNT_PROVIDERS = { "openid_connect": { "APPS": [ { "provider_id": "keycloak", "name": "Keycloak", "client_id": "", "secret": "", "settings": { "server_url": "http://keycloak:8080/realms/master/.well-known/openid-configuration", }, } ] } } 0.55.2 (2023-08-30) ******************* Fixes ----- - Email confirmation: An attribute error could occur when following invalid email confirmation links. 0.55.1 (2023-08-30) ******************* Fixes ----- - SAML: the lookup of the app (``SocialApp``) was working correctly for apps configured via the settings, but failed when the app was configured via the Django admin. - Keycloak: fixed reversal of the callback URL, which was reversed using ``"openid_connect_callback"`` instead of ``"keycloak_callback"``. Although the resulting URL is the same, it results in a ``NoReverseMatch`` error when ``allauth.socialaccount.providers.openid_connect`` is not present in ``INSTALLED_APPS``. 0.55.0 (2023-08-22) ******************* Note worthy changes ------------------- - Introduced a new setting ``ACCOUNT_PASSWORD_RESET_TOKEN_GENERATOR`` that allows you to specify the token generator for password resets. - Dropped support for Django 2.x and 3.0. - Officially support Django 4.2. - New providers: Miro, Questrade - It is now possible to manage OpenID Connect providers via the Django admin. Simply add a `SocialApp` for each OpenID Connect provider. - There is now a new flow for changing the email address. When enabled (``ACCOUNT_CHANGE_EMAIL``), users are limited to having exactly one email address that they can change by adding a temporary second email address that, when verified, replaces the current email address. - Changed spelling from "e-mail" to "email". Both are correct, however, the trend over the years has been towards the simpler and more streamlined form "email". - Added support for SAML 2.0. Thanks to `Dskrpt `_ for sponsoring the development of this feature! - Fixed Twitter OAuth2 authentication by using basic auth and adding scope `tweet.read`. - Added (optional) support for authentication by email for social logins (see ``SOCIALACCOUNT_EMAIL_AUTHENTICATION``). Security notice --------------- - Even with account enumeration prevention in place, it was possible for a user to infer whether or not a given account exists based by trying to add secondary email addresses . This has been fixed -- see the note on backwards incompatible changes. Backwards incompatible changes ------------------------------ - Data model changes: when ``ACCOUNT_UNIQUE_EMAIL=True`` (the default), there was a unique constraint on set on the ``email`` field of the ``EmailAddress`` model. This constraint has been relaxed, now there is a unique constraint on the combination of ``email`` and ``verified=True``. Migrations are in place to automatically transition, but if you have a lot of accounts, you may need to take special care using ``CREATE INDEX CONCURRENTLY``. - The method ``allauth.utils.email_address_exists()`` has been removed. - The Mozilla Persona provider has been removed. The project was shut down on November 30th 2016. - A large internal refactor has been performed to be able to add support for providers oferring one or more subproviders. This refactor has the following impact: - The provider registry methods ``get_list()``, ``by_id()`` have been removed. The registry now only providers access to the provider classes, not the instances. - ``provider.get_app()`` has been removed -- use ``provider.app`` instead. - ``SocialApp.objects.get_current()`` has been removed. - The ``SocialApp`` model now has additional fields ``provider_id``, and ``settings``. - The OpenID Connect provider ``SOCIALACCOUNT_PROVIDERS`` settings structure changed. Instead of the OpenID Connect specific ``SERVERS`` construct, it now uses the regular ``APPS`` approach. Please refer to the OpenID Connect provider documentation for details. - The Telegram provider settings structure, it now requires to app. Please refer to the Telegram provider documentation for details. - The Facebook provider loaded the Facebook connect ``sdk.js`` regardless of the value of the ``METHOD`` setting. To prevent tracking, now it only loads the Javascript if ``METHOD`` is explicitly set to ``"js_sdk"``. 0.54.0 (2023-03-31) ******************* Note worthy changes ------------------- - Dropped support for EOL Python versions (3.5, 3.6). Security notice --------------- - Even when account enumeration prevention was turned on, it was possible for an attacker to infer whether or not a given account exists based upon the response time of an authentication attempt. Fixed. 0.53.1 (2023-03-20) ******************* Note worthy changes ------------------- - Example base template was missing ``{% load i18n %}``, fixed. 0.53.0 (2023-03-16) ******************* Note worthy changes ------------------- - You can now override the use of the ``UserTokenForm`` over at the ``PasswordResetFromKeyView`` by configuring ``ACCOUNT_FORMS["user_token"]`` to allow the change of the password reset token generator. - The Google API URLs are now configurable via the provider setting which enables use-cases such as overriding the endpoint during integration tests to talk to a mocked version of the API. 0.52.0 (2022-12-29) ******************* Note worthy changes ------------------- - Officially support Django 4.1. - New providers: OpenID Connect, Twitter (OAuth2), Wahoo, DingTalk. - Introduced a new provider setting ``OAUTH_PKCE_ENABLED`` that enables the PKCE-enhanced Authorization Code Flow for OAuth 2.0 providers. - When ``ACCOUNT_PREVENT_ENUMERATION`` is turned on, enumeration is now also prevented during signup, provided you are using mandatory email verification. There is a new email template (`templates/account/email/acccount_already_exists_message.txt`) that will be used in this scenario. - Updated URLs of Google's endpoints to the latest version; removed a redundant ``userinfo`` call. - Fixed Pinterest provider on new api version. 0.51.0 (2022-06-07) ******************* Note worthy changes ------------------- - New providers: Snapchat, Hubspot, Pocket, Clever. Security notice --------------- The reset password form is protected by rate limits. There is a limit per IP, and per email. In previous versions, the latter rate limit could be bypassed by changing the casing of the email address. Note that in that case, the former rate limit would still kick in. 0.50.0 (2022-03-25) ******************* Note worthy changes ------------------- - Fixed compatibility issue with setuptools 61. - New providers: Drip. - The Facebook API version now defaults to v13.0. 0.49.0 (2022-02-22) ******************* Note worthy changes ------------------- - New providers: LemonLDAP::NG. - Fixed ``SignupForm`` setting username and email attributes on the ``User`` class instead of a dummy user instance. - Email addresses POST'ed to the email management view (done in order to resend the confirmation email) were not properly validated. Yet, these email addresses were still added as secondary email addresses. Given the lack of proper validation, invalid email addresses could have entered the database. - New translations: Romanian. Backwards incompatible changes ------------------------------ - The Microsoft ``tenant`` setting must now be specified using uppercase ``TENANT``. - Changed naming of ``internal_reset_url_key`` attribute in ``allauth.account.views.PasswordResetFromKeyView`` to ``reset_url_key``. 0.48.0 (2022-02-03) ******************* Note worthy changes ------------------- - New translations: Catalan, Bulgarian. - Introduced a new setting ``ACCOUNT_PREVENT_ENUMERATION`` that controls whether or not information is revealed about whether or not a user account exists. **Warning**: this is a work in progress, password reset is covered, yet, signing up is not. - The ``ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN`` is now also respected when using HMAC based email confirmations. In earlier versions, users could trigger email verification mails without any limits. - Added builtin rate limiting (see ``ACCOUNT_RATE_LIMITS``). - Added ``internal_reset_url_key`` attribute in ``allauth.account.views.PasswordResetFromKeyView`` which allows specifying a token parameter displayed as a component of password reset URLs. - It is now possible to use allauth without having ``sites`` installed. Whether or not sites is used affects the data models. For example, the social app model uses a many-to-many pointing to the sites model if the ``sites`` app is installed. Therefore, enabling or disabling ``sites`` is not something you can do on the fly. - The ``facebook`` provider no longer raises ``ImproperlyConfigured`` within ``{% providers_media_js %}`` when it is not configured. Backwards incompatible changes ------------------------------ - The newly introduced ``ACCOUNT_PREVENT_ENUMERATION`` defaults to ``True`` impacting the current behavior of the password reset flow. - The newly introduced rate limiting is by default turned on. You will need to provide a ``429.html`` template. - The default of ``SOCIALACCOUNT_STORE_TOKENS`` has been changed to ``False``. Rationale is that storing sensitive information should be opt in, not opt out. If you were relying on this functionality without having it explicitly turned on, please add it to your ``settings.py``. django-allauth-0.58.2/LICENSE000066400000000000000000000021201452212273200155000ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2010-2021 Raymond Penners and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. django-allauth-0.58.2/MANIFEST.in000066400000000000000000000003141452212273200162340ustar00rootroot00000000000000include AUTHORS include LICENSE include README.rst include ChangeLog.rst include test_settings.py recursive-include allauth *.html *.txt *.xml *.po *.mo *.js recursive-include docs Makefile conf.py *.rst django-allauth-0.58.2/Makefile000066400000000000000000000016351452212273200161450ustar00rootroot00000000000000PYTHON = python ISORT = isort $$(find $(PWD)/allauth -not -path '*/migrations/*' -type f -name '*.py' -not -name '__init__.py' -print) .PHONY: usage usage: @echo 'Usage: make [target]' @echo '' @echo 'Targets:' @echo ' black Auto format Python code' @echo ' isort Fix isort issues' @echo ' po (Re)generate .po files' @echo ' mo Compile .po into .mo' @echo ' qa Perform QA checks' @echo ' test Execute test suite' .PHONY: po po: ( cd allauth ; $(PYTHON) ../manage.py makemessages -a -e html,txt,py ) .PHONY: mo mo: ( cd allauth ; $(PYTHON) ../manage.py compilemessages ) .PHONY: isort isort: $(ISORT) .PHONY: black black: black allauth/ setup.py .PHONY: test test: pytest allauth/ .PHONY: qa qa: flake8 allauth isort --check-only --skip-glob '*/migrations/*' --diff allauth black --check allauth setup.py djlint --check allauth example django-allauth-0.58.2/README.rst000066400000000000000000000126411452212273200161730ustar00rootroot00000000000000========================== Welcome to django-allauth! ========================== .. image:: https://github.com/pennersr/django-allauth/actions/workflows/ci.yml/badge.svg :target: https://github.com/pennersr/django-allauth/actions .. image:: https://img.shields.io/pypi/v/django-allauth.svg :target: https://pypi.python.org/pypi/django-allauth .. image:: https://coveralls.io/repos/pennersr/django-allauth/badge.svg?branch=main :alt: Coverage Status :target: https://coveralls.io/r/pennersr/django-allauth .. image:: https://pennersr.github.io/img/bitcoin-badge.svg :target: https://blockchain.info/address/1AJXuBMPHkaDCNX2rwAy34bGgs7hmrePEr .. image:: https://badgen.net/liberapay/receives/pennersr :target: https://en.liberapay.com/pennersr .. image:: https://img.shields.io/badge/code%20style-pep8-green.svg :target: https://www.python.org/dev/peps/pep-0008/ .. image:: https://img.shields.io/badge/code_style-standard-brightgreen.svg :target: http://standardjs.com .. image:: https://pennersr.github.io/img/emacs-badge.svg :target: https://www.gnu.org/software/emacs/ Integrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication. Home page https://allauth.org/ Source code http://github.com/pennersr/django-allauth Mailing list http://groups.google.com/group/django-allauth Documentation https://docs.allauth.org/en/latest/ Stack Overflow http://stackoverflow.com/questions/tagged/django-allauth .. end-welcome Rationale ========= .. begin-rationale Most existing Django apps that address the problem of social authentication unfortunately focus only on one dimension - the social. Most developers end up integrating another app in order to support authentication flows that are locally generated. This approach creates a development gap between local and social authentication flows. It has remained an issue in spite of numerous common scenarios that both require. For example, an email address passed along by an OpenID provider may not be verified. Therefore, prior to hooking up an OpenID account to a local account the email address must be verified. This essentially is one of many use cases that mandate email verification to be present in both worlds. Integrating both is a humongous and tedious process. It is not as simple as adding one social authentication app, and one local account registration app to your ``INSTALLED_APPS`` list. This inadequacy is the reason for this project's existence -- to offer a fully integrated authentication app that allows for both local and social authentication, with flows that just work, beautifully ! .. end-rationale Features ======== .. begin-features **🔑 Comprehensive account functionality** Supports multiple authentication schemes (e.g. login by user name, or by email), as well as multiple strategies for account verification (ranging from none to mandatory email verification). **👥 Social Login** Login using external identity providers, supporting any *Open ID Connect compatible* provider, many *OAuth 1.0/2.0* providers, as well as custom protocols such as, for example, *Telegram* authentication. **💼 Enterprise ready** Supports SAML 2.0, which is often used in a B2B context. **🕵️ Battle-tested** The package has been out in the open since 2010. It is in use by many commercial companies whose business depends on it and has hence been subjected to various penetration testing attempts. **⏳Rate limiting** When you expose an authentication-enabled web service to the internet, it is important to be prepared for potential brute force attempts. Therefore, rate limiting is enabled out of the box. **🔒 Private** Many sites leak information. For example, on many sites you can check whether someone you know has an account by input their email address into the password forgotten form, or trying to signup with it. We offer account enumeration prevention, making it impossible to tell whether or not somebody already has an account. **🧩 Customizable** As a developer, you have the flexibility to customize the core functionality according to your specific requirements. By employing the adapter pattern, you can effortlessly introduce interventions at the desired points to deviate from the standard behavior. This level of customization empowers you to tailor the software to meet your unique needs and preferences. **⚙️ Configuration** The required consumer keys and secrets for interacting with Facebook, Twitter and the likes can be configured using regular settings, or, can be configured in the database via the Django admin. Here, optional support for the Django sites framework is available, which is helpful for larger multi-domain projects, but also allows for easy switching between a development (localhost) and production setup without messing with your settings and database. .. end-features Commercial Support ================== .. begin-support Commercial support is available. If you find certain functionality missing, or require assistance on your project(s), please contact us: info@intenct.nl. .. end-support Cross-Selling ============= If you like this, you may also like: - django-trackstats: https://github.com/pennersr/django-trackstats - netwell: https://github.com/pennersr/netwell - Shove: https://github.com/pennersr/shove django-allauth-0.58.2/allauth/000077500000000000000000000000001452212273200161325ustar00rootroot00000000000000django-allauth-0.58.2/allauth/__init__.py000066400000000000000000000012641452212273200202460ustar00rootroot00000000000000r""" _ ___ __ __ .___________. __ __ /\| |/\ / \ | | | | | || | | | \ ` ' / / ^ \ | | | | `---| |----`| |__| | |_ _| / /_\ \ | | | | | | | __ | / , . \ / _____ \ | `--' | | | | | | | \/|_|\//__/ \__\ \______/ |__| |__| |__| """ VERSION = (0, 58, 2, "final", 0) __title__ = "django-allauth" __version_info__ = VERSION __version__ = ".".join(map(str, VERSION[:3])) + ( "-{}{}".format(VERSION[3], VERSION[4] or "") if VERSION[3] != "final" else "" ) __author__ = "Raymond Penners" __license__ = "MIT" __copyright__ = "Copyright 2010-2023 Raymond Penners and contributors" django-allauth-0.58.2/allauth/account/000077500000000000000000000000001452212273200175665ustar00rootroot00000000000000django-allauth-0.58.2/allauth/account/__init__.py000066400000000000000000000000001452212273200216650ustar00rootroot00000000000000django-allauth-0.58.2/allauth/account/adapter.py000066400000000000000000000620711452212273200215660ustar00rootroot00000000000000import html import json import warnings from datetime import timedelta from urllib.parse import urlparse from django import forms from django.conf import settings from django.contrib import messages from django.contrib.auth import ( authenticate, get_backends, get_user_model, login as django_login, logout as django_logout, ) from django.contrib.auth.models import AbstractUser from django.contrib.auth.password_validation import validate_password from django.contrib.sites.shortcuts import get_current_site from django.core.exceptions import FieldDoesNotExist from django.core.mail import EmailMessage, EmailMultiAlternatives from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import resolve_url from django.template import TemplateDoesNotExist from django.template.loader import render_to_string from django.urls import reverse from django.utils import timezone from django.utils.crypto import get_random_string from django.utils.encoding import force_str from django.utils.translation import gettext_lazy as _ from allauth import app_settings as allauth_app_settings from allauth.account import signals from allauth.account.app_settings import ( AuthenticationMethod, EmailVerificationMethod, ) from allauth.core import context, ratelimit from allauth.utils import ( build_absolute_uri, generate_unique_username, import_attribute, ) from . import app_settings class DefaultAccountAdapter(object): error_messages = { "username_blacklisted": _( "Username can not be used. Please use other username." ), "username_taken": AbstractUser._meta.get_field("username").error_messages[ "unique" ], "too_many_login_attempts": _( "Too many failed login attempts. Try again later." ), "email_taken": _("A user is already registered with this email address."), "incorrect_password": _("Incorrect password."), } def __init__(self, request=None): # Explicitly passing `request` is deprecated, just use: # `allauth.core.context.request`. self.request = context.request def stash_verified_email(self, request, email): request.session["account_verified_email"] = email def unstash_verified_email(self, request): ret = request.session.get("account_verified_email") request.session["account_verified_email"] = None return ret def stash_user(self, request, user): request.session["account_user"] = user def unstash_user(self, request): return request.session.pop("account_user", None) def is_email_verified(self, request, email): """ Checks whether or not the email address is already verified beyond allauth scope, for example, by having accepted an invitation before signing up. """ ret = False verified_email = request.session.get("account_verified_email") if verified_email: ret = verified_email.lower() == email.lower() return ret def can_delete_email(self, email_address): from allauth.account.models import EmailAddress has_other = ( EmailAddress.objects.filter(user_id=email_address.user_id) .exclude(pk=email_address.pk) .exists() ) login_by_email = ( app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.EMAIL ) if email_address.primary: if has_other: # Don't allow, let the user mark one of the others as primary # first. return False elif login_by_email: # Last email & login is by email, prevent dangling account. return False return True elif has_other: # Account won't be dangling. return True elif login_by_email: # This is the last email. return False else: return True def format_email_subject(self, subject): prefix = app_settings.EMAIL_SUBJECT_PREFIX if prefix is None: site = get_current_site(context.request) prefix = "[{name}] ".format(name=site.name) return prefix + force_str(subject) def get_from_email(self): """ This is a hook that can be overridden to programmatically set the 'from' email address for sending emails """ return settings.DEFAULT_FROM_EMAIL def render_mail(self, template_prefix, email, context, headers=None): """ Renders an email to `email`. `template_prefix` identifies the email that is to be sent, e.g. "account/email/email_confirmation" """ to = [email] if isinstance(email, str) else email subject = render_to_string("{0}_subject.txt".format(template_prefix), context) # remove superfluous line breaks subject = " ".join(subject.splitlines()).strip() subject = self.format_email_subject(subject) from_email = self.get_from_email() bodies = {} for ext in ["html", "txt"]: try: template_name = "{0}_message.{1}".format(template_prefix, ext) bodies[ext] = render_to_string( template_name, context, globals()["context"].request, ).strip() except TemplateDoesNotExist: if ext == "txt" and not bodies: # We need at least one body raise if "txt" in bodies: msg = EmailMultiAlternatives( subject, bodies["txt"], from_email, to, headers=headers ) if "html" in bodies: msg.attach_alternative(bodies["html"], "text/html") else: msg = EmailMessage(subject, bodies["html"], from_email, to, headers=headers) msg.content_subtype = "html" # Main content is now text/html return msg def send_mail(self, template_prefix, email, context): msg = self.render_mail(template_prefix, email, context) msg.send() def get_signup_redirect_url(self, request): return resolve_url(app_settings.SIGNUP_REDIRECT_URL) def get_login_redirect_url(self, request): """ Returns the default URL to redirect to after logging in. Note that URLs passed explicitly (e.g. by passing along a `next` GET parameter) take precedence over the value returned here. """ assert request.user.is_authenticated url = getattr(settings, "LOGIN_REDIRECT_URLNAME", None) if url: warnings.warn( "LOGIN_REDIRECT_URLNAME is deprecated, simply" " use LOGIN_REDIRECT_URL with a URL name", DeprecationWarning, ) else: url = settings.LOGIN_REDIRECT_URL return resolve_url(url) def get_logout_redirect_url(self, request): """ Returns the URL to redirect to after the user logs out. Note that this method is also invoked if you attempt to log out while no users is logged in. Therefore, request.user is not guaranteed to be an authenticated user. """ return resolve_url(app_settings.LOGOUT_REDIRECT_URL) def get_email_confirmation_redirect_url(self, request): """ The URL to return to after successful email confirmation. """ if request.user.is_authenticated: if app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL: return app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL else: return self.get_login_redirect_url(request) else: return app_settings.EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL def is_open_for_signup(self, request): """ Checks whether or not the site is open for signups. Next to simply returning True/False you can also intervene the regular flow by raising an ImmediateHttpResponse """ return True def new_user(self, request): """ Instantiates a new User instance. """ user = get_user_model()() return user def populate_username(self, request, user): """ Fills in a valid username, if required and missing. If the username is already present it is assumed to be valid (unique). """ from .utils import user_email, user_field, user_username first_name = user_field(user, "first_name") last_name = user_field(user, "last_name") email = user_email(user) username = user_username(user) if app_settings.USER_MODEL_USERNAME_FIELD: user_username( user, username or self.generate_unique_username( [first_name, last_name, email, username, "user"] ), ) def generate_unique_username(self, txts, regex=None): return generate_unique_username(txts, regex) def save_user(self, request, user, form, commit=True): """ Saves a new `User` instance using information provided in the signup form. """ from .utils import user_email, user_field, user_username data = form.cleaned_data first_name = data.get("first_name") last_name = data.get("last_name") email = data.get("email") username = data.get("username") user_email(user, email) user_username(user, username) if first_name: user_field(user, "first_name", first_name) if last_name: user_field(user, "last_name", last_name) if "password1" in data: user.set_password(data["password1"]) else: user.set_unusable_password() self.populate_username(request, user) if commit: # Ability not to commit makes it easier to derive from # this adapter by adding user.save() return user def clean_username(self, username, shallow=False): """ Validates the username. You can hook into this if you want to (dynamically) restrict what usernames can be chosen. """ for validator in app_settings.USERNAME_VALIDATORS: validator(username) # TODO: Add regexp support to USERNAME_BLACKLIST username_blacklist_lower = [ ub.lower() for ub in app_settings.USERNAME_BLACKLIST ] if username.lower() in username_blacklist_lower: raise forms.ValidationError(self.error_messages["username_blacklisted"]) # Skipping database lookups when shallow is True, needed for unique # username generation. if not shallow: from .utils import filter_users_by_username if filter_users_by_username(username).exists(): user_model = get_user_model() username_field = app_settings.USER_MODEL_USERNAME_FIELD error_message = user_model._meta.get_field( username_field ).error_messages.get("unique") if not error_message: error_message = self.error_messages["username_taken"] raise forms.ValidationError( error_message, params={ "model_name": user_model.__name__, "field_label": username_field, }, ) return username def clean_email(self, email): """ Validates an email value. You can hook into this if you want to (dynamically) restrict what email addresses can be chosen. """ return email def clean_password(self, password, user=None): """ Validates a password. You can hook into this if you want to restric the allowed password choices. """ min_length = app_settings.PASSWORD_MIN_LENGTH if min_length and len(password) < min_length: raise forms.ValidationError( _("Password must be a minimum of {0} characters.").format(min_length) ) validate_password(password, user) return password def validate_unique_email(self, email): return email def add_message( self, request, level, message_template, message_context=None, extra_tags="", ): """ Wrapper of `django.contrib.messages.add_message`, that reads the message text from a template. """ if "django.contrib.messages" in settings.INSTALLED_APPS: try: if message_context is None: message_context = {} escaped_message = render_to_string( message_template, message_context, context.request, ).strip() if escaped_message: message = html.unescape(escaped_message) messages.add_message(request, level, message, extra_tags=extra_tags) except TemplateDoesNotExist: pass def ajax_response(self, request, response, redirect_to=None, form=None, data=None): resp = {} status = response.status_code if redirect_to: status = 200 resp["location"] = redirect_to if form: if request.method == "POST": if form.is_valid(): status = 200 else: status = 400 else: status = 200 resp["form"] = self.ajax_response_form(form) if hasattr(response, "render"): response.render() resp["html"] = response.content.decode("utf8") if data is not None: resp["data"] = data return HttpResponse( json.dumps(resp), status=status, content_type="application/json" ) def ajax_response_form(self, form): form_spec = { "fields": {}, "field_order": [], "errors": form.non_field_errors(), } for field in form: field_spec = { "label": force_str(field.label), "value": field.value(), "help_text": force_str(field.help_text), "errors": [force_str(e) for e in field.errors], "widget": { "attrs": { k: force_str(v) for k, v in field.field.widget.attrs.items() } }, } form_spec["fields"][field.html_name] = field_spec form_spec["field_order"].append(field.html_name) return form_spec def pre_login( self, request, user, *, email_verification, signal_kwargs, email, signup, redirect_url ): from .utils import has_verified_email, send_email_confirmation if not user.is_active: return self.respond_user_inactive(request, user) if email_verification == EmailVerificationMethod.NONE: pass elif email_verification == EmailVerificationMethod.OPTIONAL: # In case of OPTIONAL verification: send on signup. if not has_verified_email(user, email) and signup: send_email_confirmation(request, user, signup=signup, email=email) elif email_verification == EmailVerificationMethod.MANDATORY: if not has_verified_email(user, email): send_email_confirmation(request, user, signup=signup, email=email) return self.respond_email_verification_sent(request, user) def post_login( self, request, user, *, email_verification, signal_kwargs, email, signup, redirect_url ): from .utils import get_login_redirect_url response = HttpResponseRedirect( get_login_redirect_url(request, redirect_url, signup=signup) ) if signal_kwargs is None: signal_kwargs = {} signals.user_logged_in.send( sender=user.__class__, request=request, response=response, user=user, **signal_kwargs, ) self.add_message( request, messages.SUCCESS, "account/messages/logged_in.txt", {"user": user}, ) return response def login(self, request, user): from allauth.account.reauthentication import record_authentication # HACK: This is not nice. The proper Django way is to use an # authentication backend if not hasattr(user, "backend"): from .auth_backends import AuthenticationBackend backends = get_backends() backend = None for b in backends: if isinstance(b, AuthenticationBackend): # prefer our own backend backend = b break elif not backend and hasattr(b, "get_user"): # Pick the first valid one backend = b backend_path = ".".join([backend.__module__, backend.__class__.__name__]) user.backend = backend_path django_login(request, user) record_authentication(request, user) def logout(self, request): django_logout(request) def confirm_email(self, request, email_address): """ Marks the email address as confirmed on the db """ from allauth.account.models import EmailAddress from_email_address = ( EmailAddress.objects.filter(user_id=email_address.user_id) .exclude(pk=email_address.pk) .first() ) if not email_address.set_verified(commit=False): return False email_address.set_as_primary(conditional=(not app_settings.CHANGE_EMAIL)) email_address.save(update_fields=["verified", "primary"]) if app_settings.CHANGE_EMAIL: for instance in EmailAddress.objects.filter( user_id=email_address.user_id ).exclude(pk=email_address.pk): instance.remove() signals.email_changed.send( sender=get_user_model(), request=request, user=email_address.user, from_email_address=from_email_address, to_email_address=email_address, ) return True def set_password(self, user, password): user.set_password(password) user.save() def get_user_search_fields(self): ret = [] User = get_user_model() candidates = [ app_settings.USER_MODEL_USERNAME_FIELD, "first_name", "last_name", "email", ] for candidate in candidates: try: User._meta.get_field(candidate) ret.append(candidate) except FieldDoesNotExist: pass return ret def is_safe_url(self, url): from django.utils.http import url_has_allowed_host_and_scheme # get_host already validates the given host, so no need to check it again allowed_hosts = {context.request.get_host()} | set(settings.ALLOWED_HOSTS) if "*" in allowed_hosts: parsed_host = urlparse(url).netloc allowed_host = {parsed_host} if parsed_host else None return url_has_allowed_host_and_scheme(url, allowed_hosts=allowed_host) return url_has_allowed_host_and_scheme(url, allowed_hosts=allowed_hosts) def get_email_confirmation_url(self, request, emailconfirmation): """Constructs the email confirmation (activation) url. Note that if you have architected your system such that email confirmations are sent outside of the request context `request` can be `None` here. """ url = reverse("account_confirm_email", args=[emailconfirmation.key]) ret = build_absolute_uri(request, url) return ret def should_send_confirmation_mail(self, request, email_address): from allauth.account.models import EmailConfirmation cooldown_period = timedelta(seconds=app_settings.EMAIL_CONFIRMATION_COOLDOWN) if app_settings.EMAIL_CONFIRMATION_HMAC: send_email = ratelimit.consume( request, action="confirm_email", key=email_address.email.lower(), amount=1, duration=cooldown_period.total_seconds(), ) else: send_email = not EmailConfirmation.objects.filter( sent__gt=timezone.now() - cooldown_period, email_address=email_address, ).exists() return send_email def send_account_already_exists_mail(self, email): signup_url = build_absolute_uri(context.request, reverse("account_signup")) password_reset_url = build_absolute_uri( context.request, reverse("account_reset_password") ) ctx = { "request": context.request, "current_site": get_current_site(context.request), "email": email, "signup_url": signup_url, "password_reset_url": password_reset_url, } self.send_mail("account/email/account_already_exists", email, ctx) def send_confirmation_mail(self, request, emailconfirmation, signup): current_site = get_current_site(request) activate_url = self.get_email_confirmation_url(request, emailconfirmation) ctx = { "user": emailconfirmation.email_address.user, "activate_url": activate_url, "current_site": current_site, "key": emailconfirmation.key, } if signup: email_template = "account/email/email_confirmation_signup" else: email_template = "account/email/email_confirmation" self.send_mail(email_template, emailconfirmation.email_address.email, ctx) def respond_user_inactive(self, request, user): return HttpResponseRedirect(reverse("account_inactive")) def respond_email_verification_sent(self, request, user): return HttpResponseRedirect(reverse("account_email_verification_sent")) def _get_login_attempts_cache_key(self, request, **credentials): site = get_current_site(request) login = credentials.get("email", credentials.get("username", "")).lower() return "{site}:{login}".format(site=site.domain, login=login) def _delete_login_attempts_cached_email(self, request, **credentials): if app_settings.LOGIN_ATTEMPTS_LIMIT: cache_key = self._get_login_attempts_cache_key(request, **credentials) ratelimit.clear(request, action="login_failed", key=cache_key) def pre_authenticate(self, request, **credentials): if app_settings.LOGIN_ATTEMPTS_LIMIT: cache_key = self._get_login_attempts_cache_key(request, **credentials) if not ratelimit.consume( request, action="login_failed", key=cache_key, amount=app_settings.LOGIN_ATTEMPTS_LIMIT, duration=app_settings.LOGIN_ATTEMPTS_TIMEOUT, ): raise forms.ValidationError( self.error_messages["too_many_login_attempts"] ) def authenticate(self, request, **credentials): """Only authenticates, does not actually login. See `login`""" from allauth.account.auth_backends import AuthenticationBackend self.pre_authenticate(request, **credentials) AuthenticationBackend.unstash_authenticated_user() user = authenticate(request, **credentials) alt_user = AuthenticationBackend.unstash_authenticated_user() user = user or alt_user if user and app_settings.LOGIN_ATTEMPTS_LIMIT: self._delete_login_attempts_cached_email(request, **credentials) else: self.authentication_failed(request, **credentials) return user def authentication_failed(self, request, **credentials): pass def is_ajax(self, request): return any( [ request.META.get("HTTP_X_REQUESTED_WITH") == "XMLHttpRequest", request.content_type == "application/json", request.META.get("HTTP_ACCEPT") == "application/json", ] ) def get_client_ip(self, request): x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR") if x_forwarded_for: ip = x_forwarded_for.split(",")[0] else: ip = request.META.get("REMOTE_ADDR") return ip def generate_emailconfirmation_key(self, email): key = get_random_string(64).lower() return key def get_login_stages(self): ret = [] if allauth_app_settings.MFA_ENABLED: ret.append("allauth.mfa.stages.AuthenticateStage") return ret def get_adapter(request=None): return import_attribute(app_settings.ADAPTER)(request) django-allauth-0.58.2/allauth/account/admin.py000066400000000000000000000020621452212273200212300ustar00rootroot00000000000000from django.contrib import admin from . import app_settings from .adapter import get_adapter from .models import EmailAddress, EmailConfirmation class EmailAddressAdmin(admin.ModelAdmin): list_display = ("email", "user", "primary", "verified") list_filter = ("primary", "verified") search_fields = [] raw_id_fields = ("user",) actions = ["make_verified"] def get_search_fields(self, request): base_fields = get_adapter().get_user_search_fields() return ["email"] + list(map(lambda a: "user__" + a, base_fields)) def make_verified(self, request, queryset): queryset.update(verified=True) make_verified.short_description = "Mark selected email addresses as verified" class EmailConfirmationAdmin(admin.ModelAdmin): list_display = ("email_address", "created", "sent", "key") list_filter = ("sent",) raw_id_fields = ("email_address",) if not app_settings.EMAIL_CONFIRMATION_HMAC: admin.site.register(EmailConfirmation, EmailConfirmationAdmin) admin.site.register(EmailAddress, EmailAddressAdmin) django-allauth-0.58.2/allauth/account/app_settings.py000066400000000000000000000305111452212273200226400ustar00rootroot00000000000000from django.core.exceptions import ImproperlyConfigured class AppSettings(object): class AuthenticationMethod: USERNAME = "username" EMAIL = "email" USERNAME_EMAIL = "username_email" class EmailVerificationMethod: # After signing up, keep the user account inactive until the email # address is verified MANDATORY = "mandatory" # Allow login with unverified email (email verification is # still sent) OPTIONAL = "optional" # Don't send email verification mails during signup NONE = "none" def __init__(self, prefix): self.prefix = prefix # If login is by email, email must be required assert ( not self.AUTHENTICATION_METHOD == self.AuthenticationMethod.EMAIL ) or self.EMAIL_REQUIRED # If login includes email, login must be unique assert ( self.AUTHENTICATION_METHOD == self.AuthenticationMethod.USERNAME ) or self.UNIQUE_EMAIL assert ( self.EMAIL_VERIFICATION != self.EmailVerificationMethod.MANDATORY ) or self.EMAIL_REQUIRED if not self.USER_MODEL_USERNAME_FIELD: assert not self.USERNAME_REQUIRED assert self.AUTHENTICATION_METHOD not in ( self.AuthenticationMethod.USERNAME, self.AuthenticationMethod.USERNAME_EMAIL, ) if self.MAX_EMAIL_ADDRESSES is not None: assert self.MAX_EMAIL_ADDRESSES > 0 if self.CHANGE_EMAIL: if self.MAX_EMAIL_ADDRESSES is not None and self.MAX_EMAIL_ADDRESSES != 2: raise ImproperlyConfigured( "Invalid combination of ACCOUNT_CHANGE_EMAIL and ACCOUNT_MAX_EMAIL_ADDRESSES" ) def _setting(self, name, dflt): from allauth.utils import get_setting return get_setting(self.prefix + name, dflt) @property def PREVENT_ENUMERATION(self): return self._setting("PREVENT_ENUMERATION", True) @property def DEFAULT_HTTP_PROTOCOL(self): return self._setting("DEFAULT_HTTP_PROTOCOL", "http").lower() @property def EMAIL_CONFIRMATION_EXPIRE_DAYS(self): """ Determines the expiration date of email confirmation mails (# of days) """ from django.conf import settings return self._setting( "EMAIL_CONFIRMATION_EXPIRE_DAYS", getattr(settings, "EMAIL_CONFIRMATION_DAYS", 3), ) @property def EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL(self): """ The URL to redirect to after a successful email confirmation, in case of an authenticated user """ return self._setting("EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL", None) @property def EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL(self): """ The URL to redirect to after a successful email confirmation, in case no user is logged in """ from django.conf import settings return self._setting( "EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL", settings.LOGIN_URL ) @property def EMAIL_CONFIRMATION_COOLDOWN(self): """ The cooldown in seconds during which, after an email confirmation has been sent, a second confirmation email will not be sent. """ return self._setting("EMAIL_CONFIRMATION_COOLDOWN", 3 * 60) @property def EMAIL_REQUIRED(self): """ The user is required to hand over an email address when signing up """ return self._setting("EMAIL_REQUIRED", False) @property def EMAIL_VERIFICATION(self): """ See email verification method """ ret = self._setting("EMAIL_VERIFICATION", self.EmailVerificationMethod.OPTIONAL) # Deal with legacy (boolean based) setting if ret is True: ret = self.EmailVerificationMethod.MANDATORY elif ret is False: ret = self.EmailVerificationMethod.OPTIONAL return ret @property def MAX_EMAIL_ADDRESSES(self): return self._setting("MAX_EMAIL_ADDRESSES", None) @property def CHANGE_EMAIL(self): return self._setting("CHANGE_EMAIL", False) @property def AUTHENTICATION_METHOD(self): ret = self._setting("AUTHENTICATION_METHOD", self.AuthenticationMethod.USERNAME) return ret @property def EMAIL_MAX_LENGTH(self): """ Adjust max_length of email addresses """ return self._setting("EMAIL_MAX_LENGTH", 254) @property def UNIQUE_EMAIL(self): """ Enforce uniqueness of email addresses """ return self._setting("UNIQUE_EMAIL", True) @property def SIGNUP_EMAIL_ENTER_TWICE(self): """ Signup email verification """ return self._setting("SIGNUP_EMAIL_ENTER_TWICE", False) @property def SIGNUP_PASSWORD_ENTER_TWICE(self): """ Signup password verification """ legacy = self._setting("SIGNUP_PASSWORD_VERIFICATION", True) return self._setting("SIGNUP_PASSWORD_ENTER_TWICE", legacy) @property def SIGNUP_REDIRECT_URL(self): from django.conf import settings return self._setting("SIGNUP_REDIRECT_URL", settings.LOGIN_REDIRECT_URL) @property def PASSWORD_MIN_LENGTH(self): """ Minimum password Length """ from django.conf import settings ret = None if not settings.AUTH_PASSWORD_VALIDATORS: ret = self._setting("PASSWORD_MIN_LENGTH", 6) return ret @property def RATE_LIMITS(self): dflt = { # Change password view (for users already logged in) "change_password": "5/m", # Email management (e.g. add, remove, change primary) "manage_email": "10/m", # Request a password reset, global rate limit per IP "reset_password": "20/m", # Rate limit measured per individual email address "reset_password_email": "5/m", # Reauthentication for users already logged in) "reauthenticate": "10/m", # Password reset (the view the password reset email links to). "reset_password_from_key": "20/m", # Signups. "signup": "20/m", # NOTE: Login is already protected via `ACCOUNT_LOGIN_ATTEMPTS_LIMIT` } return self._setting("RATE_LIMITS", dflt) @property def EMAIL_SUBJECT_PREFIX(self): """ Subject-line prefix to use for email messages sent """ return self._setting("EMAIL_SUBJECT_PREFIX", None) @property def SIGNUP_FORM_CLASS(self): """ Signup form """ return self._setting("SIGNUP_FORM_CLASS", None) @property def USERNAME_REQUIRED(self): """ The user is required to enter a username when signing up """ return self._setting("USERNAME_REQUIRED", True) @property def USERNAME_MIN_LENGTH(self): """ Minimum username Length """ return self._setting("USERNAME_MIN_LENGTH", 1) @property def USERNAME_BLACKLIST(self): """ List of usernames that are not allowed """ return self._setting("USERNAME_BLACKLIST", []) @property def PASSWORD_INPUT_RENDER_VALUE(self): """ render_value parameter as passed to PasswordInput fields """ return self._setting("PASSWORD_INPUT_RENDER_VALUE", False) @property def ADAPTER(self): return self._setting("ADAPTER", "allauth.account.adapter.DefaultAccountAdapter") @property def CONFIRM_EMAIL_ON_GET(self): return self._setting("CONFIRM_EMAIL_ON_GET", False) @property def AUTHENTICATED_LOGIN_REDIRECTS(self): return self._setting("AUTHENTICATED_LOGIN_REDIRECTS", True) @property def LOGIN_ON_EMAIL_CONFIRMATION(self): """ Automatically log the user in once they confirmed their email address """ return self._setting("LOGIN_ON_EMAIL_CONFIRMATION", False) @property def LOGIN_ON_PASSWORD_RESET(self): """ Automatically log the user in immediately after resetting their password. """ return self._setting("LOGIN_ON_PASSWORD_RESET", False) @property def LOGOUT_REDIRECT_URL(self): from django.conf import settings return self._setting("LOGOUT_REDIRECT_URL", settings.LOGOUT_REDIRECT_URL or "/") @property def LOGOUT_ON_GET(self): return self._setting("LOGOUT_ON_GET", False) @property def LOGOUT_ON_PASSWORD_CHANGE(self): return self._setting("LOGOUT_ON_PASSWORD_CHANGE", False) @property def USER_MODEL_USERNAME_FIELD(self): return self._setting("USER_MODEL_USERNAME_FIELD", "username") @property def USER_MODEL_EMAIL_FIELD(self): return self._setting("USER_MODEL_EMAIL_FIELD", "email") @property def SESSION_COOKIE_AGE(self): """ Deprecated -- use Django's settings.SESSION_COOKIE_AGE instead """ from django.conf import settings return self._setting("SESSION_COOKIE_AGE", settings.SESSION_COOKIE_AGE) @property def SESSION_REMEMBER(self): """ Controls the life time of the session. Set to `None` to ask the user ("Remember me?"), `False` to not remember, and `True` to always remember. """ return self._setting("SESSION_REMEMBER", None) @property def TEMPLATE_EXTENSION(self): """ A string defining the template extension to use, defaults to `html`. """ return self._setting("TEMPLATE_EXTENSION", "html") @property def FORMS(self): return self._setting("FORMS", {}) @property def LOGIN_ATTEMPTS_LIMIT(self): """ Number of failed login attempts. When this number is exceeded, the user is prohibited from logging in for the specified `LOGIN_ATTEMPTS_TIMEOUT` """ return self._setting("LOGIN_ATTEMPTS_LIMIT", 5) @property def LOGIN_ATTEMPTS_TIMEOUT(self): """ Time period from last unsuccessful login attempt, during which the user is prohibited from trying to log in. Defaults to 5 minutes. """ return self._setting("LOGIN_ATTEMPTS_TIMEOUT", 60 * 5) @property def EMAIL_CONFIRMATION_HMAC(self): return self._setting("EMAIL_CONFIRMATION_HMAC", True) @property def SALT(self): return self._setting("SALT", "account") @property def PRESERVE_USERNAME_CASING(self): return self._setting("PRESERVE_USERNAME_CASING", True) @property def USERNAME_VALIDATORS(self): from django.contrib.auth import get_user_model from django.core.exceptions import ImproperlyConfigured from allauth.utils import import_attribute path = self._setting("USERNAME_VALIDATORS", None) if path: ret = import_attribute(path) if not isinstance(ret, list): raise ImproperlyConfigured( "ACCOUNT_USERNAME_VALIDATORS is expected to be a list" ) else: if self.USER_MODEL_USERNAME_FIELD is not None: ret = ( get_user_model() ._meta.get_field(self.USER_MODEL_USERNAME_FIELD) .validators ) else: ret = [] return ret @property def PASSWORD_RESET_TOKEN_GENERATOR(self): from allauth.account.forms import EmailAwarePasswordResetTokenGenerator from allauth.utils import import_attribute token_generator_path = self._setting("PASSWORD_RESET_TOKEN_GENERATOR", None) if token_generator_path is not None: token_generator = import_attribute(token_generator_path) else: token_generator = EmailAwarePasswordResetTokenGenerator return token_generator @property def REAUTHENTICATION_TIMEOUT(self): return self._setting("REAUTHENTICATION_TIMEOUT", 300) @property def REAUTHENTICATION_REQUIRED(self): return self._setting("REAUTHENTICATION_REQUIRED", False) _app_settings = AppSettings("ACCOUNT_") def __getattr__(name): # See https://peps.python.org/pep-0562/ return getattr(_app_settings, name) django-allauth-0.58.2/allauth/account/apps.py000066400000000000000000000011221452212273200210770ustar00rootroot00000000000000from django.apps import AppConfig from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.utils.translation import gettext_lazy as _ class AccountConfig(AppConfig): name = "allauth.account" verbose_name = _("Accounts") default_auto_field = "django.db.models.AutoField" def ready(self): required_mw = "allauth.account.middleware.AccountMiddleware" if required_mw not in settings.MIDDLEWARE: raise ImproperlyConfigured( f"{required_mw} must be added to settings.MIDDLEWARE" ) django-allauth-0.58.2/allauth/account/auth_backends.py000066400000000000000000000077121452212273200227420ustar00rootroot00000000000000from threading import local from django.contrib.auth import get_user_model from django.contrib.auth.backends import ModelBackend from . import app_settings from .app_settings import AuthenticationMethod from .utils import filter_users_by_email, filter_users_by_username _stash = local() class AuthenticationBackend(ModelBackend): def authenticate(self, request, **credentials): ret = None if app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.EMAIL: ret = self._authenticate_by_email(**credentials) elif app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.USERNAME_EMAIL: ret = self._authenticate_by_email(**credentials) if not ret: ret = self._authenticate_by_username(**credentials) else: ret = self._authenticate_by_username(**credentials) return ret def _authenticate_by_username(self, **credentials): username_field = app_settings.USER_MODEL_USERNAME_FIELD username = credentials.get("username") password = credentials.get("password") User = get_user_model() if not username_field or username is None or password is None: return None try: # Username query is case insensitive user = filter_users_by_username(username).get() except User.DoesNotExist: # Run the default password hasher once to reduce the timing # difference between an existing and a nonexistent user. get_user_model()().set_password(password) return None else: if self._check_password(user, password): return user def _authenticate_by_email(self, **credentials): # Even though allauth will pass along `email`, other apps may # not respect this setting. For example, when using # django-tastypie basic authentication, the login is always # passed as `username`. So let's play nice with other apps # and use username as fallback email = credentials.get("email", credentials.get("username")) if email: for user in filter_users_by_email(email, prefer_verified=True): if self._check_password(user, credentials["password"]): return user return None def _check_password(self, user, password): ret = user.check_password(password) if ret: ret = self.user_can_authenticate(user) if not ret: self._stash_user(user) return ret @classmethod def _stash_user(cls, user): """Now, be aware, the following is quite ugly, let me explain: Even if the user credentials match, the authentication can fail because Django's default ModelBackend calls user_can_authenticate(), which checks `is_active`. Now, earlier versions of allauth did not do this and simply returned the user as authenticated, even in case of `is_active=False`. For allauth scope, this does not pose a problem, as these users are properly redirected to an account inactive page. This does pose a problem when the allauth backend is used in a different context where allauth is not responsible for the login. Then, by not checking on `user_can_authenticate()` users will allow to become authenticated whereas according to Django logic this should not be allowed. In order to preserve the allauth behavior while respecting Django's logic, we stash a user for which the password check succeeded but `user_can_authenticate()` failed. In the allauth authentication logic, we can then unstash this user and proceed pointing the user to the account inactive page. """ global _stash ret = getattr(_stash, "user", None) _stash.user = user return ret @classmethod def unstash_authenticated_user(cls): return cls._stash_user(None) django-allauth-0.58.2/allauth/account/decorators.py000066400000000000000000000052071452212273200223110ustar00rootroot00000000000000from functools import wraps from django.contrib.auth import REDIRECT_FIELD_NAME from django.contrib.auth.decorators import login_required from django.shortcuts import render from django.urls import reverse from allauth.account.models import EmailAddress from allauth.account.reauthentication import ( did_recently_authenticate, suspend_request, ) from allauth.account.utils import send_email_confirmation def verified_email_required( function=None, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME ): """ Even when email verification is not mandatory during signup, there may be circumstances during which you really want to prevent unverified users to proceed. This decorator ensures the user is authenticated and has a verified email address. If the former is not the case then the behavior is identical to that of the standard `login_required` decorator. If the latter does not hold, email verification mails are automatically resend and the user is presented with a page informing them they needs to verify their email address. """ def decorator(view_func): @login_required(redirect_field_name=redirect_field_name, login_url=login_url) def _wrapped_view(request, *args, **kwargs): if not EmailAddress.objects.filter( user=request.user, verified=True ).exists(): send_email_confirmation(request, request.user) return render(request, "account/verified_email_required.html") return view_func(request, *args, **kwargs) return _wrapped_view if function: return decorator(function) return decorator def reauthentication_required( function=None, redirect_field_name=REDIRECT_FIELD_NAME, allow_get=False, enabled=None, ): def decorator(view_func): @wraps(view_func) def _wrapper_view(request, *args, **kwargs): pass_method = allow_get and request.method == "GET" ena = (enabled is None) or ( enabled(request) if callable(enabled) else enabled ) if ena and not pass_method: if request.user.is_anonymous or not did_recently_authenticate(request): redirect_url = reverse( "account_login" if request.user.is_anonymous else "account_reauthenticate" ) return suspend_request(request, redirect_url) return view_func(request, *args, **kwargs) return _wrapper_view if function: return decorator(function) return decorator django-allauth-0.58.2/allauth/account/forms.py000066400000000000000000000606251452212273200212770ustar00rootroot00000000000000from importlib import import_module from django import forms from django.contrib.auth import password_validation from django.contrib.auth.tokens import PasswordResetTokenGenerator from django.contrib.sites.shortcuts import get_current_site from django.core import exceptions, validators from django.urls import NoReverseMatch, reverse from django.utils.safestring import mark_safe from django.utils.translation import gettext, gettext_lazy as _, pgettext from ..utils import ( build_absolute_uri, get_username_max_length, set_form_field_order, ) from . import app_settings from .adapter import get_adapter from .app_settings import AuthenticationMethod from .models import EmailAddress from .utils import ( assess_unique_email, filter_users_by_email, get_user_model, perform_login, setup_user_email, sync_user_email_addresses, url_str_to_user_pk, user_email, user_pk_to_url_str, user_username, ) class EmailAwarePasswordResetTokenGenerator(PasswordResetTokenGenerator): def _make_hash_value(self, user, timestamp): ret = super(EmailAwarePasswordResetTokenGenerator, self)._make_hash_value( user, timestamp ) sync_user_email_addresses(user) email = user_email(user) emails = set([email] if email else []) emails.update( EmailAddress.objects.filter(user=user).values_list("email", flat=True) ) ret += "|".join(sorted(emails)) return ret default_token_generator = app_settings.PASSWORD_RESET_TOKEN_GENERATOR() class PasswordVerificationMixin(object): def clean(self): cleaned_data = super(PasswordVerificationMixin, self).clean() password1 = cleaned_data.get("password1") password2 = cleaned_data.get("password2") if (password1 and password2) and password1 != password2: self.add_error("password2", _("You must type the same password each time.")) return cleaned_data class PasswordField(forms.CharField): def __init__(self, *args, **kwargs): render_value = kwargs.pop( "render_value", app_settings.PASSWORD_INPUT_RENDER_VALUE ) kwargs["widget"] = forms.PasswordInput( render_value=render_value, attrs={"placeholder": kwargs.get("label")}, ) autocomplete = kwargs.pop("autocomplete", None) if autocomplete is not None: kwargs["widget"].attrs["autocomplete"] = autocomplete super(PasswordField, self).__init__(*args, **kwargs) class SetPasswordField(PasswordField): def __init__(self, *args, **kwargs): kwargs["autocomplete"] = "new-password" super(SetPasswordField, self).__init__(*args, **kwargs) self.user = None def clean(self, value): value = super(SetPasswordField, self).clean(value) value = get_adapter().clean_password(value, user=self.user) return value class LoginForm(forms.Form): password = PasswordField(label=_("Password"), autocomplete="current-password") remember = forms.BooleanField(label=_("Remember Me"), required=False) user = None error_messages = { "account_inactive": _("This account is currently inactive."), "email_password_mismatch": _( "The email address and/or password you specified are not correct." ), "username_password_mismatch": _( "The username and/or password you specified are not correct." ), } def __init__(self, *args, **kwargs): self.request = kwargs.pop("request", None) super(LoginForm, self).__init__(*args, **kwargs) if app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.EMAIL: login_widget = forms.TextInput( attrs={ "type": "email", "placeholder": _("Email address"), "autocomplete": "email", } ) login_field = forms.EmailField(label=_("Email"), widget=login_widget) elif app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.USERNAME: login_widget = forms.TextInput( attrs={"placeholder": _("Username"), "autocomplete": "username"} ) login_field = forms.CharField( label=_("Username"), widget=login_widget, max_length=get_username_max_length(), ) else: assert ( app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.USERNAME_EMAIL ) login_widget = forms.TextInput( attrs={"placeholder": _("Username or email"), "autocomplete": "email"} ) login_field = forms.CharField( label=pgettext("field label", "Login"), widget=login_widget ) self.fields["login"] = login_field set_form_field_order(self, ["login", "password", "remember"]) if app_settings.SESSION_REMEMBER is not None: del self.fields["remember"] try: reset_url = reverse("account_reset_password") except NoReverseMatch: pass else: forgot_txt = _("Forgot your password?") self.fields["password"].help_text = mark_safe( f'{forgot_txt}' ) def user_credentials(self): """ Provides the credentials required to authenticate the user for login. """ credentials = {} login = self.cleaned_data["login"] if app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.EMAIL: credentials["email"] = login elif app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.USERNAME: credentials["username"] = login else: if self._is_login_email(login): credentials["email"] = login credentials["username"] = login credentials["password"] = self.cleaned_data["password"] return credentials def clean_login(self): login = self.cleaned_data["login"] return login.strip() def _is_login_email(self, login): try: validators.validate_email(login) ret = True except exceptions.ValidationError: ret = False return ret def clean(self): super(LoginForm, self).clean() if self._errors: return credentials = self.user_credentials() user = get_adapter(self.request).authenticate(self.request, **credentials) if user: self.user = user else: auth_method = app_settings.AUTHENTICATION_METHOD if auth_method == app_settings.AuthenticationMethod.USERNAME_EMAIL: login = self.cleaned_data["login"] if self._is_login_email(login): auth_method = app_settings.AuthenticationMethod.EMAIL else: auth_method = app_settings.AuthenticationMethod.USERNAME raise forms.ValidationError( self.error_messages["%s_password_mismatch" % auth_method] ) return self.cleaned_data def login(self, request, redirect_url=None): email = self.user_credentials().get("email") ret = perform_login( request, self.user, email_verification=app_settings.EMAIL_VERIFICATION, redirect_url=redirect_url, email=email, ) remember = app_settings.SESSION_REMEMBER if remember is None: remember = self.cleaned_data["remember"] if remember: request.session.set_expiry(app_settings.SESSION_COOKIE_AGE) else: request.session.set_expiry(0) return ret class _DummyCustomSignupForm(forms.Form): def signup(self, request, user): """ Invoked at signup time to complete the signup of the user. """ pass def _base_signup_form_class(): """ Currently, we inherit from the custom form, if any. This is all not very elegant, though it serves a purpose: - There are two signup forms: one for local accounts, and one for social accounts - Both share a common base (BaseSignupForm) - Given the above, how to put in a custom signup form? Which form would your custom form derive from, the local or the social one? """ if not app_settings.SIGNUP_FORM_CLASS: return _DummyCustomSignupForm try: fc_module, fc_classname = app_settings.SIGNUP_FORM_CLASS.rsplit(".", 1) except ValueError: raise exceptions.ImproperlyConfigured( "%s does not point to a form class" % app_settings.SIGNUP_FORM_CLASS ) try: mod = import_module(fc_module) except ImportError as e: raise exceptions.ImproperlyConfigured( "Error importing form class %s:" ' "%s"' % (fc_module, e) ) try: fc_class = getattr(mod, fc_classname) except AttributeError: raise exceptions.ImproperlyConfigured( 'Module "%s" does not define a' ' "%s" class' % (fc_module, fc_classname) ) if not hasattr(fc_class, "signup"): raise exceptions.ImproperlyConfigured( "The custom signup form must offer" " a `def signup(self, request, user)` method", ) return fc_class class BaseSignupForm(_base_signup_form_class()): username = forms.CharField( label=_("Username"), min_length=app_settings.USERNAME_MIN_LENGTH, widget=forms.TextInput( attrs={"placeholder": _("Username"), "autocomplete": "username"} ), ) email = forms.EmailField( widget=forms.TextInput( attrs={ "type": "email", "placeholder": _("Email address"), "autocomplete": "email", } ) ) def __init__(self, *args, **kwargs): email_required = kwargs.pop("email_required", app_settings.EMAIL_REQUIRED) self.username_required = kwargs.pop( "username_required", app_settings.USERNAME_REQUIRED ) self.account_already_exists = False super(BaseSignupForm, self).__init__(*args, **kwargs) username_field = self.fields["username"] username_field.max_length = get_username_max_length() username_field.validators.append( validators.MaxLengthValidator(username_field.max_length) ) username_field.widget.attrs["maxlength"] = str(username_field.max_length) default_field_order = [ "email", "email2", # ignored when not present "username", "password1", "password2", # ignored when not present ] if app_settings.SIGNUP_EMAIL_ENTER_TWICE: self.fields["email2"] = forms.EmailField( label=_("Email (again)"), widget=forms.TextInput( attrs={ "type": "email", "placeholder": _("Email address confirmation"), } ), ) if email_required: self.fields["email"].label = gettext("Email") self.fields["email"].required = True else: self.fields["email"].label = gettext("Email (optional)") self.fields["email"].required = False self.fields["email"].widget.is_required = False if self.username_required: default_field_order = [ "username", "email", "email2", # ignored when not present "password1", "password2", # ignored when not present ] if not self.username_required: del self.fields["username"] set_form_field_order( self, getattr(self, "field_order", None) or default_field_order ) def clean_username(self): value = self.cleaned_data["username"] value = get_adapter().clean_username(value) # Note regarding preventing enumeration: if the username is already # taken, but the email address is not, we would still leak information # if we were to send an email to that email address stating that the # username is already in use. return value def clean_email(self): value = self.cleaned_data["email"] value = get_adapter().clean_email(value) if value and app_settings.UNIQUE_EMAIL: value = self.validate_unique_email(value) return value def validate_unique_email(self, value): adapter = get_adapter() assessment = assess_unique_email(value) if assessment is True: # All good. pass elif assessment is False: # Fail right away. raise forms.ValidationError(adapter.error_messages["email_taken"]) else: assert assessment is None self.account_already_exists = True return adapter.validate_unique_email(value) def clean(self): cleaned_data = super(BaseSignupForm, self).clean() if app_settings.SIGNUP_EMAIL_ENTER_TWICE: email = cleaned_data.get("email") email2 = cleaned_data.get("email2") if (email and email2) and email != email2: self.add_error("email2", _("You must type the same email each time.")) return cleaned_data def custom_signup(self, request, user): self.signup(request, user) def try_save(self, request): """Try and save te user. This can fail in case of a conflict on the email address, in that case we will send an "account already exists" email and return a standard "email verification sent" response. """ if self.account_already_exists: # Don't create a new account, only send an email informing the user # that (s)he already has one... email = self.cleaned_data["email"] adapter = get_adapter() adapter.send_account_already_exists_mail(email) user = None resp = adapter.respond_email_verification_sent(request, None) else: user = self.save(request) resp = None return user, resp class SignupForm(BaseSignupForm): def __init__(self, *args, **kwargs): super(SignupForm, self).__init__(*args, **kwargs) self.fields["password1"] = PasswordField( label=_("Password"), autocomplete="new-password", help_text=password_validation.password_validators_help_text_html(), ) if app_settings.SIGNUP_PASSWORD_ENTER_TWICE: self.fields["password2"] = PasswordField( label=_("Password (again)"), autocomplete="new-password" ) if hasattr(self, "field_order"): set_form_field_order(self, self.field_order) def clean(self): super(SignupForm, self).clean() # `password` cannot be of type `SetPasswordField`, as we don't # have a `User` yet. So, let's populate a dummy user to be used # for password validation. User = get_user_model() dummy_user = User() user_username(dummy_user, self.cleaned_data.get("username")) user_email(dummy_user, self.cleaned_data.get("email")) password = self.cleaned_data.get("password1") if password: try: get_adapter().clean_password(password, user=dummy_user) except forms.ValidationError as e: self.add_error("password1", e) if ( app_settings.SIGNUP_PASSWORD_ENTER_TWICE and "password1" in self.cleaned_data and "password2" in self.cleaned_data ): if self.cleaned_data["password1"] != self.cleaned_data["password2"]: self.add_error( "password2", _("You must type the same password each time."), ) return self.cleaned_data def save(self, request): email = self.cleaned_data.get("email") if self.account_already_exists: raise ValueError(email) adapter = get_adapter() user = adapter.new_user(request) adapter.save_user(request, user, self) self.custom_signup(request, user) # TODO: Move into adapter `save_user` ? setup_user_email(request, user, [EmailAddress(email=email)] if email else []) return user class UserForm(forms.Form): def __init__(self, user=None, *args, **kwargs): self.user = user super(UserForm, self).__init__(*args, **kwargs) class AddEmailForm(UserForm): email = forms.EmailField( label=_("Email"), required=True, widget=forms.TextInput( attrs={"type": "email", "placeholder": _("Email address")} ), ) def clean_email(self): from allauth.account import signals value = self.cleaned_data["email"] adapter = get_adapter() value = adapter.clean_email(value) errors = { "this_account": _( "This email address is already associated with this account." ), "max_email_addresses": _("You cannot add more than %d email addresses."), } users = filter_users_by_email(value) on_this_account = [u for u in users if u.pk == self.user.pk] on_diff_account = [u for u in users if u.pk != self.user.pk] if on_this_account: raise forms.ValidationError(errors["this_account"]) if ( on_diff_account and app_settings.PREVENT_ENUMERATION != "strict" and app_settings.UNIQUE_EMAIL ): raise forms.ValidationError(adapter.error_messages["email_taken"]) if not EmailAddress.objects.can_add_email(self.user): raise forms.ValidationError( errors["max_email_addresses"] % app_settings.MAX_EMAIL_ADDRESSES ) signals._add_email.send( sender=self.user.__class__, email=value, user=self.user, ) return value def save(self, request): if app_settings.CHANGE_EMAIL: return EmailAddress.objects.add_new_email( request, self.user, self.cleaned_data["email"] ) return EmailAddress.objects.add_email( request, self.user, self.cleaned_data["email"], confirm=True ) class ChangePasswordForm(PasswordVerificationMixin, UserForm): oldpassword = PasswordField( label=_("Current Password"), autocomplete="current-password" ) password1 = SetPasswordField( label=_("New Password"), help_text=password_validation.password_validators_help_text_html(), ) password2 = PasswordField(label=_("New Password (again)")) def __init__(self, *args, **kwargs): super(ChangePasswordForm, self).__init__(*args, **kwargs) self.fields["password1"].user = self.user def clean_oldpassword(self): if not self.user.check_password(self.cleaned_data.get("oldpassword")): raise forms.ValidationError(_("Please type your current password.")) return self.cleaned_data["oldpassword"] def save(self): get_adapter().set_password(self.user, self.cleaned_data["password1"]) class SetPasswordForm(PasswordVerificationMixin, UserForm): password1 = SetPasswordField( label=_("Password"), help_text=password_validation.password_validators_help_text_html(), ) password2 = PasswordField(label=_("Password (again)")) def __init__(self, *args, **kwargs): super(SetPasswordForm, self).__init__(*args, **kwargs) self.fields["password1"].user = self.user def save(self): get_adapter().set_password(self.user, self.cleaned_data["password1"]) class ResetPasswordForm(forms.Form): email = forms.EmailField( label=_("Email"), required=True, widget=forms.TextInput( attrs={ "type": "email", "placeholder": _("Email address"), "autocomplete": "email", } ), ) def clean_email(self): email = self.cleaned_data["email"] email = get_adapter().clean_email(email) self.users = filter_users_by_email(email, is_active=True, prefer_verified=True) if not self.users and not app_settings.PREVENT_ENUMERATION: raise forms.ValidationError( _("The email address is not assigned to any user account") ) return self.cleaned_data["email"] def save(self, request, **kwargs): email = self.cleaned_data["email"] if not self.users: self._send_unknown_account_mail(request, email) else: self._send_password_reset_mail(request, email, self.users, **kwargs) return email def _send_unknown_account_mail(self, request, email): signup_url = build_absolute_uri(request, reverse("account_signup")) context = { "current_site": get_current_site(request), "email": email, "request": request, "signup_url": signup_url, } get_adapter().send_mail("account/email/unknown_account", email, context) def _send_password_reset_mail(self, request, email, users, **kwargs): token_generator = kwargs.get("token_generator", default_token_generator) for user in users: temp_key = token_generator.make_token(user) # save it to the password reset model # password_reset = PasswordReset(user=user, temp_key=temp_key) # password_reset.save() # send the password reset email uid = user_pk_to_url_str(user) path = reverse( "account_reset_password_from_key", kwargs=dict(uidb36=uid, key=temp_key), ) url = build_absolute_uri(request, path) context = { "current_site": get_current_site(request), "user": user, "password_reset_url": url, "uid": uid, "key": temp_key, "request": request, } if app_settings.AUTHENTICATION_METHOD != AuthenticationMethod.EMAIL: context["username"] = user_username(user) get_adapter().send_mail("account/email/password_reset_key", email, context) class ResetPasswordKeyForm(PasswordVerificationMixin, forms.Form): password1 = SetPasswordField(label=_("New Password")) password2 = PasswordField(label=_("New Password (again)")) def __init__(self, *args, **kwargs): self.user = kwargs.pop("user", None) self.temp_key = kwargs.pop("temp_key", None) super(ResetPasswordKeyForm, self).__init__(*args, **kwargs) self.fields["password1"].user = self.user def save(self): get_adapter().set_password(self.user, self.cleaned_data["password1"]) class UserTokenForm(forms.Form): uidb36 = forms.CharField() key = forms.CharField() reset_user = None token_generator = default_token_generator error_messages = { "token_invalid": _("The password reset token was invalid."), } def _get_user(self, uidb36): User = get_user_model() try: pk = url_str_to_user_pk(uidb36) return User.objects.get(pk=pk) except (ValueError, User.DoesNotExist): return None def clean(self): cleaned_data = super(UserTokenForm, self).clean() uidb36 = cleaned_data.get("uidb36", None) key = cleaned_data.get("key", None) if not key: raise forms.ValidationError(self.error_messages["token_invalid"]) self.reset_user = self._get_user(uidb36) if self.reset_user is None or not self.token_generator.check_token( self.reset_user, key ): raise forms.ValidationError(self.error_messages["token_invalid"]) return cleaned_data class ReauthenticateForm(forms.Form): password = PasswordField(label=_("Password"), autocomplete="current-password") def __init__(self, *args, **kwargs): self.user = kwargs.pop("user") super().__init__(*args, **kwargs) def clean_password(self): password = self.cleaned_data.get("password") if not self.user.check_password(password): raise forms.ValidationError( get_adapter().error_messages["incorrect_password"] ) return password django-allauth-0.58.2/allauth/account/management/000077500000000000000000000000001452212273200217025ustar00rootroot00000000000000django-allauth-0.58.2/allauth/account/management/__init__.py000066400000000000000000000000001452212273200240010ustar00rootroot00000000000000django-allauth-0.58.2/allauth/account/management/commands/000077500000000000000000000000001452212273200235035ustar00rootroot00000000000000django-allauth-0.58.2/allauth/account/management/commands/__init__.py000066400000000000000000000000001452212273200256020ustar00rootroot00000000000000django-allauth-0.58.2/allauth/account/management/commands/account_unsetmultipleprimaryemails.py000066400000000000000000000032261452212273200333050ustar00rootroot00000000000000from django.contrib.auth import get_user_model from django.core.management.base import BaseCommand from django.db.models import Count from allauth.account.models import EmailAddress from allauth.account.utils import user_email class Command(BaseCommand): def handle(self, *args, **options): for user in self.get_users_with_multiple_primary_email(): self.unprimary_extra_primary_emails(user) def get_users_with_multiple_primary_email(self): user_pks = [] for email_address_dict in ( EmailAddress.objects.filter(primary=True) .values("user") .annotate(Count("user")) .filter(user__count__gt=1) ): user_pks.append(email_address_dict["user"]) return get_user_model().objects.filter(pk__in=user_pks) def unprimary_extra_primary_emails(self, user): primary_email_addresses = EmailAddress.objects.filter(user=user, primary=True) for primary_email_address in primary_email_addresses: if primary_email_address.email == user_email(user): break else: # Didn't find the main email addresses and break the for loop print( "WARNING: Multiple primary without a user.email match for" "user pk %s; (tried: %s, using: %s)" ) % ( user.pk, ", ".join( [email_address.email for email_address in primary_email_addresses] ), primary_email_address, ) primary_email_addresses.exclude(pk=primary_email_address.pk).update( primary=False ) django-allauth-0.58.2/allauth/account/managers.py000066400000000000000000000104651452212273200217430ustar00rootroot00000000000000import functools from datetime import timedelta from django.db import models from django.db.models import Q from django.utils import timezone from . import app_settings class EmailAddressManager(models.Manager): def can_add_email(self, user): ret = True if app_settings.CHANGE_EMAIL: # We always allow adding an email in this case, regardless of # `MAX_EMAIL_ADDRESSES`, as adding actually adds a temporary email # that the user wants to change to. return True elif app_settings.MAX_EMAIL_ADDRESSES: count = self.filter(user=user).count() ret = count < app_settings.MAX_EMAIL_ADDRESSES return ret def get_new(self, user): """ Returns the email address the user is in the process of changing to, if any. """ assert app_settings.CHANGE_EMAIL return ( self.model.objects.filter(user=user, verified=False).order_by("pk").last() ) def add_new_email(self, request, user, email): """ Adds an email address the user wishes to change to, replacing his current email address once confirmed. """ assert app_settings.CHANGE_EMAIL instance = self.get_new(user) if not instance: instance = self.model.objects.create(user=user, email=email) else: # Apparently, the user was already in the process of changing his # email. Reuse that temporary email address. instance.email = email instance.verified = False instance.primary = False instance.save() instance.send_confirmation(request) return instance def add_email(self, request, user, email, confirm=False, signup=False): email_address, created = self.get_or_create( user=user, email__iexact=email, defaults={"email": email} ) if created and confirm: email_address.send_confirmation(request, signup=signup) return email_address def get_verified(self, user): return self.filter(user=user, verified=True).order_by("-primary", "pk").first() def get_primary(self, user): try: return self.get(user=user, primary=True) except self.model.DoesNotExist: return None def get_users_for(self, email): # this is a list rather than a generator because we probably want to # do a len() on it right away return [ address.user for address in self.filter(verified=True, email__iexact=email) ] def fill_cache_for_user(self, user, addresses): """ In a multi-db setup, inserting records and re-reading them later on may result in not being able to find newly inserted records. Therefore, we maintain a cache for the user so that we can avoid database access when we need to re-read.. """ user._emailaddress_cache = addresses def get_for_user(self, user, email): cache_key = "_emailaddress_cache" addresses = getattr(user, cache_key, None) if addresses is None: ret = self.get(user=user, email__iexact=email) # To avoid additional lookups when e.g. # EmailAddress.set_as_primary() starts touching self.user ret.user = user return ret else: for address in addresses: if address.email.lower() == email.lower(): return address raise self.model.DoesNotExist() def is_verified(self, email): return self.filter(email__iexact=email, verified=True).exists() def lookup(self, emails): q_list = [Q(email__iexact=e) for e in emails] if not q_list: return self.none() q = functools.reduce(lambda a, b: a | b, q_list) return self.filter(q) class EmailConfirmationManager(models.Manager): def all_expired(self): return self.filter(self.expired_q()) def all_valid(self): return self.exclude(self.expired_q()) def expired_q(self): sent_threshold = timezone.now() - timedelta( days=app_settings.EMAIL_CONFIRMATION_EXPIRE_DAYS ) return Q(sent__lt=sent_threshold) def delete_expired_confirmations(self): self.all_expired().delete() django-allauth-0.58.2/allauth/account/middleware.py000066400000000000000000000025101452212273200222530ustar00rootroot00000000000000from django.conf import settings from allauth.core import context from allauth.core.exceptions import ImmediateHttpResponse class AccountMiddleware: def __init__(self, get_response): self.get_response = get_response # One-time configuration and initialization. def __call__(self, request): with context.request_context(request): response = self.get_response(request) self._remove_dangling_login(request, response) return response def process_exception(self, request, exception): if isinstance(exception, ImmediateHttpResponse): return exception.response def _remove_dangling_login(self, request, response): content_type = response.headers.get("content-type") if content_type: content_type = content_type.partition(";")[0] if content_type and content_type != "text/html": return if request.path.startswith(settings.STATIC_URL) or request.path in [ "/favicon.ico", "/robots.txt", "/humans.txt", ]: return if response.status_code // 100 != 2: return if not getattr(request, "_account_login_accessed", False): if "account_login" in request.session: request.session.pop("account_login") django-allauth-0.58.2/allauth/account/migrations/000077500000000000000000000000001452212273200217425ustar00rootroot00000000000000django-allauth-0.58.2/allauth/account/migrations/0001_initial.py000066400000000000000000000064761452212273200244220ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals import django.utils.timezone from django.conf import settings from django.db import migrations, models UNIQUE_EMAIL = getattr(settings, "ACCOUNT_UNIQUE_EMAIL", True) class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name="EmailAddress", fields=[ ( "id", models.AutoField( verbose_name="ID", serialize=False, auto_created=True, primary_key=True, ), ), ( "email", models.EmailField( unique=UNIQUE_EMAIL, max_length=75, verbose_name="email address", ), ), ( "verified", models.BooleanField(default=False, verbose_name="verified"), ), ( "primary", models.BooleanField(default=False, verbose_name="primary"), ), ( "user", models.ForeignKey( verbose_name="user", to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE, ), ), ], options={ "verbose_name": "email address", "verbose_name_plural": "email addresses", }, bases=(models.Model,), ), migrations.CreateModel( name="EmailConfirmation", fields=[ ( "id", models.AutoField( verbose_name="ID", serialize=False, auto_created=True, primary_key=True, ), ), ( "created", models.DateTimeField( default=django.utils.timezone.now, verbose_name="created", ), ), ("sent", models.DateTimeField(null=True, verbose_name="sent")), ( "key", models.CharField(unique=True, max_length=64, verbose_name="key"), ), ( "email_address", models.ForeignKey( verbose_name="email address", to="account.EmailAddress", on_delete=models.CASCADE, ), ), ], options={ "verbose_name": "email confirmation", "verbose_name_plural": "email confirmations", }, bases=(models.Model,), ), ] if not UNIQUE_EMAIL: operations += [ migrations.AlterUniqueTogether( name="emailaddress", unique_together=set([("user", "email")]), ), ] django-allauth-0.58.2/allauth/account/migrations/0002_email_max_length.py000066400000000000000000000016121452212273200262520ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.conf import settings from django.db import migrations, models UNIQUE_EMAIL = getattr(settings, "ACCOUNT_UNIQUE_EMAIL", True) EMAIL_MAX_LENGTH = getattr(settings, "ACCOUNT_EMAIL_MAX_LENGTH", 254) class Migration(migrations.Migration): dependencies = [ ("account", "0001_initial"), ] operations = [ migrations.AlterField( model_name="emailaddress", name="email", field=models.EmailField( unique=UNIQUE_EMAIL, max_length=EMAIL_MAX_LENGTH, verbose_name="email address", ), ), ] if not UNIQUE_EMAIL: operations += [ migrations.AlterUniqueTogether( name="emailaddress", unique_together=set([("user", "email")]), ), ] 0003_alter_emailaddress_create_unique_verified_email.py000066400000000000000000000015711452212273200344640ustar00rootroot00000000000000django-allauth-0.58.2/allauth/account/migrations# Generated by Django 4.2.2 on 2023-06-14 12:52 from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ("account", "0002_email_max_length"), ] operations = ( [ migrations.AlterUniqueTogether( name="emailaddress", unique_together={("user", "email")}, ), migrations.AddConstraint( model_name="emailaddress", constraint=models.UniqueConstraint( condition=models.Q(("verified", True)), fields=["email"], name="unique_verified_email", ), ), ] if getattr(settings, "ACCOUNT_UNIQUE_EMAIL", True) else [] ) django-allauth-0.58.2/allauth/account/migrations/0004_alter_emailaddress_drop_unique_email.py000066400000000000000000000010461452212273200323650ustar00rootroot00000000000000from django.conf import settings from django.db import migrations, models EMAIL_MAX_LENGTH = getattr(settings, "ACCOUNT_EMAIL_MAX_LENGTH", 254) class Migration(migrations.Migration): dependencies = [ ("account", "0003_alter_emailaddress_create_unique_verified_email"), ] operations = [ migrations.AlterField( model_name="emailaddress", name="email", field=models.EmailField( max_length=EMAIL_MAX_LENGTH, verbose_name="email address" ), ), ] django-allauth-0.58.2/allauth/account/migrations/0005_emailaddress_idx_upper_email.py000066400000000000000000000010221452212273200306360ustar00rootroot00000000000000# Generated by Django 4.2.4 on 2023-08-23 18:17 import django.db.models.functions.text from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ("account", "0004_alter_emailaddress_drop_unique_email"), ] operations = [ migrations.AddIndex( model_name="emailaddress", index=models.Index( django.db.models.functions.text.Upper("email"), name="account_emailaddress_upper", ), ), ] django-allauth-0.58.2/allauth/account/migrations/__init__.py000066400000000000000000000000001452212273200240410ustar00rootroot00000000000000django-allauth-0.58.2/allauth/account/models.py000066400000000000000000000215321452212273200214260ustar00rootroot00000000000000import datetime from django.conf import settings from django.contrib.auth import get_user_model from django.core import signing from django.db import models from django.db.models import Index, Q from django.db.models.constraints import UniqueConstraint from django.db.models.functions import Upper from django.utils import timezone from django.utils.translation import gettext_lazy as _ from . import app_settings, signals from .adapter import get_adapter from .managers import EmailAddressManager, EmailConfirmationManager class EmailAddress(models.Model): user = models.ForeignKey( settings.AUTH_USER_MODEL, verbose_name=_("user"), on_delete=models.CASCADE, ) email = models.EmailField( max_length=app_settings.EMAIL_MAX_LENGTH, verbose_name=_("email address"), ) verified = models.BooleanField(verbose_name=_("verified"), default=False) primary = models.BooleanField(verbose_name=_("primary"), default=False) objects = EmailAddressManager() class Meta: verbose_name = _("email address") verbose_name_plural = _("email addresses") unique_together = [("user", "email")] if app_settings.UNIQUE_EMAIL: constraints = [ UniqueConstraint( fields=["email"], name="unique_verified_email", condition=Q(verified=True), ) ] indexes = [Index(Upper("email"), name="account_emailaddress_upper")] def __str__(self): return self.email def can_set_verified(self): if self.verified: return True conflict = False if app_settings.UNIQUE_EMAIL: conflict = ( EmailAddress.objects.exclude(pk=self.pk) .filter(verified=True, email__iexact=self.email) .exists() ) return not conflict def set_verified(self, commit=True): if self.verified: return True if self.can_set_verified(): self.verified = True if commit: self.save(update_fields=["verified"]) return self.verified def set_as_primary(self, conditional=False): """Marks the email address as primary. In case of `conditional`, it is only marked as primary if there is no other primary email address set. """ from allauth.account.utils import user_email old_primary = EmailAddress.objects.get_primary(self.user) if old_primary: if conditional: return False old_primary.primary = False old_primary.save() self.primary = True self.save() user_email(self.user, self.email, commit=True) return True def send_confirmation(self, request=None, signup=False): if app_settings.EMAIL_CONFIRMATION_HMAC: confirmation = EmailConfirmationHMAC(self) else: confirmation = EmailConfirmation.create(self) confirmation.send(request, signup=signup) return confirmation def remove(self): from allauth.account.utils import user_email self.delete() if user_email(self.user) == self.email: alt = ( EmailAddress.objects.filter(user=self.user) .order_by("-verified") .first() ) alt_email = "" if alt: alt_email = alt.email user_email(self.user, alt_email, commit=True) class EmailConfirmationMixin: def confirm(self, request): email_address = self.email_address if not email_address.verified: confirmed = get_adapter().confirm_email(request, email_address) if confirmed: signals.email_confirmed.send( sender=self.__class__, request=request, email_address=email_address, ) return email_address def send(self, request=None, signup=False): get_adapter().send_confirmation_mail(request, self, signup) signals.email_confirmation_sent.send( sender=self.__class__, request=request, confirmation=self, signup=signup, ) class EmailConfirmation(EmailConfirmationMixin, models.Model): email_address = models.ForeignKey( EmailAddress, verbose_name=_("email address"), on_delete=models.CASCADE, ) created = models.DateTimeField(verbose_name=_("created"), default=timezone.now) sent = models.DateTimeField(verbose_name=_("sent"), null=True) key = models.CharField(verbose_name=_("key"), max_length=64, unique=True) objects = EmailConfirmationManager() class Meta: verbose_name = _("email confirmation") verbose_name_plural = _("email confirmations") def __str__(self): return "confirmation for %s" % self.email_address @classmethod def create(cls, email_address): key = get_adapter().generate_emailconfirmation_key(email_address.email) return cls._default_manager.create(email_address=email_address, key=key) def key_expired(self): expiration_date = self.sent + datetime.timedelta( days=app_settings.EMAIL_CONFIRMATION_EXPIRE_DAYS ) return expiration_date <= timezone.now() key_expired.boolean = True def confirm(self, request): if not self.key_expired(): return super().confirm(request) def send(self, request=None, signup=False): super().send(request=request, signup=signup) self.sent = timezone.now() self.save() class EmailConfirmationHMAC(EmailConfirmationMixin, object): def __init__(self, email_address): self.email_address = email_address @property def key(self): return signing.dumps(obj=self.email_address.pk, salt=app_settings.SALT) @classmethod def from_key(cls, key): try: max_age = 60 * 60 * 24 * app_settings.EMAIL_CONFIRMATION_EXPIRE_DAYS pk = signing.loads(key, max_age=max_age, salt=app_settings.SALT) ret = EmailConfirmationHMAC(EmailAddress.objects.get(pk=pk, verified=False)) except ( signing.SignatureExpired, signing.BadSignature, EmailAddress.DoesNotExist, ): ret = None return ret class Login: """ Represents a user that is in the process of logging in. """ def __init__( self, user, email_verification, redirect_url=None, signal_kwargs=None, signup=False, email=None, state=None, ): self.user = user self.email_verification = email_verification self.redirect_url = redirect_url self.signal_kwargs = signal_kwargs self.signup = signup self.email = email self.state = {} if state is None else state def serialize(self): from allauth.account.utils import user_pk_to_url_str # :-( Knowledge of the `socialaccount` is entering the `account` app. signal_kwargs = self.signal_kwargs if signal_kwargs is not None: sociallogin = signal_kwargs.get("sociallogin") if sociallogin is not None: signal_kwargs = signal_kwargs.copy() signal_kwargs["sociallogin"] = sociallogin.serialize() data = { "user_pk": user_pk_to_url_str(self.user), "email_verification": self.email_verification, "signup": self.signup, "redirect_url": self.redirect_url, "email": self.email, "signal_kwargs": signal_kwargs, "state": self.state, } return data @classmethod def deserialize(cls, data): from allauth.account.utils import url_str_to_user_pk from allauth.socialaccount.models import SocialLogin user = ( get_user_model() .objects.filter(pk=url_str_to_user_pk(data["user_pk"])) .first() ) if user is None: raise ValueError() try: # :-( Knowledge of the `socialaccount` is entering the `account` app. signal_kwargs = data["signal_kwargs"] if signal_kwargs is not None: sociallogin = signal_kwargs.get("sociallogin") if sociallogin is not None: signal_kwargs = signal_kwargs.copy() signal_kwargs["sociallogin"] = SocialLogin.deserialize(sociallogin) return Login( user=user, email_verification=data["email_verification"], redirect_url=data["redirect_url"], signup=data["signup"], signal_kwargs=signal_kwargs, state=data["state"], ) except KeyError: raise ValueError() django-allauth-0.58.2/allauth/account/reauthentication.py000066400000000000000000000054301452212273200235100ustar00rootroot00000000000000import time from django.contrib.auth import REDIRECT_FIELD_NAME from django.http import HttpResponseRedirect from django.urls import resolve, reverse from django.utils.http import urlencode from allauth.account import app_settings from allauth.account.utils import get_next_redirect_url from allauth.core.internal.http import deserialize_request, serialize_request from allauth.utils import import_callable STATE_SESSION_KEY = "account_reauthentication_state" AUTHENTICATED_AT_SESSION_KEY = "account_authenticated_at" def suspend_request(request, redirect_to): path = request.get_full_path() if request.method == "POST": request.session[STATE_SESSION_KEY] = {"request": serialize_request(request)} return HttpResponseRedirect( redirect_to + "?" + urlencode({REDIRECT_FIELD_NAME: path}) ) def resume_request(request): state = request.session.pop(STATE_SESSION_KEY, None) if state and "callback" in state: callback = import_callable(state["callback"]) return callback(request, state["state"]) url = get_next_redirect_url(request, REDIRECT_FIELD_NAME) if not url: return None if state and "request" in state: suspended_request = deserialize_request(state["request"], request) if suspended_request.path == url: resolved = resolve(suspended_request.path) return resolved.func(suspended_request, *resolved.args, **resolved.kwargs) return HttpResponseRedirect(url) def record_authentication(request, user): request.session[AUTHENTICATED_AT_SESSION_KEY] = time.time() def reauthenticate_then_callback(request, serialize_state, callback): # TODO: Currently, ACCOUNT_REAUTHENTICATION_REQUIRED does not play well with # XHR. if did_recently_authenticate(request): return None request.session[STATE_SESSION_KEY] = { "state": serialize_state(request), "callback": callback, } return HttpResponseRedirect(reverse("account_reauthenticate")) def did_recently_authenticate(request): if request.user.is_anonymous: return False if not request.user.has_usable_password(): # TODO: This user only has social accounts attached. Now, ideally, you # would want to reauthenticate over at the social account provider. For # now, this is not implemented. Although definitely suboptimal, this # method is currently used for reauthentication checks over at MFA, and, # users that delegate the security of their account to an external # provider like Google typically use MFA over there anyway. return True authenticated_at = request.session.get(AUTHENTICATED_AT_SESSION_KEY) if not authenticated_at: return False return time.time() - authenticated_at < app_settings.REAUTHENTICATION_TIMEOUT django-allauth-0.58.2/allauth/account/signals.py000066400000000000000000000020121452212273200215730ustar00rootroot00000000000000from django.contrib.auth.signals import user_logged_out # noqa from django.dispatch import Signal # Provides the arguments "request", "user" user_logged_in = Signal() # Typically followed by `user_logged_in` (unless, email verification kicks in) # Provides the arguments "request", "user" user_signed_up = Signal() # Provides the arguments "request", "user" password_set = Signal() # Provides the arguments "request", "user" password_changed = Signal() # Provides the arguments "request", "user" password_reset = Signal() # Provides the arguments "request", "email_address" email_confirmed = Signal() # Provides the arguments "request", "confirmation", "signup" email_confirmation_sent = Signal() # Provides the arguments "request", "user", "from_email_address", # "to_email_address" email_changed = Signal() # Provides the arguments "request", "user", "email_address" email_added = Signal() # Provides the arguments "request", "user", "email_address" email_removed = Signal() # Internal/private signal. _add_email = Signal() django-allauth-0.58.2/allauth/account/stages.py000066400000000000000000000045511452212273200214330ustar00rootroot00000000000000from allauth.account.adapter import get_adapter from allauth.account.utils import resume_login, stash_login, unstash_login from allauth.utils import import_callable class LoginStage: key = None def __init__(self, controller, request, login): if not self.key: raise ValueError() self.controller = controller self.request = request self.login = login def handle(self): return None, True def exit(self): self.controller.set_handled(self.key) return resume_login(self.request, self.login) class LoginStageController: def __init__(self, request, login): self.request = request self.login = login self.state = self.login.state.setdefault("stages", {}) @classmethod def enter(cls, request, stage_key): login = unstash_login(request, peek=True) if not login: return None ctrl = LoginStageController(request, login) if ctrl.state.get("current") != stage_key: return None stages = ctrl.get_stages() for stage in stages: if stage.key == stage_key: return stage return None def set_current(self, stage_key): self.state["current"] = stage_key def is_handled(self, stage_key): return self.state.get(stage_key, {}).get("handled", False) def set_handled(self, stage_key, data=None): stage_state = self.state.setdefault(stage_key, {}) stage_state["handled"] = True stage_state["data"] = data def get_stages(self): stages = [] adapter = get_adapter(self.request) paths = adapter.get_login_stages() for path in paths: cls = import_callable(path) stage = cls(self, self.request, self.login) stages.append(stage) return stages def handle(self): stages = self.get_stages() for stage in stages: if self.is_handled(stage.key): continue self.set_current(stage.key) response, cont = stage.handle() if response: if cont: stash_login(self.request, self.login) else: unstash_login(self.request) return response else: assert cont unstash_login(self.request) django-allauth-0.58.2/allauth/account/templatetags/000077500000000000000000000000001452212273200222605ustar00rootroot00000000000000django-allauth-0.58.2/allauth/account/templatetags/__init__.py000066400000000000000000000000001452212273200243570ustar00rootroot00000000000000django-allauth-0.58.2/allauth/account/templatetags/account.py000066400000000000000000000007411452212273200242700ustar00rootroot00000000000000from django import template from allauth.account.utils import user_display register = template.Library() @register.simple_tag(name="user_display") def user_display_tag(user): """ Example usage:: {% user_display user %} or if you need to use in a {% blocktrans %}:: {% user_display user as user_display %} {% blocktrans %} {{ user_display }} has sent you a gift. {% endblocktrans %} """ return user_display(user) django-allauth-0.58.2/allauth/account/tests/000077500000000000000000000000001452212273200207305ustar00rootroot00000000000000django-allauth-0.58.2/allauth/account/tests/__init__.py000066400000000000000000000000001452212273200230270ustar00rootroot00000000000000django-allauth-0.58.2/allauth/account/tests/test_adapter.py000066400000000000000000000013531452212273200237630ustar00rootroot00000000000000from django.http import HttpResponseRedirect from django.urls import reverse from allauth.account.adapter import DefaultAccountAdapter from allauth.core.exceptions import ImmediateHttpResponse class PreLoginRedirectAccountAdapter(DefaultAccountAdapter): def pre_login(self, *args, **kwargs): raise ImmediateHttpResponse(HttpResponseRedirect("/foo")) def test_adapter_pre_login(settings, user, user_password, client): settings.ACCOUNT_ADAPTER = ( "allauth.account.tests.test_adapter.PreLoginRedirectAccountAdapter" ) resp = client.post( reverse("account_login"), {"login": user.username, "password": user_password}, ) assert resp.status_code == 302 assert resp["location"] == "/foo" django-allauth-0.58.2/allauth/account/tests/test_ajax.py000066400000000000000000000055541452212273200232750ustar00rootroot00000000000000import json from django.conf import settings from django.contrib.auth import get_user_model from django.core import mail from django.test.utils import override_settings from django.urls import reverse from allauth.account import app_settings from allauth.tests import TestCase class AjaxTests(TestCase): def _send_post_request(self, **kwargs): return self.client.post( reverse("account_signup"), { "username": "johndoe", "email": "john@example.org", "email2": "john@example.org", "password1": "johndoe", "password2": "johndoe", }, **kwargs, ) def test_no_ajax_header(self): resp = self._send_post_request() self.assertEqual(302, resp.status_code) self.assertRedirects( resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False ) def test_ajax_header_x_requested_with(self): resp = self._send_post_request(HTTP_X_REQUESTED_WITH="XMLHttpRequest") self.assertEqual(200, resp.status_code) self.assertEqual(settings.LOGIN_REDIRECT_URL, resp.json()["location"]) def test_ajax_header_http_accept(self): resp = self._send_post_request(HTTP_ACCEPT="application/json") self.assertEqual(200, resp.status_code) self.assertEqual(settings.LOGIN_REDIRECT_URL, resp.json()["location"]) def test_ajax_password_reset(self): get_user_model().objects.create( username="john", email="john@example.org", is_active=True ) resp = self.client.post( reverse("account_reset_password"), data={"email": "john@example.org"}, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, ["john@example.org"]) self.assertEqual(resp["content-type"], "application/json") def test_ajax_login_fail(self): resp = self.client.post( reverse("account_login"), {}, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) self.assertEqual(resp.status_code, 400) json.loads(resp.content.decode("utf8")) # TODO: Actually test something @override_settings( ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.OPTIONAL ) def test_ajax_login_success(self): user = get_user_model().objects.create(username="john", is_active=True) user.set_password("doe") user.save() resp = self.client.post( reverse("account_login"), {"login": "john", "password": "doe"}, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) self.assertEqual(resp.status_code, 200) data = json.loads(resp.content.decode("utf8")) self.assertEqual(data["location"], "/accounts/profile/") django-allauth-0.58.2/allauth/account/tests/test_auth_backends.py000066400000000000000000000043651452212273200251440ustar00rootroot00000000000000from django.contrib.auth import get_user_model from django.test.utils import override_settings from allauth.account import app_settings from allauth.account.auth_backends import AuthenticationBackend from allauth.tests import TestCase class AuthenticationBackendTests(TestCase): def setUp(self): user = get_user_model().objects.create( is_active=True, email="john@example.com", username="john" ) user.set_password(user.username) user.save() self.user = user @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.USERNAME ) # noqa def test_auth_by_username(self): user = self.user backend = AuthenticationBackend() self.assertEqual( backend.authenticate( request=None, username=user.username, password=user.username ).pk, user.pk, ) self.assertEqual( backend.authenticate( request=None, username=user.email, password=user.username ), None, ) @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL ) # noqa def test_auth_by_email(self): user = self.user backend = AuthenticationBackend() self.assertEqual( backend.authenticate( request=None, username=user.email, password=user.username ).pk, user.pk, ) self.assertEqual( backend.authenticate( request=None, username=user.username, password=user.username ), None, ) @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.USERNAME_EMAIL ) # noqa def test_auth_by_username_or_email(self): user = self.user backend = AuthenticationBackend() self.assertEqual( backend.authenticate( request=None, username=user.email, password=user.username ).pk, user.pk, ) self.assertEqual( backend.authenticate( request=None, username=user.username, password=user.username ).pk, user.pk, ) django-allauth-0.58.2/allauth/account/tests/test_change_email.py000066400000000000000000000313561452212273200247450ustar00rootroot00000000000000import json from unittest.mock import patch from django.contrib.auth import get_user_model from django.urls import reverse import pytest from pytest_django.asserts import assertTemplateNotUsed, assertTemplateUsed from allauth.account.app_settings import AuthenticationMethod from allauth.account.models import EmailAddress, EmailConfirmationHMAC from allauth.account.utils import user_email def test_ajax_get(auth_client, user): primary = EmailAddress.objects.filter(user=user).first() secondary = EmailAddress.objects.create( email="secondary@email.org", user=user, verified=False, primary=False ) resp = auth_client.get( reverse("account_email"), HTTP_X_REQUESTED_WITH="XMLHttpRequest" ) data = json.loads(resp.content.decode("utf8")) assert data["data"] == [ { "id": primary.pk, "email": primary.email, "primary": True, "verified": True, }, { "id": secondary.pk, "email": secondary.email, "primary": False, "verified": False, }, ] def test_ajax_add(auth_client): resp = auth_client.post( reverse("account_email"), {"action_add": "", "email": "john3@example.org"}, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) data = json.loads(resp.content.decode("utf8")) assert data["location"] == reverse("account_email") def test_ajax_add_invalid(auth_client): resp = auth_client.post( reverse("account_email"), {"action_add": "", "email": "john3#example.org"}, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) data = json.loads(resp.content.decode("utf8")) assert "valid" in data["form"]["fields"]["email"]["errors"][0] def test_ajax_remove_primary(auth_client, user, settings): settings.ACCOUNT_AUTHENTICATION_METHOD = "email" resp = auth_client.post( reverse("account_email"), {"action_remove": "", "email": user.email}, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) assertTemplateUsed(resp, "account/messages/cannot_delete_primary_email.txt") data = json.loads(resp.content.decode("utf8")) assert data["location"] == reverse("account_email") def test_remove_secondary(auth_client, user): secondary = EmailAddress.objects.create( email="secondary@email.org", user=user, verified=False, primary=False ) resp = auth_client.post( reverse("account_email"), {"action_remove": "", "email": secondary.email}, ) assert not EmailAddress.objects.filter(email=secondary.pk).exists() assertTemplateUsed(resp, "account/messages/email_deleted.txt") def test_set_primary_unverified(auth_client, user): secondary = EmailAddress.objects.create( email="secondary@email.org", user=user, verified=False, primary=False ) resp = auth_client.post( reverse("account_email"), {"action_primary": "", "email": secondary.email}, ) primary = EmailAddress.objects.get(email=user.email) secondary.refresh_from_db() assert not secondary.primary assert primary.primary assertTemplateUsed(resp, "account/messages/unverified_primary_email.txt") def test_set_primary(auth_client, user): primary = EmailAddress.objects.get(email=user.email) secondary = EmailAddress.objects.create( email="secondary@email.org", user=user, verified=True, primary=False ) resp = auth_client.post( reverse("account_email"), {"action_primary": "", "email": secondary.email}, ) primary.refresh_from_db() secondary.refresh_from_db() assert not primary.primary assert secondary.primary assertTemplateUsed(resp, "account/messages/primary_email_set.txt") def test_verify(auth_client, user): secondary = EmailAddress.objects.create( email="secondary@email.org", user=user, verified=False, primary=False ) resp = auth_client.post( reverse("account_email"), {"action_send": "", "email": secondary.email}, ) assertTemplateUsed(resp, "account/messages/email_confirmation_sent.txt") def test_verify_unknown_email(auth_client, user): auth_client.post( reverse("account_email"), {"action_send": "", "email": "email@unknown.org"}, ) # This unknown email address must not be implicitly added. assert EmailAddress.objects.filter(user=user).count() == 1 def test_add_with_two_limiter(auth_client, user, settings): EmailAddress.objects.create( email="secondary@email.org", user=user, verified=False, primary=False ) settings.ACCOUNT_MAX_EMAIL_ADDRESSES = 2 resp = auth_client.post( reverse("account_email"), {"action_add": "", "email": "john3@example.org"} ) assertTemplateNotUsed(resp, "account/messages/email_confirmation_sent.txt") def test_add_with_none_limiter(auth_client, settings): settings.ACCOUNT_MAX_EMAIL_ADDRESSES = None resp = auth_client.post( reverse("account_email"), {"action_add": "", "email": "john3@example.org"} ) assertTemplateUsed(resp, "account/messages/email_confirmation_sent.txt") def test_add_with_zero_limiter(auth_client, settings): settings.ACCOUNT_MAX_EMAIL_ADDRESSES = 0 resp = auth_client.post( reverse("account_email"), {"action_add": "", "email": "john3@example.org"} ) assertTemplateUsed(resp, "account/messages/email_confirmation_sent.txt") @pytest.mark.parametrize("has_email_field", [True, False]) def test_set_email_as_primary_doesnt_override_existing_changes_on_the_user( db, has_email_field, settings ): if not has_email_field: settings.ACCOUNT_USER_MODEL_EMAIL_FIELD = None user = get_user_model().objects.create( username="@raymond.penners", first_name="Before Update" ) email = EmailAddress.objects.create( user=user, email="raymond.penners@example.com", primary=True, verified=True, ) updated_first_name = "Updated" get_user_model().objects.filter(id=user.id).update(first_name=updated_first_name) email.set_as_primary() user.refresh_from_db() assert user.first_name == updated_first_name def test_delete_email_changes_user_email(user_factory, client, email_factory): user = user_factory(email_verified=False) client.force_login(user) first_email = EmailAddress.objects.get(user=user) first_email.primary = False first_email.save() # other_unverified_email EmailAddress.objects.create( user=user, email=email_factory(), verified=False, primary=False ) other_verified_email = EmailAddress.objects.create( user=user, email=email_factory(), verified=True, primary=False ) assert user_email(user) == first_email.email resp = client.post( reverse("account_email"), {"action_remove": "", "email": first_email.email}, ) assert resp.status_code == 302 user.refresh_from_db() assert user_email(user) == other_verified_email.email def test_delete_email_wipes_user_email(user_factory, client): user = user_factory(email_verified=False) client.force_login(user) first_email = EmailAddress.objects.get(user=user) first_email.primary = False first_email.save() assert user_email(user) == first_email.email resp = client.post( reverse("account_email"), {"action_remove": "", "email": first_email.email}, ) assert resp.status_code == 302 user.refresh_from_db() assert user_email(user) == "" def test_change_email(user_factory, client, settings): settings.ACCOUNT_CHANGE_EMAIL = True settings.ACCOUNT_EMAIL_CONFIRMATION_HMAC = True user = user_factory(email_verified=True) client.force_login(user) current_email = EmailAddress.objects.get(user=user) resp = client.post( reverse("account_email"), {"action_add": "", "email": "change-to@this.org"}, ) assert resp.status_code == 302 new_email = EmailAddress.objects.get(email="change-to@this.org") key = EmailConfirmationHMAC(new_email).key with patch("allauth.account.signals.email_changed.send") as email_changed_mock: resp = client.post(reverse("account_confirm_email", args=[key])) assert resp.status_code == 302 assert not EmailAddress.objects.filter(pk=current_email.pk).exists() assert EmailAddress.objects.filter(user=user).count() == 1 new_email.refresh_from_db() assert new_email.verified assert new_email.primary assert email_changed_mock.called def test_add(auth_client, user, settings): resp = auth_client.post( reverse("account_email"), {"action_add": "", "email": "john3@example.org"}, ) EmailAddress.objects.get( email="john3@example.org", user=user, verified=False, primary=False, ) assertTemplateUsed(resp, "account/messages/email_confirmation_sent.txt") def test_add_with_reauthentication(auth_client, user, user_password, settings): settings.ACCOUNT_REAUTHENTICATION_REQUIRED = True resp = auth_client.post( reverse("account_email"), {"action_add": "", "email": "john3@example.org"}, ) assert not EmailAddress.objects.filter(email="john3@example.org").exists() assert resp.status_code == 302 assert resp["location"] == reverse("account_reauthenticate") + "?next=%2Femail%2F" resp = auth_client.post(resp["location"], {"password": user_password}) assert EmailAddress.objects.filter(email="john3@example.org").exists() assertTemplateUsed(resp, "account/messages/email_confirmation_sent.txt") assert resp.status_code == 302 assert resp["location"] == reverse("account_email") @pytest.mark.parametrize( "prevent_enumeration", [ False, True, "strict", ], ) def test_add_not_allowed( auth_client, user, settings, user_factory, prevent_enumeration ): settings.ACCOUNT_PREVENT_ENUMERATION = prevent_enumeration email = "inuse@byotheruser.com" user_factory(email=email) resp = auth_client.post( reverse("account_email"), {"action_add": "", "email": email}, ) if prevent_enumeration == "strict": assert resp.status_code == 302 EmailAddress.objects.get( email=email, user=user, verified=False, primary=False, ) assertTemplateUsed(resp, "account/messages/email_confirmation_sent.txt") else: assert resp.status_code == 200 assert resp.context["form"].errors == { "email": ["A user is already registered with this email address."] } @pytest.mark.parametrize( "authentication_method,primary_email,secondary_emails,delete_email,success", [ (AuthenticationMethod.EMAIL, "pri@ma.il", ["sec@ma.il"], "pri@ma.il", False), (AuthenticationMethod.EMAIL, "pri@ma.il", ["sec@ma.il"], "sec@ma.il", True), (AuthenticationMethod.EMAIL, "pri@ma.il", [], "pri@ma.il", False), (AuthenticationMethod.USERNAME, "pri@ma.il", ["sec@ma.il"], "pri@ma.il", False), (AuthenticationMethod.USERNAME, "pri@ma.il", ["sec@ma.il"], "sec@ma.il", True), (AuthenticationMethod.USERNAME, "pri@ma.il", [], "pri@ma.il", True), ( AuthenticationMethod.USERNAME_EMAIL, "pri@ma.il", ["sec@ma.il"], "pri@ma.il", False, ), ( AuthenticationMethod.USERNAME_EMAIL, "pri@ma.il", ["sec@ma.il"], "sec@ma.il", True, ), (AuthenticationMethod.USERNAME_EMAIL, "pri@ma.il", [], "pri@ma.il", True), ], ) def test_remove_email( client, settings, user_factory, primary_email, secondary_emails, delete_email, authentication_method, success, ): settings.ACCOUNT_AUTHENTICATION_METHOD = authentication_method user = user_factory(email=primary_email) EmailAddress.objects.bulk_create( [ EmailAddress(user=user, email=email, primary=False, verified=False) for email in secondary_emails ] ) client.force_login(user) resp = client.post( reverse("account_email"), {"action_remove": "", "email": delete_email}, ) assert EmailAddress.objects.filter(email=delete_email).exists() == (not success) if not success: assertTemplateUsed(resp, "account/messages/cannot_delete_primary_email.txt") @pytest.mark.parametrize( "email,did_look_up", [ ("valid@email.org", True), ("not-an-email", False), ], ) def test_dont_lookup_invalid_email(auth_client, email, did_look_up): with patch("allauth.account.views.EmailAddress.objects.get_for_user") as gfu_mock: gfu_mock.side_effect = EmailAddress.DoesNotExist auth_client.post( reverse("account_email"), {"action_remove": "", "email": email}, ) assert gfu_mock.called == did_look_up django-allauth-0.58.2/allauth/account/tests/test_commands.py000066400000000000000000000003561452212273200241460ustar00rootroot00000000000000from django.core.management import call_command def test_unset_multipleprimaryemails(db): # This command needs to be dropped, in favor of having a conditional # constraint. call_command("account_unsetmultipleprimaryemails") django-allauth-0.58.2/allauth/account/tests/test_confirm_email.py000066400000000000000000000331441452212273200251520ustar00rootroot00000000000000from datetime import timedelta from unittest.mock import Mock, patch from django.conf import settings from django.contrib.auth import get_user_model from django.core import mail from django.http import HttpResponseRedirect from django.test.client import Client, RequestFactory from django.test.utils import override_settings from django.urls import reverse from django.utils.timezone import now from allauth.account import app_settings from allauth.account.models import ( EmailAddress, EmailConfirmation, EmailConfirmationHMAC, ) from allauth.account.signals import user_logged_in from allauth.account.utils import user_pk_to_url_str from allauth.tests import TestCase from .test_models import UUIDUser @override_settings( ACCOUNT_DEFAULT_HTTP_PROTOCOL="https", ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY, ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.USERNAME, ACCOUNT_SIGNUP_FORM_CLASS=None, ACCOUNT_EMAIL_SUBJECT_PREFIX=None, LOGIN_REDIRECT_URL="/accounts/profile/", ACCOUNT_SIGNUP_REDIRECT_URL="/accounts/welcome/", ACCOUNT_ADAPTER="allauth.account.adapter.DefaultAccountAdapter", ACCOUNT_USERNAME_REQUIRED=True, ) class ConfirmationViewTests(TestCase): def _create_user(self, username="john", password="doe", **kwargs): user = get_user_model().objects.create( username=username, is_active=True, **kwargs ) if password: user.set_password(password) else: user.set_unusable_password() user.save() return user @override_settings( ACCOUNT_EMAIL_CONFIRMATION_HMAC=True, ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION=True, ) def test_login_on_confirm(self): user = self._create_user() email = EmailAddress.objects.create( user=user, email="a@b.com", verified=False, primary=True ) key = EmailConfirmationHMAC(email).key receiver_mock = Mock() # we've logged if signal was called user_logged_in.connect(receiver_mock) # fake post-signup account_user stash session = self.client.session session["account_user"] = user_pk_to_url_str(user) session.save() resp = self.client.post(reverse("account_confirm_email", args=[key])) email = EmailAddress.objects.get(pk=email.pk) self.assertTrue(email.verified) receiver_mock.assert_called_once_with( sender=get_user_model(), request=resp.wsgi_request, response=resp, user=get_user_model().objects.get(username="john"), signal=user_logged_in, ) user_logged_in.disconnect(receiver_mock) @override_settings( ACCOUNT_EMAIL_CONFIRMATION_HMAC=True, ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION=True, ) @patch("allauth.account.views.perform_login") @patch("allauth.account.utils.get_user_model", return_value=UUIDUser) def test_login_on_confirm_uuid_user(self, mocked_gum, mock_perform_login): user = UUIDUser(is_active=True, email="john@example.com", username="john") # fake post-signup account_user stash session = self.client.session session["account_user"] = user_pk_to_url_str(user) session.save() # fake email and email confirmation to avoid swappable model hell email = Mock(verified=False, user=user) key = "mockkey" confirmation = Mock(autospec=EmailConfirmationHMAC, key=key) confirmation.email_address = email confirmation.from_key.return_value = confirmation mock_perform_login.return_value = HttpResponseRedirect(redirect_to="/") with patch("allauth.account.views.EmailConfirmationHMAC", confirmation): self.client.post(reverse("account_confirm_email", args=[key])) assert mock_perform_login.called @override_settings( ACCOUNT_EMAIL_CONFIRMATION_HMAC=False, ) def test_email_verification_failed(self): verified_user = get_user_model().objects.create(username="foobar") unverified_user = get_user_model().objects.create(username="foobar2") EmailAddress.objects.create( user=verified_user, email="foo@bar.org", verified=True, primary=True, ) email_address = EmailAddress.objects.create( user=unverified_user, email="foo@bar.org", verified=False, primary=False, ) confirmation = EmailConfirmation.objects.create( email_address=email_address, key="dummy", sent=now(), ) c = Client() resp = c.post(reverse("account_confirm_email", args=[confirmation.key])) self.assertTemplateUsed(resp, "account/messages/email_confirmation_failed.txt") @override_settings( ACCOUNT_EMAIL_CONFIRMATION_HMAC=False, ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN=10 ) def test_email_verification_mandatory(self): c = Client() # Signup resp = c.post( reverse("account_signup"), { "username": "johndoe", "email": "john@example.com", "password1": "johndoe", "password2": "johndoe", }, follow=True, ) self.assertEqual(resp.status_code, 200) self.assertEqual(mail.outbox[0].to, ["john@example.com"]) self.assertGreater(mail.outbox[0].body.find("https://"), 0) self.assertEqual(len(mail.outbox), 1) self.assertTemplateUsed( resp, "account/verification_sent.%s" % app_settings.TEMPLATE_EXTENSION, ) # Attempt to login, unverified for attempt in [1, 2]: resp = c.post( reverse("account_login"), {"login": "johndoe", "password": "johndoe"}, follow=True, ) # is_active is controlled by the admin to manually disable # users. I don't want this flag to flip automatically whenever # users verify their email addresses. self.assertTrue( get_user_model() .objects.filter(username="johndoe", is_active=True) .exists() ) self.assertTemplateUsed( resp, "account/verification_sent." + app_settings.TEMPLATE_EXTENSION, ) # Attempt 1: no mail is sent due to cool-down , # but there was already a mail in the outbox. self.assertEqual(len(mail.outbox), attempt) self.assertEqual( EmailConfirmation.objects.filter( email_address__email="john@example.com" ).count(), attempt, ) # Wait for cooldown EmailConfirmation.objects.update(sent=now() - timedelta(days=1)) # Verify, and re-attempt to login. confirmation = EmailConfirmation.objects.filter( email_address__user__username="johndoe" )[:1].get() resp = c.get(reverse("account_confirm_email", args=[confirmation.key])) self.assertTemplateUsed( resp, "account/email_confirm.%s" % app_settings.TEMPLATE_EXTENSION ) c.post(reverse("account_confirm_email", args=[confirmation.key])) resp = c.post( reverse("account_login"), {"login": "johndoe", "password": "johndoe"}, ) self.assertRedirects( resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False ) @override_settings( ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.OPTIONAL, ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE=False, ) def test_optional_email_verification(self): c = Client() # Signup c.get(reverse("account_signup")) resp = c.post( reverse("account_signup"), { "username": "johndoe", "email": "john@example.com", "password1": "johndoe", }, ) # Logged in self.assertRedirects( resp, settings.ACCOUNT_SIGNUP_REDIRECT_URL, fetch_redirect_response=False ) self.assertEqual(mail.outbox[0].to, ["john@example.com"]) self.assertEqual(len(mail.outbox), 1) # Logout & login again c.logout() # Wait for cooldown EmailConfirmation.objects.update(sent=now() - timedelta(days=1)) # Signup resp = c.post( reverse("account_login"), {"login": "johndoe", "password": "johndoe"}, ) self.assertRedirects( resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False ) self.assertEqual(mail.outbox[0].to, ["john@example.com"]) # There was an issue that we sent out email confirmation mails # on each login in case of optional verification. Make sure # this is not the case: self.assertEqual(len(mail.outbox), 1) @override_settings(ACCOUNT_EMAIL_CONFIRMATION_HMAC=True) def test_email_confirmation_hmac_falls_back(self): user = self._create_user() email = EmailAddress.objects.create( user=user, email="a@b.com", verified=False, primary=True ) confirmation = EmailConfirmation.create(email) confirmation.sent = now() confirmation.save() self.client.post(reverse("account_confirm_email", args=[confirmation.key])) email = EmailAddress.objects.get(pk=email.pk) self.assertTrue(email.verified) @override_settings(ACCOUNT_EMAIL_CONFIRMATION_HMAC=True) def test_email_confirmation_hmac(self): user = self._create_user() email = EmailAddress.objects.create( user=user, email="a@b.com", verified=False, primary=True ) confirmation = EmailConfirmationHMAC(email) request = RequestFactory().get("/") confirmation.send(request=request) self.assertEqual(len(mail.outbox), 1) self.client.post(reverse("account_confirm_email", args=[confirmation.key])) email = EmailAddress.objects.get(pk=email.pk) self.assertTrue(email.verified) @override_settings( ACCOUNT_EMAIL_CONFIRMATION_HMAC=True, ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS=0, ) def test_email_confirmation_hmac_timeout(self): user = self._create_user() email = EmailAddress.objects.create( user=user, email="a@b.com", verified=False, primary=True ) confirmation = EmailConfirmationHMAC(email) request = RequestFactory().get("/") confirmation.send(request=request) self.assertEqual(len(mail.outbox), 1) self.client.post(reverse("account_confirm_email", args=[confirmation.key])) email = EmailAddress.objects.get(pk=email.pk) self.assertFalse(email.verified) @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL ) def test_confirm_email_with_another_user_logged_in(self): """Test the email confirmation view. If User B clicks on an email verification link while logged in as User A, ensure User A gets logged out.""" user = get_user_model().objects.create_user( username="john", email="john@example.org", password="doe" ) self.client.force_login(user) self.client.post( reverse("account_email"), {"email": user.email, "action_send": ""} ) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, [user.email]) self.client.logout() body = mail.outbox[0].body self.assertGreater(body.find("https://"), 0) user2 = self._create_user(username="john2", email="john2@example.com") EmailAddress.objects.create( user=user2, email=user2.email, primary=True, verified=True ) resp = self.client.post( reverse("account_login"), { "login": user2.email, "password": "doe", }, ) self.assertEqual(user2, resp.context["user"]) url = body[body.find("/confirm-email/") :].split()[0] resp = self.client.post(url) self.assertTemplateUsed(resp, "account/messages/logged_out.txt") self.assertTemplateUsed(resp, "account/messages/email_confirmed.txt") self.assertRedirects(resp, settings.LOGIN_URL, fetch_redirect_response=False) @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL ) def test_confirm_email_with_same_user_logged_in(self): """Test the email confirmation view. If User A clicks on an email verification link while logged in, ensure the user stayed logged in.""" user = get_user_model().objects.create_user( username="john", email="john@example.org", password="doe" ) self.client.force_login(user) self.client.post( reverse("account_email"), {"email": user.email, "action_send": ""} ) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, [user.email]) body = mail.outbox[0].body self.assertGreater(body.find("https://"), 0) url = body[body.find("/confirm-email/") :].split()[0] resp = self.client.post(url) self.assertTemplateNotUsed(resp, "account/messages/logged_out.txt") self.assertTemplateUsed(resp, "account/messages/email_confirmed.txt") self.assertRedirects( resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False ) self.assertEqual(user, resp.wsgi_request.user) django-allauth-0.58.2/allauth/account/tests/test_decorators.py000066400000000000000000000012641452212273200245110ustar00rootroot00000000000000from django.contrib.messages.middleware import MessageMiddleware from django.contrib.sessions.middleware import SessionMiddleware from pytest_django.asserts import assertTemplateUsed from allauth.account.decorators import verified_email_required def test_verified_email_required(user_factory, rf): user = user_factory(email_verified=False) @verified_email_required def view(request): assert False request = rf.get("/") SessionMiddleware(lambda request: None).process_request(request) MessageMiddleware(lambda request: None).process_request(request) request.user = user view(request) assertTemplateUsed("account/verified_email_required.html") django-allauth-0.58.2/allauth/account/tests/test_login.py000066400000000000000000000303501452212273200234520ustar00rootroot00000000000000import json from unittest.mock import patch import django from django.conf import settings from django.contrib.auth import get_user_model from django.core import mail from django.test.utils import override_settings from django.urls import NoReverseMatch, reverse from allauth.account import app_settings from allauth.account.forms import LoginForm from allauth.account.models import EmailAddress from allauth.tests import TestCase @override_settings( ACCOUNT_DEFAULT_HTTP_PROTOCOL="https", ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY, ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.USERNAME, ACCOUNT_SIGNUP_FORM_CLASS=None, ACCOUNT_EMAIL_SUBJECT_PREFIX=None, LOGIN_REDIRECT_URL="/accounts/profile/", ACCOUNT_SIGNUP_REDIRECT_URL="/accounts/welcome/", ACCOUNT_ADAPTER="allauth.account.adapter.DefaultAccountAdapter", ACCOUNT_USERNAME_REQUIRED=True, ) class LoginTests(TestCase): @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.USERNAME_EMAIL ) def test_username_containing_at(self): user = get_user_model().objects.create(username="@raymond.penners") user.set_password("psst") user.save() EmailAddress.objects.create( user=user, email="raymond.penners@example.com", primary=True, verified=True, ) resp = self.client.post( reverse("account_login"), {"login": "@raymond.penners", "password": "psst"}, ) self.assertRedirects( resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False ) def _create_user(self, username="john", password="doe", **kwargs): user = get_user_model().objects.create( username=username, is_active=True, **kwargs ) if password: user.set_password(password) else: user.set_unusable_password() user.save() return user def _create_user_and_login(self, usable_password=True): password = "doe" if usable_password else False user = self._create_user(password=password) self.client.force_login(user) return user def test_redirect_when_authenticated(self): self._create_user_and_login() c = self.client resp = c.get(reverse("account_login")) self.assertRedirects(resp, "/accounts/profile/", fetch_redirect_response=False) def test_ajax_password_change(self): self._create_user_and_login() resp = self.client.post( reverse("account_change_password"), data={ "oldpassword": "doe", "password1": "AbCdEf!123", "password2": "AbCdEf!123456", }, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) self.assertEqual(resp["content-type"], "application/json") data = json.loads(resp.content.decode("utf8")) assert "same password" in data["form"]["fields"]["password2"]["errors"][0] @override_settings( ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.OPTIONAL ) def test_login_unverified_account_optional(self): """Tests login behavior when email verification is optional.""" user = get_user_model().objects.create(username="john") user.set_password("doe") user.save() EmailAddress.objects.create( user=user, email="user@example.com", primary=True, verified=False ) resp = self.client.post( reverse("account_login"), {"login": "john", "password": "doe"} ) self.assertRedirects( resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False ) @override_settings( ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.OPTIONAL, ACCOUNT_LOGIN_ATTEMPTS_LIMIT=3, CACHES={ "default": { "BACKEND": "django.core.cache.backends.locmem.LocMemCache", } }, ) def test_login_failed_attempts_exceeded(self): user = get_user_model().objects.create(username="john") user.set_password("doe") user.save() EmailAddress.objects.create( user=user, email="user@example.com", primary=True, verified=False ) for i in range(5): is_valid_attempt = i == 4 is_locked = i >= 3 resp = self.client.post( reverse("account_login"), { "login": ["john", "John", "JOHN", "JOhn", "joHN"][i], "password": ("doe" if is_valid_attempt else "wrong"), }, ) if django.VERSION >= (4, 1): self.assertFormError( resp.context["form"], None, "Too many failed login attempts. Try again later." if is_locked else "The username and/or password you specified are not correct.", ) else: self.assertFormError( resp, "form", None, "Too many failed login attempts. Try again later." if is_locked else "The username and/or password you specified are not correct.", ) @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL, ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY, ACCOUNT_LOGIN_ATTEMPTS_LIMIT=1, CACHES={ "default": { "BACKEND": "django.core.cache.backends.locmem.LocMemCache", } }, ) def test_login_failed_attempts_exceeded_cleared_on_password_reset(self): # Ensure that login attempts, once they hit the limit, # can use the password reset mechanism to regain access. user = get_user_model().objects.create( username="john", email="john@example.org", is_active=True ) user.set_password("doe") user.save() EmailAddress.objects.create( user=user, email="john@example.org", primary=True, verified=True ) resp = self.client.post( reverse("account_login"), {"login": user.email, "password": "bad"} ) if django.VERSION >= (4, 1): self.assertFormError( resp.context["form"], None, "The email address and/or password you specified are not correct.", ) else: self.assertFormError( resp, "form", None, "The email address and/or password you specified are not correct.", ) resp = self.client.post( reverse("account_login"), {"login": user.email, "password": "bad"} ) if django.VERSION >= (4, 1): self.assertFormError( resp.context["form"], None, "Too many failed login attempts. Try again later.", ) else: self.assertFormError( resp, "form", None, "Too many failed login attempts. Try again later.", ) self.client.post(reverse("account_reset_password"), data={"email": user.email}) body = mail.outbox[0].body self.assertGreater(body.find("https://"), 0) # Extract URL for `password_reset_from_key` view and access it url = body[body.find("/password/reset/") :].split()[0] resp = self.client.get(url) # Follow the redirect the actual password reset page with the key # hidden. url = resp.url resp = self.client.get(url) self.assertTemplateUsed( resp, "account/password_reset_from_key.%s" % app_settings.TEMPLATE_EXTENSION, ) self.assertFalse("token_fail" in resp.context_data) new_password = "newpass123" # Reset the password resp = self.client.post( url, {"password1": new_password, "password2": new_password} ) self.assertRedirects(resp, reverse("account_reset_password_from_key_done")) # Check the new password is in effect user = get_user_model().objects.get(pk=user.pk) self.assertTrue(user.check_password(new_password)) resp = self.client.post( reverse("account_login"), {"login": user.email, "password": new_password}, ) self.assertRedirects( resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False ) @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL, ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY, ACCOUNT_LOGIN_ATTEMPTS_LIMIT=1, ) def test_login_using_unverified_email_address_is_prohibited(self): user = get_user_model().objects.create( username="john", email="john@example.org", is_active=True ) user.set_password("doe") user.save() EmailAddress.objects.create( user=user, email="john@example.org", primary=True, verified=True ) EmailAddress.objects.create( user=user, email="john@example.com", primary=True, verified=False ) resp = self.client.post( reverse("account_login"), {"login": "john@example.com", "password": "doe"} ) self.assertRedirects( resp, reverse("account_email_verification_sent"), fetch_redirect_response=False, ) self.assertEqual(len(mail.outbox), 1) assert mail.outbox[0].to == ["john@example.com"] def test_login_unverified_account_mandatory(self): """Tests login behavior when email verification is mandatory.""" user = get_user_model().objects.create(username="john") user.set_password("doe") user.save() EmailAddress.objects.create( user=user, email="user@example.com", primary=True, verified=False ) resp = self.client.post( reverse("account_login"), {"login": "john", "password": "doe"} ) self.assertRedirects(resp, reverse("account_email_verification_sent")) def test_login_inactive_account(self): """ Tests login behavior with inactive accounts. Inactive user accounts should be prevented from performing any actions, regardless of their verified state. """ # Inactive and verified user account user = get_user_model().objects.create(username="john", is_active=False) user.set_password("doe") user.save() EmailAddress.objects.create( user=user, email="john@example.com", primary=True, verified=True ) resp = self.client.post( reverse("account_login"), {"login": "john", "password": "doe"} ) self.assertRedirects(resp, reverse("account_inactive")) # Inactive and unverified user account user = get_user_model().objects.create(username="doe", is_active=False) user.set_password("john") user.save() EmailAddress.objects.create( user=user, email="user@example.com", primary=True, verified=False ) resp = self.client.post( reverse("account_login"), {"login": "doe", "password": "john"} ) self.assertRedirects(resp, reverse("account_inactive")) @override_settings(ACCOUNT_AUTHENTICATED_LOGIN_REDIRECTS=False) def test_account_authenticated_login_redirects_is_false(self): self._create_user_and_login() resp = self.client.get(reverse("account_login")) self.assertEqual(resp.status_code, 200) def test_login_password_forgotten_link_not_present(client, db): with patch("allauth.account.forms.reverse") as reverse_mock: reverse_mock.side_effect = NoReverseMatch form = LoginForm() assert form.fields["password"].help_text == "" def test_login_password_forgotten_link_present(client, db): form = LoginForm() assert ( form.fields["password"].help_text == 'Forgot your password?' ) django-allauth-0.58.2/allauth/account/tests/test_logout.py000066400000000000000000000043061452212273200236550ustar00rootroot00000000000000from django.contrib.auth import get_user_model from django.core import validators from django.test.client import Client from django.test.utils import override_settings from django.urls import reverse from allauth.account import app_settings from allauth.account.signals import user_logged_out from allauth.tests import Mock, TestCase test_username_validators = [ validators.RegexValidator(regex=r"^[a-c]+$", message="not abc", flags=0) ] @override_settings( ACCOUNT_DEFAULT_HTTP_PROTOCOL="https", ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY, ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.USERNAME, ACCOUNT_SIGNUP_FORM_CLASS=None, ACCOUNT_EMAIL_SUBJECT_PREFIX=None, LOGIN_REDIRECT_URL="/accounts/profile/", ACCOUNT_SIGNUP_REDIRECT_URL="/accounts/welcome/", ACCOUNT_ADAPTER="allauth.account.adapter.DefaultAccountAdapter", ACCOUNT_USERNAME_REQUIRED=True, ) class LogoutTests(TestCase): @override_settings(ACCOUNT_LOGOUT_ON_GET=True) def test_logout_view_on_get(self): c, resp = self._logout_view("get") self.assertTemplateUsed(resp, "account/messages/logged_out.txt") @override_settings(ACCOUNT_LOGOUT_ON_GET=False) def test_logout_view_on_post(self): c, resp = self._logout_view("get") self.assertTemplateUsed( resp, "account/logout.%s" % app_settings.TEMPLATE_EXTENSION ) receiver_mock = Mock() user_logged_out.connect(receiver_mock) resp = c.post(reverse("account_logout")) self.assertTemplateUsed(resp, "account/messages/logged_out.txt") receiver_mock.assert_called_once_with( sender=get_user_model(), request=resp.wsgi_request, user=get_user_model().objects.get(username="john"), signal=user_logged_out, ) user_logged_out.disconnect(receiver_mock) def _logout_view(self, method): c = Client() user = get_user_model().objects.create(username="john", is_active=True) user.set_password("doe") user.save() c = Client() c.login(username="john", password="doe") return c, getattr(c, method)(reverse("account_logout")) django-allauth-0.58.2/allauth/account/tests/test_middleware.py000066400000000000000000000020431452212273200244550ustar00rootroot00000000000000from django.conf import settings from django.http import HttpResponse import pytest from allauth.account.middleware import AccountMiddleware @pytest.mark.parametrize( "path,status_code,content_type,login_removed", [ ("/", 200, "text/html", True), ("/", 200, "text/html; charset=utf8", True), ("/", 200, "text/txt", False), ("/", 404, "text/html", False), (settings.STATIC_URL, 200, "text/html", False), ("/favicon.ico", 200, "image/x-icon", False), ("/robots.txt", 200, "text/plain", False), ("/robots.txt", 200, "text/html", False), ("/humans.txt", 200, "text/plain", False), ], ) def test_remove_dangling_login(rf, path, status_code, login_removed, content_type): request = rf.get(path) request.session = {"account_login": True} response = HttpResponse(status=status_code) response["Content-Type"] = content_type mw = AccountMiddleware(lambda request: response) mw(request) assert ("account_login" in request.session) is (not login_removed) django-allauth-0.58.2/allauth/account/tests/test_models.py000066400000000000000000000016441452212273200236310ustar00rootroot00000000000000import uuid from django.contrib.auth.models import AbstractUser from django.db import models from allauth.account.models import EmailAddress class UUIDUser(AbstractUser): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) class Meta(AbstractUser.Meta): swappable = "AUTH_USER_MODEL" def test_add_new_email(rf, user, settings): settings.ACCOUNT_CHANGE_EMAIL = True request = rf.get("/") assert EmailAddress.objects.filter(user=user).count() == 1 new_email = EmailAddress.objects.add_new_email(request, user, "new@email.org") assert not new_email.verified assert not new_email.primary assert EmailAddress.objects.filter(user=user).count() == 2 EmailAddress.objects.add_new_email(request, user, "new2@email.org") assert EmailAddress.objects.filter(user=user).count() == 2 new_email.refresh_from_db() assert new_email.email == "new2@email.org" django-allauth-0.58.2/allauth/account/tests/test_ratelimit.py000066400000000000000000000014631452212273200243370ustar00rootroot00000000000000from django.contrib.auth import get_user_model from django.test.utils import override_settings from django.urls import reverse from allauth.tests import TestCase @override_settings( CACHES={ "default": { "BACKEND": "django.core.cache.backends.locmem.LocMemCache", }, }, ACCOUNT_RATE_LIMITS={"reset_password_email": "1/m"}, ) class RateLimitTests(TestCase): def test_case_insensitive_password_reset(self): get_user_model().objects.create(email="a@b.com") resp = self.client.post( reverse("account_reset_password"), data={"email": "a@b.com"} ) assert resp.status_code == 302 resp = self.client.post( reverse("account_reset_password"), data={"email": "A@B.COM"} ) assert resp.status_code == 429 django-allauth-0.58.2/allauth/account/tests/test_reset_password.py000066400000000000000000000265361452212273200254210ustar00rootroot00000000000000import json from django.contrib.auth import get_user_model from django.contrib.auth.models import AnonymousUser from django.core import mail from django.test.utils import override_settings from django.urls import reverse from allauth.account import app_settings from allauth.account.forms import ResetPasswordForm from allauth.account.models import EmailAddress from allauth.tests import TestCase @override_settings( ACCOUNT_PREVENT_ENUMERATION=False, ACCOUNT_DEFAULT_HTTP_PROTOCOL="https", ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY, ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.USERNAME, ACCOUNT_SIGNUP_FORM_CLASS=None, ACCOUNT_EMAIL_SUBJECT_PREFIX=None, LOGIN_REDIRECT_URL="/accounts/profile/", ACCOUNT_SIGNUP_REDIRECT_URL="/accounts/welcome/", ACCOUNT_ADAPTER="allauth.account.adapter.DefaultAccountAdapter", ACCOUNT_USERNAME_REQUIRED=True, ) class ResetPasswordTests(TestCase): def test_user_email_not_sent_inactive_user(self): User = get_user_model() User.objects.create_user( "mike123", "mike@ixample.org", "test123", is_active=False ) data = {"email": "mike@ixample.org"} form = ResetPasswordForm(data) self.assertFalse(form.is_valid()) def test_password_reset_get(self): resp = self.client.get(reverse("account_reset_password")) self.assertTemplateUsed(resp, "account/password_reset.html") def test_password_set_redirect(self): resp = self._password_set_or_change_redirect("account_set_password", True) self.assertRedirects( resp, reverse("account_change_password"), fetch_redirect_response=False, ) def test_set_password_not_allowed(self): user = self._create_user_and_login(True) pwd = "!*123i1uwn12W23" self.assertFalse(user.check_password(pwd)) resp = self.client.post( reverse("account_set_password"), data={"password1": pwd, "password2": pwd}, ) user.refresh_from_db() self.assertFalse(user.check_password(pwd)) self.assertTrue(user.has_usable_password()) self.assertEqual(resp.status_code, 302) def test_password_change_no_redirect(self): resp = self._password_set_or_change_redirect("account_change_password", True) self.assertEqual(resp.status_code, 200) def test_password_set_no_redirect(self): resp = self._password_set_or_change_redirect("account_set_password", False) self.assertEqual(resp.status_code, 200) def test_password_change_redirect(self): resp = self._password_set_or_change_redirect("account_change_password", False) self.assertRedirects( resp, reverse("account_set_password"), fetch_redirect_response=False, ) def test_password_forgotten_username_hint(self): user = self._request_new_password() body = mail.outbox[0].body assert user.username in body @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL ) def test_password_forgotten_no_username_hint(self): user = self._request_new_password() body = mail.outbox[0].body assert user.username not in body def _request_new_password(self): user = get_user_model().objects.create( username="john", email="john@example.org", is_active=True ) user.set_password("doe") user.save() self.client.post( reverse("account_reset_password"), data={"email": "john@example.org"}, ) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, ["john@example.org"]) return user def test_password_reset_flow_with_empty_session(self): """ Test the password reset flow when the session is empty: requesting a new password, receiving the reset link via email, following the link, getting redirected to the new link (without the token) Copying the link and using it in a DIFFERENT client (Browser/Device). """ # Request new password self._request_new_password() body = mail.outbox[0].body self.assertGreater(body.find("https://"), 0) # Extract URL for `password_reset_from_key` view url = body[body.find("/password/reset/") :].split()[0] resp = self.client.get(url) reset_pass_url = resp.url # Accessing the url via a different session resp = self.client_class().get(reset_pass_url) # We should receive the token_fail context_data self.assertTemplateUsed( resp, "account/password_reset_from_key.%s" % app_settings.TEMPLATE_EXTENSION, ) self.assertTrue(resp.context_data["token_fail"]) def test_password_reset_flow(self): """ Tests the password reset flow: requesting a new password, receiving the reset link via email and finally resetting the password to a new value. """ # Request new password user = self._request_new_password() body = mail.outbox[0].body self.assertGreater(body.find("https://"), 0) # Extract URL for `password_reset_from_key` view and access it url = body[body.find("/password/reset/") :].split()[0] resp = self.client.get(url) # Follow the redirect the actual password reset page with the key # hidden. url = resp.url resp = self.client.get(url) self.assertTemplateUsed( resp, "account/password_reset_from_key.%s" % app_settings.TEMPLATE_EXTENSION, ) self.assertFalse("token_fail" in resp.context_data) # Reset the password resp = self.client.post( url, {"password1": "newpass123", "password2": "newpass123"} ) self.assertRedirects(resp, reverse("account_reset_password_from_key_done")) # Check the new password is in effect user = get_user_model().objects.get(pk=user.pk) self.assertTrue(user.check_password("newpass123")) # Trying to reset the password against the same URL (or any other # invalid/obsolete URL) returns a bad token response resp = self.client.post( url, {"password1": "newpass123", "password2": "newpass123"} ) self.assertTemplateUsed( resp, "account/password_reset_from_key.%s" % app_settings.TEMPLATE_EXTENSION, ) self.assertTrue(resp.context_data["token_fail"]) # Same should happen when accessing the page directly response = self.client.get(url) self.assertTemplateUsed( response, "account/password_reset_from_key.%s" % app_settings.TEMPLATE_EXTENSION, ) self.assertTrue(response.context_data["token_fail"]) # When in XHR views, it should respond with a 400 bad request # code, and the response body should contain the JSON-encoded # error from the adapter response = self.client.post( url, {"password1": "newpass123", "password2": "newpass123"}, HTTP_X_REQUESTED_WITH="XMLHttpRequest", ) self.assertEqual(response.status_code, 400) data = json.loads(response.content.decode("utf8")) assert "invalid" in data["form"]["errors"][0] @override_settings( ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL ) def test_password_reset_flow_with_another_user_logged_in(self): """ Tests the password reset flow: if User B requested a password reset earlier and now User A is logged in, User B now clicks on the link, ensure User A is logged out before continuing. """ # Request new password self._request_new_password() body = mail.outbox[0].body self.assertGreater(body.find("https://"), 0) user2 = self._create_user(username="john2", email="john2@example.com") EmailAddress.objects.create( user=user2, email=user2.email, primary=True, verified=True ) resp = self.client.post( reverse("account_login"), { "login": user2.email, "password": "doe", }, ) self.assertEqual(user2, resp.context["user"]) # Extract URL for `password_reset_from_key` view and access it url = body[body.find("/password/reset/") :].split()[0] resp = self.client.get(url) # Follow the redirect the actual password reset page with the key # hidden. url = resp.url resp = self.client.get(url) self.assertTemplateUsed( resp, "account/password_reset_from_key.%s" % app_settings.TEMPLATE_EXTENSION ) self.assertFalse("token_fail" in resp.context_data) # Reset the password resp = self.client.post( url, {"password1": "newpass123", "password2": "newpass123"}, follow=True ) self.assertRedirects(resp, reverse("account_reset_password_from_key_done")) self.assertNotEqual(user2, resp.context["user"]) self.assertEqual(AnonymousUser(), resp.context["user"]) def test_password_reset_flow_with_email_changed(self): """ Test that the password reset token is invalidated if the user email address was changed. """ user = self._request_new_password() body = mail.outbox[0].body self.assertGreater(body.find("https://"), 0) EmailAddress.objects.create(user=user, email="other@email.org") # Extract URL for `password_reset_from_key` view url = body[body.find("/password/reset/") :].split()[0] resp = self.client.get(url) self.assertTemplateUsed( resp, "account/password_reset_from_key.%s" % app_settings.TEMPLATE_EXTENSION, ) self.assertTrue("token_fail" in resp.context_data) @override_settings(ACCOUNT_LOGIN_ON_PASSWORD_RESET=True) def test_password_reset_ACCOUNT_LOGIN_ON_PASSWORD_RESET(self): user = self._request_new_password() body = mail.outbox[0].body url = body[body.find("/password/reset/") :].split()[0] resp = self.client.get(url) # Follow the redirect the actual password reset page with the key # hidden. resp = self.client.post( resp.url, {"password1": "newpass123", "password2": "newpass123"} ) self.assertTrue(user.is_authenticated) # EmailVerificationMethod.MANDATORY sends us to the confirm-email page self.assertRedirects(resp, "/confirm-email/") def _create_user(self, username="john", password="doe", **kwargs): user = get_user_model().objects.create( username=username, is_active=True, **kwargs ) if password: user.set_password(password) else: user.set_unusable_password() user.save() return user def _create_user_and_login(self, usable_password=True): password = "doe" if usable_password else False user = self._create_user(password=password) self.client.force_login(user) return user def _password_set_or_change_redirect(self, urlname, usable_password): self._create_user_and_login(usable_password) return self.client.get(reverse(urlname)) django-allauth-0.58.2/allauth/account/tests/test_security.py000066400000000000000000000037501452212273200242150ustar00rootroot00000000000000from django.contrib.auth import get_user_model from django.core import mail from django.test.client import RequestFactory from django.test.utils import override_settings from allauth.account.forms import ResetPasswordForm from allauth.tests import TestCase @override_settings(ACCOUNT_PREVENT_ENUMERATION=False) class TestCVE2019_19844(TestCase): global_request = RequestFactory().get("/") def test_user_email_unicode_collision(self): User = get_user_model() User.objects.create_user("mike123", "mike@example.org", "test123") User.objects.create_user("mike456", "mıke@example.org", "test123") data = {"email": "mıke@example.org"} form = ResetPasswordForm(data) self.assertTrue(form.is_valid()) form.save(self.global_request) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, ["mıke@example.org"]) def test_user_email_domain_unicode_collision(self): User = get_user_model() User.objects.create_user("mike123", "mike@ixample.org", "test123") User.objects.create_user("mike456", "mike@ıxample.org", "test123") data = {"email": "mike@ıxample.org"} form = ResetPasswordForm(data) self.assertTrue(form.is_valid()) form.save(self.global_request) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, ["mike@ıxample.org"]) def test_user_email_unicode_collision_nonexistent(self): User = get_user_model() User.objects.create_user("mike123", "mike@example.org", "test123") data = {"email": "mıke@example.org"} form = ResetPasswordForm(data) self.assertFalse(form.is_valid()) def test_user_email_domain_unicode_collision_nonexistent(self): User = get_user_model() User.objects.create_user("mike123", "mike@ixample.org", "test123") data = {"email": "mike@ıxample.org"} form = ResetPasswordForm(data) self.assertFalse(form.is_valid()) django-allauth-0.58.2/allauth/account/tests/test_signup.py000066400000000000000000000347321452212273200236570ustar00rootroot00000000000000import django from django import forms from django.contrib.auth import get_user_model from django.contrib.auth.models import AnonymousUser from django.contrib.messages.middleware import MessageMiddleware from django.contrib.sessions.middleware import SessionMiddleware from django.core import mail from django.test.client import Client, RequestFactory from django.test.utils import override_settings from django.urls import reverse import pytest from pytest_django.asserts import assertTemplateUsed from allauth.account import app_settings from allauth.account.adapter import get_adapter from allauth.account.forms import BaseSignupForm, SignupForm from allauth.account.models import EmailAddress from allauth.core import context from allauth.tests import TestCase from allauth.utils import get_username_max_length class CustomSignupFormTests(TestCase): @override_settings( ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE=True, ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE=True, ) def test_custom_form_field_order(self): expected_field_order = [ "email", "email2", "password1", "password2", "username", "last_name", "first_name", ] class TestSignupForm(forms.Form): first_name = forms.CharField(max_length=30) last_name = forms.CharField(max_length=30) field_order = expected_field_order class CustomSignupForm(SignupForm, TestSignupForm): # ACCOUNT_SIGNUP_FORM_CLASS is only abided by when the # BaseSignupForm definition is loaded the first time on Django # startup. @override_settings() has therefore no effect. pass form = CustomSignupForm() self.assertEqual(list(form.fields.keys()), expected_field_order) def test_user_class_attribute(self): from django.contrib.auth import get_user_model from django.db.models.query_utils import DeferredAttribute class CustomSignupForm(SignupForm): # ACCOUNT_SIGNUP_FORM_CLASS is only abided by when the # BaseSignupForm definition is loaded the first time on Django # startup. @override_settings() has therefore no effect. pass User = get_user_model() data = { "username": "username", "email": "user@example.com", "password1": "very-secret", "password2": "very-secret", } form = CustomSignupForm(data, email_required=True) assert isinstance(User.username, DeferredAttribute) form.is_valid() assert isinstance(User.username, DeferredAttribute) class BaseSignupFormTests(TestCase): @override_settings( ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_USERNAME_BLACKLIST=["username"] ) def test_username_in_blacklist(self): data = { "username": "username", "email": "user@example.com", } form = BaseSignupForm(data, email_required=True) self.assertFalse(form.is_valid()) @override_settings( ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_USERNAME_BLACKLIST=["username"] ) def test_username_not_in_blacklist(self): data = { "username": "theusername", "email": "user@example.com", } form = BaseSignupForm(data, email_required=True) self.assertTrue(form.is_valid()) @override_settings(ACCOUNT_USERNAME_REQUIRED=True) def test_username_maxlength(self): data = { "username": "username", "email": "user@example.com", } form = BaseSignupForm(data, email_required=True) max_length = get_username_max_length() field = form.fields["username"] self.assertEqual(field.max_length, max_length) widget = field.widget self.assertEqual(widget.attrs.get("maxlength"), str(max_length)) @override_settings( ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE=True ) def test_signup_email_verification(self): data = { "username": "username", "email": "user@example.com", } form = BaseSignupForm(data, email_required=True) self.assertFalse(form.is_valid()) data = { "username": "username", "email": "user@example.com", "email2": "user@example.com", } form = BaseSignupForm(data, email_required=True) self.assertTrue(form.is_valid()) data["email2"] = "anotheruser@example.com" form = BaseSignupForm(data, email_required=True) self.assertFalse(form.is_valid()) @override_settings( ACCOUNT_DEFAULT_HTTP_PROTOCOL="https", ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY, ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.USERNAME, ACCOUNT_SIGNUP_FORM_CLASS=None, ACCOUNT_EMAIL_SUBJECT_PREFIX=None, LOGIN_REDIRECT_URL="/accounts/profile/", ACCOUNT_SIGNUP_REDIRECT_URL="/accounts/welcome/", ACCOUNT_ADAPTER="allauth.account.adapter.DefaultAccountAdapter", ACCOUNT_USERNAME_REQUIRED=True, ) class SignupTests(TestCase): def test_signup_same_email_verified_externally(self): user = self._test_signup_email_verified_externally( "john@example.com", "john@example.com" ) self.assertEqual(EmailAddress.objects.filter(user=user).count(), 1) EmailAddress.objects.get( verified=True, email="john@example.com", user=user, primary=True ) def test_signup_other_email_verified_externally(self): """ John is invited on john@example.org, but signs up via john@example.com. Email verification is by-passed, their home email address is used as a secondary. """ user = self._test_signup_email_verified_externally( "john@example.com", "john@example.org" ) self.assertEqual(EmailAddress.objects.filter(user=user).count(), 2) EmailAddress.objects.get( verified=False, email="john@example.com", user=user, primary=False ) EmailAddress.objects.get( verified=True, email="john@example.org", user=user, primary=True ) def _test_signup_email_verified_externally(self, signup_email, verified_email): username = "johndoe" request = RequestFactory().post( reverse("account_signup"), { "username": username, "email": signup_email, "password1": "johndoe", "password2": "johndoe", }, ) # Fake stash_verified_email SessionMiddleware(lambda request: None).process_request(request) MessageMiddleware(lambda request: None).process_request(request) request.user = AnonymousUser() request.session["account_verified_email"] = verified_email from allauth.account.views import signup with context.request_context(request): resp = signup(request) self.assertEqual(resp.status_code, 302) self.assertEqual( resp["location"], get_adapter().get_signup_redirect_url(request) ) self.assertEqual(len(mail.outbox), 0) return get_user_model().objects.get(username=username) @override_settings( ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE=True, ) def test_signup_password_twice_form_error(self): resp = self.client.post( reverse("account_signup"), data={ "username": "johndoe", "email": "john@example.org", "password1": "johndoe", "password2": "janedoe", }, ) if django.VERSION >= (4, 1): self.assertFormError( resp.context["form"], "password2", "You must type the same password each time.", ) else: self.assertFormError( resp, "form", "password2", "You must type the same password each time.", ) @override_settings( ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE=True ) def test_signup_email_twice(self): request = RequestFactory().post( reverse("account_signup"), { "username": "johndoe", "email": "john@example.org", "email2": "john@example.org", "password1": "johndoe", "password2": "johndoe", }, ) SessionMiddleware(lambda request: None).process_request(request) MessageMiddleware(lambda request: None).process_request(request) request.user = AnonymousUser() from allauth.account.views import signup with context.request_context(request): signup(request) user = get_user_model().objects.get(username="johndoe") self.assertEqual(user.email, "john@example.org") @override_settings( AUTH_PASSWORD_VALIDATORS=[ { "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", "OPTIONS": { "min_length": 9, }, } ] ) def test_django_password_validation(self): resp = self.client.post( reverse("account_signup"), { "username": "johndoe", "email": "john@example.com", "password1": "johndoe", "password2": "johndoe", }, ) if django.VERSION >= (4, 1): self.assertFormError(resp.context["form"], None, []) self.assertFormError( resp.context["form"], "password1", ["This password is too short. It must contain at least 9 characters."], ) else: self.assertFormError(resp, "form", None, []) self.assertFormError( resp, "form", "password1", ["This password is too short. It must contain at least 9 characters."], ) def test_prevent_enumeration_with_mandatory_verification(settings, user_factory): settings.ACCOUNT_PREVENT_ENUMERATION = True settings.ACCOUNT_AUTHENTICATION_METHOD = app_settings.AuthenticationMethod.EMAIL settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.MANDATORY user = user_factory(username="john", email="john@example.org", password="doe") c = Client() resp = c.post( reverse("account_signup"), { "username": "johndoe", "email": user.email, "password1": "johndoe", "password2": "johndoe", }, ) assert resp.status_code == 302 assert resp["location"] == reverse("account_email_verification_sent") assertTemplateUsed(resp, "account/email/account_already_exists_message.txt") assert EmailAddress.objects.filter(email="john@example.org").count() == 1 def test_prevent_enumeration_off(settings, user_factory): settings.ACCOUNT_PREVENT_ENUMERATION = False settings.ACCOUNT_AUTHENTICATION_METHOD = app_settings.AuthenticationMethod.EMAIL settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.MANDATORY user = user_factory(username="john", email="john@example.org", password="doe") c = Client() resp = c.post( reverse("account_signup"), { "username": "johndoe", "email": user.email, "password1": "johndoe", "password2": "johndoe", }, ) assert resp.status_code == 200 assert resp.context["form"].errors == { "email": ["A user is already registered with this email address."] } def test_prevent_enumeration_strictly(settings, user_factory): settings.ACCOUNT_PREVENT_ENUMERATION = "strict" settings.ACCOUNT_AUTHENTICATION_METHOD = app_settings.AuthenticationMethod.EMAIL settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.NONE user = user_factory(username="john", email="john@example.org", password="doe") c = Client() resp = c.post( reverse("account_signup"), { "username": "johndoe", "email": user.email, "password1": "johndoe", "password2": "johndoe", }, ) assert resp.status_code == 302 assert resp["location"] == settings.LOGIN_REDIRECT_URL assert EmailAddress.objects.filter(email="john@example.org").count() == 2 def test_prevent_enumeration_on(settings, user_factory): settings.ACCOUNT_PREVENT_ENUMERATION = True settings.ACCOUNT_AUTHENTICATION_METHOD = app_settings.AuthenticationMethod.EMAIL settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.NONE user = user_factory(username="john", email="john@example.org", password="doe") c = Client() resp = c.post( reverse("account_signup"), { "username": "johndoe", "email": user.email, "password1": "johndoe", "password2": "johndoe", }, ) assert resp.status_code == 200 assert resp.context["form"].errors == { "email": ["A user is already registered with this email address."] } @pytest.mark.django_db def test_get_initial_with_valid_email(): """Test that the email field is populated with a valid email.""" request = RequestFactory().get("/signup/?email=test@example.com") from allauth.account.views import signup SessionMiddleware(lambda request: None).process_request(request) request.user = AnonymousUser() with context.request_context(request): view = signup(request) assert view.context_data["view"].get_initial()["email"] == "test@example.com" def test_signup_user_model_no_email(settings, client, password_factory, db, mailoutbox): settings.ACCOUNT_USERNAME_REQUIRED = False settings.ACCOUNT_EMAIL_REQUIRED = True settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.MANDATORY settings.ACCOUNT_USER_MODEL_EMAIL_FIELD = None password = password_factory() email = "user@example.com" resp = client.post( reverse("account_signup"), { "email": email, "password1": password, "password2": password, }, ) assert resp.status_code == 302 email = EmailAddress.objects.get(email=email) assert email.primary assert not email.verified assert len(mailoutbox) == 1 django-allauth-0.58.2/allauth/account/tests/test_utils.py000066400000000000000000000127021452212273200235030ustar00rootroot00000000000000import uuid from unittest.mock import patch from django.contrib import messages from django.contrib.auth import get_user_model from django.contrib.messages.api import get_messages from django.contrib.messages.middleware import MessageMiddleware from django.contrib.sessions.middleware import SessionMiddleware from django.core import mail, validators from django.core.exceptions import ValidationError from django.template import Context, Template from django.test.client import RequestFactory from django.test.utils import override_settings from django.urls import reverse import allauth.app_settings from allauth.account.adapter import get_adapter from allauth.account.models import EmailAddress from allauth.account.utils import ( filter_users_by_username, url_str_to_user_pk, user_pk_to_url_str, user_username, ) from allauth.core import context from allauth.tests import TestCase from .test_models import UUIDUser test_username_validators = [ validators.RegexValidator(regex=r"^[a-c]+$", message="not abc", flags=0) ] class UtilsTests(TestCase): def setUp(self): self.user_id = uuid.uuid4().hex def test_url_str_to_pk_identifies_UUID_as_stringlike(self): with patch("allauth.account.utils.get_user_model") as mocked_gum: mocked_gum.return_value = UUIDUser self.assertEqual(url_str_to_user_pk(self.user_id), uuid.UUID(self.user_id)) def test_pk_to_url_string_identifies_UUID_as_stringlike(self): with patch("allauth.account.utils.get_user_model") as mocked_gum: mocked_gum.return_value = UUIDUser user = UUIDUser(is_active=True, email="john@example.com", username="john") self.assertEqual(user_pk_to_url_str(user), user.pk.hex) @override_settings(ACCOUNT_PRESERVE_USERNAME_CASING=False) def test_username_lower_cased(self): user = get_user_model()() user_username(user, "CamelCase") self.assertEqual(user_username(user), "camelcase") # TODO: Actually test something filter_users_by_username("CamelCase", "FooBar") @override_settings(ACCOUNT_PRESERVE_USERNAME_CASING=True) def test_username_case_preserved(self): user = get_user_model()() user_username(user, "CamelCase") self.assertEqual(user_username(user), "CamelCase") # TODO: Actually test something filter_users_by_username("camelcase", "foobar") def test_user_display(self): user = get_user_model()(username="john
doe") expected_name = "john<br/>doe" templates = [ "{% load account %}{% user_display user %}", "{% load account %}{% user_display user as x %}{{ x }}", ] for template in templates: t = Template(template) content = t.render(Context({"user": user})) self.assertEqual(content, expected_name) def test_message_escaping(self): request = RequestFactory().get("/") SessionMiddleware(lambda request: None).process_request(request) MessageMiddleware(lambda request: None).process_request(request) user = get_user_model()() user_username(user, "'<8") context = {"user": user} get_adapter().add_message( request, messages.SUCCESS, "account/messages/logged_in.txt", context ) msgs = get_messages(request) actual_message = msgs._queued_messages[0].message assert user.username in actual_message, actual_message def test_email_escaping(self): site_name = "testserver" if allauth.app_settings.SITES_ENABLED: from django.contrib.sites.models import Site site = Site.objects.get_current() site.name = site_name = '' site.save() u = get_user_model().objects.create(username="test", email="user@example.com") request = RequestFactory().get("/") EmailAddress.objects.add_email(request, u, u.email, confirm=True) self.assertTrue(mail.outbox[0].subject[1:].startswith(site_name)) @override_settings( ACCOUNT_USERNAME_VALIDATORS="allauth.account.tests.test_utils.test_username_validators" ) def test_username_validator(self): get_adapter().clean_username("abc") self.assertRaises(ValidationError, lambda: get_adapter().clean_username("def")) @override_settings(ALLOWED_HOSTS=["allowed_host", "testserver"]) def test_is_safe_url_no_wildcard(self): with context.request_context(RequestFactory().get("/")): self.assertTrue(get_adapter().is_safe_url("http://allowed_host/")) self.assertFalse(get_adapter().is_safe_url("http://other_host/")) @override_settings(ALLOWED_HOSTS=["*"]) def test_is_safe_url_wildcard(self): with context.request_context(RequestFactory().get("/")): self.assertTrue(get_adapter().is_safe_url("http://foobar.com/")) self.assertTrue(get_adapter().is_safe_url("http://other_host/")) @override_settings(ALLOWED_HOSTS=["allowed_host", "testserver"]) def test_is_safe_url_relative_path(self): with context.request_context(RequestFactory().get("/")): self.assertTrue(get_adapter().is_safe_url("/foo/bar")) def test_redirect_noreversematch(auth_client): # We used to call `django.shortcuts.redirect()` as is, but that one throws a # `NoReverseMatch`, resulting in 500s. resp = auth_client.post(reverse("account_logout") + "?next=badurlname") assert resp["location"] == "/badurlname" django-allauth-0.58.2/allauth/account/urls.py000066400000000000000000000027151452212273200211320ustar00rootroot00000000000000from django.urls import path, re_path from . import views urlpatterns = [ path("signup/", views.signup, name="account_signup"), path("login/", views.login, name="account_login"), path("logout/", views.logout, name="account_logout"), path("reauthenticate/", views.reauthenticate, name="account_reauthenticate"), path( "password/change/", views.password_change, name="account_change_password", ), path("password/set/", views.password_set, name="account_set_password"), path("inactive/", views.account_inactive, name="account_inactive"), # Email path("email/", views.email, name="account_email"), path( "confirm-email/", views.email_verification_sent, name="account_email_verification_sent", ), re_path( r"^confirm-email/(?P[-:\w]+)/$", views.confirm_email, name="account_confirm_email", ), # password reset path("password/reset/", views.password_reset, name="account_reset_password"), path( "password/reset/done/", views.password_reset_done, name="account_reset_password_done", ), re_path( r"^password/reset/key/(?P[0-9A-Za-z]+)-(?P.+)/$", views.password_reset_from_key, name="account_reset_password_from_key", ), path( "password/reset/key/done/", views.password_reset_from_key_done, name="account_reset_password_from_key_done", ), ] django-allauth-0.58.2/allauth/account/utils.py000066400000000000000000000453341452212273200213110ustar00rootroot00000000000000import unicodedata from collections import OrderedDict from typing import Optional from django.conf import settings from django.contrib import messages from django.contrib.auth import get_user_model, update_session_auth_hash from django.core.exceptions import FieldDoesNotExist from django.db import models from django.db.models import Q from django.utils.encoding import force_str from django.utils.http import base36_to_int, int_to_base36, urlencode from allauth.account import app_settings, signals from allauth.account.adapter import get_adapter from allauth.account.models import Login from allauth.core.exceptions import ImmediateHttpResponse from allauth.utils import ( get_request_param, import_callable, valid_email_or_none, ) def _unicode_ci_compare(s1, s2): """ Perform case-insensitive comparison of two identifiers, using the recommended algorithm from Unicode Technical Report 36, section 2.11.2(B)(2). """ norm_s1 = unicodedata.normalize("NFKC", s1).casefold() norm_s2 = unicodedata.normalize("NFKC", s2).casefold() return norm_s1 == norm_s2 def get_next_redirect_url(request, redirect_field_name="next"): """ Returns the next URL to redirect to, if it was explicitly passed via the request. """ redirect_to = get_request_param(request, redirect_field_name) if not get_adapter().is_safe_url(redirect_to): redirect_to = None return redirect_to def get_login_redirect_url(request, url=None, redirect_field_name="next", signup=False): ret = url if url and callable(url): # In order to be able to pass url getters around that depend # on e.g. the authenticated state. ret = url() if not ret: ret = get_next_redirect_url(request, redirect_field_name=redirect_field_name) if not ret: if signup: ret = get_adapter().get_signup_redirect_url(request) else: ret = get_adapter().get_login_redirect_url(request) return ret _user_display_callable = None def logout_on_password_change(request, user): # Since it is the default behavior of Django to invalidate all sessions on # password change, this function actually has to preserve the session when # logout isn't desired. if not app_settings.LOGOUT_ON_PASSWORD_CHANGE: update_session_auth_hash(request, user) def default_user_display(user): if app_settings.USER_MODEL_USERNAME_FIELD: return getattr(user, app_settings.USER_MODEL_USERNAME_FIELD) else: return force_str(user) def user_display(user): global _user_display_callable if not _user_display_callable: f = getattr(settings, "ACCOUNT_USER_DISPLAY", default_user_display) _user_display_callable = import_callable(f) return _user_display_callable(user) def user_field(user, field, *args, commit=False): """ Gets or sets (optional) user model fields. No-op if fields do not exist. """ if not field: return User = get_user_model() try: field_meta = User._meta.get_field(field) max_length = field_meta.max_length except FieldDoesNotExist: if not hasattr(user, field): return max_length = None if args: # Setter v = args[0] if v: v = v[0:max_length] setattr(user, field, v) if commit: user.save(update_fields=[field]) else: # Getter return getattr(user, field) def user_username(user, *args, commit=False): if args and not app_settings.PRESERVE_USERNAME_CASING and args[0]: args = [args[0].lower()] return user_field(user, app_settings.USER_MODEL_USERNAME_FIELD, *args) def user_email(user, *args, commit=False): return user_field(user, app_settings.USER_MODEL_EMAIL_FIELD, *args, commit=commit) def has_verified_email(user, email=None): from .models import EmailAddress emailaddress = None if email: ret = False try: emailaddress = EmailAddress.objects.get_for_user(user, email) ret = emailaddress.verified except EmailAddress.DoesNotExist: pass else: ret = EmailAddress.objects.filter(user=user, verified=True).exists() return ret def perform_login( request, user, email_verification, redirect_url=None, signal_kwargs=None, signup=False, email=None, ): """ Keyword arguments: signup -- Indicates whether or not sending the email is essential (during signup), or if it can be skipped (e.g. in case email verification is optional and we are only logging in). """ login = Login( user=user, email_verification=email_verification, redirect_url=redirect_url, signal_kwargs=signal_kwargs, signup=signup, email=email, ) return _perform_login(request, login) def _perform_login(request, login): # Local users are stopped due to form validation checking # is_active, yet, adapter methods could toy with is_active in a # `user_signed_up` signal. Furthermore, social users should be # stopped anyway. adapter = get_adapter() hook_kwargs = _get_login_hook_kwargs(login) response = adapter.pre_login(request, login.user, **hook_kwargs) if response: return response return resume_login(request, login) def _get_login_hook_kwargs(login): """ TODO: Just break backwards compatibility and pass only `login` to `pre/post_login()`. """ return dict( email_verification=login.email_verification, redirect_url=login.redirect_url, signal_kwargs=login.signal_kwargs, signup=login.signup, email=login.email, ) def resume_login(request, login): from allauth.account.stages import LoginStageController adapter = get_adapter() ctrl = LoginStageController(request, login) try: response = ctrl.handle() if response: return response adapter.login(request, login.user) hook_kwargs = _get_login_hook_kwargs(login) response = adapter.post_login(request, login.user, **hook_kwargs) if response: return response except ImmediateHttpResponse as e: response = e.response return response def unstash_login(request, peek=False): login = None if peek: data = request.session.get("account_login") else: data = request.session.pop("account_login", None) if data is not None: try: login = Login.deserialize(data) request._account_login_accessed = True except ValueError: pass return login def stash_login(request, login): request.session["account_login"] = login.serialize() request._account_login_accessed = True def complete_signup(request, user, email_verification, success_url, signal_kwargs=None): if signal_kwargs is None: signal_kwargs = {} signals.user_signed_up.send( sender=user.__class__, request=request, user=user, **signal_kwargs ) return perform_login( request, user, email_verification=email_verification, signup=True, redirect_url=success_url, signal_kwargs=signal_kwargs, ) def cleanup_email_addresses(request, addresses): """ Takes a list of EmailAddress instances and cleans it up, making sure only valid ones remain, without multiple primaries etc. Order is important: e.g. if multiple primary email addresses exist, the first one encountered will be kept as primary. """ from .models import EmailAddress adapter = get_adapter() # Let's group by `email` e2a = OrderedDict() # maps email to EmailAddress primary_addresses = [] verified_addresses = [] primary_verified_addresses = [] for address in addresses: # Pick up only valid ones... email = valid_email_or_none(address.email) if not email: continue # ... and non-conflicting ones... if ( app_settings.UNIQUE_EMAIL and app_settings.PREVENT_ENUMERATION != "strict" and EmailAddress.objects.lookup([email]) ): # Email address already exists. continue if ( app_settings.UNIQUE_EMAIL and app_settings.PREVENT_ENUMERATION == "strict" and address.verified and EmailAddress.objects.is_verified(email) ): # Email address already exists, and is verified as well. continue a = e2a.get(email.lower()) if a: a.primary = a.primary or address.primary a.verified = a.verified or address.verified else: a = address a.verified = a.verified or adapter.is_email_verified(request, a.email) e2a[email.lower()] = a if a.primary: primary_addresses.append(a) if a.verified: primary_verified_addresses.append(a) if a.verified: verified_addresses.append(a) # Now that we got things sorted out, let's assign a primary if primary_verified_addresses: primary_address = primary_verified_addresses[0] elif verified_addresses: # Pick any verified as primary primary_address = verified_addresses[0] elif primary_addresses: # Okay, let's pick primary then, even if unverified primary_address = primary_addresses[0] elif e2a: # Pick the first primary_address = list(e2a.values())[0] else: # Empty primary_address = None # There can only be one primary for a in e2a.values(): a.primary = primary_address.email.lower() == a.email.lower() return list(e2a.values()), primary_address def setup_user_email(request, user, addresses): """ Creates proper EmailAddress for the user that was just signed up. Only sets up, doesn't do any other handling such as sending out email confirmation mails etc. """ from .models import EmailAddress assert not EmailAddress.objects.filter(user=user).exists() priority_addresses = [] # Is there a stashed email? adapter = get_adapter() stashed_email = adapter.unstash_verified_email(request) if stashed_email: priority_addresses.append( EmailAddress(user=user, email=stashed_email, primary=True, verified=True) ) email = user_email(user) if email: priority_addresses.append( EmailAddress(user=user, email=email, primary=True, verified=False) ) addresses, primary = cleanup_email_addresses( request, priority_addresses + addresses ) for a in addresses: a.user = user a.save() EmailAddress.objects.fill_cache_for_user(user, addresses) if primary and email and email.lower() != primary.email.lower(): user_email(user, primary.email) user.save() return primary def send_email_confirmation(request, user, signup=False, email=None): """ Email verification mails are sent: a) Explicitly: when a user signs up b) Implicitly: when a user attempts to log in using an unverified email while EMAIL_VERIFICATION is mandatory. Especially in case of b), we want to limit the number of mails sent (consider a user retrying a few times), which is why there is a cooldown period before sending a new mail. This cooldown period can be configured in ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN setting. TODO: This code is doing way too much. Looking up EmailAddress, creating if not present, etc. To be refactored. """ from .models import EmailAddress adapter = get_adapter() email_address = None if not email: email = user_email(user) if not email: email_address = ( EmailAddress.objects.filter(user=user).order_by("verified", "pk").first() ) if email_address: email = email_address.email if email: if email_address is None: try: email_address = EmailAddress.objects.get_for_user(user, email) except EmailAddress.DoesNotExist: pass if email_address is not None: if not email_address.verified: send_email = adapter.should_send_confirmation_mail( request, email_address ) if send_email: email_address.send_confirmation(request, signup=signup) else: send_email = False else: send_email = True email_address = EmailAddress.objects.add_email( request, user, email, signup=signup, confirm=True ) assert email_address # At this point, if we were supposed to send an email we have sent it. if send_email: adapter.add_message( request, messages.INFO, "account/messages/email_confirmation_sent.txt", {"email": email, "login": not signup, "signup": signup}, ) if signup: adapter.stash_user(request, user_pk_to_url_str(user)) def sync_user_email_addresses(user): """ Keep user.email in sync with user.emailaddress_set. Under some circumstances the user.email may not have ended up as an EmailAddress record, e.g. in the case of manually created admin users. """ from .models import EmailAddress email = user_email(user) if ( email and not EmailAddress.objects.filter(user=user, email__iexact=email).exists() ): # get_or_create() to gracefully handle races EmailAddress.objects.get_or_create( user=user, email=email, defaults={"primary": False, "verified": False} ) def filter_users_by_username(*username): if app_settings.PRESERVE_USERNAME_CASING: qlist = [ Q(**{app_settings.USER_MODEL_USERNAME_FIELD + "__iexact": u}) for u in username ] q = qlist[0] for q2 in qlist[1:]: q = q | q2 ret = get_user_model()._default_manager.filter(q) else: ret = get_user_model()._default_manager.filter( **{ app_settings.USER_MODEL_USERNAME_FIELD + "__in": [u.lower() for u in username] } ) return ret def filter_users_by_email(email, is_active=None, prefer_verified=False): """Return list of users by email address Typically one, at most just a few in length. First we look through EmailAddress table, than customisable User model table. Add results together avoiding SQL joins and deduplicate. `prefer_verified`: When looking up users by email, there can be cases where users with verified email addresses are preferable above users who did not verify their email address. The password reset is such a use case -- if there is a user with a verified email than that user should be returned, not one of the other users. """ from .models import EmailAddress User = get_user_model() mails = EmailAddress.objects.filter(email__iexact=email).prefetch_related("user") if is_active is not None: mails = mails.filter(user__is_active=is_active) mails = list(mails) is_verified = False if prefer_verified: verified_mails = list(filter(lambda e: e.verified, mails)) if verified_mails: mails = verified_mails is_verified = True users = [] for e in mails: if _unicode_ci_compare(e.email, email): users.append(e.user) if app_settings.USER_MODEL_EMAIL_FIELD and not is_verified: q_dict = {app_settings.USER_MODEL_EMAIL_FIELD + "__iexact": email} user_qs = User.objects.filter(**q_dict) if is_active is not None: user_qs = user_qs.filter(is_active=is_active) for user in user_qs.iterator(): user_email = getattr(user, app_settings.USER_MODEL_EMAIL_FIELD) if _unicode_ci_compare(user_email, email): users.append(user) return list(set(users)) def passthrough_next_redirect_url(request, url, redirect_field_name): assert url.find("?") < 0 # TODO: Handle this case properly next_url = get_next_redirect_url(request, redirect_field_name) if next_url: url = url + "?" + urlencode({redirect_field_name: next_url}) return url def user_pk_to_url_str(user): """ This should return a string. """ User = get_user_model() pk_field_class = type(User._meta.pk) if issubclass(pk_field_class, models.UUIDField): if isinstance(user.pk, str): return user.pk return user.pk.hex elif issubclass(pk_field_class, models.IntegerField): return int_to_base36(int(user.pk)) return str(user.pk) def url_str_to_user_pk(pk_str): User = get_user_model() remote_field = getattr(User._meta.pk, "remote_field", None) if remote_field and getattr(remote_field, "to", None): pk_field = User._meta.pk.remote_field.to._meta.pk else: pk_field = User._meta.pk pk_field_class = type(pk_field) if issubclass(pk_field_class, models.IntegerField): pk = base36_to_int(pk_str) # always call to_python() -- because there are fields like HashidField # that derive from IntegerField. pk = pk_field.to_python(pk) else: pk = pk_field.to_python(pk_str) return pk def assess_unique_email(email) -> Optional[bool]: """ True -- email is unique False -- email is already in use None -- email is in use, but we should hide that using email verification. """ if not filter_users_by_email(email): # All good. return True elif not app_settings.PREVENT_ENUMERATION: # Fail right away. return False elif ( app_settings.EMAIL_VERIFICATION == app_settings.EmailVerificationMethod.MANDATORY ): # In case of mandatory verification and enumeration prevention, # we can avoid creating a new account with the same (unverified) # email address, because we are going to send an email anyway. assert app_settings.PREVENT_ENUMERATION return None elif app_settings.PREVENT_ENUMERATION == "strict": # We're going to be strict on enumeration prevention, and allow for # this email address to pass even though it already exists. In this # scenario, you can signup multiple times using the same email # address resulting in multiple accounts with an unverified email. return True else: assert app_settings.PREVENT_ENUMERATION is True # Conflict. We're supposed to prevent enumeration, but we can't # because that means letting the user in, while emails are required # to be unique. In this case, uniqueness takes precedence over # enumeration prevention. return False django-allauth-0.58.2/allauth/account/views.py000066400000000000000000001101161452212273200212750ustar00rootroot00000000000000from django.contrib import messages from django.contrib.auth import REDIRECT_FIELD_NAME from django.contrib.auth.decorators import login_required from django.contrib.sites.shortcuts import get_current_site from django.core.validators import validate_email from django.forms import ValidationError from django.http import ( Http404, HttpResponsePermanentRedirect, HttpResponseRedirect, ) from django.urls import reverse, reverse_lazy from django.utils.decorators import method_decorator from django.views.decorators.cache import never_cache from django.views.decorators.debug import sensitive_post_parameters from django.views.generic.base import TemplateResponseMixin, TemplateView, View from django.views.generic.edit import FormView from allauth.account import app_settings, signals from allauth.account.adapter import get_adapter from allauth.account.decorators import reauthentication_required from allauth.account.forms import ( AddEmailForm, ChangePasswordForm, LoginForm, ReauthenticateForm, ResetPasswordForm, ResetPasswordKeyForm, SetPasswordForm, SignupForm, UserTokenForm, ) from allauth.account.models import ( EmailAddress, EmailConfirmation, EmailConfirmationHMAC, ) from allauth.account.reauthentication import ( record_authentication, resume_request, ) from allauth.account.utils import ( complete_signup, get_login_redirect_url, get_next_redirect_url, logout_on_password_change, passthrough_next_redirect_url, perform_login, send_email_confirmation, sync_user_email_addresses, url_str_to_user_pk, ) from allauth.core import ratelimit from allauth.core.exceptions import ImmediateHttpResponse from allauth.core.internal.http import redirect from allauth.decorators import rate_limit from allauth.utils import get_form_class, get_request_param INTERNAL_RESET_SESSION_KEY = "_password_reset_key" sensitive_post_parameters_m = method_decorator( sensitive_post_parameters("oldpassword", "password", "password1", "password2") ) def _ajax_response(request, response, form=None, data=None): adapter = get_adapter() if adapter.is_ajax(request): if isinstance(response, HttpResponseRedirect) or isinstance( response, HttpResponsePermanentRedirect ): redirect_to = response["Location"] else: redirect_to = None response = adapter.ajax_response( request, response, form=form, data=data, redirect_to=redirect_to ) return response class RedirectAuthenticatedUserMixin(object): def dispatch(self, request, *args, **kwargs): if request.user.is_authenticated and app_settings.AUTHENTICATED_LOGIN_REDIRECTS: redirect_to = self.get_authenticated_redirect_url() response = HttpResponseRedirect(redirect_to) return _ajax_response(request, response) else: response = super(RedirectAuthenticatedUserMixin, self).dispatch( request, *args, **kwargs ) return response def get_authenticated_redirect_url(self): redirect_field_name = self.redirect_field_name return get_login_redirect_url( self.request, url=self.get_success_url(), redirect_field_name=redirect_field_name, ) class AjaxCapableProcessFormViewMixin(object): def get(self, request, *args, **kwargs): response = super(AjaxCapableProcessFormViewMixin, self).get( request, *args, **kwargs ) form = self.get_form() return _ajax_response( self.request, response, form=form, data=self._get_ajax_data_if() ) def post(self, request, *args, **kwargs): form_class = self.get_form_class() form = self.get_form(form_class) if form.is_valid(): response = self.form_valid(form) else: response = self.form_invalid(form) return _ajax_response( self.request, response, form=form, data=self._get_ajax_data_if() ) def get_form(self, form_class=None): form = getattr(self, "_cached_form", None) if form is None: form = super(AjaxCapableProcessFormViewMixin, self).get_form(form_class) self._cached_form = form return form def _get_ajax_data_if(self): return ( self.get_ajax_data() if get_adapter(self.request).is_ajax(self.request) else None ) def get_ajax_data(self): return None class LogoutFunctionalityMixin(object): def logout(self): adapter = get_adapter(self.request) adapter.add_message( self.request, messages.SUCCESS, "account/messages/logged_out.txt" ) adapter.logout(self.request) class LoginView( RedirectAuthenticatedUserMixin, AjaxCapableProcessFormViewMixin, FormView ): form_class = LoginForm template_name = "account/login." + app_settings.TEMPLATE_EXTENSION success_url = None redirect_field_name = REDIRECT_FIELD_NAME @sensitive_post_parameters_m @method_decorator(never_cache) def dispatch(self, request, *args, **kwargs): return super(LoginView, self).dispatch(request, *args, **kwargs) def get_form_kwargs(self): kwargs = super(LoginView, self).get_form_kwargs() kwargs["request"] = self.request return kwargs def get_form_class(self): return get_form_class(app_settings.FORMS, "login", self.form_class) def form_valid(self, form): success_url = self.get_success_url() try: return form.login(self.request, redirect_url=success_url) except ImmediateHttpResponse as e: return e.response def get_success_url(self): # Explicitly passed ?next= URL takes precedence ret = ( get_next_redirect_url(self.request, self.redirect_field_name) or self.success_url ) return ret def get_context_data(self, **kwargs): ret = super(LoginView, self).get_context_data(**kwargs) signup_url = passthrough_next_redirect_url( self.request, reverse("account_signup"), self.redirect_field_name ) redirect_field_value = get_request_param(self.request, self.redirect_field_name) site = get_current_site(self.request) ret.update( { "signup_url": signup_url, "site": site, "redirect_field_name": self.redirect_field_name, "redirect_field_value": redirect_field_value, } ) return ret login = LoginView.as_view() class CloseableSignupMixin(object): template_name_signup_closed = ( "account/signup_closed." + app_settings.TEMPLATE_EXTENSION ) def dispatch(self, request, *args, **kwargs): try: if not self.is_open(): return self.closed() except ImmediateHttpResponse as e: return e.response return super(CloseableSignupMixin, self).dispatch(request, *args, **kwargs) def is_open(self): return get_adapter(self.request).is_open_for_signup(self.request) def closed(self): response_kwargs = { "request": self.request, "template": self.template_name_signup_closed, } return self.response_class(**response_kwargs) @method_decorator(rate_limit(action="signup"), name="dispatch") class SignupView( RedirectAuthenticatedUserMixin, CloseableSignupMixin, AjaxCapableProcessFormViewMixin, FormView, ): template_name = "account/signup." + app_settings.TEMPLATE_EXTENSION form_class = SignupForm redirect_field_name = REDIRECT_FIELD_NAME success_url = None @sensitive_post_parameters_m @method_decorator(never_cache) def dispatch(self, request, *args, **kwargs): return super(SignupView, self).dispatch(request, *args, **kwargs) def get_form_class(self): return get_form_class(app_settings.FORMS, "signup", self.form_class) def get_success_url(self): # Explicitly passed ?next= URL takes precedence ret = ( get_next_redirect_url(self.request, self.redirect_field_name) or self.success_url ) return ret def form_valid(self, form): self.user, resp = form.try_save(self.request) if resp: return resp try: return complete_signup( self.request, self.user, app_settings.EMAIL_VERIFICATION, self.get_success_url(), ) except ImmediateHttpResponse as e: return e.response def get_context_data(self, **kwargs): ret = super(SignupView, self).get_context_data(**kwargs) form = ret["form"] email = self.request.session.get("account_verified_email") if email: email_keys = ["email"] if app_settings.SIGNUP_EMAIL_ENTER_TWICE: email_keys.append("email2") for email_key in email_keys: form.fields[email_key].initial = email login_url = passthrough_next_redirect_url( self.request, reverse("account_login"), self.redirect_field_name ) redirect_field_name = self.redirect_field_name site = get_current_site(self.request) redirect_field_value = get_request_param(self.request, redirect_field_name) ret.update( { "login_url": login_url, "redirect_field_name": redirect_field_name, "redirect_field_value": redirect_field_value, "site": site, } ) return ret def get_initial(self): initial = super().get_initial() email = self.request.GET.get("email") if email: try: validate_email(email) except ValidationError: return initial initial["email"] = email if app_settings.SIGNUP_EMAIL_ENTER_TWICE: initial["email2"] = email return initial signup = SignupView.as_view() class ConfirmEmailView(TemplateResponseMixin, LogoutFunctionalityMixin, View): template_name = "account/email_confirm." + app_settings.TEMPLATE_EXTENSION def get(self, *args, **kwargs): try: self.object = self.get_object() if app_settings.CONFIRM_EMAIL_ON_GET: return self.post(*args, **kwargs) except Http404: self.object = None ctx = self.get_context_data() return self.render_to_response(ctx) def post(self, *args, **kwargs): self.object = confirmation = self.get_object() email_address = confirmation.confirm(self.request) if not email_address: get_adapter(self.request).add_message( self.request, messages.ERROR, "account/messages/email_confirmation_failed.txt", {"email": confirmation.email_address.email}, ) return self.respond(False) # In the event someone clicks on an email confirmation link # for one account while logged into another account, # logout of the currently logged in account. if ( self.request.user.is_authenticated and self.request.user.pk != confirmation.email_address.user_id ): self.logout() get_adapter(self.request).add_message( self.request, messages.SUCCESS, "account/messages/email_confirmed.txt", {"email": confirmation.email_address.email}, ) if app_settings.LOGIN_ON_EMAIL_CONFIRMATION: resp = self.login_on_confirm(confirmation) if resp is not None: return resp # Don't -- allauth doesn't touch is_active so that sys admin can # use it to block users et al # # user = confirmation.email_address.user # user.is_active = True # user.save() return self.respond(True) def respond(self, success): redirect_url = self.get_redirect_url() if not redirect_url: ctx = self.get_context_data() return self.render_to_response(ctx) return redirect(redirect_url) def login_on_confirm(self, confirmation): """ Simply logging in the user may become a security issue. If you do not take proper care (e.g. don't purge used email confirmations), a malicious person that got hold of the link will be able to login over and over again and the user is unable to do anything about it. Even restoring their own mailbox security will not help, as the links will still work. For password reset this is different, this mechanism works only as long as the attacker has access to the mailbox. If they no longer has access they cannot issue a password request and intercept it. Furthermore, all places where the links are listed (log files, but even Google Analytics) all of a sudden need to be secured. Purging the email confirmation once confirmed changes the behavior -- users will not be able to repeatedly confirm (in case they forgot that they already clicked the mail). All in all, opted for storing the user that is in the process of signing up in the session to avoid all of the above. This may not 100% work in case the user closes the browser (and the session gets lost), but at least we're secure. """ user_pk = None user_pk_str = get_adapter(self.request).unstash_user(self.request) if user_pk_str: user_pk = url_str_to_user_pk(user_pk_str) user = confirmation.email_address.user if user_pk == user.pk and self.request.user.is_anonymous: return perform_login( self.request, user, app_settings.EmailVerificationMethod.NONE, # passed as callable, as this method # depends on the authenticated state redirect_url=self.get_redirect_url, ) return None def get_object(self, queryset=None): key = self.kwargs["key"] emailconfirmation = EmailConfirmationHMAC.from_key(key) if not emailconfirmation: if queryset is None: queryset = self.get_queryset() try: emailconfirmation = queryset.get(key=key.lower()) except EmailConfirmation.DoesNotExist: raise Http404() return emailconfirmation def get_queryset(self): qs = EmailConfirmation.objects.all_valid() qs = qs.select_related("email_address__user") return qs def get_context_data(self, **kwargs): ctx = kwargs site = get_current_site(self.request) ctx.update( { "site": site, "confirmation": self.object, "can_confirm": self.object and self.object.email_address.can_set_verified(), } ) if self.object: ctx["email"] = self.object.email_address.email return ctx def get_redirect_url(self): return get_adapter(self.request).get_email_confirmation_redirect_url( self.request ) confirm_email = ConfirmEmailView.as_view() @method_decorator(rate_limit(action="manage_email"), name="dispatch") @method_decorator( reauthentication_required( allow_get=True, enabled=lambda request: app_settings.REAUTHENTICATION_REQUIRED ), name="dispatch", ) class EmailView(AjaxCapableProcessFormViewMixin, FormView): template_name = ( "account/email_change." if app_settings.CHANGE_EMAIL else "account/email." ) + app_settings.TEMPLATE_EXTENSION form_class = AddEmailForm success_url = reverse_lazy("account_email") def get_form_class(self): return get_form_class(app_settings.FORMS, "add_email", self.form_class) def dispatch(self, request, *args, **kwargs): sync_user_email_addresses(request.user) return super(EmailView, self).dispatch(request, *args, **kwargs) def get_form_kwargs(self): kwargs = super(EmailView, self).get_form_kwargs() kwargs["user"] = self.request.user return kwargs def form_valid(self, form): email_address = form.save(self.request) get_adapter(self.request).add_message( self.request, messages.INFO, "account/messages/email_confirmation_sent.txt", {"email": form.cleaned_data["email"]}, ) signals.email_added.send( sender=self.request.user.__class__, request=self.request, user=self.request.user, email_address=email_address, ) return super(EmailView, self).form_valid(form) def post(self, request, *args, **kwargs): res = None if "action_add" in request.POST: res = super(EmailView, self).post(request, *args, **kwargs) elif request.POST.get("email"): if "action_send" in request.POST: res = self._action_send(request) elif "action_remove" in request.POST: res = self._action_remove(request) elif "action_primary" in request.POST: res = self._action_primary(request) res = res or HttpResponseRedirect(self.get_success_url()) # Given that we bypassed AjaxCapableProcessFormViewMixin, # we'll have to call invoke it manually... res = _ajax_response(request, res, data=self._get_ajax_data_if()) else: # No email address selected res = HttpResponseRedirect(self.success_url) res = _ajax_response(request, res, data=self._get_ajax_data_if()) return res def _get_email_address(self, request): email = request.POST["email"] try: validate_email(email) except ValidationError: return None try: return EmailAddress.objects.get_for_user(user=request.user, email=email) except EmailAddress.DoesNotExist: pass def _action_send(self, request, *args, **kwargs): email_address = self._get_email_address(request) if email_address: send_email_confirmation( self.request, request.user, email=email_address.email ) def _action_remove(self, request, *args, **kwargs): email_address = self._get_email_address(request) if email_address: adapter = get_adapter() if not adapter.can_delete_email(email_address): adapter.add_message( request, messages.ERROR, "account/messages/cannot_delete_primary_email.txt", {"email": email_address.email}, ) else: email_address.remove() signals.email_removed.send( sender=request.user.__class__, request=request, user=request.user, email_address=email_address, ) adapter.add_message( request, messages.SUCCESS, "account/messages/email_deleted.txt", {"email": email_address.email}, ) return HttpResponseRedirect(self.get_success_url()) def _action_primary(self, request, *args, **kwargs): email_address = self._get_email_address(request) if email_address: # Not primary=True -- Slightly different variation, don't # require verified unless moving from a verified # address. Ignore constraint if previous primary email # address is not verified. if ( not email_address.verified and EmailAddress.objects.filter( user=request.user, verified=True ).exists() ): get_adapter().add_message( request, messages.ERROR, "account/messages/unverified_primary_email.txt", ) else: # Sending the old primary address to the signal # adds a db query. try: from_email_address = EmailAddress.objects.get( user=request.user, primary=True ) except EmailAddress.DoesNotExist: from_email_address = None email_address.set_as_primary() get_adapter().add_message( request, messages.SUCCESS, "account/messages/primary_email_set.txt", ) signals.email_changed.send( sender=request.user.__class__, request=request, user=request.user, from_email_address=from_email_address, to_email_address=email_address, ) return HttpResponseRedirect(self.get_success_url()) def get_context_data(self, **kwargs): ret = super(EmailView, self).get_context_data(**kwargs) emails = list( EmailAddress.objects.filter(user=self.request.user).order_by("email") ) ret.update( { "emailaddresses": emails, "emailaddress_radios": [ { "id": f"email_radio_{i}", "checked": email.primary or len(emails) == 1, "emailaddress": email, } for i, email in enumerate(emails) ], "add_email_form": ret.get("form"), "can_add_email": EmailAddress.objects.can_add_email(self.request.user), } ) if app_settings.CHANGE_EMAIL: ret.update( { "new_emailaddress": EmailAddress.objects.get_new(self.request.user), "current_emailaddress": EmailAddress.objects.get_verified( self.request.user ), } ) return ret def get_ajax_data(self): data = [] for emailaddress in self.request.user.emailaddress_set.all().order_by("pk"): data.append( { "id": emailaddress.pk, "email": emailaddress.email, "verified": emailaddress.verified, "primary": emailaddress.primary, } ) return data email = login_required(EmailView.as_view()) @method_decorator(rate_limit(action="change_password"), name="dispatch") class PasswordChangeView(AjaxCapableProcessFormViewMixin, FormView): template_name = "account/password_change." + app_settings.TEMPLATE_EXTENSION form_class = ChangePasswordForm success_url = reverse_lazy("account_change_password") def get_form_class(self): return get_form_class(app_settings.FORMS, "change_password", self.form_class) @sensitive_post_parameters_m def dispatch(self, request, *args, **kwargs): return super(PasswordChangeView, self).dispatch(request, *args, **kwargs) def render_to_response(self, context, **response_kwargs): if self.request.user.is_anonymous: # We end up here when `ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE = True`. redirect_url = get_adapter(self.request).get_logout_redirect_url( self.request ) return HttpResponseRedirect(redirect_url) elif not self.request.user.has_usable_password(): return HttpResponseRedirect(reverse("account_set_password")) return super(PasswordChangeView, self).render_to_response( context, **response_kwargs ) def get_form_kwargs(self): kwargs = super(PasswordChangeView, self).get_form_kwargs() kwargs["user"] = self.request.user return kwargs def form_valid(self, form): form.save() logout_on_password_change(self.request, form.user) get_adapter(self.request).add_message( self.request, messages.SUCCESS, "account/messages/password_changed.txt", ) signals.password_changed.send( sender=self.request.user.__class__, request=self.request, user=self.request.user, ) return super(PasswordChangeView, self).form_valid(form) def get_context_data(self, **kwargs): ret = super(PasswordChangeView, self).get_context_data(**kwargs) # NOTE: For backwards compatibility ret["password_change_form"] = ret.get("form") # (end NOTE) return ret password_change = login_required(PasswordChangeView.as_view()) @method_decorator( # NOTE: 'change_password' (iso 'set_') is intentional, there is no need to # differentiate between set and change. rate_limit(action="change_password"), name="dispatch", ) class PasswordSetView(AjaxCapableProcessFormViewMixin, FormView): template_name = "account/password_set." + app_settings.TEMPLATE_EXTENSION form_class = SetPasswordForm success_url = reverse_lazy("account_set_password") def get_form_class(self): return get_form_class(app_settings.FORMS, "set_password", self.form_class) @sensitive_post_parameters_m def dispatch(self, request, *args, **kwargs): if self.request.user.has_usable_password(): return HttpResponseRedirect(reverse("account_change_password")) return super(PasswordSetView, self).dispatch(request, *args, **kwargs) def render_to_response(self, context, **response_kwargs): return super(PasswordSetView, self).render_to_response( context, **response_kwargs ) def get_form_kwargs(self): kwargs = super(PasswordSetView, self).get_form_kwargs() kwargs["user"] = self.request.user return kwargs def form_valid(self, form): form.save() logout_on_password_change(self.request, form.user) get_adapter(self.request).add_message( self.request, messages.SUCCESS, "account/messages/password_set.txt" ) signals.password_set.send( sender=self.request.user.__class__, request=self.request, user=self.request.user, ) return super(PasswordSetView, self).form_valid(form) def get_context_data(self, **kwargs): ret = super(PasswordSetView, self).get_context_data(**kwargs) # NOTE: For backwards compatibility ret["password_set_form"] = ret.get("form") # (end NOTE) return ret password_set = login_required(PasswordSetView.as_view()) @method_decorator(rate_limit(action="reset_password"), name="dispatch") class PasswordResetView(AjaxCapableProcessFormViewMixin, FormView): template_name = "account/password_reset." + app_settings.TEMPLATE_EXTENSION form_class = ResetPasswordForm success_url = reverse_lazy("account_reset_password_done") redirect_field_name = REDIRECT_FIELD_NAME def get_form_class(self): return get_form_class(app_settings.FORMS, "reset_password", self.form_class) def form_valid(self, form): r429 = ratelimit.consume_or_429( self.request, action="reset_password_email", key=form.cleaned_data["email"].lower(), ) if r429: return r429 form.save(self.request) return super(PasswordResetView, self).form_valid(form) def get_context_data(self, **kwargs): ret = super(PasswordResetView, self).get_context_data(**kwargs) login_url = passthrough_next_redirect_url( self.request, reverse("account_login"), self.redirect_field_name ) # NOTE: For backwards compatibility ret["password_reset_form"] = ret.get("form") # (end NOTE) ret.update({"login_url": login_url}) return ret password_reset = PasswordResetView.as_view() class PasswordResetDoneView(TemplateView): template_name = "account/password_reset_done." + app_settings.TEMPLATE_EXTENSION password_reset_done = PasswordResetDoneView.as_view() @method_decorator(rate_limit(action="reset_password_from_key"), name="dispatch") class PasswordResetFromKeyView( AjaxCapableProcessFormViewMixin, LogoutFunctionalityMixin, FormView ): template_name = "account/password_reset_from_key." + app_settings.TEMPLATE_EXTENSION form_class = ResetPasswordKeyForm success_url = reverse_lazy("account_reset_password_from_key_done") reset_url_key = "set-password" def get_form_class(self): return get_form_class( app_settings.FORMS, "reset_password_from_key", self.form_class ) def dispatch(self, request, uidb36, key, **kwargs): self.request = request self.key = key user_token_form_class = get_form_class( app_settings.FORMS, "user_token", UserTokenForm ) if self.key == self.reset_url_key: self.key = self.request.session.get(INTERNAL_RESET_SESSION_KEY, "") # (Ab)using forms here to be able to handle errors in XHR #890 token_form = user_token_form_class(data={"uidb36": uidb36, "key": self.key}) if token_form.is_valid(): self.reset_user = token_form.reset_user # In the event someone clicks on a password reset link # for one account while logged into another account, # logout of the currently logged in account. if ( self.request.user.is_authenticated and self.request.user.pk != self.reset_user.pk ): self.logout() self.request.session[INTERNAL_RESET_SESSION_KEY] = self.key return super(PasswordResetFromKeyView, self).dispatch( request, uidb36, self.key, **kwargs ) else: token_form = user_token_form_class(data={"uidb36": uidb36, "key": self.key}) if token_form.is_valid(): # Store the key in the session and redirect to the # password reset form at a URL without the key. That # avoids the possibility of leaking the key in the # HTTP Referer header. self.request.session[INTERNAL_RESET_SESSION_KEY] = self.key redirect_url = self.request.path.replace(self.key, self.reset_url_key) return redirect(redirect_url) self.reset_user = None response = self.render_to_response(self.get_context_data(token_fail=True)) return _ajax_response(self.request, response, form=token_form) def get_context_data(self, **kwargs): ret = super(PasswordResetFromKeyView, self).get_context_data(**kwargs) ret["action_url"] = reverse( "account_reset_password_from_key", kwargs={ "uidb36": self.kwargs["uidb36"], "key": self.kwargs["key"], }, ) return ret def get_form_kwargs(self): kwargs = super(PasswordResetFromKeyView, self).get_form_kwargs() kwargs["user"] = self.reset_user kwargs["temp_key"] = self.key return kwargs def form_valid(self, form): form.save() adapter = get_adapter(self.request) if self.reset_user and app_settings.LOGIN_ATTEMPTS_LIMIT: # User successfully reset the password, clear any # possible cache entries for all email addresses. for email in self.reset_user.emailaddress_set.all(): adapter._delete_login_attempts_cached_email( self.request, email=email.email ) adapter.add_message( self.request, messages.SUCCESS, "account/messages/password_changed.txt", ) signals.password_reset.send( sender=self.reset_user.__class__, request=self.request, user=self.reset_user, ) if app_settings.LOGIN_ON_PASSWORD_RESET: return perform_login( self.request, self.reset_user, email_verification=app_settings.EMAIL_VERIFICATION, ) return super(PasswordResetFromKeyView, self).form_valid(form) password_reset_from_key = PasswordResetFromKeyView.as_view() class PasswordResetFromKeyDoneView(TemplateView): template_name = ( "account/password_reset_from_key_done." + app_settings.TEMPLATE_EXTENSION ) password_reset_from_key_done = PasswordResetFromKeyDoneView.as_view() class LogoutView(TemplateResponseMixin, LogoutFunctionalityMixin, View): template_name = "account/logout." + app_settings.TEMPLATE_EXTENSION redirect_field_name = REDIRECT_FIELD_NAME def get(self, *args, **kwargs): if app_settings.LOGOUT_ON_GET: return self.post(*args, **kwargs) if not self.request.user.is_authenticated: response = redirect(self.get_redirect_url()) return _ajax_response(self.request, response) ctx = self.get_context_data() response = self.render_to_response(ctx) return _ajax_response(self.request, response) def post(self, *args, **kwargs): url = self.get_redirect_url() if self.request.user.is_authenticated: self.logout() response = redirect(url) return _ajax_response(self.request, response) def get_context_data(self, **kwargs): ctx = kwargs redirect_field_value = get_request_param(self.request, self.redirect_field_name) ctx.update( { "redirect_field_name": self.redirect_field_name, "redirect_field_value": redirect_field_value, } ) return ctx def get_redirect_url(self): return get_next_redirect_url( self.request, self.redirect_field_name ) or get_adapter(self.request).get_logout_redirect_url(self.request) logout = LogoutView.as_view() class AccountInactiveView(TemplateView): template_name = "account/account_inactive." + app_settings.TEMPLATE_EXTENSION account_inactive = AccountInactiveView.as_view() class EmailVerificationSentView(TemplateView): template_name = "account/verification_sent." + app_settings.TEMPLATE_EXTENSION email_verification_sent = EmailVerificationSentView.as_view() class ReauthenticateView(FormView): form_class = ReauthenticateForm template_name = "account/reauthenticate." + app_settings.TEMPLATE_EXTENSION redirect_field_name = REDIRECT_FIELD_NAME def dispatch(self, request, *args, **kwargs): r429 = ratelimit.consume_or_429( self.request, action="reauthenticate", user=self.request.user, ) if r429: return r429 return super().dispatch(request, *args, **kwargs) def get_form_class(self): return get_form_class(app_settings.FORMS, "reauthenticate", self.form_class) def get_success_url(self): url = get_next_redirect_url(self.request, self.redirect_field_name) if not url: url = get_adapter(self.request).get_login_redirect_url(self.request) return url def get_form_kwargs(self): ret = super().get_form_kwargs() ret["user"] = self.request.user return ret def form_valid(self, form): record_authentication(self.request, self.request.user) response = resume_request(self.request) if response: return response return super().form_valid(form) def get_context_data(self, **kwargs): ret = super(ReauthenticateView, self).get_context_data(**kwargs) redirect_field_value = get_request_param(self.request, self.redirect_field_name) ret.update( { "redirect_field_name": self.redirect_field_name, "redirect_field_value": redirect_field_value, } ) return ret reauthenticate = login_required(ReauthenticateView.as_view()) django-allauth-0.58.2/allauth/app_settings.py000066400000000000000000000013041452212273200212020ustar00rootroot00000000000000from django.apps import apps class AppSettings(object): def __init__(self, prefix): self.prefix = prefix def _setting(self, name, dflt): from allauth.utils import get_setting return get_setting(self.prefix + name, dflt) @property def SITES_ENABLED(self): return apps.is_installed("django.contrib.sites") @property def SOCIALACCOUNT_ENABLED(self): return apps.is_installed("allauth.socialaccount") @property def MFA_ENABLED(self): return apps.is_installed("allauth.mfa") _app_settings = AppSettings("ALLAUTH_") def __getattr__(name): # See https://peps.python.org/pep-0562/ return getattr(_app_settings, name) django-allauth-0.58.2/allauth/conftest.py000066400000000000000000000043261452212273200203360ustar00rootroot00000000000000import uuid from contextlib import contextmanager from unittest.mock import patch from django.contrib.auth import get_user_model import pytest from allauth.account.models import EmailAddress from allauth.account.utils import user_email, user_username from allauth.core import context @pytest.fixture def user(user_factory): return user_factory() @pytest.fixture def auth_client(client, user): client.force_login(user) return client @pytest.fixture def password_factory(): def f(): return str(uuid.uuid4()) return f @pytest.fixture def user_password(password_factory): return password_factory() @pytest.fixture def user_factory(email_factory, db, user_password): def factory( email=None, username=None, commit=True, with_email=True, email_verified=True, password=None, with_emailaddress=True, ): if not username: username = uuid.uuid4().hex if not email and with_email: email = email_factory(username=username) User = get_user_model() user = User() user.set_password(user_password if password is None else password) user_username(user, username) user_email(user, email or "") if commit: user.save() if email and with_emailaddress: EmailAddress.objects.create( user=user, email=email, verified=email_verified, primary=True ) return user return factory @pytest.fixture def email_factory(): def factory(username=None): if not username: username = uuid.uuid4().hex return f"{username}@{uuid.uuid4().hex}.org" return factory @pytest.fixture def reauthentication_bypass(): @contextmanager def f(): with patch("allauth.account.decorators.did_recently_authenticate") as m: m.return_value = True yield return f @pytest.fixture(autouse=True) def clear_context_request(): context._request_var.set(None) @pytest.fixture def enable_cache(settings): settings.CACHES = { "default": { "BACKEND": "django.core.cache.backends.locmem.LocMemCache", } } yield django-allauth-0.58.2/allauth/core/000077500000000000000000000000001452212273200170625ustar00rootroot00000000000000django-allauth-0.58.2/allauth/core/__init__.py000066400000000000000000000000001452212273200211610ustar00rootroot00000000000000django-allauth-0.58.2/allauth/core/context.py000066400000000000000000000006161452212273200211230ustar00rootroot00000000000000from contextlib import contextmanager from contextvars import ContextVar _request_var = ContextVar("request", default=None) def __getattr__(name): if name == "request": return _request_var.get() raise AttributeError(name) @contextmanager def request_context(request): token = _request_var.set(request) try: yield finally: _request_var.reset(token) django-allauth-0.58.2/allauth/core/exceptions.py000066400000000000000000000003541452212273200216170ustar00rootroot00000000000000class ImmediateHttpResponse(Exception): """ This exception is used to interrupt the flow of processing to immediately return a custom HttpResponse. """ def __init__(self, response): self.response = response django-allauth-0.58.2/allauth/core/internal/000077500000000000000000000000001452212273200206765ustar00rootroot00000000000000django-allauth-0.58.2/allauth/core/internal/__init__.py000066400000000000000000000000001452212273200227750ustar00rootroot00000000000000django-allauth-0.58.2/allauth/core/internal/http.py000066400000000000000000000016461452212273200222360ustar00rootroot00000000000000import json from django import shortcuts from django.http import QueryDict from django.urls import NoReverseMatch def serialize_request(request): return json.dumps( { "path": request.path, "path_info": request.path_info, "META": {k: v for k, v in request.META.items() if isinstance(v, str)}, "GET": request.GET.urlencode(), "POST": request.POST.urlencode(), "method": request.method, } ) def deserialize_request(s, request): data = json.loads(s) request.GET = QueryDict(data["GET"]) request.POST = QueryDict(data["POST"]) request.META = data["META"] request.path = data["path"] request.path_info = data["path_info"] request.method = data["method"] return request def redirect(to): try: return shortcuts.redirect(to) except NoReverseMatch: return shortcuts.redirect(f"/{to}") django-allauth-0.58.2/allauth/core/ratelimit.py000066400000000000000000000044011452212273200214250ustar00rootroot00000000000000import hashlib import time from collections import namedtuple from django.core.cache import cache from django.shortcuts import render Rate = namedtuple("Rate", "amount duration") def parse(rate): ret = None if rate: amount, duration = rate.split("/") amount = int(amount) duration_map = {"s": 1, "m": 60, "h": 3600, "d": 86400} if duration not in duration_map: raise ValueError("Invalid duration: %s" % duration) duration = duration_map[duration] ret = Rate(amount, duration) return ret def _cache_key(request, *, action, key=None, user=None): from allauth.account.adapter import get_adapter if key: source = () elif user or request.user.is_authenticated: source = ("user", str((user or request.user).pk)) else: source = ("ip", get_adapter().get_client_ip(request)) keys = ["allauth", "rl", action, *source] if key is not None: key_hash = hashlib.sha256(key.encode("utf8")).hexdigest() keys.append(key_hash) return ":".join(keys) def clear(request, *, action, key=None, user=None): cache_key = _cache_key(request, action=action, key=key, user=user) cache.delete(cache_key) def consume(request, *, action, key=None, amount=None, duration=None, user=None): allowed = True from allauth.account import app_settings rate = app_settings.RATE_LIMITS.get(action) if rate: rate = parse(rate) if not amount: amount = rate.amount if not duration: duration = rate.duration if not request or request.method == "GET" or not amount or not duration: pass else: cache_key = _cache_key(request, action=action, key=key, user=user) history = cache.get(cache_key, []) now = time.time() while history and history[-1] <= now - duration: history.pop() allowed = len(history) < amount if allowed: history.insert(0, now) cache.set(cache_key, history, duration) return allowed def consume_or_429(request, *args, **kwargs): from allauth.account import app_settings if not consume(request, *args, **kwargs): return render(request, "429." + app_settings.TEMPLATE_EXTENSION, status=429) django-allauth-0.58.2/allauth/decorators.py000066400000000000000000000012601452212273200206500ustar00rootroot00000000000000from functools import wraps from allauth.core import ratelimit def rate_limit(*, action, **rl_kwargs): from allauth.account import app_settings rate = app_settings.RATE_LIMITS.get(action) if rate: rate = ratelimit.parse(rate) rl_kwargs.setdefault("duration", rate.duration) rl_kwargs.setdefault("amount", rate.amount) def decorator(function): @wraps(function) def wrap(request, *args, **kwargs): resp = ratelimit.consume_or_429(request, action=action, **rl_kwargs) if not resp: resp = function(request, *args, **kwargs) return resp return wrap return decorator django-allauth-0.58.2/allauth/exceptions.py000066400000000000000000000003021452212273200206600ustar00rootroot00000000000000import warnings from allauth.core.exceptions import ImmediateHttpResponse __all__ = ["ImmediateHttpResponse"] warnings.warn("allauth.exceptions is deprecated, use allauth.core.exceptions") django-allauth-0.58.2/allauth/locale/000077500000000000000000000000001452212273200173715ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ar/000077500000000000000000000000001452212273200177735ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ar/LC_MESSAGES/000077500000000000000000000000001452212273200215605ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ar/LC_MESSAGES/django.po000066400000000000000000001167741452212273200234020ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2023-08-15 04:00+0300\n" "Last-Translator: Abdo \n" "Language-Team: Arabic\n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" "X-Generator: Poedit 3.3.2\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "اسم المستخدم غير مسموح به. الرجاء اختيار اسم آخر‪." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "تجاوزت الحد المسموح لمحاولة تسجيل الدخول. حاول في وقت لاحق." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "هنالك مستخدم مسجل سابقا يستخدم عنوان البريد الإلكتروني نفسه." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "كلمة المرور الحالية" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "كلمة المرور يجب أن لا تقل عن {0} حروف." #: account/apps.py:9 msgid "Accounts" msgstr "الحسابات" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "يجب عليك كتابة كلمة المرور نفسها في كل مرة‪." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "كلمة المرور" #: account/forms.py:94 msgid "Remember Me" msgstr "تذكرني" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "هذا الحساب غير نشط حاليا." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "عنوان البريد الإلكتروني و / أو كلمة المرور غير صحيحة." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "اسم المستخدم و / أو كلمة المرور غير صحيحة." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "عنوان البريد الالكتروني" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "البريد الالكتروني" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "اسم المستخدم" #: account/forms.py:134 msgid "Username or email" msgstr "اسم المستخدم أو البريد الإلكتروني" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "تسجيل الدخول" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "هل نسيت كلمة المرور؟" #: account/forms.py:312 msgid "Email (again)" msgstr "البريد الإلكتروني ‪(مجددا)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "تأكيد البريد الإلكتروني" #: account/forms.py:324 msgid "Email (optional)" msgstr "البريد الالكتروني (اختياري)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "يجب عليك كتابة البريد الإلكتروني نفسه في كل مرة‪." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "كلمة المرور (مجددا)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "عنوان البريد الإلكتروني هذا مربوط بالفعل مع هذا الحساب." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "لا يمكنك إضافة أكثر من %d بريد إلكتروني." #: account/forms.py:524 msgid "Current Password" msgstr "كلمة المرور الحالية" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "كلمة المرور الجديدة" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "كلمة المرور الجديدة (مجددا)" #: account/forms.py:538 msgid "Please type your current password." msgstr "الرجاء كتابة كلمة المرور الحالية." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "لم يتم ربط عنوان البريد الإلكتروني مع أي حساب مستخدم" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "كود إعادة تعيين كلمة المرور غير صالح." #: account/models.py:21 msgid "user" msgstr "مستخدم" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "عنوان بريد إلكتروني" #: account/models.py:28 msgid "verified" msgstr "موثق" #: account/models.py:29 msgid "primary" msgstr "رئيسي" #: account/models.py:35 msgid "email addresses" msgstr "عناوين البريد الالكتروني" #: account/models.py:141 msgid "created" msgstr "تمّ إنشاؤه" #: account/models.py:142 msgid "sent" msgstr "تم ارساله" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "مفتاح" #: account/models.py:148 msgid "email confirmation" msgstr "تأكيد البريد الإلكتروني" #: account/models.py:149 msgid "email confirmations" msgstr "تأكيدات البريد الإلكتروني" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, python-format msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "يوجد حساب بالفعل مربوط مع هذا البريد الإلكتروني. يرجى الدخول إلى ذاك الحساب " "أولا، ثم ربط حسابك في %s." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "حسابك ليست له كلمة مرور مضبوطة." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "حسابك ليس لديه عنوان بريد إلكتروني موثقف." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "حسابات التواصل الاجتماعي" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "مزود" #: socialaccount/models.py:48 msgid "provider ID" msgstr "معرف المزود" #: socialaccount/models.py:52 msgid "name" msgstr "اسم" #: socialaccount/models.py:54 msgid "client id" msgstr "معرف العميل" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "معرف آبل، أو مفتاح المستهلك" #: socialaccount/models.py:59 msgid "secret key" msgstr "مفتاح سري" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "مفتاح واجهة برمجية سري أو مفتاح مستهلك" #: socialaccount/models.py:65 msgid "Key" msgstr "مفتاح" #: socialaccount/models.py:77 msgid "social application" msgstr "تطبيق اجتماعي" #: socialaccount/models.py:78 msgid "social applications" msgstr "تطبيقات اجتماعية" #: socialaccount/models.py:113 msgid "uid" msgstr "معرف المستخدم" #: socialaccount/models.py:115 msgid "last login" msgstr "أخر دخول" #: socialaccount/models.py:116 msgid "date joined" msgstr "تاريخ الانضمام" #: socialaccount/models.py:117 msgid "extra data" msgstr "بيانات إضافية" #: socialaccount/models.py:121 msgid "social account" msgstr "حساب تواصل اجتماعي" #: socialaccount/models.py:122 msgid "social accounts" msgstr "حسابات تواصل اجتماعي" #: socialaccount/models.py:156 msgid "token" msgstr "كود" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) أو مفتاح وصول (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "كود سري" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) أو رمز تحديث (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "ينتهي في" #: socialaccount/models.py:170 msgid "social application token" msgstr "كود تطبيق اجتماعي" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "أكواد التطبيقات الاجتماعية" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "معلومات ملف شخصي غير صالحة" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "تم تلقي رد غير صالح عند الحصول على كود الطلب من \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "تم تلقي رد غير صالح عند الحصول على كود الوصول من \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "لا يوجد كود طلب محفوظ لـ \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "لا يوجد كود وصول محفوظ لـ \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "لا وصول للموارد الخاصة في \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "تم تلقي رد غير صالح عند الحصول على كود الطلب من \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "الحساب غير نشط" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "هذا الحساب غير نشط." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "عناوين البريد الإلكتروني" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "عناوين البريد الإلكتروني التالية مربوطة مع حسابك:" #: templates/account/email.html:23 msgid "Verified" msgstr "موثق" #: templates/account/email.html:27 msgid "Unverified" msgstr "غير موثق" #: templates/account/email.html:32 msgid "Primary" msgstr "أساسي" #: templates/account/email.html:42 msgid "Make Primary" msgstr "اجعله أساسيا" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "إعادة ارسال رسالة التأكيد" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "احذف" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "أضف عنوان بريد إلكتروني" #: templates/account/email.html:70 msgid "Add Email" msgstr "أضف بريدا إلكترونيا" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "هل تريد حقا حذف عنوان البريد الإلكتروني المحدد؟" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" "تلقيت هذه الرسالة لأنك أو أحد آخر حاول تسجيل حساب\n" "باستخدام البريد الإلكتروني:\n" "\n" "%(email)s\n" "\n" "لكن حسابا مربوطا بهذا البريد موجود بالفعل. في حال نسيت هذا، يمكنك استخدام " "رابط\n" "إعادة ضبط كلمة المرور لاستعادة حسابك:\n" "\n" "%(password_reset_url)s" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "الحساب موجود بالفعل" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "مرحبا من موقع %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "شكرا لاستخدامك %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "تلقيت هذه الرسالة لأن المستخدم %(user_display)s أعطانا بريدك الإلكتروني " "لتسجيل حساب في %(site_domain)s.\n" "\n" "لتأكيد هذا، يرجى الذهاب إلى %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "أكد عنوان البريد الإلكتروني" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "تلقيت هذه الرسالة لأنك أو أحد آخر طلب إعادة ضبط كلمة مرور حسابك.\n" "يمكنك تجاهل الرسالة بأمان إذا لم تطلب هذا. اضغط الرابط في الأسفل لإعادة ضبط " "كلمة المرور." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "في حال كنت قد نسيت، اسم المستخدم الخاص بك هو %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "رسالة إعادة ضبط كلمة المرور" #: templates/account/email/unknown_account_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "تلقيت هذه الرسالة لأنك أو أحد آخر طلب كلمة لحسابك.\n" "لكن ليس لدينا قيد مستخدم يستخدم عنوان البريد الإلكتروني %(email)s\n" "في قاعدة بياناتنا.\n" "\n" "يمكنك تجاهل هذه الرسالة بأمان إذا لم تطلب إعادة ضبط كلمة المرور.\n" "\n" "إذا كنت أنت من طلب، يمكنك تسجيل حساب باستخدام الرابط في الأسفل." #: templates/account/email_change.html:5 templates/account/email_change.html:9 msgid "Email Address" msgstr "بريد إلكتروني" #: templates/account/email_change.html:14 msgid "The following email address is associated with your account:" msgstr "عناوين البريد الإلكتروني التالية مربوطة مع حسابك:" #: templates/account/email_change.html:19 msgid "Your email address is still pending verification:" msgstr "ما زال عنوان البريد الإلكتروني بانتظار التوثيق:" #: templates/account/email_change.html:38 msgid "Change Email Address" msgstr "تغيير البريد الإلكتروني" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 msgid "Change Email" msgstr "تغيير البريد الإلكتروني" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "تأكيد البريد الإلكتروني" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "يرجى تأكيد أن %(email)s هو عنوان بريد " "إلكتروني للمستخدم %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "تأكيد" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, python-format msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "فشل تأكيد %(email)s لأنه مؤكد بالفعل في حساب مختلف." #: templates/account/email_confirm.html:35 #, python-format msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "هذا الرابط لتأكيد البريد الإلكتروني نتهت فترة صلاحيته أو إنه غير صالح. يرجى " "طلب رابط جديد لتأكيد البريد الإلكتروني." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "تسجيل الدخول" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "إذا لم يكن لديك حساب بالفعل،\n" "يرجى التسجيل أولا." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "تسجيل الخروج" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "هل تريد حقا تسجيل الخروج؟" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "لا يمكنك إزالة عنوان البريد الإلكتروني الرئيسي (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "تم إرسال رسالة تأكيد إلى العنوان %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "لقد أكدت عنوان البريد الإلكتروني %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "تمت إزالة عنوان البريد الإلكتروني %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "لقد سجلت الدخول بنجاح يا %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "تم تسجيل خروجك." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "تم تغيير كلمة المرور بنجاح‪." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "تم إعداد كلمة المرور بنجاح‪." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "تم تعيين عنوان البريد الإلكتروني الرئيسي‪." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "يجب توثيق عنوان بريدك الإلكتروني الرئيسي." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "غيّر كلمة المرور" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "هل نسيت كلمة المرور؟" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "إعادة تعيين كلمة المرور" #: templates/account/password_reset.html:14 msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "هل نسيت كلمة المرور؟ أدخل عنوان البريد الإلكتروني أدناه، وسنرسل لك رسالة " "تتيح لك إعادة تعيينها." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "إعادة تعيين كلمة المرور" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "يرجى الاتصال بنا إذا كنت تواجه أي مشاكل في إعادة تعيين كلمة المرور." #: templates/account/password_reset_done.html:16 msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "أرسلنا لك رسالة. إذا لم تصلك يرجى التحقق من صندوق الرسائل غير المرغوب فيها. " "اتصل بنا إذا لم تصل في غضون دقائق." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "كود غير صالح" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "رابط إعادة تعيين كلمة المرور غير صالح، ربما لأنه قد تم استخدامه مسبقا. يرجى " "طلب رابط جديد." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "تم تغيير كلمة المرور الخاصة بك." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "تعيين كلمة مرور" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "تأكيد البريد الإلكتروني" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "التسجيل" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "الاشتراك" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "لديك حساب؟ سجل الدخول." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "الاشتراك مغلق" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "نحن آسفون‪:‬ الاشتراك مغلق حاليا‪." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "ملاحظة" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "تم تسجيل دخولك بالفعل يا %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "تحذير‪:" #: templates/account/snippets/warn_no_email.html:3 msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "ليس لديك أي بريد إلكتروني مضبوط. عليك حقا إضافة عنوان لكي تتلقى الإشعارات، " "وتعيد تعيين كلمة المرور، إلخ." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "التحقق من البريد الإلكتروني" #: templates/account/verification_sent.html:12 msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "لقد أرسلنا لك رسالة للتوثيق. اتبع الرابط المزود لإكمال عملية التسجيل. إذا لم " "ترى الرسالة في صندوقك الرئيسي، تحقق من صندوق الرسائل غير المرغوب فيها. يرجى " "التواصل معنا إذا لم تتلقى الرسالة في غضو دقائق." #: templates/account/verified_email_required.html:13 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "تتطلب هذه الصفحة توثيق هويتك.\n" "لهذا نطلب منك توثيق ملكية بريدك الإلكتروني. " #: templates/account/verified_email_required.html:18 msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "أرسلنا لك رسالة للتوثيق.\n" "يرجى الضغط على الرابط في الرسالة. إذا لم ترى الرسالة في صندوقك الرئيسي، تحقق " "من صندوق الرسائل غير المرغوب فيها.\n" "يرجى التواصل معنا إذا لم تتلقاه في غضون دقائق." #: templates/account/verified_email_required.html:23 #, python-format msgid "" "Note: you can still change your " "email address." msgstr "" "ملاحظة: ما زال بإمكانك تغيير " "البريد الإلكتروني." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "رسائل:" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "قائمة:" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "كود سري" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "فشل تسجيل الدخول الاجتماعي" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "حدث خطأ أثناء محاولة تسجيل الدخول عن طريق حساب الشبكة الاجتماعية." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "اتصالات الحساب" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "يمكنك تسجيل الدخول إلى حسابك باستخدام أي من حسابات الطرف الثالث التالية:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "ليس لديك حاليا أي شبكة اجتماعية متصلة بهذا الحساب." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "إضافة حساب طرف الثالث" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "ربط %(provider)s" #: templates/socialaccount/login.html:13 #, fuzzy, python-format #| msgid "" #| "You are about to connect a new third party account from %(provider)s." msgid "You are about to connect a new third-party account from %(provider)s." msgstr "أنت على وشك ربط حساب طرف ثالث جديد من %(provider)s." #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "تسجيل الدخول عبر %(provider)s" #: templates/socialaccount/login.html:20 #, fuzzy, python-format #| msgid "" #| "You are about to sign in using a third party account from %(provider)s." msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "أنت على وشك تسجيل الدخول باستخدام حساب الطرف الثالث من %(provider)s." #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "المتابعة" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "تم إلغاء تسجيل الدخول" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "قد قررت إلغاء تسجيل الدخول إلى الموقع باستخدام أحد الحسابات الموجودة الخاصة " "بك. إذا كان هذا خطأ، الرجاء المتابعة إلى تسجيل " "الدخول." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "تم ربط حساب التواصل الاجتماعي." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "حساب التواصل الاجتماعي متصل مسبقا مع حساب مختلف." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "تم قطع الاتصال بحساب التواصل الاجتماعي." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "أنت على وشك استخدام حسابك من %(provider_name)s لتسجيل الدخول إلى " "%(site_name)s.\n" "كخطوة أخيرة، يرجى ملء النموذج التالي:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "يرجى تسجيل الدخول مع واحد من حسابات الطرف الثالث الموجودة لديك‪.‬\n" #~ "كما يمكنك تسجيل حساب\n" #~ "في موقع %(site_name)s والدخول في الأسفل:" #~ msgid "or" #~ msgstr "أو" #~ msgid "change password" #~ msgstr "تغيير كلمة المرور" #~ msgid "OpenID Sign In" #~ msgstr "تسجيل الدخول عبر OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "عنوان البريد الإلكتروني هذا مقترن بالفعل بحساب آخر." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "لقد قمنا بإرسال رسالة اليك عبر البريد الإلكتروني. يرجى الاتصال بنا اذا " #~ "كنت لا تتلقى في غضون بضع دقائق." #~ msgid "Account" #~ msgstr "حساب" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "تسجيل الدخول و / أو كلمة المرور الذي حددته غير صحيحة." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "يمكن أن تحتوي أسماء المستخدمين إلا على الحروف، الأرقام و @/‪.‬/-/+/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "اسم المستخدم مسجل مسبقا. الرجاء اختيار اسم اخر‪.‬" #, fuzzy #~ msgid "Shopify Sign In" #~ msgstr "تسجيل الدخول Shopify" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "لقد اكّدت ان %(email)s هو من إحدى عناوين " #~ "للمستعمل %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "شكرا لاستخدام موقعنا!" #~ msgid "Confirmation email sent to %(email)s" #~ msgstr "ارسلت رسالة التأكيد الى بريدك الالكتروني %(email)s" #~ msgid "Delete Password" #~ msgstr "احذف كلمة المرور" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "بامكانك حذف كلمة المرور بما انك قمت بتسجيل الدخول بواسطة OpenID" #~ msgid "delete my password" #~ msgstr "احذف كلمة المرور الخاصة بي" #~ msgid "Password Deleted" #~ msgstr "تم حذف كلمة المرور" #~ msgid "Your password has been deleted." #~ msgstr "تم حذف كلمة المرور الخاصة بك." django-allauth-0.58.2/allauth/locale/bg/000077500000000000000000000000001452212273200177615ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/bg/LC_MESSAGES/000077500000000000000000000000001452212273200215465ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/bg/LC_MESSAGES/django.po000066400000000000000000001200011452212273200233420ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2023-07-24 22:25+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "" "Това потребителско име не може да бъде използвано. Моля, изберете друго." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Твърде много неуспешни опити за влизане. Опитайте отново по-късно." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Вече има регистриран потребител с този e-mail адрес." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Текуща парола" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Паролата трябва да бъде поне {0} символа." #: account/apps.py:9 msgid "Accounts" msgstr "Акаунти" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Трябва да въведете една и съща парола." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Парола" #: account/forms.py:94 msgid "Remember Me" msgstr "Запомни ме" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Този акаунт в момента е неактивен." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "E-mail адресът и/или паролата, които въведохте, са грешни." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Потребителското име и/или паролата, които въведохте, са грешни." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "E-mail адрес" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Потребителско име" #: account/forms.py:134 msgid "Username or email" msgstr "Потребителско име или e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Акаунт" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Забравена парола?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-mail (отново)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Потвърждение на e-mail адрес" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (опционален)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Трябва да въведете един и същ email." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Парола (отново)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Този e-mail адрес вече е свързан с този акаунт." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "Не можете да добавяте повече от %d e-mail адреса." #: account/forms.py:524 msgid "Current Password" msgstr "Текуща парола" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Нова парола" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Нова парола (отново)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Моля, въведете вашата текуща парола." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Няма потребител с този e-mail адрес." #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Невалиден код за възстановяване на парола." #: account/models.py:21 msgid "user" msgstr "потребител" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "e-mail адрес" #: account/models.py:28 msgid "verified" msgstr "потвърден" #: account/models.py:29 msgid "primary" msgstr "основен" #: account/models.py:35 msgid "email addresses" msgstr "email адреси" #: account/models.py:141 msgid "created" msgstr "създадено" #: account/models.py:142 msgid "sent" msgstr "изпратено" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "ключ" #: account/models.py:148 msgid "email confirmation" msgstr "email потвърждение" #: account/models.py:149 msgid "email confirmations" msgstr "email потвърждения" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Вече съществува акаунт с този e-mail адрес. Моля, първо влезте в този акаунт " "и тогава свържете вашия %s акаунт." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Вашият акаунт няма парола." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Вашият акаунт няма потвърден e-mail адрес." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Социални акаунти" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "доставчик" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "доставчик" #: socialaccount/models.py:52 msgid "name" msgstr "име" #: socialaccount/models.py:54 msgid "client id" msgstr "id на клиент" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "ID на приложение, или ключ на консуматор" #: socialaccount/models.py:59 msgid "secret key" msgstr "таен ключ" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "таен ключ на API, клиент или консуматор" #: socialaccount/models.py:65 msgid "Key" msgstr "Ключ" #: socialaccount/models.py:77 msgid "social application" msgstr "социално приложение" #: socialaccount/models.py:78 msgid "social applications" msgstr "социални приложения" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "последно влизане" #: socialaccount/models.py:116 msgid "date joined" msgstr "дата на регистрация" #: socialaccount/models.py:117 msgid "extra data" msgstr "допълнителни данни" #: socialaccount/models.py:121 msgid "social account" msgstr "социален акаунт" #: socialaccount/models.py:122 msgid "social accounts" msgstr "социални акаунти" #: socialaccount/models.py:156 msgid "token" msgstr "код" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) или access token (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "таен код" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) или refresh token (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "изтича" #: socialaccount/models.py:170 msgid "social application token" msgstr "код на социално приложение" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "кодове на социални приложения" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Невалидни профилни данни" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Грешен отговор при получаване на код за заявка от \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Грешен отговор при получаване на код за достъп от \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Няма запазен код за заявка за \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Няма запазен код за достъп за \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Няма достъп до лични данни при \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Грешен отговор при получаване на код за заявка от \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Неактивен акаунт" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Този акаунт е неактивен." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "E-mail адреси" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Следните e-mail адреси са свързани с вашия акаунт:" #: templates/account/email.html:23 msgid "Verified" msgstr "Потвърден" #: templates/account/email.html:27 msgid "Unverified" msgstr "Непотвърден" #: templates/account/email.html:32 msgid "Primary" msgstr "Основен" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Направи основен" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Изпрати потвърждение отново" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Премахни" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Добяне на е-mail адрес" #: templates/account/email.html:70 msgid "Add Email" msgstr "Добави e-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Наистина ли искате да премахнете избрания e-mail адрес?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Здравейте от %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Благодарим, че ползвате %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Получавате този e-mail, защото потребител %(user_display)s е дал вашия e-" "mail адрес за да регистрира акаунт в %(site_domain)s.\n" "\n" "За да потвърдите, че това е вярно, посетете %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Моля, потвърдете вашия e-mail адрес" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Получавате този e-mail, защото вие или някой друг е поискал парола за вашия " "потребителски акаунт.\n" "Можете да го пренебрегнете, ако не сте поискали възстановяване на парола. " "Кликнете линка по-долу за да възстановите вашата парола." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "В случай, че сте забравили, вашето потребителско име е %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Възстановяване на парола" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You are receiving this e-mail because you or someone else has requested " #| "a\n" #| "password for your user account. However, we do not have any record of a " #| "user\n" #| "with email %(email)s in our database.\n" #| "\n" #| "This mail can be safely ignored if you did not request a password reset.\n" #| "\n" #| "If it was you, you can sign up for an account using the link below." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Получавате този e-mail, защото вие или някой друг е поискал парола за вашия " "потребителски акаунт.\n" "На сървъра обаче не беше намерен потребител свързван с електронния адрес " "%(email)s.\n" "\n" "Можете да пренебрегнете това писмо, ако не сте поискали възстановяване на " "парола. Кликнете линка по-долу, за да направите нов акаунт." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "E-mail адреси" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Следните e-mail адреси са свързани с вашия акаунт:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Основният ви e-mail адрес трябва да бъде потвърден." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Потвърждение на e-mail адрес" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Потвърждение на e-mail адрес" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Моля, потвърдете, че %(email)s е e-mail " "адрес на потребител %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Потвърди" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Социалният акаунт вече е свързан с друг акаунт." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Този линк за потвърждение на e-mail е изтекъл или невалиден. Моля, подайте нова заявка за потвърждение на e-mail." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Вход" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Ако все още не сте създали акаунт, моля,\n" "регистрирайте се." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Изход" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Сигурни ли сте, че искате да излезете?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Не можете да премахнете основния си e-mail адрес (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Потвърждение на e-mail адрес изпратено на %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Потвърдихте e-mail адрес %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Премахнат e-mail адрес %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Успешно влязохте като %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Излязохте." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Паролата беше сменена успешно." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Паролата беше запазена успешно." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Основният e-mail адрес беше избран." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Основният ви e-mail адрес трябва да бъде потвърден." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Смяна на парола" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Забравена парола?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Възстановяване на парола" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Забравили сте вашата парола? Въведете вашия e-mail адрес по-долу и ще ви " "пратим e-mail как да я възстановите." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Възстанови паролата ми" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Моля, свържете се с нас, ако имате проблеми с възстановяването на вашата " "парола." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent you an e-mail. If you have not received it please check your " #| "spam folder. Otherwise contact us if you do not receive it in a few " #| "minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Изпратихме ви електронно писмо. То може да пристигнало в папката Спам. Моля, " "свържете се с нас, ако не го получите до няколко минути." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Грешен код" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Линкът за възстановяване на парола е невалиден, може би защото вече е бил " "използван. Моля, заявете ново " "възстановяване на парола." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Паролата ви е сменена." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Създаване на парола" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Потвърждение на e-mail адрес" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Регистрация" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Регистрация" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Вече имате акаунт? Тогава, моля, влезте." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Регистрацията е затворена" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Съжаляваме, но в момента регистрацията е затворена." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Забележка" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "вече сте влезли като %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Предупреждение:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "В момента нямате регистриран e-mail адрес. Препоръчително е да добавите e-" "mail адрес за да можете да получавате известия, да възстановявате паролата " "си, и т.н." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Потвърдете вашия e-mail адрес" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. If you do not see the verification e-mail " #| "in your main inbox, check your spam folder. Please contact us if you do " #| "not receive the verification e-mail within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Изпратихме ви e-mail за потвърждение. Последвайте посочения в него линк за " "да завършите процеса на регистрация. То може да е пристигнало в папката " "Спам. Моля, свържете се с нас, ако не го получите до няколко минути." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Тази част на сайта изисква да проверим, че сте който/която твърдите.\n" "За тази цел изискваме да\n" "потвърдите притежанието на вашия e-mail адрес. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside that e-mail. If you do not " #| "see the verification e-mail in your main inbox, check your spam folder. " #| "Otherwise\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Изпратихме ви e-mail за потвърждение. То може да е попаднало в папката Спам. " "Моля, кликнете линка в него. Свържете се с нас, ако не го получите до " "няколко минути." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Забележка: можете да смените " "вашия e-mail адрес." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "таен код" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Грешка при вход чрез социална мрежа" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Възникна грешка при опита за влизане чрез вашия акаунт от социална мрежа." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Свързани акаунти" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Можете да влизате в акаунта си чрез следните външни акаунти:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "В момента нямате акаунти от социални мрежи, свързани с този акаунт." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Добавяне на външен акаунт" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Вход прекъснат" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Прекъснахте влизането в нашия сайт чрез ваш съществуващ акаунт. Ако това е " "било грешка, моля, влезте." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Социалният акаунт беше свързан." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Социалният акаунт вече е свързан с друг акаунт." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Социалният акаунт беше изключен." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "На път сте да използвате вашия %(provider_name)s акаунт за вход в\n" "%(site_name)s. Като последна стъпка, моля, попълнете следната форма:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Моля, влезте с някой\n" #~ "от съществуващите ви външни акаунти. Или се " #~ "регистрирайте\n" #~ "за %(site_name)s акаунт и влезте по-долу:" #~ msgid "or" #~ msgstr "или" #~ msgid "change password" #~ msgstr "смени паролата" #~ msgid "OpenID Sign In" #~ msgstr "Вход с OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Този e-mail адрес вече е свързан с друг акаунт." django-allauth-0.58.2/allauth/locale/ca/000077500000000000000000000000001452212273200177545ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ca/LC_MESSAGES/000077500000000000000000000000001452212273200215415ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ca/LC_MESSAGES/django.po000066400000000000000000001126631452212273200233540ustar00rootroot00000000000000# DJANGO-ALLAUTH. # Copyright (C) 2016 # This file is distributed under the same license as the django-allauth package. # # Translators: # Marc Seguí Coll , 2022. # msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Marc Seguí Coll \n" "Language-Team: Català \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "" "Aquest nom d'usuari no pot ser emprat. Si us plau utilitzeu-ne un altre." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Massa intents fallits. Intenteu-ho de nou més tard." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "" "Un usuari ja ha estat registrat amb aquesta direcció de correu electrònic." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Contrasenya actual" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "La contrasenya ha de contenir al menys {0} caràcters." #: account/apps.py:9 msgid "Accounts" msgstr "Comptes" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Heu d'escriure la mateixa contrasenya cada cop." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Contrasenya" #: account/forms.py:94 msgid "Remember Me" msgstr "Recordar-me" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Ara mateix aquest compte està inactiu." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "" "El correu electrònic i/o la contrasenya que heu especificat no són correctes." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "L'usuari i/o la contrasenya que heu especificat no són correctes." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Correu electrònic" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "Correu electrònic" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Nom d'usuari" #: account/forms.py:134 msgid "Username or email" msgstr "Nom d'usuari o correu electrònic" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Iniciar sessió" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Heu oblidat la vostra contrasenya?" #: account/forms.py:312 msgid "Email (again)" msgstr "Correu electrònic (un altre cop)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Confirmació de direcció de correu electrònic" #: account/forms.py:324 msgid "Email (optional)" msgstr "Correu electrònic (opcional)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Heu d'escriure el mateix correu electrònic cada cop." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Contrasenya (de nou)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Aquest correu electrònic ja està associat amb aquest compte." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "No es poden afegit més de %d adreces de correu electrònic." #: account/forms.py:524 msgid "Current Password" msgstr "Contrasenya actual" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Nova contrasenya" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Nova contrasenya (de nou)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Si us plau, escriviu la vostra contrasenya actual." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "El correu electrònic no està assignat a cap compte d'usuari" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "El token per reiniciar la contrasenya no és vàlid." #: account/models.py:21 msgid "user" msgstr "usuari" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "correu electrònic" #: account/models.py:28 msgid "verified" msgstr "verificat" #: account/models.py:29 msgid "primary" msgstr "principal" #: account/models.py:35 msgid "email addresses" msgstr "correus electrònics" #: account/models.py:141 msgid "created" msgstr "creat" #: account/models.py:142 msgid "sent" msgstr "enviat" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "clau" #: account/models.py:148 msgid "email confirmation" msgstr "confirmació de correu electrònic" #: account/models.py:149 msgid "email confirmations" msgstr "confirmacions de correu electrònic" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Ja existeix un compte associat a aquesta adreça de correu electrònic. Si us " "plau, primer identifiqueu-vos utilitzant aquest compte, i després vinculeu " "el vostre compte %s." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "El vostre compte no té una contrasenya definida." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "El vostre compte no té un correu electrònic verificat." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Comptes de xarxes socials" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "proveïdor" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "proveïdor" #: socialaccount/models.py:52 msgid "name" msgstr "nom" #: socialaccount/models.py:54 msgid "client id" msgstr "identificador client" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "Identificador de App o clau de consumidor" #: socialaccount/models.py:59 msgid "secret key" msgstr "clau secreta" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" "frase secrete de API, frase secreta client o frase secreta de consumidor" #: socialaccount/models.py:65 msgid "Key" msgstr "Clau" #: socialaccount/models.py:77 msgid "social application" msgstr "aplicació de xarxa social" #: socialaccount/models.py:78 msgid "social applications" msgstr "aplicacions de xarxes socials" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "darrer inici de sessió" #: socialaccount/models.py:116 msgid "date joined" msgstr "data d'incorporació" #: socialaccount/models.py:117 msgid "extra data" msgstr "dades extra" #: socialaccount/models.py:121 msgid "social account" msgstr "compte de xarxa social" #: socialaccount/models.py:122 msgid "social accounts" msgstr "comptes de xarxes socials" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) o token d'accés (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "frase secreta de token" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) o token de refrescament (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "expira el" #: socialaccount/models.py:170 msgid "social application token" msgstr "token d'aplicació de xarxa social" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "tokens d'aplicació de xarxa social" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Dades de perfil invàlides" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Resposta invàlida a l'hora d'obtenir token de sol·licitud de \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Resposta invàlida a l'hora d'obtenir token d'accés de \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "No hi ha token de sol·licitud guardat per \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "No hi ha token d'accés guardat per \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Sense accés recursos privats de \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Resposta invàlida a l'hora d'obtenir token de sol·licitud de \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Compte inactiu" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Aquest compte està inactiu." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Adreces de correu electrònic" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "" "Les següents adreces de correu electrònic estan associades al vostre compte:" #: templates/account/email.html:23 msgid "Verified" msgstr "Verificat" #: templates/account/email.html:27 msgid "Unverified" msgstr "Sense verificar" #: templates/account/email.html:32 msgid "Primary" msgstr "Principal" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Definir com a principal" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Reenviar Verificació" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Eliminar" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Afegir adreça de correu electrònic" #: templates/account/email.html:70 msgid "Add Email" msgstr "Afegir correu electrònic" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "" "Esteu segurs de voler eliminar l'adreça de correu electrònic seleccionada?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Hola des de %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Gràcies per utilitzar %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Heu rebut aquest missatge perquè l'usuari %(user_display)s ha proporcionat " "la vostra adreça per registrar un compte a %(site_domain)s.\n" "\n" "Per confirmar que això és correcte, seguiu aquest enllaç %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Si us plau, confirmeu la vostra adreça de correu electrònic" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Heu rebut aquest correu electrònic perquè vosaltres o una altra persona heu " "sol·licitat una contrasenya per al vostre compte d'usuari.\n" "Es pot ignorar de forma segura si no es va sol·licitar el restabliment de " "contrasenya. Seguiu el següent enllaç per restablir la vostra contrasenya." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "En cas d'haver-lo oblidat, el vostre nom d'usuari és %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Correu electrònic per restablir contrasenya" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You are receiving this e-mail because you or someone else has requested " #| "a\n" #| "password for your user account. However, we do not have any record of a " #| "user\n" #| "with email %(email)s in our database.\n" #| "\n" #| "This mail can be safely ignored if you did not request a password reset.\n" #| "\n" #| "If it was you, you can sign up for an account using the link below." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Has rebut aquest correu electrònic perquè vosaltres o algú altre heu " "sol·licitat una\n" "contrasenya per al vostre compte d'usuari. Tot i això, no tenim cap registre " "d'un usuari\n" "amb correu electrònic %(email)s a la nostra base de dades.\n" "\n" "Aquest correu es pot ignorar de forma segura si no heu sol·licitat un canvi " "de contrasenya.\n" "\n" "Si heu estat vosaltres, podeu registrar un compte d'usuari utilitzant el " "link de sota." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Adreces de correu electrònic" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "" "Les següents adreces de correu electrònic estan associades al vostre compte:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "La vostra adreça de correu electrònic principal ha de ser verificada." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Confirmar adreça de correu electrònic" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "Correu electrònic" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Confirmar adreça de correu electrònic" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Si us plau confirmeu que %(email)s és una " "adreça de correu electrònic de l'usuari %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Confirmar" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "El compte de xarxa social ja està connectada a un compte diferent." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Aquest enllaç de verificació de correu electrònic ha expirat o és invàlid. " "Si us plau, sol·liciteu una nova verificació per " "correu electrònic.." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Iniciar sessió" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Si encara no heu creat un compte, llavors si us plau\n" "registreu-vos primer." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Tancar sessió" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Esteu segurs de voler tancar sessió?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "No podeu eliminar el vostre correu electrònic principal (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Correu electrònic de confirmació enviat a %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Heu confirmat %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Eliminat correu electrònic %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Heu iniciat sessió exitosament com a %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Heu tancat sessió." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Contrasenya canviada amb èxit." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Contrasenya establerta amb èxit." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Adreça de correu electrònic principal establerta" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "La vostra adreça de correu electrònic principal ha de ser verificada." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Canviar Contrasenya" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Heu oblidat la vostra contrasenya?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Restablir Contrasenya" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Heu oblidat la vostra contrasenya? Introduïu el vostre correu electrònic i " "us enviarem un correu que us permetrà restablir-la." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Restablir la meva contrasenya" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Si us plau contacteu-nis si teniu algun problema per restablir la vostra " "contrasenya." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent you an e-mail. If you have not received it please check your " #| "spam folder. Otherwise contact us if you do not receive it in a few " #| "minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Us hem enviat un correu electrònic. Si us plau contacteu-nos si no el rebeu " "en uns minuts." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "L'enllaç per restablir la contrasenya és invàlid, probablement porquè ja ha " "estat utilitzat. Si us plau soliciteu restablir la contrasenya novament." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "La vostra contrasenya ha canviat." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Establir contrasenya" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Confirmar adreça de correu electrònic" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registrar-se" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Registrar-se" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Ja teniu un compte? Si us plau inicieu sessió." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Registre tancat" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Ho sentim, en aquest moment el registre está tancat." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Nota" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "ja heu iniciat sessió com a %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Advertència:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Actualment no teniu cap adreça de correu electrònic definida. Hauríeu " "d'afegir una adreça de correu electrònic per poder rebre notificacions, " "restablir la contrasenya, etc." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Verifiqueu la vostra direcció de correu electrònic" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. If you do not see the verification e-mail " #| "in your main inbox, check your spam folder. Please contact us if you do " #| "not receive the verification e-mail within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Us hem enviat un correu electrònic per la seva verificació. Seguiu l'enllaç " "per completar el procés de registre. Si us plau contacteu-nos si no el rebeu " "en uns minuts." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Aquesta part del lloc web requereix que verifiquem que sou qui dieu ser. Per " "això us requerim que verifiqueu la propietat del vostre correu electrònic. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside that e-mail. If you do not " #| "see the verification e-mail in your main inbox, check your spam folder. " #| "Otherwise\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Us hem enviat un correu electrònic per la vostra\n" "verificació. Si us plau accediu al link dins el correu electrònic. Si no " "veieu el correu de verificació a la vostra bústia principal, comproveu la " "carpeta d'spam. D'altra banda\n" "contacteu-nos si no el rebeu en uns minuts." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Nota: encara podeu canviar la " "vostra adreça de correu electrònic." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "frase secreta de token" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Error d'inici de sessió amb xarxa social" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "S'ha produït un error intentant iniciar sessió a través del vostre compte de " "xarxa social." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Connexions de Compte" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Podeu iniciar sessió amb algun dels següents comptes externs:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Actualment no tens cap compte de xarxa social associat a aquest compte." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Afegir un compte d'una xarxa social externa" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "Connectar %(provider)s" #: templates/socialaccount/login.html:13 #, fuzzy, python-format #| msgid "" #| "You are about to connect a new third party account from %(provider)s." msgid "You are about to connect a new third-party account from %(provider)s." msgstr "Esteu a punt de connectar un nou compte extern des de %(provider)s." #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "Iniciar sessió via %(provider)s" #: templates/socialaccount/login.html:20 #, fuzzy, python-format #| msgid "" #| "You are about to sign in using a third party account from %(provider)s." msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" "Esteu a punt d'iniciar sessió utilitzant un compte extern des de " "%(provider)s." #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "Continuar" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Inici de sessió cancel·lat" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Heu decidit cancel·lar l'inici de sessió al vostre lloc web utilitzant un " "dels vostres comptes existents. Si ha estat un error, si us plau inicieu sessió." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "El compte de xarxa social ha estat connectat." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "El compte de xarxa social ja està connectada a un compte diferent." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "El compte de xarxa social s'ha desconnectat." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Esteu a punt d'utilitzar el vostre compte de %(provider_name)s per iniciar " "sessió a\n" "%(site_name)s. Com a pas final, si us plau completeu el següent formulari:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Si us plau, inicieu sessió amb un\n" #~ "compte d'una altra xarxa social. O registreu-" #~ "vos \n" #~ "com a usuari de %(site_name)s i inicieu sessió a continuació:" #~ msgid "or" #~ msgstr "o" #~ msgid "change password" #~ msgstr "canviar la contrasenya" #~ msgid "OpenID Sign In" #~ msgstr "Iniciar sessió amb OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Aquest correu electrònic ja està associat amb un altre compte." django-allauth-0.58.2/allauth/locale/cs/000077500000000000000000000000001452212273200177765ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/cs/LC_MESSAGES/000077500000000000000000000000001452212273200215635ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/cs/LC_MESSAGES/django.po000066400000000000000000001131751452212273200233750ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Tomas Marcik , 2013. # Beda Kosata , 2018. # Filip Dobrovolny , 2023. # msgid "" msgstr "" "Project-Id-Version: 0.55\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2023-09-06 14:00+0200\n" "Last-Translator: Filip Dobrovolny \n" "Language-Team: Czech <>\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " "<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" "X-Generator: Gtranslator 2.91.7\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Toto uživatelské jméno nemůže být zvoleno. Prosím, zvolte si jiné." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Příliš mnoho pokusů o přihlášení. Zkuste to prosím později." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Uživatel s tímto e-mailem je již registrován." #: account/adapter.py:60 msgid "Incorrect password." msgstr "Nesprávné heslo." #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Heslo musí obsahovat minimálně {0} znaků." #: account/apps.py:9 msgid "Accounts" msgstr "Účty" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Hesla se musí shodovat." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Heslo" #: account/forms.py:94 msgid "Remember Me" msgstr "Zapamatovat" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Účet je v tuto chvíli neaktivní." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Zadaný e-mail nebo heslo není správné." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Zadané uživatelské jméno nebo heslo není správné." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "E-mailová adresa" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Uživatelské jméno" #: account/forms.py:134 msgid "Username or email" msgstr "Uživatelské jméno nebo e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Přihlášení" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Zapomenuté heslo?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-mail (znovu)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Potrvzení e-mailové adresy" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (nepovinné)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Vložené e-maily se musí shodovat." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Heslo (znovu)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Tento e-mail je již k tomuto účtu přiřazen." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "Nelze přidat více než %d e-mailových adres." #: account/forms.py:524 msgid "Current Password" msgstr "Současné heslo" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Nové heslo" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Nové heslo (znovu)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Prosím, zadejte svoje současné heslo." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "E-mail není přiřazen k žádnému účtu" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Token pro reset hesla není platný." #: account/models.py:21 msgid "user" msgstr "uživatel" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "e-mailová adresa" #: account/models.py:28 msgid "verified" msgstr "ověřeno" #: account/models.py:29 msgid "primary" msgstr "primární" #: account/models.py:35 msgid "email addresses" msgstr "e-mailové adresy" #: account/models.py:141 msgid "created" msgstr "vytvořeno" #: account/models.py:142 msgid "sent" msgstr "odeslaný" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "klíč" #: account/models.py:148 msgid "email confirmation" msgstr "Potvrzovací e-mail" #: account/models.py:149 msgid "email confirmations" msgstr "Ověřovací e-maily" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" "Nemůžete aktivovat dvoufaktorovou autentizaci, dokud nepotvrdíte svoue-" "mailovou adresu." #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" "Nelze přidat e-mailovou adresu k účtu chráněnému dvoufaktorovouautentizací." #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "Nesprávný kód." #: mfa/apps.py:7 msgid "MFA" msgstr "2FA" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "Kód" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "Kód autentifikátoru" #: mfa/models.py:15 msgid "Recovery codes" msgstr "Záchranné kódy" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "TOTP Autentifikátor" #: socialaccount/adapter.py:32 #, python-format msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Účet s touto e-mailovou adresou již existuje. Prosím přihlaste se nejdříve " "pod tímto účtem a potom připojte svůj %s účet." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Váš účet nemá nastavené heslo." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Váš účet nemá žádný ověřený e-mail." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Účty sociálních sítí" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "poskytovatel" #: socialaccount/models.py:48 msgid "provider ID" msgstr "ID poskytovatele" #: socialaccount/models.py:52 msgid "name" msgstr "jméno" #: socialaccount/models.py:54 msgid "client id" msgstr "id klienta" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "App ID nebo uživatelský klíč" #: socialaccount/models.py:59 msgid "secret key" msgstr "tajný klíč" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "tajný API klíč, tajný klientský klíč nebo uživatelský tajný klíč" #: socialaccount/models.py:65 msgid "Key" msgstr "Klíč" #: socialaccount/models.py:77 msgid "social application" msgstr "sociální aplikace" #: socialaccount/models.py:78 msgid "social applications" msgstr "sociální aplikace" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "poslední přihlášení" #: socialaccount/models.py:116 msgid "date joined" msgstr "datum registrace" #: socialaccount/models.py:117 msgid "extra data" msgstr "extra data" #: socialaccount/models.py:121 msgid "social account" msgstr "účet sociální sítě" #: socialaccount/models.py:122 msgid "social accounts" msgstr "účty sociálních sítí" #: socialaccount/models.py:156 msgid "token" msgstr "token" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) nebo přístupový token (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "tajný token" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) nebo token pro obnovu (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "vyprší" #: socialaccount/models.py:170 msgid "social application token" msgstr "token sociální aplikace" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "tokeny sociálních aplikací" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Neplatná data profilu" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Chyba při odesílání požadavku: \"%s\". Odpoveď byla: %s." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Chyba při získávání přístupového klíče od \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Není uložen žádný požadavkový klíč pro: \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Není uložen žádný přístupový klíč pro: \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Není přístup k privátním zdrojům: \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Chyba při získávání požadavkového klíče \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Neaktivní účet" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Tento účet není aktivní." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "E-mailové adresy" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "K vašemu účtu jsou přiřazeny tyto e-mailové adresy:" #: templates/account/email.html:23 msgid "Verified" msgstr "Ověřeno" #: templates/account/email.html:27 msgid "Unverified" msgstr "Neověřeno" #: templates/account/email.html:32 msgid "Primary" msgstr "Primární" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Zvolit jako primární" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Znovu zaslat oveřovací e-mail" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Odstranit" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Přidat e-mailovou adresu" #: templates/account/email.html:70 msgid "Add Email" msgstr "Přidat e-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Opravdu chcete odstranit zvolené e-mailové adresy?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" "Dostáváte tento e-mail, protože vy nebo někdo jiný se pokusil registrovat " "účet s \n" "použitím e-mailové adresy:\n" "\n" "%(email)s\n" "\n" "Ale účet s touto e-mailovou adresou již existuje. Pokud jste na to " "zapomněli, \n" "použijte prosím postup obnovení hesla k obnovení vašeho účtu:\n" "\n" "%(password_reset_url)s" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "Účet již existuje." #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Pozdrav z %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Děkujeme, že používáte %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Tento e-mail jste obdrželi protože uživatel %(user_display)s zadal vaši " "adresu jako e-mailovou adresu pro připojení svého účtu na.na stránkách " "%(site_domain)s.\n" "\n" "Pro potvrzení, že je to v pořádku, pokračujte na %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Potvrďte prosím svou e-mailovou adresu" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Tento e-mail jste obdrželi protože jste vy nebo někdo jiný zažádal o změnu " "hesla uživatelského účtu.\n" "Pokud jste to nebyli vy, můžete tento e-mail ignorovat. Pokud ano, klikněte " "na odkaz níže pro změnu vašeho hesla." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "" "Pro případ, že byste zapomněli, vaše uživatelské jméno je %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-mail pro reset hesla" #: templates/account/email/unknown_account_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Tento e-mail jste obdrželi protože jste vy nebo někdo jiný zažádal o změnu \n" "hesla uživatelského účtu. Nicméně, nemáme žádný záznam o uživateli s \n" "e-mailem %(email)s v naší databázi.\n" "\n" "Tento e-mail můžete bezpečně ignorovat, pokud jste nezažádali o změnu " "hesla.\n" "\n" "Jestliže jste to byli vy, můžete se zaregistrovat na stránkách pomocí " "odkazu \n" "níže." #: templates/account/email_change.html:5 templates/account/email_change.html:9 msgid "Email Address" msgstr "E-mailové adresa" #: templates/account/email_change.html:14 msgid "The following email address is associated with your account:" msgstr "K vašemu účtu je přiřazena tato e-mailová adresa:" #: templates/account/email_change.html:19 msgid "Your email address is still pending verification:" msgstr "Vaše primární e-mailová adresa stále čeká na ověření:" #: templates/account/email_change.html:38 msgid "Change Email Address" msgstr "Změna e-mailové adresy" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 msgid "Change Email" msgstr "Změnit E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Potvrzení e-mailové adresy" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Prosím, potvrďte, že %(email)s je e-mailová " "adresa pro uživatele %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Potvrdit" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, python-format msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Nelze potvrdit %(email)s, protože již byl spojen s jiným účtem." #: templates/account/email_confirm.html:35 #, python-format msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Tento ověřovací odkaz již vypršel nebo není správný. Prosím, zažádejte si o nový." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Přihlásit se" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Pokud jste si ještě nevytvořili účet, nejprve se zaregistrujte." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Odhlásit se" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Jste si jisti, že se chcete odhlásit?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Nemůžete odstranit primární e-mailovou adresu (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Ověření e-mailu posláno na %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Ověřili jste %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "E-mailová adresa %(email)s byla odebrána." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Úspěšně přihlášen jako %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Právě jste byl odhlášen." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Heslo bylo úspěšně změněno." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Heslo bylo úspěšně nastaveno." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Primární e-mail byla nastavena." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Vaše primární e-mailová adresa musí být ověřena." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Změnit heslo" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Zapomenuté heslo?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Reset hesla" #: templates/account/password_reset.html:14 msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Zapomněli jste heslo? Zadejte prosím svoji e-mailovou adresu a do e-mailové " "schránky Vám přijde návod na jeho obnovu." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Resetovat moje heslo" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Prosím, kontaktujte nás, pokud máte jakékoliv potíže s resetováním hesla." #: templates/account/password_reset_done.html:16 msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Poslali jsme vám e-mail. Pokud jste ho neobdrželi, zkontrolujte prosím " "složku s nevyžádanou poštou (spam). V opačném případě nás kontaktujte, pokud " "ho neobdržíte do několika minut." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Chybný klíč" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Odkaz pro změnu hesla není platný, protože již byl použit. Prosím, zažádejte si o nové." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Vaše heslo bylo změněno." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Nastavit heslo" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 msgid "Confirm Access" msgstr "Potvrdit přístup" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "Pro zabezpečení vašeho účtu, prosím, zadejte vaše heslo:" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Zaregistrovat se" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Zaregistrovat se" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Máte již účet? Přihlašte se, prosím." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Registrace je uzavřena" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Omlouváme se, ale registrace je momentálně uzavřena." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Poznámka" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "momentálně jste přihlášen jako %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Varování:" #: templates/account/snippets/warn_no_email.html:3 msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "V současné chvíli nemáte nastaveny žádné e-mailové adresy. Prosím, uložte si " "k účtu alespoň jeden e-mail, abyste moli dostávat upozornění nebo mohli " "použít funkci zapomenutého hesla apod." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Ověřte svoji e-mailovou adresu." #: templates/account/verification_sent.html:12 msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Byl vám zaslán ověřovací e-mail. Následujte odkaz v e-mailu pro dokončení " "registračního procesu. Pokud jste ho neobdrželi, zkontrolujte prosím složku " "s nevyžádanou poštou (spam). Neváhejte nás kontaktovat v případě, pokud e-" "mail do několika minut neobdržíte." #: templates/account/verified_email_required.html:13 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Tato část stránek vyžaduje ověření,\n" "že jste ten, kdo tvrdíte. K těmto účelům požadujeme\n" "ověření vlastnictví vaší e-mailové adresy." #: templates/account/verified_email_required.html:18 msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Zaslali jsme na vaši e-mailovou adresu\n" "ověřovací e-mail. Prosím, klikněte na odkaz uvnitř e-mailu.\n" "Pokud jste ho neobdrželi, zkontrolujte prosím složku s nevyžádanou poštou " "(spam). \n" "Neváhejte nás kontaktovat v případě, pokud e-mail nedostanete do několika " "minut." #: templates/account/verified_email_required.html:23 #, python-format msgid "" "Note: you can still change your " "email address." msgstr "" "Poznámka: stále můžete změnit " "vaši e-mailovou adresu.." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "Zprávy:" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "Menu:" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "Dvoufaktorová autentizace" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" "Váš účet je chráněn dvoufaktorovou autentizací. Prosím, zadejte autentizační " "kód:" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "Autentifikátor" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "Autentizace pomocí autentifikátoru je aktivní." #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "Autentifikátor není aktivní." #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "Deaktivovat" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "Aktivovat" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "Záchranné kódy" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" "Z dostupných záchranných kódů je použito %(unused_count)s z celkového počtu " "%(total_count)s kódů." msgstr[1] "" "Z dostupných záchranných kódů je použito %(unused_count)s z celkového počtu " "%(total_count)s kódů." msgstr[2] "" "Z dostupných záchranných kódů je použito %(unused_count)s z celkového počtu " "%(total_count)s kódů." msgstr[3] "" "Z dostupných záchranných kódů je použito %(unused_count)s z celkového počtu " "%(total_count)s kódů." #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "Nejsou nastaveny žádné záchranné kódy." #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 #, fuzzy #| msgid "Download codes" msgid "Download" msgstr "Stáhnout kódy" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "Generovat" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "Byla vygenerována nová sada záchranných kódů." #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "Autentifikátor byl aktivován." #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "Autentifikátor byl deaktivován." #: templates/mfa/recovery_codes/generate.html:9 #, fuzzy #| msgid "" #| "You are about to generate a new set of recovery codes for your account. " #| "This action will invalidate your existing codes. Are you sure?" msgid "You are about to generate a new set of recovery codes for your account." msgstr "" "Chystáte se vygenerovat novou sadu záchranných kódů pro váš účet. Tato akce " "zneplatní vaše stávající kódy. Jste si jisti?" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 #, fuzzy #| msgid "View codes" msgid "Unused codes" msgstr "Zobrazit kódy" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "Stáhnout kódy" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "Generovat nové kódy" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "Aktivovat Autentifikátor" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "Klíč autentifikátoru" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "Deaktivovat Autentifikátor" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" "Chystáte se deaktivovat autentizaci pomocí autentifikátoru. Jste si jisti?" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Přihlášení pomocí sociální sítě selhalo." #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Nastala chyba při přihlašování pomocí vašeho účtu sociální sítě." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Propojení účtu" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Můžete se přihlásit pomocí jakéhokoliv následujícího účtu:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "V současné chvíli nemáte připojeny žádné účty sociálních sítí." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Přidejte další účet" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "Připojit %(provider)s" #: templates/socialaccount/login.html:13 #, fuzzy, python-format #| msgid "" #| "You are about to connect a new third party account from %(provider)s." msgid "You are about to connect a new third-party account from %(provider)s." msgstr "Chystáte se připojit nový účet třetí strany od %(provider)s." #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "Přihlásit se pomocí %(provider)s" #: templates/socialaccount/login.html:20 #, fuzzy, python-format #| msgid "" #| "You are about to sign in using a third party account from %(provider)s." msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "Chystáte se přihlásit pomocí účtu třetí strany od %(provider)s." #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "Pokračovat" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Přihlášení zrušeno" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Rozhodli jste se zrušit přihlašování jednoho z vašich účtů. Pokud je to " "omylem, následujte přihlášení." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Účet sociální sítě byl připojen." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Účet sociální sítě je již spojen s jiným účtem." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Účet sociální sítě byl odpojen." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Chystáte se použít vášeho %(provider_name)s účtu k přihlášení na naše " "stránky \n" "%(site_name)s. Jako poslední krok, prosím, vyplňte následující formulář:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, fuzzy #~| msgid "Generate" #~ msgid "Regenerate" #~ msgstr "Generovat" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Přihlašte se prosím výběrem jednoho\n" #~ "z vašich účtů třetích stran. Nebo se zaregistruje na stránky %(site_name)s a přihlašte se níže:" #~ msgid "or" #~ msgstr "nebo" #~ msgid "change password" #~ msgstr "změnit heslo" #~ msgid "OpenID Sign In" #~ msgstr "Přihlášení OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Tento e-mail je již přiřazen k jinému účtu." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Zaslali jsme vám e-mail. Prosím, kontaktujte nás, pokud ho nedostanete do " #~ "několika minut." #~ msgid "Account" #~ msgstr "Účet" #~| msgid "The password reset token was invalid." #~ msgid "The provided password is not valid." #~ msgstr "Použité heslo není platné." #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Zadané přihlašovací údaje nejsou správné." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Uživatelské jméno může obsahovat pouze písmena, číslice a znaky @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Toto uživatelské jméno je již zvoleno. Prosím, vyberte si jiné." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Přihlásit se" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Potvrdili jste e-mailovou adresu %(email)s uživateli %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Děkujeme za využívání našich stránek!" #~ msgid "Confirmation email sent to %(email)s" #~ msgstr "Ověřovací e-mail byl zaslán: %(email)s" #~ msgid "Delete Password" #~ msgstr "Smazat heslo" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "Můžete si smazat heslo, protože používáte jiné způsoby přihlášení." #~ msgid "delete my password" #~ msgstr "Odstanit moje heslo" #~ msgid "Password Deleted" #~ msgstr "Heslo bylo odstraněno" #~ msgid "Your password has been deleted." #~ msgstr "Vaše heslo bylo smazáno." django-allauth-0.58.2/allauth/locale/da/000077500000000000000000000000001452212273200177555ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/da/LC_MESSAGES/000077500000000000000000000000001452212273200215425ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/da/LC_MESSAGES/django.po000066400000000000000000001073011452212273200233460ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2018-09-03 16:04+0200\n" "Last-Translator: b'Tuk Bredsdorff '\n" "Language-Team: \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.1.1\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Brugernavn kan ikke bruges. Brug venligst et andet brugernavn." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Der er for mange mislykkede logonforsøg. Prøv igen senere." #: account/adapter.py:59 #, fuzzy #| msgid "A user is already registered with this address." msgid "A user is already registered with this email address." msgstr "En bruger er allerede registreret med denne emailadresse." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Nuværende adgangskode" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Adgangskoden skal være på mindst {0} tegn." #: account/apps.py:9 msgid "Accounts" msgstr "Konti" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Du skal skrive den samme adgangskode hver gang." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Adgangskode" #: account/forms.py:94 msgid "Remember Me" msgstr "Husk mig" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Denne konto er i øjeblikket inaktiv." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Den angivne emailadresse og/eller adgangskode er ikke korrekt." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Det angivne brugernavn og/eller adgangskoden er ikke korrekt." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Emailadresse" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "Email" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Brugernavn" #: account/forms.py:134 msgid "Username or email" msgstr "Brugernavn eller email" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Bruger" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Glemt password?" #: account/forms.py:312 msgid "Email (again)" msgstr "Email (igen)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Bekræftelse af emailadresse" #: account/forms.py:324 msgid "Email (optional)" msgstr "Email (valgfri)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Du skal skrive den samme emailadresse hver gang." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Adgangskode (igen)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Denne emailadresse er allerede knyttet til denne konto." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Din konto har ikke nogen bekræftet emailadresse." #: account/forms.py:524 msgid "Current Password" msgstr "Nuværende adgangskode" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Ny adgangskode" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Ny adgangskode (igen)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Indtast din nuværende adgangskode." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Emailadressen er ikke tildelt til nogen brugerkonto" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Token for nulstilling af adgangskode var ugyldig." #: account/models.py:21 msgid "user" msgstr "bruger" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "emailadresse" #: account/models.py:28 msgid "verified" msgstr "bekræftet" #: account/models.py:29 msgid "primary" msgstr "primær" #: account/models.py:35 msgid "email addresses" msgstr "emailadresser" #: account/models.py:141 msgid "created" msgstr "oprettet" #: account/models.py:142 msgid "sent" msgstr "sendt" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "nøgle" #: account/models.py:148 msgid "email confirmation" msgstr "emailbekræfelse" #: account/models.py:149 msgid "email confirmations" msgstr "emailbekræftelse" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "En konto med denne emailadresse eksisterer allerede. Log venligst ind med " "den konto først og tilknyt din %s konto derefter." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Der er ikke oprettet noget password til din konto." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Din konto har ikke nogen bekræftet emailadresse." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Sociale konti" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "udbyder" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "udbyder" #: socialaccount/models.py:52 msgid "name" msgstr "navn" #: socialaccount/models.py:54 msgid "client id" msgstr "klient id" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "App ID, eller konsumer nøgle" #: socialaccount/models.py:59 msgid "secret key" msgstr "hemmelig nøgle" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "API hemmelighed, klient hemmelighed eller konsumet hemmelighed" #: socialaccount/models.py:65 msgid "Key" msgstr "Nøgle" #: socialaccount/models.py:77 msgid "social application" msgstr "social applikation" #: socialaccount/models.py:78 msgid "social applications" msgstr "sociale applikationer" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "sidste log ind" #: socialaccount/models.py:116 msgid "date joined" msgstr "dato oprettet" #: socialaccount/models.py:117 msgid "extra data" msgstr "ekstra data" #: socialaccount/models.py:121 msgid "social account" msgstr "social konto" #: socialaccount/models.py:122 msgid "social accounts" msgstr "sociale konti" #: socialaccount/models.py:156 msgid "token" msgstr "token" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "“oauth_token” (OAuth1) eller adgangstoken (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "token hemmelighed" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "“oauth_token_secret” (OAuth1) eller fornyelsestoken (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "udløber den" #: socialaccount/models.py:170 msgid "social application token" msgstr "socialt applikationstoken" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "sociale applikationstokener" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Ugyldig profildata" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Ugyldig respons under forsøg på at hente request token fra “%s”." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Ugyldig respons under forsøg på at hente adgangstoken fra “%s”." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Intet request token gemt for “%s”." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Intet adgangstoken gemt for “%s”." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Ingen adgang til private ressourcer på “%s”." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Ugyldig respons under forsøg på at hente request token fra “%s”." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Inaktiv konto" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Denne konto er inaktiv." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Emailadresser" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "De følgende emailadresser er tilknyttet din konto:" #: templates/account/email.html:23 msgid "Verified" msgstr "Bekæftet" #: templates/account/email.html:27 msgid "Unverified" msgstr "Ubekræftet" #: templates/account/email.html:32 msgid "Primary" msgstr "Primær" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Gør primær" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Send bekræftelse igen" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Fjern" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Tilføj emailadresse" #: templates/account/email.html:70 msgid "Add Email" msgstr "Tilføj email" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Vil du virkelig fjerne den valgte emailadresse?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Tak fra %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Tak fordi du bruger %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Hej fra %(site_name)s!\n" "\n" "Du modtager denne email, fordi brugeren %(user_display)s ønsker at bruge den " "til sin konto.\n" "\n" "For at bekræfte dette, gå til %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Bekræft venligst din emailadresse" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Hej fra %(site_name)s!\n" "\n" "Du har modtaget denne email fordi du eller en anden har bedt om et password " "til din konto.\n" "Den kan trygt ses bort fra, hvis du ikke har bedt om at få nulstillet dit " "password. Klik linket herunder for at nulstille dit password." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "I tilfælde af at du har glemt det er dit brugernavn %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Token for nulstilling af adgangskode var ugyldig" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Hej fra %(site_name)s!\n" "\n" "Du har modtaget denne email fordi du eller en anden har bedt om et password " "til din konto.\n" "Den kan trygt ses bort fra, hvis du ikke har bedt om at få nulstillet dit " "password. Klik linket herunder for at nulstille dit password." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Emailadresser" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "De følgende emailadresser er tilknyttet din konto:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Din primære emailadresse skal bekræftes." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Bekræft venligst din emailadresse" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "Email" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Bekræft venligst din emailadresse" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Bekræft venligst at %(email)s er en e-mail " "adresse for %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Bekræft" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Den sociale konto er allerede tilknyttet en anden konto." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Dette link til bekræftelse af email er udløbet eller ugyldigt. Lav venligst " "et nyt." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Log ind" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Hvis du ikke allerede har oprettet en konto, så\n" "opret dig først." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Log ud" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Er du sikker på, at du vil logge af?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Du kan ikke fjerne din primære emailadresse (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Bekræftelses-email sendt til %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Du har bekræftet %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Fjernede emailadressen %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Loggede succesfuldt ind med %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Du har logget ud." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Password ændret med success." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Password indstillet med success." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Primær emailadresse indstillet." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Din primære emailadresse skal bekræftes." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Ændr password" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Glemt password?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Nulstil password" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Glemt dit password? Skriv din emailadresse herunder, og vi vil sende dig en " "email, hvorfra du kan nulstille det." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Nulstil mit password" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Kontakt os venligst, hvis du har problemer med at nulstille dit password." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Vi har sendt en email til dig for bekræftelse.\n" "Klik på linket i den. Kontakt os venligst, hvis du ikke modtager\n" " den i løbet af et par minutter." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Ugyldigt token" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Linket til nulstilling af password var ugyldigt, muligvis fordi det allerede " "er blevet brugt. Lav venligst et nyt." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Dit password er nu ændret." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Indstil password" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Bekræft venligst din emailadresse" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Opret" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Opret konto" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Har du allerede en konto? Så log ind." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Lukket for nye konti" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Vi beklager, men der er for tiden lukket for oprettelse af nye konti." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Note" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "du er allerede logget ind som %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Advarsel:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Du har på nuværende tidspunkt ikke nogen emailadresser tilknyttet. Du bør " "virkelig tilknytte en emailadresse, så du kan modtage notifikationer, " "resette dit password osv." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Bekræft din emailadresse" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Vi har sendt en email til dig. Følg linket i den for at færdiggøre " "oprettelsesprocessen. Kontakt os venligst, hvis du ikke modtager den i løbet " "af et par minutter." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Denne del af siden kræver, at du bekræfter, at\n" "du er hvem du påstår du er. Derfor er du nødt til at\n" "bekræfte, at du ejer din emailadresse " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Vi har sendt en email til dig for bekræftelse.\n" "Klik på linket i den. Kontakt os venligst, hvis du ikke modtager\n" " den i løbet af et par minutter." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Bemærk: du kan stadig ændre din " "emailadresse." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "token hemmelighed" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Social Network log ind-fejl" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Der opstod en fejl under forsøget på at logge ind via din social konto." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Kontoforbindelser" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Du kan logge ind med følgende tredjepartskonti:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Du har ikke nogle social netværks-konti tilknyttet denne konto." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Tilføj tredjeparts konto" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Log ind afbrudt" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Du valgte at afbryde log ind på vores side med en af dine eksisterende " "konti. Hvis det var en fejl, så fortsæt venligst til log ind." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Den social konto er tilknyttet." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Den sociale konto er allerede tilknyttet en anden konto." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Tilknytningen til den social konto er blevet afbrydt." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Du er ved at bruge din %(provider_name)s -konto til at logge ind i\n" "%(site_name)s. Som et sidste skridt, udfyld venligst denne formular:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Log venligst ind med en\n" #~ "af dine eksisterende tredjeparts konti. Eller, opret\n" #~ "en konto på %(site_name)s og log ind herunder:" #~ msgid "or" #~ msgstr "eller" #~ msgid "change password" #~ msgstr "ændr password" #~ msgid "OpenID Sign In" #~ msgstr "OpenID Log ind" #~ msgid "This email address is already associated with another account." #~ msgstr "Denne emailadresse er allerede knyttet til en anden konto." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Vi har sendt dig en email. Kontakt os venligst, hvis du ikke modtager den " #~ "i løbet af et par minutter." #~ msgid "Account" #~ msgstr "Konto" django-allauth-0.58.2/allauth/locale/de/000077500000000000000000000000001452212273200177615ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/de/LC_MESSAGES/000077500000000000000000000000001452212273200215465ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/de/LC_MESSAGES/django.po000066400000000000000000001111761452212273200233570ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jannis Vajen, 2013-2014 msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2023-11-03 10:52+0100\n" "Last-Translator: Jannis Vajen \n" "Language-Team: German (http://www.transifex.com/projects/p/django-allauth/" "language/de/)\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "" "Anmeldename kann nicht verwendet werden. Bitte wähle einen anderen Namen." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "" "Zu viele gescheiterte Anmeldeversuche. Bitte versuche es später erneut." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Es ist bereits jemand mit dieser E-Mail-Adresse registriert." #: account/adapter.py:60 msgid "Incorrect password." msgstr "Aktuelles Passwort." #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Das Passwort muss aus mindestens {0} Zeichen bestehen." #: account/apps.py:9 msgid "Accounts" msgstr "Konten" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Du musst zweimal das selbe Passwort eingeben." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Passwort" #: account/forms.py:94 msgid "Remember Me" msgstr "Angemeldet bleiben" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Dieses Konto ist derzeit inaktiv." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Die E-Mail-Adresse und/oder das Passwort sind leider falsch." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Der Anmeldename und/oder das Passwort sind leider falsch." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "E-Mail-Adresse" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-Mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Anmeldename" #: account/forms.py:134 msgid "Username or email" msgstr "Anmeldename oder E-Mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Anmeldung" #: account/forms.py:148 msgid "Forgot your password?" msgstr "Passwort vergessen?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-Mail (wiederholen)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Bestätigung der E-Mail-Adresse" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-Mail (optional)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Du musst zweimal dieselbe E-Mail-Adresse eingeben." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Passwort (Wiederholung)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Diese E-Mail-Adresse wird bereits in diesem Konto verwendet." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "Du kannst nicht mehr als %d E-Mail-Adressen hinzufügen." #: account/forms.py:524 msgid "Current Password" msgstr "Aktuelles Passwort" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Neues Passwort" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Neues Passwort (Wiederholung)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Bitte gib dein aktuelles Passwort ein." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Diese E-Mail-Adresse ist keinem Konto zugeordnet" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Das Sicherheits-Token zum Zurücksetzen des Passwortes war ungültig." #: account/models.py:21 msgid "user" msgstr "Benutzer" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "E-Mail-Adresse" #: account/models.py:28 msgid "verified" msgstr "bestätigt" #: account/models.py:29 msgid "primary" msgstr "Primär" #: account/models.py:35 msgid "email addresses" msgstr "E-Mail-Adressen" #: account/models.py:141 msgid "created" msgstr "Erstellt" #: account/models.py:142 msgid "sent" msgstr "Gesendet" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "Schlüssel" #: account/models.py:148 msgid "email confirmation" msgstr "E-Mail-Bestätigung" #: account/models.py:149 msgid "email confirmations" msgstr "E-Mail-Bestätigungen" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "Sie können die Zwei-Faktor-Authentifizierung nicht aktivieren, bis Sie Ihre E-Mail-Adresse verifiziert haben." #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "Sie können keine E-Mail-Adresse zu einem Konto hinzufügen, das durch die Zwei-Faktor-Authentifizierung geschützt ist." #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "Falscher Code." #: mfa/apps.py:7 msgid "MFA" msgstr "MFA" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "Code" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "Authentifizierungscode" #: mfa/models.py:15 msgid "Recovery codes" msgstr "Wiederherstellungs-Codes" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "TOTP Authenticator" #: socialaccount/adapter.py:32 #, python-format msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Es existiert bereits ein Konto mit dieser E-Mail-Adresse. Bitte melde dich " "zuerst mit diesem Konto an, und verknüpfe es dann mit deinem %s-Konto." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Für dein Konto wurde noch kein Passwort festgelegt." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Dein Konto hat keine bestätigte E-Mail-Adresse." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Konto" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "Anbieter" #: socialaccount/models.py:48 msgid "provider ID" msgstr "Anbieter-ID" #: socialaccount/models.py:52 msgid "name" msgstr "Anmeldename" #: socialaccount/models.py:54 msgid "client id" msgstr "Client-ID" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "App-ID oder 'Consumer key'" #: socialaccount/models.py:59 msgid "secret key" msgstr "Geheimer Schlüssel" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "'API secret', 'client secret' oder 'consumer secret'" #: socialaccount/models.py:65 msgid "Key" msgstr "Schlüssel" #: socialaccount/models.py:77 msgid "social application" msgstr "Soziale Anwendung" #: socialaccount/models.py:78 msgid "social applications" msgstr "Soziale Anwendungen" #: socialaccount/models.py:113 msgid "uid" msgstr "UID" #: socialaccount/models.py:115 msgid "last login" msgstr "Letzte Anmeldung" #: socialaccount/models.py:116 msgid "date joined" msgstr "Registrierdatum" #: socialaccount/models.py:117 msgid "extra data" msgstr "Weitere Daten" #: socialaccount/models.py:121 msgid "social account" msgstr "Soziales Konto" #: socialaccount/models.py:122 msgid "social accounts" msgstr "Soziale Konten" #: socialaccount/models.py:156 msgid "token" msgstr "Token" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) oder \"access token\" (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "Geheimes Token" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) oder \"refresh token\" (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "Läuft ab" #: socialaccount/models.py:170 msgid "social application token" msgstr "Token für soziale Anwendung" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "Tokens für soziale Anwendungen" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Ungültige Profildaten" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Ungültige Antwort von \"%s\" als Anfrageschlüssel erbeten wurde. Die Antwort war: %s." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Ungültige Antwort von \"%s\" als Zugangsschlüssel erbeten wurde." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Kein Request-Token gespeichert für \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Kein Access-Token gespeichert für \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Kein Zugriff zu privaten Daten auf \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Ungültige Antwort von \"%s\" als Anfrageschlüssel erbeten wurde." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Konto inaktiv" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Dieses Konto ist inaktiv." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "E-Mail-Adressen" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Folgende E-Mail-Adressen sind mit diesem Konto verknüpft:" #: templates/account/email.html:23 msgid "Verified" msgstr "Bestätigt" #: templates/account/email.html:27 msgid "Unverified" msgstr "Unbestätigt" #: templates/account/email.html:32 msgid "Primary" msgstr "Primär" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Als primäre Adresse festlegen" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Bestätigungs-Mail nochmal verschicken" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Ausgewählte entfernen" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "E-Mail-Adresse hinzufügen" #: templates/account/email.html:70 msgid "Add Email" msgstr "E-Mail hinzufügen" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Möchtest du wirklich die ausgewählte E-Mail-Adresse entfernen?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" "Du erhältst diese E-Mail, weil du oder jemand anderes versucht hat, sich für " "ein Konto anzumelden mit E-Mail-Adresse:\n" "\n" "%(email)s\n" "\n" "Es existiert jedoch bereits ein Konto mit dieser E-Mail-Adresse. Falls du " "dies vergessen hast, verwende bitte das Passwort-Vergessen-Verfahren, um " "dein Konto wiederherzustellen:\n" "\n" "%(password_reset_url)s" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "Konto existiert bereits" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Hallo von %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Danke dass du %(site_name)s nutzt!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Du erhältst diese E-Mail, weil der Nutzer %(user_display)s von " "%(site_domain)s deine E-Mail-Adresse als seine angab, um sie mit seinem " "Konto zu verknüpfen.\n" "\n" "Um dies zu bestätigen, rufe bitte folgende Adresse auf: %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Bitte bestätige deine E-Mail-Adresse" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Du erhältst diese E-Mail weil du oder jemand anderes die Zurücksetzung des " "Passwortes für dein Konto gefordert hat.\n" "Falls es sich dabei nicht um dich handelt, kann diese Nachricht ignoriert " "werden. Rufe folgende Adresse auf um dein Passwort zurückzusetzen." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "" "Falls du deinen Anmeldenamen vergessen haben solltest; er lautet " "%(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-Mail zum Zurücksetzen des Passworts" #: templates/account/email/unknown_account_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Du erhältst diese E-Mail weil du oder jemand anderes die Zurücksetzung des " "Passwortes für dein Konto gefordert hat. Wir haben jedoch keinen Eintrag " "eines Benutzers mit der E-Mail-Adresse %(email)s in unserer Datenbank.\n" "\n" "Falls es sich dabei nicht um dich handelt, kann diese Nachricht ignoriert " "werden.\n" "\n" "Ansonsten kannst du dich über den unten stehenden Link für ein Konto " "anmelden." #: templates/account/email_change.html:5 templates/account/email_change.html:9 msgid "Email Address" msgstr "Email-Adresse" #: templates/account/email_change.html:14 msgid "The following email address is associated with your account:" msgstr "Die folgende Email-Adresse ist mit Ihrem Konto verknüpft:" #: templates/account/email_change.html:19 msgid "Your email address is still pending verification:" msgstr "Deine E-Mail-Adresse steht immer noch aus und muss überprüft werden:" #: templates/account/email_change.html:38 msgid "Change Email Address" msgstr "E-Mail-Adresse ändern" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 msgid "Change Email" msgstr "Email ändern" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "E-Mail-Adresse bestätigen" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Bitte bestätige, dass %(email)s eine E-Mail-" "Adresse von %(user_display)s ist." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Bestätigen" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, python-format msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Kann %(email)s nicht bestätigen, da sie bereits von einem anderen Konto bestätigt wurde." #: templates/account/email_confirm.html:35 #, python-format msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Dieser Bestätigungslink ist leider abgelaufen. Lass Dir bitte eine neue Bestätigungs-Mail schicken." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Anmeldung" #: templates/account/login.html:12 #, python-format msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Du hast noch kein Konto bei uns? Dann erstelle bitte zunächst eins." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Abmelden" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Bist du sicher, dass du dich abmelden möchtest?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Du kannst deine primäre E-Mail-Adresse (%(email)s) nicht löschen." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Bestätigungs-E-Mail wurde an %(email)s verschickt." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Du hast die Adresse %(email)s bestätigt." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "E-Mailadresse %(email)s entfernt." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Erfolgreich als %(name)s angemeldet." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Du hast dich abgemeldet." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Das Passwort wurde geändert." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Das Passwort wurde erfolgreich gesetzt." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Primäre E-Mailadresse festgelegt." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Deine primäre E-Mailadresse muss bestätigt werden." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Passwort ändern" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Passwort vergessen?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Passwort zurücksetzen" #: templates/account/password_reset.html:14 msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Passwort vergessen? Gib deine E-Mail-Adresse unten ein, dann schicken wir " "dir einen Link, unter dem du dein Passwort zurücksetzen kannst." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Passwort zurücksetzen" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Bitte kontaktiere uns, wenn das Zurücksetzen des Passworts nicht klappt." #: templates/account/password_reset_done.html:16 msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Wir haben Dir eine E-Mail geschickt. Wenn du die E-Mail nicht in deinem " "Posteingang siehst, überprüfe bitte deinen Spam-Ordner. Wenn die E-Mail " "ansonsten nicht in ein paar Minuten angekommen ist, gib uns bitte Bescheid." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Falsches Token" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Der Link zum Zurücksetzen des Passworts war ungültig, womöglich wurde dieser " "Link bereits benutzt. Bitte lass dein Passwort noch mal zurücksetzen." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Dein Passwort wurde geändert." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Passwort setzen" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 msgid "Confirm Access" msgstr "Zugriff bestätigen" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "Um die Sicherheit Ihres Kontos zu gewährleisten, geben Sie bitte Ihr Passwort ein:" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registrieren" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Registrieren" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Du hast bereits ein Konto bei uns? Dann bitte hier " "entlang." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Registrierung geschlossen" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Es tut uns leid, aber die Registrierung ist derzeit geschlossen." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Anmerkung" #: templates/account/snippets/already_logged_in.html:7 #, python-format msgid "You are already logged in as %(user_display)s." msgstr "Du bist bereits als %(user_display)s angemeldet." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Warnung:" #: templates/account/snippets/warn_no_email.html:3 msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Du hast derzeit keine E-Mail-Adressen angegeben. Das solltest du allerdings " "tun, denn nur so können wir dich benachrichtigen und dein Passwort " "zurücksetzen." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Bestätige deine E-Mail-Adresse" #: templates/account/verification_sent.html:12 msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Wir haben dir eine E-Mail geschickt, um deine Adresse zu verifizieren. Bitte " "folge dem Link in der E-Mail um den Anmeldeprozess abzuschließen. Wenn du " "die E-Mail nicht in deinem Posteingang siehst, überprüfe bitte deinen Spam-" "Ordner. Wenn die E-Mail nicht in ein paar Minuten angekommen ist, gib uns " "bitte Bescheid." #: templates/account/verified_email_required.html:13 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Auf diesem Teil der Webseite möchten wie sichergehen,\n" "dass du die Person bist für die du dich ausgibst.\n" "Dazu musst du deine E-Mail-Adresse verifizieren. " #: templates/account/verified_email_required.html:18 msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Wir haben Dir eine E-Mail geschickt, um deine\n" "Adresse zu verifizieren. Bitte klick auf den Link\n" "in der E-Mail. Wenn du die E-Mail nicht in deinem Posteingang siehst, " "überprüfe bitte deinen Spam-Ordner. Wenn die E-Mail ansonsten nicht in ein " "paar Minuten angekommen ist, gib uns bitte Bescheid." #: templates/account/verified_email_required.html:23 #, python-format msgid "" "Note: you can still change your " "email address." msgstr "" "Anmerkung: Du kannst Deine E-Mail-" "Adresse ändern." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "Nachrichten:" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "Menü" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "Zwei-Faktor-Authentifizierung" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "Ihr Konto ist durch Zwei-Faktor-Authentifizierung geschützt. Bitte geben Sie einen Authenticator-Code ein:" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "Authenticator-App" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "Die Authentifizierung mit einer Authenticator-App ist aktiv." #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "Es ist keine Authenticator-App aktiv." #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "Deaktivieren" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "Aktivieren" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "Wiederherstellungs-Codes" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "Es steht %(unused_count)s von %(total_count)s Wiederherstellungscodes zur Verfügung." msgstr[1] "Es stehen %(unused_count)s von %(total_count)s Wiederherstellungscodes zur Verfügung." #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "Es wurden keine Wiederherstellungscodes eingerichtet." #: templates/mfa/index.html:56 msgid "View" msgstr "Anzeigen" #: templates/mfa/index.html:62 msgid "Download" msgstr "Herunterladen" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "Generieren" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "Ein neuer Satz Wiederherstellungscodes wurde generiert." #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "Authenticator-App aktiviert." #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "Authenticator-App deaktiviert." #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "Du bist dabei, einen neuen Satz Wiederherstellungscodes für Ihr Konto zu generieren." #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "Diese Aktion wird Ihre vorhandenen Codes ungültig machen." #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "Sind Sie sicher?" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "Unbenutzte Codes" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "Codes herunterladen" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "Neue Codes generieren" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "Authenticator-App aktivieren" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "Um Ihr Konto mit der Zwei-Faktor-Authentifizierung zu schützen, scannen Sie den unten stehenden QR-Code mit Ihrer Authenticator-App. Geben Sie dann den von der App generierten Bestätigungscode unten ein." #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "Authentifizierungsgeheimnis" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "Sie können dieses Geheimnis speichern und zu einem späteren Zeitpunkt verwenden, um Ihre Authenticator-App neu zu installieren." #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "Authenticator-App deaktivieren" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "Du bist dabei, die Authentifizierung per Authenticator-App zu deaktivieren. Sind Sie sicher?" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Fehler bei der Anmeldung am sozialen Netzwerk" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Ein Fehler ist aufgetreten; die Anmeldung beim sozialen Netzwerk hat nicht " "geklappt." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Konto-Verknüpfungen" #: templates/socialaccount/connections.html:13 msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Sie können sich bei Ihrem Konto mit einem der folgenden Drittanbieter-Konten anmelden:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Dein Konto ist derzeit mit keinen sozialen Netzwerken verknüpft." #: templates/socialaccount/connections.html:48 msgid "Add a Third-Party Account" msgstr "Einen Drittanbieter-Account hinzufügen" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "Mit %(provider)s verbinden" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "Du bist dabei, ein neues Drittanbieter-Konto von %(provider)s zu verknüpfen." #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "Anmelden über %(provider)s" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "Du bist dabei, dich mit einem Konto von %(provider)s anzumelden." #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "Fortfahren" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Anmeldung abgebrochen" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Du hast die Anmeldung abgebrochen. Wenn das nur ein Versehen oder ein Fehler " "war, folge bitte diesem Link um dich " "anzumelden." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Konten wurden erfolgreich verknüpft." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "" "Das Konto des Drittanbieters ist bereits mit einem anderen Konto dieser " "Seite verknüpft." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Die Verknüpfung mit dem sozialen Netzwerk wurde aufgehoben." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Du verwendest dein %(provider_name)s-Konto, um dich bei\n" "%(site_name)s anzumelden. Zum Abschluss bitte das folgende Formular " "ausfüllen:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "Oder Drittanbieter verwenden" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Bitte melde dich mit einem der folgenden Netzwerkkonten an, oder registriere dich auf %(site_name)s, dann " #~ "kannst du dich unten mit deinem Konto anmelden:" #~ msgid "or" #~ msgstr "oder" #~ msgid "change password" #~ msgstr "Passwort ändern" #~ msgid "OpenID Sign In" #~ msgstr "OpenID-Anmeldung" #~ msgid "This email address is already associated with another account." #~ msgstr "Diese E-Mail-Adresse wird bereits in einem anderen Konto verwendet." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Wir haben Dir eine E-Mail geschickt. Bitte kontaktiere uns, wenn du sie " #~ "nicht in ein paar Minuten erhalten hast." #~ msgid "Account" #~ msgstr "Konto" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Die Anmeldedaten sind leider falsch." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Anmeldenamen dürfen nur Buchstaben und Ziffern und folgende Zeichen " #~ "enthalten: @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Der Anmeldename ist bereits vergeben – bitte wähle einen anderen." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Anmeldung" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Du hast bestätigt, dass %(email)s eine " #~ "gültige Adresse von %(user_display)s ist." #~ msgid "Thanks for using our site!" #~ msgstr "Danke, dass du unsere Seite nutzt!" django-allauth-0.58.2/allauth/locale/el/000077500000000000000000000000001452212273200177715ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/el/LC_MESSAGES/000077500000000000000000000000001452212273200215565ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/el/LC_MESSAGES/django.po000066400000000000000000001262331452212273200233670ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2014-08-12 00:29+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Δεν μπορεί να χρησιμοποιηθεί αυτό το όνομα χρήστη. Δοκιμάστε άλλο." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Πολλές αποτυχημένες προσπάθειες σύνδεσης. Προσπαθήστε ξανά αργότερα." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Υπάρχει ήδη εγγεγραμμένος χρήστης με αυτό το e-mail." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Τρέχον συνθηματικό" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Το συνθηματικό πρέπει να περιέχει τουλάχιστον {0} χαρακτήρες." #: account/apps.py:9 msgid "Accounts" msgstr "Λογαριασμοί" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Πρέπει να δοθεί το ίδιο συνθηματικό κάθε φορά." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Συνθηματικό" #: account/forms.py:94 msgid "Remember Me" msgstr "Αυτόματη Σύνδεση" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Αυτός ο λογαριασμός είναι ανενεργός." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Η διέυθυνση e-mail ή/και το συνθηματικό που δόθηκαν δεν είναι σωστά." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Το όνομα χρήστη ή/και το συνθηματικό που δόθηκαν δεν είναι σωστά." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Διεύθυνση e-mail" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Όνομα χρήστη" #: account/forms.py:134 msgid "Username or email" msgstr "Όνομα χρήστη ή e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Σύνδεση" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Ξέχασα το συνθηματικό μου" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "E-mail (επιβεβαίωση)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "Επιβεβαίωση διεύθυνσης e-mail" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (προαιρετικό)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Πρέπει να δοθεί το ίδιο email κάθε φορά." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Συνθηματικό (επιβεβαίωση)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Αυτό το e-mail χρησιμοποιείται ήδη από αυτό το λογαριασμό." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Δεν έχει επιβεβαιωθεί κανένα e-mail του λογαριασμού σας." #: account/forms.py:524 msgid "Current Password" msgstr "Τρέχον συνθηματικό" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Νέο συνθηματικό" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Νέο συνθηματικό (επιβεβαίωση)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Παρακαλώ γράψτε το τρέχον συνθηματικό σας." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Το e-mail δεν χρησιμοποιείται από κανέναν λογαριασμό" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Το κουπόνι επαναφοράς του συνθηματικού δεν ήταν έγκυρο." #: account/models.py:21 msgid "user" msgstr "χρήστης" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "διεύθυνση e-mail" #: account/models.py:28 msgid "verified" msgstr "επαληθευμένο" #: account/models.py:29 msgid "primary" msgstr "πρωτεύον" #: account/models.py:35 msgid "email addresses" msgstr "διευθύνσεις e-mail" #: account/models.py:141 msgid "created" msgstr "δημιουργήθηκε" #: account/models.py:142 msgid "sent" msgstr "απστάλει" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "κλειδί" #: account/models.py:148 msgid "email confirmation" msgstr "e-mail επιβεβαίωσης" #: account/models.py:149 msgid "email confirmations" msgstr "e-mail επιβεβαίωσης" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Υπάρχει ήδη ένας λογαριασμός με αυτό το e-mail. Συνδεθείτε πρώτα με αυτόνκαι " "μετά συνδέστε τον λογαριασμό %s." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Δεν έχει οριστεί συνθηματικό στον λογαριασμό σας." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Δεν έχει επιβεβαιωθεί κανένα e-mail του λογαριασμού σας." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Λογαριασμοί Κοινωνικών Μέσων" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "πάροχος" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "πάροχος" #: socialaccount/models.py:52 msgid "name" msgstr "όνομα" #: socialaccount/models.py:54 msgid "client id" msgstr "id πελάτη" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "App ID ή consumer key(κλειδί καταναλωτή)" #: socialaccount/models.py:59 msgid "secret key" msgstr "μυστικό κλειδί" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "API secret, client secret, ή consumer secret" #: socialaccount/models.py:65 msgid "Key" msgstr "Κλειδί" #: socialaccount/models.py:77 msgid "social application" msgstr "εφαρμογή κοινωνικών μέσων" #: socialaccount/models.py:78 msgid "social applications" msgstr "εφαρμογές κοινωνικών μέσων" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "τελευταία σύνδεση" #: socialaccount/models.py:116 msgid "date joined" msgstr "ημερομηνία εγγραφής" #: socialaccount/models.py:117 msgid "extra data" msgstr "έξτρα δεδομένα" #: socialaccount/models.py:121 msgid "social account" msgstr "λογαριασμός κοινωνικών μέσων" #: socialaccount/models.py:122 msgid "social accounts" msgstr "λογαριασμοί κοινωνικών μέσων" #: socialaccount/models.py:156 msgid "token" msgstr "κουπόνι" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) ή access token (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "token secret" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) ή refresh token (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "λήγει στις" #: socialaccount/models.py:170 msgid "social application token" msgstr "token (κουπόνι) εφαρμογής κοινωνικών μέσων" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "tokens (κουπόνια) εφαρμογής κοινωνικών μέσων" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Άκυρα δεδομένα προφίλ" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Μη-έγκυρη απάντηση κατά την απόκτηση κουπονιού αιτήματος από \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Μη-έγκυρη απάντηση κατά την απόκτηση κουπονιού πρόσβασης από \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Δεν υπάρχει αποθηκευμένο κουπόνι αιτήματος για \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Δεν υπάρχει αποθηκευμένο κουπόνι πρόσβασης για \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Αδύνατη πρόσβαση σε ιδιοτικούς πόρους στο \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Μη-έγκυρη απάντηση κατά την απόκτηση κουπονιού αιτήματος από \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Λογαριασμός Ανενεργός" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Αυτός ο λογαριασμός είναι ανενεργός." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Διεύθυνση e-mail" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "" "Οι διευθύνσεις e-mail που ακολουθούν είναι συσχετισμένες με τον λογαριασμό " "σας:" #: templates/account/email.html:23 msgid "Verified" msgstr "Εγκεκριμένος" #: templates/account/email.html:27 msgid "Unverified" msgstr "Μη-επιβεβαιωμένο" #: templates/account/email.html:32 msgid "Primary" msgstr "Πρωτεύον" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Ορισμός ως Πρωτεύον" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Επανάληψη αποστολής Επαλήθευσης" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Αφαίρεση" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Προσθήκη διέυθυνσης e-mail" #: templates/account/email.html:70 msgid "Add Email" msgstr "Προσθήκη e-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Θέλετε να αφαιρέσετε την επλεγμένη διεύθυνση e-mail?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Ευχαριστούμε από το %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Ευχαριστούμε που χρησιμοποιήσατε το %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Χαιρετίσματα από το %(site_name)s!\n" "\n" "Λαμβάνετε αυτό το e-mail επειδή ο χρήστης %(user_display)s έκανε αίτηση " "σύνδεσης της διέυθυνσης e-mail σας με τον λογαριασμό του.\n" "\n" "Για να επιβεβαιώσετε αυτή την ενέργεια, πηγαίνετε στο %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Παρακαλούμε να επιβεβαιώσετε την διεύθυνση e-mail σας" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Χαιρετίσματα από το %(site_name)s!\n" "\n" "Λαμβάνετε αυτό το e-mail επειδή εσείς ή κάποιος άλλος έχει κάνει αίτηση " "συνθηματικού για τον λογαριασμό σας.\n" "Αν δεν ζητήσατε επαναφορά συνθηματικού, μπορεί να αγνοηθεί με ασφάλεια. " "Πατήστε στον σύνδεσμο που ακολουθεί για να επαναφέρετε το συνθηματικό σας." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Σε περίπτωση που ξεχάσατε, το όνομα χρήστη σας είναι %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-mail επαναφοράς συνθηματικού" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Χαιρετίσματα από το %(site_name)s!\n" "\n" "Λαμβάνετε αυτό το e-mail επειδή εσείς ή κάποιος άλλος έχει κάνει αίτηση " "συνθηματικού για τον λογαριασμό σας.\n" "Αν δεν ζητήσατε επαναφορά συνθηματικού, μπορεί να αγνοηθεί με ασφάλεια. " "Πατήστε στον σύνδεσμο που ακολουθεί για να επαναφέρετε το συνθηματικό σας." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Διεύθυνση e-mail" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "" "Οι διευθύνσεις e-mail που ακολουθούν είναι συσχετισμένες με τον λογαριασμό " "σας:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Η πρωτεύον διεύθυνση e-mail πρέπει να επιβεβαιωθεί." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Επιβεβαίωση διεύθυνση e-mail" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Επιβεβαίωση διεύθυνση e-mail" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Παρακαλούμε επιβεβαιώστε ότι το %(email)s " "αποτελεί διεύθυνση e-mail για τον χρήστη %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Επιβεβαίωση" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "" "Ο λογαριασμός κοινωνικών μέσων είναι ήδη συνδεδεμένος με διαφορετικό " "λογαριασμό." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Αυτός ο σύνδεσμος επιβεβαίωσης έχει λήξει ή δεν είναι έγκυρος. Παρακαλούμε " "κάντε καινούρια αίτηση επιβεβαίωσης e-mail." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Σύνδεση" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Αν δεν έχετε δημιουργήσει λογαριασμό, πρώτα κάντε\n" "εγγραφή" #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Αποσύνδεση" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Είστε σίγουροι ότι θέλετε να αποσυνδεθείτε;" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Δεν μπορείτε να αφαιρέσετε την πρωτεύον διεύθυνση email (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "E-mail επιβεβαίωσης στάλθηκε στο %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Έχετε επιβεβαιώσει το %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Αφαιρέθηκε η διεύθυνση e-mail %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Επιτυχημένη σύνδεση ως %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Έχετε αποσυνδεθεί." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Αλλαγή συνθηματικού ολοκληρώθηκε επιτυχώς." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Συνθηματικό ορίστηκε επιτυχώς." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Ορίστηκε η πρωτεύον διεύθυνση e-mail." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Η πρωτεύον διεύθυνση e-mail πρέπει να επιβεβαιωθεί." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Αλλάξτε Συνθηματικό" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Ξέχασα το συνθηματικό μου" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Επαναφορά Συνθηματικού" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Ξεχάσατε το συνθηματικό σας? Γράψτε το e-mail σας παρακάτω, και θα σας " "στείλουμε ενα e-mail για να το επαναφέρετε." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Επαναφορά του Συνθηματικού Μου" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Παρακαλούμε επικοινωνήστε μαζί μας αν υπάρξει οποιοδήποτε πρόβλημα κατα την " "επαναφορά του συνθηματικού σας." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Σας στείλαμε ένα e-mail για επαλήθευση.\n" "Παρακαλούμε ακολουθήστε τον σύνδεσμο που αυτό περιέχει. Παρακαλούμε\n" "επικοινωνήστε μαζί μας αν δεν το έχετε παραλάβει μέσα σε λίγα λεπτά." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Μη-έγκυρο Κουπόνι" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Ο σύνδεσμος επαναφορά συνθηματικού δεν ήταν έγκυρος, πιθανών να έχει ήδη " "χρησιμοποιηθεί. Παρακαλούμε κάντε εκ νέου επαναφορά συνθηματικού." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Το συνθηματικό σας έχει αλλάξει." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Ορισμός Συνθηματικού" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Επιβεβαίωση διεύθυνση e-mail" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Εγγραφή" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Εγγραφή" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Έχετε ήδη λογαριασμό; Τότε παρακαλούμε συνδεθείτε." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Φραγή Εγγραφών" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Ζητούμε συγνώμη, αλλά η δυνατότητα εγγραφής είναι υπό φραγή." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Σημείωση" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "είστε ήδη συνδεδεμένος ως %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Προσοχη:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Δεν έχετε ρυθμίσει καμία διεύθυνση e-mail. Προτείνουμε να προσθέσετε μία " "ώστε να μπορείτε να λάβετε ειδοποιήσεις, να ανακτήσετε το συνθηματικό σας " "κλπ." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Επιβεβαιώστε την διεύθυνση e-mail σας" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Σας στείλαμε ένα e-mail για επαλήθευση. Ακολουθήστε τον σύνδεσμο που λάβατε " "γιατην ολοκλήρωση της διαδικασίας εγγραφής. Παρακαλούμε επικοινωνήστε μαζί " "μας αν δεν το έχετε παραλάβει μέσα σε λίγα λεπτά." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Αυτή η λειτουργία της σελίδας απαιτεί την επαλήθευση\n" "της ταυτότηας σας. Γι' αυτό, σας ζητούμε να\n" "επαληθεύσετε την ιδιοκτησία της e-mail διεύθυνσης σας. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Σας στείλαμε ένα e-mail για επαλήθευση.\n" "Παρακαλούμε ακολουθήστε τον σύνδεσμο που αυτό περιέχει. Παρακαλούμε\n" "επικοινωνήστε μαζί μας αν δεν το έχετε παραλάβει μέσα σε λίγα λεπτά." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Σημείωση: μπορείτε ακόμα να αλλάξετε τηνδιεύθυνση e-mail σας." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "token secret" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Σύνδεση μέσω Κοινωνικών Μέσων ανεπιτυχής" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Παρουσιάστηκε ένα σφάλμα κατά την σύνδεση μέσω του λογαριασμού κοινωνικών " "μέσων σας." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Συνδέσεις Λογαριασμού" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Μπορείτε να συνδεθείτε στον λογαριασμό σας με οποιοδήποτε από τους παρακάτω " "εξωτερικούς λογαριασμούς:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Δεν έχετε συνδέσει κανένα λογαριασμό κοινωνικών μέσων με αυτό τον λογαριασμό." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Προσθήκη εξωτερικού λογαριασμού" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, fuzzy, python-format #| msgid "" #| "You are about to connect a new third party account from %(provider)s." msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" "Πρόκειται να συνδεθείτε χρησιμοποιώντας έναν λογαριασμό τρίτου μέρους από " "%(provider)s." #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "Συνδεθείτε με %(provider)s" #: templates/socialaccount/login.html:20 #, fuzzy, python-format #| msgid "" #| "You are about to connect a new third party account from %(provider)s." msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" "Πρόκειται να συνδεθείτε χρησιμοποιώντας έναν λογαριασμό τρίτου μέρους από " "%(provider)s." #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "Συνέχεια" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Σύνδεση ακυρώθηκε" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Αποφασίσατε να ακυρώσετε την σύνδεση σας στην ιστοσελίδα με έναν από τους " "υπάρχοντες λογαριασμούς σας. Αν έγινε κατά λάθος, παρακαλώ συνδεθείτε." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Ο λογαριασμός κοινωνικών μέσων έχει συνδεθεί." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "" "Ο λογαριασμός κοινωνικών μέσων είναι ήδη συνδεδεμένος με διαφορετικό " "λογαριασμό." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Ο λογαριασμός κοινωνικών μέσων έχει αποσυνδεθεί." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Πρόκειται να χρησιμοποιήσετε τον %(provider_name)s λογαριασμό σας για να " "συνδεθείτε στην σελίδα\n" "%(site_name)s. Ως τελικό βήμα, παρακαλούμε συμπληρώστε την παρακάτω φόρμα:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Παρακαλούμε συνδεθείτε με έναν\n" #~ "από τους ήδη υπάρχοντες εξωτερικούς λογαριασμούς σας. Ή, κάντε εγγραφή\n" #~ "για έναν λογαριασμό %(site_name)s και συνδεθείτε παρακάτω:" #~ msgid "or" #~ msgstr "ή" #~ msgid "change password" #~ msgstr "αλλαγή συνθηματικού" #~ msgid "OpenID Sign In" #~ msgstr "Σύνδεση OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Αυτό το e-mail χρησιμοποιείται ήδη από άλλο λογαριασμό." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Σας έχουμε στείλει ένα e-mail. Παρακαλούμε επικοινωνήστε μαζί μας αν δεν " #~ "το έχετε παραλάβει μέσα σε λίγα λεπτά." #~ msgid "Account" #~ msgstr "Λογαριασμός" django-allauth-0.58.2/allauth/locale/en/000077500000000000000000000000001452212273200177735ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/en/LC_MESSAGES/000077500000000000000000000000001452212273200215605ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/en/LC_MESSAGES/django.po000066400000000000000000000610061452212273200233650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2023-07-24 22:28+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "" #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "" #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "" #: account/adapter.py:60 msgid "Incorrect password." msgstr "" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "" #: account/apps.py:9 msgid "Accounts" msgstr "" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "" #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "" #: account/forms.py:94 msgid "Remember Me" msgstr "" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "" #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "" #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "" #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "" #: account/forms.py:134 msgid "Username or email" msgstr "" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "" #: account/forms.py:148 msgid "Forgot your password?" msgstr "" #: account/forms.py:312 msgid "Email (again)" msgstr "" #: account/forms.py:316 msgid "Email address confirmation" msgstr "" #: account/forms.py:324 msgid "Email (optional)" msgstr "" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "" #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "" #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "" #: account/forms.py:524 msgid "Current Password" msgstr "" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "" #: account/forms.py:538 msgid "Please type your current password." msgstr "" #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "" #: account/models.py:21 msgid "user" msgstr "" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "" #: account/models.py:28 msgid "verified" msgstr "" #: account/models.py:29 msgid "primary" msgstr "" #: account/models.py:35 msgid "email addresses" msgstr "" #: account/models.py:141 msgid "created" msgstr "" #: account/models.py:142 msgid "sent" msgstr "" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "" #: account/models.py:148 msgid "email confirmation" msgstr "" #: account/models.py:149 msgid "email confirmations" msgstr "" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, python-format msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "" #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "" #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "" #: socialaccount/models.py:48 msgid "provider ID" msgstr "" #: socialaccount/models.py:52 msgid "name" msgstr "" #: socialaccount/models.py:54 msgid "client id" msgstr "" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:59 msgid "secret key" msgstr "" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:65 msgid "Key" msgstr "" #: socialaccount/models.py:77 msgid "social application" msgstr "" #: socialaccount/models.py:78 msgid "social applications" msgstr "" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "" #: socialaccount/models.py:116 msgid "date joined" msgstr "" #: socialaccount/models.py:117 msgid "extra data" msgstr "" #: socialaccount/models.py:121 msgid "social account" msgstr "" #: socialaccount/models.py:122 msgid "social accounts" msgstr "" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "" #: socialaccount/models.py:170 msgid "social application token" msgstr "" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "" #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "" #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "" #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "" #: templates/account/email.html:23 msgid "Verified" msgstr "" #: templates/account/email.html:27 msgid "Unverified" msgstr "" #: templates/account/email.html:32 msgid "Primary" msgstr "" #: templates/account/email.html:42 msgid "Make Primary" msgstr "" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "" #: templates/account/email.html:70 msgid "Add Email" msgstr "" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "" #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "" #: templates/account/email/unknown_account_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" #: templates/account/email_change.html:5 templates/account/email_change.html:9 msgid "Email Address" msgstr "" #: templates/account/email_change.html:14 msgid "The following email address is associated with your account:" msgstr "" #: templates/account/email_change.html:19 msgid "Your email address is still pending verification:" msgstr "" #: templates/account/email_change.html:38 msgid "Change Email Address" msgstr "" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 msgid "Change Email" msgstr "" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, python-format msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "" #: templates/account/email_confirm.html:35 #, python-format msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "" #: templates/account/login.html:12 #, python-format msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "" #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "" #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "" #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "" #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "" #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "" #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "" #: templates/account/password_reset.html:14 msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" #: templates/account/password_reset_done.html:16 msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "" #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 msgid "Confirm Access" msgstr "" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "" #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "" #: templates/account/snippets/already_logged_in.html:7 #, python-format msgid "You are already logged in as %(user_display)s." msgstr "" #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "" #: templates/account/snippets/warn_no_email.html:3 msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "" #: templates/account/verification_sent.html:12 msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" #: templates/account/verified_email_required.html:13 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" #: templates/account/verified_email_required.html:18 msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" #: templates/account/verified_email_required.html:23 #, python-format msgid "" "Note: you can still change your " "email address." msgstr "" #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "" #: templates/socialaccount/connections.html:13 msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "" #: templates/socialaccount/connections.html:48 msgid "Add a Third-Party Account" msgstr "" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "" #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "" #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" django-allauth-0.58.2/allauth/locale/es/000077500000000000000000000000001452212273200200005ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/es/LC_MESSAGES/000077500000000000000000000000001452212273200215655ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/es/LC_MESSAGES/django.po000066400000000000000000001156131452212273200233760ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2018-02-14 17:46-0600\n" "Last-Translator: Jannis Š\n" "Language-Team: Spanish (http://www.transifex.com/projects/p/django-allauth/" "language/es/)\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Este nombre de usuario no puede ser usado. Por favor utilice otro." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Demasiados intentos fallidos, inténtelo más tarde." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "" "Un usuario ya ha sido registrado con esta dirección de correo electrónico." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Contraseña actual" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "La contraseña necesita al menos {0} caracteres." #: account/apps.py:9 msgid "Accounts" msgstr "Cuentas" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Debe escribir la misma contraseña cada vez." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Contraseña" #: account/forms.py:94 msgid "Remember Me" msgstr "Recordarme" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Esta cuenta se encuentra ahora mismo desactivada." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "" "El correo electrónico y/o la contraseña que se especificaron no son " "correctos." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "El usuario y/o la contraseña que se especificaron no son correctos." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Correo electrónico" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "Correo electrónico" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Usuario" #: account/forms.py:134 msgid "Username or email" msgstr "Usuario o correo electrónico" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Iniciar sesión" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "¿Olvidó su contraseña?" #: account/forms.py:312 msgid "Email (again)" msgstr "Correo Electrónico (otra vez)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Confirmación de dirección de correo electrónico" #: account/forms.py:324 msgid "Email (optional)" msgstr "Correo Electrónico (opcional)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Debe escribir el mismo correo electrónico cada vez." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Contraseña (de nuevo)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Este correo electrónico ya está asociado con esta cuenta." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "No se pueden añadir más de %d direcciones de correo electrónico." #: account/forms.py:524 msgid "Current Password" msgstr "Contraseña actual" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Nueva contraseña" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Nueva contraseña (de nuevo)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Por favor, escriba su contraseña actual." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "El correo electrónico no está asignado a ninguna cuenta de usuario" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "El token para restablecer la contraseña no es válido" #: account/models.py:21 msgid "user" msgstr "usuario" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "correo electrónico" #: account/models.py:28 msgid "verified" msgstr "verificado" #: account/models.py:29 msgid "primary" msgstr "principal" #: account/models.py:35 msgid "email addresses" msgstr "correos electrónicos" #: account/models.py:141 msgid "created" msgstr "creado" #: account/models.py:142 msgid "sent" msgstr "enviado" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "clave" #: account/models.py:148 msgid "email confirmation" msgstr "confirmación de correo electrónico" #: account/models.py:149 msgid "email confirmations" msgstr "confirmaciones de correo electrónico" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Ya existe una cuenta asociada a esta dirección de correo electrónico. Por " "favor, primero identifíquese usando esa cuenta, y luego vincule su cuenta %s." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Su cuenta no tiene una contraseña definida." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Su cuenta no tiene un correo electrónico verificado." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Cuentas de redes sociales" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "proveedor" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "proveedor" #: socialaccount/models.py:52 msgid "name" msgstr "nombre" #: socialaccount/models.py:54 msgid "client id" msgstr "identificador cliente" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "Identificador de App o clave de consumidor" #: socialaccount/models.py:59 msgid "secret key" msgstr "clave secreta" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" "frase secreta de API, frase secreta cliente o frase secreta de consumidor" #: socialaccount/models.py:65 msgid "Key" msgstr "clave" #: socialaccount/models.py:77 msgid "social application" msgstr "aplicación de redes sociales" #: socialaccount/models.py:78 msgid "social applications" msgstr "aplicaciones de redes sociales" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "último inicio de sesión" #: socialaccount/models.py:116 msgid "date joined" msgstr "fecha de incorporación" #: socialaccount/models.py:117 msgid "extra data" msgstr "datos extra" #: socialaccount/models.py:121 msgid "social account" msgstr "cuenta de redes sociales" #: socialaccount/models.py:122 msgid "social accounts" msgstr "cuentas de redes sociales" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) o token de acceso (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "frase secreta de token" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) o token de refresco (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "expira el" #: socialaccount/models.py:170 msgid "social application token" msgstr "token de aplicación de redes sociales" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "tokens de aplicación de redes sociales" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Datos de perfil inválidos" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Respuesta inválida al obtener token de solicitud de \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Respuesta inválida al obtener token de acceso de \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "No hay token de solicitud guardado para \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "No hay token de acceso guardado para \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Sin acceso a recursos privados de \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Respuesta inválida al obtener token de solicitud de \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Cuenta desactivada" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Esta cuenta está desactivada." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Direcciones de correo electrónico" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "" "Las siguientes direcciones de correo electrónico están asociadas a su cuenta:" #: templates/account/email.html:23 msgid "Verified" msgstr "Verificado" #: templates/account/email.html:27 msgid "Unverified" msgstr "Sin verificar" #: templates/account/email.html:32 msgid "Primary" msgstr "Principal" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Definir como principal" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Reenviar Verificación" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Eliminar" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Añadir correo electrónico" #: templates/account/email.html:70 msgid "Add Email" msgstr "Añadir correo electrónico" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "" "¿Está seguro de querer eliminar la dirección de correo electrónico " "seleccionada?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "La cuenta ya existe" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "¡Hola de parte de %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "¡Gracias por usar %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Ha recibido este correo electrónico porque el usuario %(user_display)s ha " "proporcionado su dirección para registrar una cuenta en %(site_domain)s.\n" "\n" "Para confirmar que esto es correcto, siga este enlace %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Por favor, confirme su dirección de correo electrónico" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Está recibiendo este correo electrónico porque usted u otra persona ha " "solicitado una contraseña para su cuenta de usuario.\n" "Se puede ignorar de forma segura si no solicitó un restablecimiento de " "contraseña. Siga el siguiente enlace para restablecer su contraseña." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "En caso de haberlo olvidado, su usuario es %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Correo electrónico para restablecer contraseña" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Está recibiendo este correo electrónico porque usted u otra persona ha " "solicitado una contraseña para su cuenta de usuario.\n" "Se puede ignorar de forma segura si no solicitó un restablecimiento de " "contraseña. Siga el siguiente enlace para restablecer su contraseña." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Direcciones de correo electrónico" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "" "Las siguientes direcciones de correo electrónico están asociadas a su cuenta:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Su dirección principal de correo electrónico debe ser verificada." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Confirmar dirección de correo electrónico" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 msgid "Change Email" msgstr "Cambiar correo electrónico" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Confirmar dirección de correo electrónico" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Por favor confirme que %(email)s es una " "dirección de correo electrónico del usuario %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Confirmar" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Esta cuenta de red social ya ha sido asociada a otra cuenta." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Este enlace de verificación de correo ha expirado o es inválido. Por favor " "solicite una nueva verificación por correo " "electrónico.." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Iniciar sesión" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Si todavía no ha creado una cuenta, entonces por favor\n" "regístrese primero." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Cerrar sesión" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "¿Está seguro de querer cerrar sesión?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "No puede eliminar su correo electrónico principal (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Correo electrónico de confirmación enviado a %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Ha confirmado %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Correo electrónico %(email)s eliminado." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Ha iniciado sesión exitosamente como %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Ha cerrado sesión." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Contraseña cambiada con éxito." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Contraseña establecida con éxito." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Dirección principal de correo electrónico establecida." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Su dirección principal de correo electrónico debe ser verificada." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Cambiar Contraseña" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "¿Olvidó su contraseña?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Restablecer Contraseña" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "¿Ha olvidado su contraseña? Introduzca su correo electrónico y le enviaremos " "un correo que le permitirá restablecerla." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Restablecer mi contraseña" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Si tiene alguna dificultad para restablecer su contraseña, por favor " "contáctenos." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent you an e-mail. If you have not received it please check your " #| "spam folder. Otherwise contact us if you do not receive it in a few " #| "minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Le hemos enviado un correo electrónico. Si no lo ha recibido, por favor " "revise su carpeta de correo no deseado. En caso contrario, póngase en " "contacto con nosotros si no lo recibe en unos minutos." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Hay un problema con el token" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "El enlace para restablecer la contraseña es inválido, probablemente porque " "ya ha sido utilizado. Por favor solicite restablecer la contraseña de nuevo." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Su contraseña ha cambiado." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Establecer contraseña" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Confirmar dirección de correo electrónico" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registrarse" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Registrarse" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "¿Ya tiene una cuenta? Por favor inicie sesión." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Registro cerrado" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Lo sentimos, en este momento el registro está cerrado." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Nota" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "ya ha iniciado sesión como %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Advertencia:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Actualmente no tiene ninguna dirección de correo electrónico definida. " "Debería añadir una dirección de correo electrónico para poder recibir " "notificaciones, restablecer la contraseña, etc." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Verifique su dirección de correo electrónico" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. If you do not see the verification e-mail " #| "in your main inbox, check your spam folder. Please contact us if you do " #| "not receive the verification e-mail within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Le hemos enviado un correo electrónico para su verificación. Siga el enlace " "para completar el proceso de registro. Por favor contacte con nosotros si no " "lo recibe en unos minutos." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Esta parte del sitio web requiere que verifiquemos que es quien dice ser. " "Para este fin, le requerimos que verifique la propiedad de su correo " "electrónico. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside that e-mail. If you do not " #| "see the verification e-mail in your main inbox, check your spam folder. " #| "Otherwise\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Le hemos enviado un correo electrónico para su verificación. Por favor, siga " "el enlace de ese correo. Contacte con nosotros si no lo recibe en unos " "minutos." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Nota: todavía puede cambiar su " "dirección de correo electrónico." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "Menú:" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "frase secreta de token" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Error de inicio de sesión con red social" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Se produjo un error al intentar iniciar sesión a través de su cuenta de red " "social." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Conexiones de Cuenta" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Puede iniciar sesión con alguna de las siguientes cuentas externas:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Actualmente no tiene ninguna cuenta de red social asociada a esta cuenta." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Agregar una cuenta de una red social externa" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "Conectar %(provider)s" #: templates/socialaccount/login.html:13 #, fuzzy, python-format #| msgid "" #| "You are about to connect a new third party account from %(provider)s." msgid "You are about to connect a new third-party account from %(provider)s." msgstr "Está a punto de conectar una nueva cuenta externa desde %(provider)s" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "Inicie sesión mediante %(provider)s" #: templates/socialaccount/login.html:20 #, fuzzy, python-format #| msgid "" #| "You are about to sign in using a third party account from %(provider)s." msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" "Está a punto de iniciar sesión usando una cuenta externa desde %(provider)s" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "Continuar" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Inicio de sesión cancelado" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Ha decidido cancelar el inicio de sesión en nuestro sitio usando una de sus " "cuentas. Si ha sido un error, por favor acceda a inicie sesión." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "La cuenta de red social ha sido conectada." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Esta cuenta de red social ya ha sido asociada a otra cuenta." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "La cuenta de red social ha sido desconectada." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Está a punto de utilizar su cuenta de %(provider_name)s para acceder a " "%(site_name)s. Como paso final, por favor complete el siguiente formulario:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Por favor, inicie sesión con una\n" #~ "cuenta de otra red social. O regístrese \n" #~ "como usuario de %(site_name)s e inicie sesión a continuación:" #~ msgid "or" #~ msgstr "o" #~ msgid "change password" #~ msgstr "cambiar la contraseña" #~ msgid "OpenID Sign In" #~ msgstr "Iniciar sesión con OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Este correo electrónico ya está asociado con otra cuenta." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Le hemos enviado un correo electrónico. Por favor contáctenos si no lo " #~ "recibe en unos minutos." #~ msgid "Account" #~ msgstr "Cuenta" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "" #~ "El correo electrónico/usuario y/o la contraseña que especificó no son " #~ "correctos." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Los nombres de usuarios pueden contener solamente letras, números, y @/./" #~ "+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Este usuario ya está en uso. Por favor elije otro." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Iniciar sesión" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Has confirmado que %(email)s es una " #~ "dirección de correo electrónico del usuario %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "¡Gracias por utilizar nuestro sitio!" #~ msgid "Confirmation email sent to %(email)s" #~ msgstr "Correo de confirmación enviado a %(email)s" #~ msgid "Delete Password" #~ msgstr "Eliminar Contraseña" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "Puedes eliminar tu contraseña ya que ingresaste con OpenID." #~ msgid "delete my password" #~ msgstr "eliminar mi contraseña" #~ msgid "Password Deleted" #~ msgstr "Contraseña Eliminada" #~ msgid "Your password has been deleted." #~ msgstr "Tu contraseña fue eliminada." django-allauth-0.58.2/allauth/locale/eu/000077500000000000000000000000001452212273200200025ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/eu/LC_MESSAGES/000077500000000000000000000000001452212273200215675ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/eu/LC_MESSAGES/django.po000066400000000000000000001077071452212273200234050ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2018-08-29 08:16+0200\n" "Last-Translator: Eneko Illarramendi \n" "Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.1.1\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "" "Erabiltzaile izen hau ezin da erabili. Aukeratu beste erabiltzaile izen bat." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Huts egite gehiegi saioa hasterakoan. Saiatu berriro beranduago." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "" "Erabiltzaile batek kontu bat sortu du iada helbide elektroniko honekin." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Oraingo pasahitza" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Pasahitzak gutxienez {0} karaktere izan behar ditu." #: account/apps.py:9 msgid "Accounts" msgstr "Kontuak" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Pasahitz berdina idatzi behar duzu aldi bakoitzean." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Pasahitza" #: account/forms.py:94 msgid "Remember Me" msgstr "Gogora nazazue" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Kontu hau ez dago aktiboa orain." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Sartutako helbide elektronikoa eta/edo pasahitza ez dira zuzenak." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Sartutako erabiltzailea eta/edo pasahitza ez dira zuzenak." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Helbide elektronikoa" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "Emaila" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Erabiltzailea" #: account/forms.py:134 msgid "Username or email" msgstr "Erabiltzailea edo emaila" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Logina" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Pasahitza ahaztu duzu?" #: account/forms.py:312 msgid "Email (again)" msgstr "Emaila (berriro)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Helbide elektronikoaren egiaztapena" #: account/forms.py:324 msgid "Email (optional)" msgstr "Emaila (hautazkoa)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Email berdina idatzi behar duzu aldi bakoitzean." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Pasahitza (berriro)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Helbide elektroniko hau dagoeneko kontu honi lotuta dago." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "Ezin dituzu %d email helbide baino gehiago erabili." #: account/forms.py:524 msgid "Current Password" msgstr "Oraingo pasahitza" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Pasahitz berria" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Pasahitz berria (berriro)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Mesedez idatzi zure oraingo pasahitza." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Helbide elektroniko hau ez dago kontu bati lotuta" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Pasahitza berrezartzeko \"token\"-a baliogabea da." #: account/models.py:21 msgid "user" msgstr "erabiltzailea" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "helbide elektronikoa" #: account/models.py:28 msgid "verified" msgstr "egiaztatuta" #: account/models.py:29 msgid "primary" msgstr "nagusia" #: account/models.py:35 msgid "email addresses" msgstr "helbide elektronikoak" #: account/models.py:141 msgid "created" msgstr "sortuta" #: account/models.py:142 msgid "sent" msgstr "bidalita" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "giltza" #: account/models.py:148 msgid "email confirmation" msgstr "email egiaztapena" #: account/models.py:149 msgid "email confirmations" msgstr "email egiaztapenak" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Kontu bat sortu da iada helbide elektroniko honekin. Mesedez hasi saio berri " "bat kontu honekin eta gero zure %s kontua honi lotu." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Zure kontuak ez du pasahitzik zehaztuta." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Zure kontuak ez du egiaztatutako emailik." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Sare sozial kontuak" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "zerbitzua" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "zerbitzua" #: socialaccount/models.py:52 msgid "name" msgstr "izena" #: socialaccount/models.py:54 msgid "client id" msgstr "client id" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "Aplikazioaren ID-a, edo \"consumer key\"-a" #: socialaccount/models.py:59 msgid "secret key" msgstr "\"secret key\"-a" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "\"API secret\"-a, \"client secret\"-a edo \"consumer secret\"-a" #: socialaccount/models.py:65 msgid "Key" msgstr "Giltza" #: socialaccount/models.py:77 msgid "social application" msgstr "aplikazio soziala" #: socialaccount/models.py:78 msgid "social applications" msgstr "aplikazio sozialak" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "azken logina" #: socialaccount/models.py:116 msgid "date joined" msgstr "erregistro eguna" #: socialaccount/models.py:117 msgid "extra data" msgstr "datu gehigarriak" #: socialaccount/models.py:121 msgid "social account" msgstr "sare sozial kontua" #: socialaccount/models.py:122 msgid "social accounts" msgstr "sare sozial kontuak" #: socialaccount/models.py:156 msgid "token" msgstr "\"token\"-a" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\"-a (OAuth1) edo \"access token\"-a (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "\"token secret\"-a" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\"-a (OAuth1) edo \"refresh token\"-a (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "iraungitze data" #: socialaccount/models.py:170 msgid "social application token" msgstr "aplikazio sozial \"token\"-a" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "aplikazio sozial \"token\"-ak" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Profil datu baliogabeak" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Erantzun baliogabea \"%s\"-tik \"request token\"-a eskuratzean." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Erantzun baliogabea \"%s\"-tik \"access token\"-a eskuratzean." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Ez dago \"request token\"-ik gordeta \"%s\"-entzat." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Ez dago \"access token\"-ik gordeta \"%s\"-entzat." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Ez duzu baliabide pribatuetara sarbiderik: \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Erantzun baliogabea \"%s\"-tik \"request token\"-a eskuratzean." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Kontu ez aktiboa" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Kontu hau ez dago aktiboa." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Helbide elektronikoak" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Helbide elektroniko hauek zure kontuari lotuta daude:" #: templates/account/email.html:23 msgid "Verified" msgstr "Egiaztatuta" #: templates/account/email.html:27 msgid "Unverified" msgstr "Egiaztatu gabe" #: templates/account/email.html:32 msgid "Primary" msgstr "Nagusia" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Nagusia egin" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Egiaztapen emaila berbidali" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Ezabatu" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Helbide elektronikoa gehitu" #: templates/account/email.html:70 msgid "Add Email" msgstr "Emaila gehitu" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Ziur al zaude aukeratutako helbide elektronikoa ezabatu nahi duzula?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Kaixo %(site_name)s webgunetik!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Mila esker %(site_name)s webgunea erabiltzeagatik!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Email hau jaso duzu %(user_display)s erabiltzaileak zure helbide " "elektronikoa bere kontuarekin lotu nahi duelako %(site_domain)s orrialdean.\n" "\n" "Hau zuzena dela baieztatzeko, egin klik hemen: %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Mesedez egiaztatu zure helbide elektronikoa" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Email hau jaso duzu zuk edo beste norbaitek pasahitza berrezartzeko eskaera " "egin duelako zure kontuarentzat.\n" "Eskaera zuk egin ez baduzu mezu hau alde batera utzi dezakezu. Edo egin klik " "ondorengo estekan zure pasahitza berrezartzeko." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Ahaztu baduzu, zure erabiltzaile izena %(username)s da." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Pasahitza berrezartzeko emaila" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Email hau jaso duzu zuk edo beste norbaitek pasahitza berrezartzeko eskaera " "egin duelako zure kontuarentzat.\n" "Eskaera zuk egin ez baduzu mezu hau alde batera utzi dezakezu. Edo egin klik " "ondorengo estekan zure pasahitza berrezartzeko." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Helbide elektronikoak" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Helbide elektroniko hauek zure kontuari lotuta daude:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Zure email nagusiak egiaztatuta egon behar du." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Helbide elektronikoa egiaztatu" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "Emaila" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Helbide elektronikoa egiaztatu" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Mesedez egiaztatu %(email)s " "%(user_display)s erabiltzailearen helbide elektroniko bat dela." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Egiaztatu" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Sare sozial kontua dagoeneko beste kontu bati lotuta dago." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Egiaztapen esteka hau iraungirik dago edo baliogabea da. Mesedez eskatu egiaztapen email berri bat." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Saioa hasi" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Oraindik kontu bat sortu ez baduzu, mesedez\n" "sortu kontu bat lehenik." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Saioa amaitu" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Ziur al zaude saioa amaitu nahi duzula?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Ezin duzu zure helbide elektroniko nagusia ezabatu (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Egiaztapen emaila bidali da %(email)s helbidera." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "%(email)s emaila egiaztatu duzu." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "%(email)s helbide elektronikoa ezabatu da." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "%(name)s bezala hasi duzu saioa." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Saioa amaitu duzu." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Pasahitza behar bezala aldatu da." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Pasahitza behar bezala zehaztu da." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Helbide elektroniko nagusia zehaztu da." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Zure email nagusiak egiaztatuta egon behar du." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Pasahitza aldatu" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Pasahitza ahaztu duzu?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Pasahitza berrezarri" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Zure pasahitza ahaztu al duzu? Idatzi zure helbide elektronikoa hemen eta " "pasahitza berrezartzeko email bat bidaliko dizugu." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Nire pasahitza berrezarri" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Mesedez jarri gurekin kontaktuan zure pasahitza berrezartzeko arazorik " "baduzu." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Email bat bidali dizugu zure helbidea egiaztatzeko.\n" "Mesedez egin klik bertan aurkituko duzun estekan,\n" "edo jarri gurekin kontaktuan hurrengo minutuetan\n" "emailik jasotzen ez baduzu." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Token baliogabea" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Pasahitza berrezartzeko esteka baliogabea da, beharbada lehendik ere erabili " "delako. Mesedez eskatu pasahitza " "berrezartzeko email berri bat." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Zure pasahitza aldatuta dago orain." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Pasahitza zehaztu" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Helbide elektronikoa egiaztatu" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Kontua sortu" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Kontua sortu" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Lehendik kontu bat sortua duzu? Saioa hasi " "orduan." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Ezin da konturik sortu iada" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Sentitzen dugu baina ezin da kontu berririk sortu." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Oharra" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "lehendik saioa hasita duzu %(user_display)s bezala." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Adi:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Oraingoz ez duzu helbide elektronikorik zehaztu. Helbide elektroniko bat " "gehitu beharko zenuke notifikazioak jaso ahal izateko, pasahitza " "berrezartzeko, etab." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Zure helbide elektronikoa egiaztatu" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Email bat bidali dizugu zure helbidea egiaztatzeko. Mesedez egin klik bertan " "aurkituko duzun estekan kontua sortzeko prozesua amaitzeko, edo jarri " "gurekin kontaktuan hurrengo minutuetan emailik jasotzen ez baduzu." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Webguneko atal honek zuk diozuna zarela egiaztatzea\n" "eskatzen digu. Honetarako zure helbide elektronikoa\n" "egiaztatzea beharrezkoa da. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Email bat bidali dizugu zure helbidea egiaztatzeko.\n" "Mesedez egin klik bertan aurkituko duzun estekan,\n" "edo jarri gurekin kontaktuan hurrengo minutuetan\n" "emailik jasotzen ez baduzu." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Oharra: oraindik zure helbide " "elektronikoa aldatu dezakezu." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "\"token secret\"-a" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Arazoak sare sozialarekin logina egitean" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Arazoren bat izan da zure sare sozial kontua erabiltzen saioa hasteko " "ahaleginean." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Lotutako kontuak" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Ondorengo zerbitzu hauetako edozein erabili dezakezu zure kontuan sartzeko:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Oraingoz ez duzu sare sozial konturik lotu kontu honekin." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Sare sozial kontu bat gehitu" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Baliogabetutako logina" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Lotutako kontu batekin saioa hasteko saiakera bertan behera utzi duzu. " "Oharkabean gertatu bada, mesedez saioa hasi " "berriro." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Sare sozial kontua behar bezala lotu da." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Sare sozial kontua dagoeneko beste kontu bati lotuta dago." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Sare sozial kontu honekin lotura ezabatu da." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Zure %(provider_name)s kontua erabiltzear zaude %(site_name)s\n" "webgunean saioa hasteko. Azken pausu bezala, mesedez osa ezazu\n" "formulario hau:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Mesedez hasi saioa lotutako sare sozial kontu bat\n" #~ "erabiliz, edo sortu kontu bat\n" #~ "%(site_name)s webgunean eta saioa hasi hemen:" #~ msgid "or" #~ msgstr "edo" #~ msgid "change password" #~ msgstr "pasahitza aldatu" #~ msgid "OpenID Sign In" #~ msgstr "OpenID-rekin sartu" #~ msgid "This email address is already associated with another account." #~ msgstr "Helbide elektroniko hau dagoeneko beste kontu bati lotuta dago." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Email bat bidali dizugu. Mesedez jarri gurekin kontaktuan hurrengo " #~ "minutuetan jasotzen ez baduzu." #~ msgid "Account" #~ msgstr "Kontua" django-allauth-0.58.2/allauth/locale/fa/000077500000000000000000000000001452212273200177575ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/fa/LC_MESSAGES/000077500000000000000000000000001452212273200215445ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/fa/LC_MESSAGES/django.po000066400000000000000000001202241452212273200233470ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2020-06-14 17:00-0000\n" "Last-Translator: Mohammad Ali Amini \n" "Language-Team: \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.7.4\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "نام‌کاربری قابل استفاده نیست. لطفا نام‌کاربری دیگری استفاده کن." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "خیلی زیاد تلاش ناموفق کردی، لطفا بعدا ازنو سعی کن." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "یک کاربر ازقبل با این نشانی رایانامه ثبت شده." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "گذرواژه کنونی" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "گذرواژه باید حداقل {0} کاراکتر باشد." #: account/apps.py:9 #, fuzzy msgid "Accounts" msgstr "حساب‌ها" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "هربار باید گذرواژه‌ی یکسانی وارد کنی." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "گذرواژه" #: account/forms.py:94 msgid "Remember Me" msgstr "مرا به یادآور" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "اکنون این حساب غیرفعال است." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "نشانی رایانامه یا گذرواژه نادرست است." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "نام‌کاربری یا گذرواژه نادرست است." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "نشانی رایانامه" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "رایانامه" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "نام‌کاربری" #: account/forms.py:134 msgid "Username or email" msgstr "نام‌کاربری ویا رایانامه" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "ورود" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "گذرواژه‌ات را فراموش کرده‌ای؟" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "رایانامه (ازنو)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "تاییدیه‌ی نشانی رایانامه" #: account/forms.py:324 msgid "Email (optional)" msgstr "رایانامه (اختیاری)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "هربار باید رایانامه‌ی یکسانی وارد کنی." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "گذرواژه (ازنو)" #: account/forms.py:484 #, fuzzy #| msgid "This email address is already associated with another account." msgid "This email address is already associated with this account." msgstr "این نشانی رایانامه ازقبل به این حساب وصل شده." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "حساب‌ات هیچ رایانامه‌ي تایید‌شده‌ای ندارد." #: account/forms.py:524 msgid "Current Password" msgstr "گذرواژه کنونی" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "گذرواژه جدید" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "گذرواژه جدید (ازنو)" #: account/forms.py:538 msgid "Please type your current password." msgstr "لطفا گذرواژه کنونی‌‌ات را وارد کن." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "این نشانی رایانامه به هیچ حساب کاربری‌ای منتسب نشده." #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "توکن بازنشانی گذرواژه نامعتبر است." #: account/models.py:21 msgid "user" msgstr "کاربر" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "نشانی رایانامه" #: account/models.py:28 msgid "verified" msgstr "تاییدشده" #: account/models.py:29 msgid "primary" msgstr "اصلی" #: account/models.py:35 msgid "email addresses" msgstr "نشانی‌های رایانامه" #: account/models.py:141 msgid "created" msgstr "ایجاد‌شده" #: account/models.py:142 msgid "sent" msgstr "ارسال شد" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "کلید" #: account/models.py:148 msgid "email confirmation" msgstr "تاییدیه‌ی رایانامه" #: account/models.py:149 msgid "email confirmations" msgstr "تاییدیه‌های رایانامه" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "یه حساب‌کاربری با این نشانی رایانامه وجود دارد. لطفا نخست وارد آن شو، سپس " "حساب %s ات را بهش وصل کن." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "هیچ گذرواژه‌ای برای حساب‌ات نهاده نشده." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "حساب‌ات هیچ رایانامه‌ي تایید‌شده‌ای ندارد." #: socialaccount/apps.py:7 #, fuzzy msgid "Social Accounts" msgstr "حساب‌های اجتماعی" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "فراهم‌کننده" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "فراهم‌کننده" #: socialaccount/models.py:52 #, fuzzy msgid "name" msgstr "نام" #: socialaccount/models.py:54 msgid "client id" msgstr "شناسه مشتری" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "شناسه اپ، یا کلید مصرف‌کننده" #: socialaccount/models.py:59 msgid "secret key" msgstr "کلید محرمانه" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "رمز رابک (رابط برنامه‌ی کاربردی API)، رمز مشتری، یا رمز مصرف‌کننده" #: socialaccount/models.py:65 #, fuzzy msgid "Key" msgstr "کلید" #: socialaccount/models.py:77 msgid "social application" msgstr "اپلیکیشن اجتماعی" #: socialaccount/models.py:78 msgid "social applications" msgstr "اپلیکیشن‌های اجتماعی" #: socialaccount/models.py:113 msgid "uid" msgstr "شناسه‌کاربری" #: socialaccount/models.py:115 msgid "last login" msgstr "آخرین ورود" #: socialaccount/models.py:116 msgid "date joined" msgstr "تاریخ پیوست‌شده" #: socialaccount/models.py:117 msgid "extra data" msgstr "داده اضافی" #: socialaccount/models.py:121 msgid "social account" msgstr "حساب اجتماعی" #: socialaccount/models.py:122 msgid "social accounts" msgstr "حساب‌های اجتماعی" #: socialaccount/models.py:156 msgid "token" msgstr "توکن" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) یا توکن دسترسی (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "رمز توکن" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) یا توکن تازه‌سازی (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "انقضا" #: socialaccount/models.py:170 msgid "social application token" msgstr "توکن اپلیکشن اجتماعی" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "توکن‌های اپلیکیشن اجتماعی" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "داده نامعتبر نمایه" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "پاسخ نامعتبر هنگام دریافت توکن درخواست از \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "پاسخ نامعتبر هنگام دریافت توکن دسترسی از \"%s\"" #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "توکن درخواست‌ْای برای \"%s\" ذخیره نشده." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "توکن دسترسی‌ای برای \"%s\" ذخیره نشده." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "دسترسی به منابع خصوصی \"%s\" وجود ندارد." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "پاسخ نامعتبر هنگام دریافت توکن درخواست از \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "حساب غیرفعال" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "این حساب‌کاربری غیرفعال است." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "نشانی‌های رایانامه" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "نشانی‌های رایانامه زیر به حساب‌ات متصل شده‌اند:" #: templates/account/email.html:23 msgid "Verified" msgstr "تایید‌شده" #: templates/account/email.html:27 msgid "Unverified" msgstr "تایید‌نشده" #: templates/account/email.html:32 msgid "Primary" msgstr "اصلی" #: templates/account/email.html:42 msgid "Make Primary" msgstr "اصلی کردن" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "بازارسال تاییدیه" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "حذف" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "افزودن نشانی رایانامه" #: templates/account/email.html:70 msgid "Add Email" msgstr "افزودن رایانامه" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "واقعا می‌خواهی نشانی رایانامه‌ی انتخاب‌شده را حذف کنی؟" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "سپاسگزارت %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "سپاس‌گزاریم برای استفاده از %(site_name)s.\n" "‏%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s at " #| "%(site_domain)s has given yours as an e-mail address to connect their " #| "account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "سلام،\n" "\n" "این رایانامه را دریافت کردی چون کاربر %(user_display)s نشانی رایانامه‌ات را " "برای اتصال به حساب‌اش در %(site_name)s داده.\n" "\n" "برای تایید درستی این به ‌%(activate_url)s برو.\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm Email Address" msgid "Please Confirm Your Email Address" msgstr "تایید نشانی رایانامه" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "سلام،\n" "\n" "این رایانامه را دریافت کرده‌ای چون برای حساب کاربری‌ات در %(site_name)s، از " "جانب خودت یا کسی دیگر، یه گذرواژه درخواست شده.\n" "برای بازنشانی گذرواژه پیوند زیر را دنبال کن. وگرنه چشم‌پوشی از این هنگامی که " "خودت هم درخواست نکردی می‌تواند امن باشد." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "در صورت فراموشی، نام‌کاربری‌ات %(username)s است." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "رایانامه‌ی بازنشانی گذرواژه" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "سلام،\n" "\n" "این رایانامه را دریافت کرده‌ای چون برای حساب کاربری‌ات در %(site_name)s، از " "جانب خودت یا کسی دیگر، یه گذرواژه درخواست شده.\n" "برای بازنشانی گذرواژه پیوند زیر را دنبال کن. وگرنه چشم‌پوشی از این هنگامی که " "خودت هم درخواست نکردی می‌تواند امن باشد." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "نشانی‌های رایانامه" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "نشانی‌های رایانامه زیر به حساب‌ات متصل شده‌اند:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "نشانی رایانامه‌ی اصلی‌ات باید تاییدشده باشد." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "تایید نشانی رایانامه" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "رایانامه" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "تایید نشانی رایانامه" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "لطفا تایید کن که %(email)s یه نشانی " "رایانامه برای کاربر %(user_display)s است." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "تایید" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "حساب اجتماعی‌اِ به یه حساب دیگر متصل شده." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "این پیوند تاییدیه رایانامه باطل‌شده ویا نامعتبر است. لطفا یه تاییدیه جدید رایانامه درخواست کن." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "ورود" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "اگر هنوز یه حساب نساختی، پس لطفا نخست ثبت‌نام " "کن." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "خروج" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "مطمئنی می‌خواهی خارج شوی؟" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "نمی‌توانی نشانی رایانامه‌ی اصلی‌ات (%(email)s) را حذف کنی." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "رایانامه‌ی تاییدیه به %(email)s فرستاده شد." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "نشانی رایانامه‌ %(email)s را تایید کرده‌ای." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "نشانی رایانامه %(email)s حذف شد." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "با %(name)s باموفقیت وارد شدی." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "خارج شده‌ای." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "گذرواژه باموفقیت تغییر کرد." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "گذرواژه باموفقیت نهاده شد." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "نشانی رانامه اصلی نهاده شد." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "نشانی رایانامه‌ی اصلی‌ات باید تاییدشده باشد." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "تغییر گذرواژه" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "گذرواژه‌ات را فراموش کرده‌ای؟" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "بازنشانی گذرواژه" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "گذرواژه‌ات را فراموش کرده‌ای؟ نشانی رایانامه‌ات را در زیر درج کن؛ ما رایانامه‌ی " "بازنشانی گذرواژه را برایت خواهیم فرستاد." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "درخواست بازنشانی" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "اگر مشکلی در بازنشانی گذرواژه‌ات داری، لطفا با ما تماس بگیر." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "ما یه رایانامه تاییدیه بهت فرستادیم؛ لطفا روی پیوند درونش کلیک کن. اگر تا " "دقایقی دیگر دریافتش نکردی با ما تماس بگیر." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "توکن نادرست" #: templates/account/password_reset_from_key.html:18 #, fuzzy, python-format #| msgid "" #| "The password reset link was invalid, possibly because it has already been " #| "used. Please request a new password " #| "reset." msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "پیوند بازنشانی گذرواژه نادرست است؛ شاید قبلا استفاده شده. لطفا یه بازنشان جدید گذرواژهدرخواست کن." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "گذرواژه‌ات اکنون تغییر کرد." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "نهادن گذرواژه" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "تایید نشانی رایانامه" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "ثبت‌نام" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "ثبت نام" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "ازقبل یه حساب داری؟ پس لطفا ورود کن." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "توقف ثبت‌نام" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "متاسفیم، ولی اکنون ثبت‌نام متوقف شده." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "توجه" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "ازقبل با %(user_display)s وارد شده‌ای." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "هشدار:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "اکنون هیچ نشانی رایانامه‌ی نهادیده‌ای نداری. درواقع باید یه نشانی رایانامه " "بافزایی تا بتوانی اعلان‌ها، بازنشان گذرواژه و غیره را دریافت کنی." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "تایید نشانی رایانامه" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "یه رایانامه تاییدیه بهت فرستادیم. پیوند درونش را برای کامل کردن فرایند " "ثبت‌نام دنبال کن. اگر تا چند دقیقه‌ی دیگر دریافتش نکردی، لطفا با ما تماس بگیر." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "این بخش از سایت نیاز دارد تایید کنیم شما کسی که ادعا کرده‌‌ای هستی.برای همین، " "نیازد داریم مالکیتت بر نشانی رایانامه‌ات را تایید کنی." #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "ما یه رایانامه تاییدیه بهت فرستادیم؛ لطفا روی پیوند درونش کلیک کن. اگر تا " "دقایقی دیگر دریافتش نکردی با ما تماس بگیر." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "توجه: هنوز می‌توانی تعویض نشانی " "رایانامه کنی." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "رمز توکن" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "ناموفق در ورود با شبکه اجتماعی" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "یه خطا هنگام سعی برای ورود با حساب شبکه‌ی اجتماعی‌ات رخ داد." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "اتصال‌های حساب" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "با هریک از حساب‌های شخص سوم زیر می‌توانی به حساب‌ات وارد شوی:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "اکنون هیچ حساب شبکه‌ی اجتماعی‌ای به این حساب متصل نشده." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "افزودن یه حساب سوم شخص" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "لغو ورود" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "ورودت به سایت‌مان با یکی از حساب‌هایت را لغو کردی. اگر اشتباهی شده، لطفا اقدام " "به ورود کن." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "حساب اجتماعی‌اِ متصل شد." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "حساب اجتماعی‌اِ به یه حساب دیگر متصل شده." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "حساب اجتماعی‌اِ قطع‌ارتباط شد." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "چند قدمی ورود به %(site_name)s با حساب‌ات %(provider_name)s هستی. در گام آخر، " "لطفا فرم زیر را کامل کن:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "لطفا با یکی از حساب‌های شخص سوم موجودت وارد شو. یا در %(site_name)sثبت‌نام کن و از زیر وارد شو:" #~ msgid "or" #~ msgstr "یا" #~ msgid "change password" #~ msgstr "تغییر گذرواژه" #~ msgid "OpenID Sign In" #~ msgstr "ورودبا OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "این نشانی رایانامه ازقبل به حساب دیگری وصل شده." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "بهت یه رایانامه فرستادیم. اگر تا چند دقیقه‌ی دیگر دریافتش نکردی باهامون " #~ "تماس بگیر." #~ msgid "Account" #~ msgstr "حساب" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "اطلاعات داده شده درست نیست." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "نام‌کاربری تنها می‌تواند شامل حروف، اعداد، و @/./+/-/_. باشد" #~ msgid "This username is already taken. Please choose another." #~ msgstr "این نام‌کاربری قبلا گرفته شده. لطفا یکی دیگر انتخاب کن." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "ورود با Shopify" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "تایید کرده‌ای که %(email)s یه نشانی " #~ "رایانامه برای کاربر %(user_display)s است." django-allauth-0.58.2/allauth/locale/fi/000077500000000000000000000000001452212273200177675ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/fi/LC_MESSAGES/000077500000000000000000000000001452212273200215545ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/fi/LC_MESSAGES/django.po000066400000000000000000001107371452212273200233670ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2020-10-15 19:56+0200\n" "Last-Translator: Anonymous User \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Translated-Using: django-rosetta 0.7.6\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Käyttäjänimeä ei voi käyttää. Valitse toinen käyttäjänimi." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "" "Liian monta virheellistä kirjautumisyritystä. Yritä myöhemmin uudelleen." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Tämä sähköpostiosoite on jo käytössä." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Nykyinen salasana" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Salasanan tulee olla vähintään {0} merkkiä pitkä." #: account/apps.py:9 msgid "Accounts" msgstr "Tili" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Salasanojen tulee olla samat." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Salasana" #: account/forms.py:94 msgid "Remember Me" msgstr "Muista minut" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Tämä tili on poistettu käytöstä." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Annettu sähköposti tai salasana ei ole oikein." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Annettu käyttäjänimi tai salasana ei ole oikein." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Sähköpostiosoite" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "Sähköposti" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Käyttäjänimi" #: account/forms.py:134 msgid "Username or email" msgstr "Käyttäjänimi tai sähköposti" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Käyttäjätunnus" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Salasana unohtunut?" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "Sähköpostiosoite (valinnainen)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "sähköpostivarmistus" #: account/forms.py:324 msgid "Email (optional)" msgstr "Sähköpostiosoite (valinnainen)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Salasanojen tulee olla samat." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Salasana (uudestaan)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Sähköpostiosoite on jo liitetty tähän tilliin." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Tiliisi ei ole liitetty vahvistettua sähköpostiosoitetta." #: account/forms.py:524 msgid "Current Password" msgstr "Nykyinen salasana" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Uusi salasana" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Uusi salasana (uudestaan)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Ole hyvä ja anna nykyinen salasanasi." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Sähköpostiosoite ei vastaa yhtäkään käyttäjätiliä." #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Salasanan uusimistarkiste ei kelpaa." #: account/models.py:21 msgid "user" msgstr "käyttäjä" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "sähköpostiosoite" #: account/models.py:28 msgid "verified" msgstr "vahvistettu" #: account/models.py:29 msgid "primary" msgstr "ensisijainen" #: account/models.py:35 msgid "email addresses" msgstr "sähköpostiosoitteet" #: account/models.py:141 msgid "created" msgstr "luotu" #: account/models.py:142 msgid "sent" msgstr "lähetetty" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "avain" #: account/models.py:148 msgid "email confirmation" msgstr "sähköpostivarmistus" #: account/models.py:149 msgid "email confirmations" msgstr "sähköpostivarmistukset" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Sähköpostiosoite on jo liitetty olemassaolevaan tiliin. Kirjaudu ensin " "kyseiseen tiliin ja liitä %s-tilisi vasta sitten." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Tilillesi ei ole asetettu salasanaa." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Tiliisi ei ole liitetty vahvistettua sähköpostiosoitetta." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Sosiaalisen median tilit" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "tarjoaja" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "tarjoaja" #: socialaccount/models.py:52 msgid "name" msgstr "nimi" #: socialaccount/models.py:54 msgid "client id" msgstr "asiakas id" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "Sovellus ID tai kuluttajan avain" #: socialaccount/models.py:59 msgid "secret key" msgstr "salainen avain" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "API:n, asiakkaan tai kuluttajan salaisuus" #: socialaccount/models.py:65 msgid "Key" msgstr "Avain" #: socialaccount/models.py:77 msgid "social application" msgstr "sosiaalinen applikaatio" #: socialaccount/models.py:78 msgid "social applications" msgstr "sosiaaliset applikaatiot" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "viimeisin sisäänkirjautuminen" #: socialaccount/models.py:116 msgid "date joined" msgstr "liittymispäivämäärä" #: socialaccount/models.py:117 msgid "extra data" msgstr "lisätiedot" #: socialaccount/models.py:121 msgid "social account" msgstr "sosiaalisen median tili" #: socialaccount/models.py:122 msgid "social accounts" msgstr "sosiaalisen median tilit" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "vanhenee" #: socialaccount/models.py:170 msgid "social application token" msgstr "" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Virheellinen vastaus palvelusta \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Virhe hankittaessa käyttöoikeustunnistetta palvelusta \"%s\"" #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "" #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Virheellinen vastaus palvelusta \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Tili poissa käytöstä" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Tämä tili ei ole käytössä." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Sähköpostiosoitteet" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Seuraavat sähköpostiosoitteet on liitetty tiliisi:" #: templates/account/email.html:23 msgid "Verified" msgstr "Vahvistettu" #: templates/account/email.html:27 msgid "Unverified" msgstr "Vahvistamaton" #: templates/account/email.html:32 msgid "Primary" msgstr "Ensisijainen" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Aseta ensisijaiseksi" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Lähetä vahvistus uudelleen" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Poista" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Lisää sähköpostiosoite" #: templates/account/email.html:70 msgid "Add Email" msgstr "Lisää sähköposti" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Haluatko varmasti poistaa valitun sähköpostiosoitteen?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Terve palvelusta %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Kiitos, kun käytät %(site_name)s palvelua!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Sait tämän viestin, koska käyttäjä %(user_display)s palvelusta " "%(site_domain)s antoi sähköpostiosoitteesi liitettäväksi tiliinsä.\n" "\n" "Vahvistaaksesi tiedot oikeiksi mene osoitteeseen %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Vahvista sähköpostiosoitteesi" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Sait tämän sähköpostin, koska sinä tai joku muu on pyytänyt salasasi " "uusimista palvelussa %(site_domain)s.\n" "Tämän viestin voi jättää huomiotta, jos et pyytänyt salasanan uusimista. " "Klikkaa alla olevaa linkkiä uusiaksesi salasanasi." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Muistathan, että käyttäjätunnuksesi on %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Salasanan uusimissähköposti" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Sait tämän sähköpostin, koska sinä tai joku muu on pyytänyt salasasi " "uusimista palvelussa %(site_domain)s.\n" "Tämän viestin voi jättää huomiotta, jos et pyytänyt salasanan uusimista. " "Klikkaa alla olevaa linkkiä uusiaksesi salasanasi." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Sähköpostiosoitteet" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Seuraavat sähköpostiosoitteet on liitetty tiliisi:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Ensisijaisen sähköpostiosoiteen tulee olla vahvistettu." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Vahvista sähköpostiosoite" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "Sähköposti" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Vahvista sähköpostiosoite" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Vahvista, että %(email)s on käyttäjän " "%(user_display)s sähköpostiosoite." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Vahvista" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Sosiaalisen median tili on jo liitetty toiseen tiliin." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Tämä sähköpostiosoitteen vahvistuslinkki on vanhentunut tai muuten " "käyttökelvoton. Voit kuitenkin pyytää uuden " "vahvistuslinkin sähköpostiosoitteellesi." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Kirjaudu sisään" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Jos et ole luonut vielä tiliä, niin rekisteröidy ensin." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Kirjaudu ulos" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Haluatko varmasti kirjautua ulos?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Et voi poistaa ensisijaista sähköpostiosoitettasi (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Vahvistusviesti on lähetetty osoitteeseen %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Sähköpostiosoite %(email)s on vahvistettu." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Poistettiin sähköpostiosoite %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Kirjauduttiin sisään käyttäjänä %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Kirjauduit ulos." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Salasana vaihto onnistui." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Salasana asetettiin." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Ensisijainen sähköpostiosoite asetettiin." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Ensisijaisen sähköpostiosoiteen tulee olla vahvistettu." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Vaihda salasana" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Salasana unohtunut?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Salasanan uusiminen" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Unohditko salasanasi? Anna sähköpostiosoitteesi ja lähetämme sinulle " "sähköpostin, jonka avulla voit uusia sen." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Salasanan uusiminen" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "Ota meihin yhteyttä, jos sinulla on ongelmia salasanasi uusimisessa." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Olemme lähettäneet sinulle sähköpostivahvistuksen. Klikkaa sähköpostissa " "olevaa linkkiä vahvistaaksesi sähköpostiosoitteesi. Ota meihin yhteyttä, jos " "et saanut vahvistusviestiä muutaman minuutin sisällä." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Virheellinen tunniste" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Salasanan uusimislinkki ei toiminut. Tämä voi tapahtua, jos linkki on jo " "käytetty. Voit kuitenkin uusia salasanan " "uusimisen." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Salasanasi on nyt vaihdettu." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Aseta salasana" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Vahvista sähköpostiosoite" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Rekisteröidy" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Rekisteröidy" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Onko sinulla jo tili? Kirjaudu sisään." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Rekisteröityminen on poissa käytöstä." #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Valitettavasti rekisteröityminen on pois käytöstä." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Huomio" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "olet jo kirjautunut käyttäjänä %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Varoitus:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Et ole asettanut sähköpostiosoitetta. Tämä tulisi tehdä, jotta voit saada " "ilmoituksia, uusia salasanasi jne." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Vahvista sähköpostiosoitteesi" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Lähetimme sinulle sähköpostin vahvistusviestin. Klikkaa sähköpostissa olevaa " "linkkiä viimeistelläksesi rekisteröitymisprosessin. Ota meihin yhteyttä, jos " "et saanut vahvistusviestiä muutaman minuutin sisällä." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Tämä osa palvelua vaatii, että tiedämme kuka olet. Tämän takia sinun pitää " "vahvistaa omistavasi ilmoittamasi sähköpostiosoite." #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Olemme lähettäneet sinulle sähköpostivahvistuksen. Klikkaa sähköpostissa " "olevaa linkkiä vahvistaaksesi sähköpostiosoitteesi. Ota meihin yhteyttä, jos " "et saanut vahvistusviestiä muutaman minuutin sisällä." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Huomio: voit edelleen vaihtaa " "sähköpostiosoitteesi." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Sosiaalisen median tilillä kirjautuminen epäonnistui" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Tapahtui virhe yritettäessä kirjautua käyttäen sosiaalisen median tiliä." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Liitetyt tilit" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Voit kirjautua käyttäen seuraavia kirjautumispalveluita:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Tiliisi ei ole liitetty yhtäkään sosiaalisen median tiliä." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Lisää kolmannen osapuolen tili" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Sisäänkirjautuminen keskeytettiin" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Keskeytit sisäänkirjautumisen olemassaolevalle tilillesi. Jos tämä oli " "vahinko niin kirjaudu sisään." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Sosiaalisen median tili liitettiin." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Sosiaalisen median tili on jo liitetty toiseen tiliin." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Sosiaalisen median tili on poistettu käytöstä." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Olet aikeissa käyttää %(provider_name)s-tiliäsi kirjautuaksesi palveluun\n" "%(site_name)s. Täytä vielä seuraava lomake:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Kirjaudu sisään käyttäen kirjautumispalvelua tai rekisteröi %(site_name)s-tili ja kirjaudu sisään alla olevalla " #~ "lomakkeella:" #~ msgid "or" #~ msgstr "tai" #~ msgid "change password" #~ msgstr "vaihda salasanaa" #~ msgid "OpenID Sign In" #~ msgstr "OpenID kirjautuminen" #~ msgid "This email address is already associated with another account." #~ msgstr "Sähköpostiosoite on jo liitetty toiseen tiliin." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Olemme lähettäneet sinulle sähköpostia. Ota meihin yhteyttä, jos et saa " #~ "sitä muutaman minuutin sisällä." #~ msgid "Account" #~ msgstr "Tili" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Kirjautumistiedot eivät ole oikein." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Käyttäjänimi saa sisältää vain kirjaimia, numeroita ja erikoismerkkejä " #~ "@/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Käyttäjänimi on käytössä. Valitse toinen käyttäjänimi." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Kirjaudu sisään" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Olet vahvistanut, että %(email)s on " #~ "sähköpostiosoite käyttäjälle %(user_display)s." django-allauth-0.58.2/allauth/locale/fr/000077500000000000000000000000001452212273200200005ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/fr/LC_MESSAGES/000077500000000000000000000000001452212273200215655ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/fr/LC_MESSAGES/django.po000066400000000000000000001113101452212273200233640ustar00rootroot00000000000000# DJANGO-ALLAUTH. # Copyright (C) 2016 # This file is distributed under the same license as the django-allauth package. # # Translators: # Steve Kossouho , 2016. # Gilou , 2019 # msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2023-11-03 11:15+0100\n" "Last-Translator: Gilou \n" "Language-Team: français <>\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Ce pseudonyme ne peut pas être utilisé. Veuillez en choisir un autre." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "" "Trop de tentatives de connexion échouées. Veuillez réessayer ultérieurement." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Un autre utilisateur utilise déjà cette adresse e-mail." #: account/adapter.py:60 msgid "Incorrect password." msgstr "Mot de passe incorrect." #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Le mot de passe doit contenir au minimum {0} caractères." #: account/apps.py:9 msgid "Accounts" msgstr "Comptes" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Vous devez saisir deux fois le même mot de passe." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Mot de passe" #: account/forms.py:94 msgid "Remember Me" msgstr "Se souvenir de moi" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Ce compte est actuellement désactivé." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "L’adresse email ou le mot de passe sont incorrects." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Le pseudo ou le mot de passe sont incorrects." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Adresse email" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "Email" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Pseudonyme" #: account/forms.py:134 msgid "Username or email" msgstr "Pseudonyme ou email" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Identifiant" #: account/forms.py:148 msgid "Forgot your password?" msgstr "Mot de passe oublié ?" #: account/forms.py:312 msgid "Email (again)" msgstr "Email (confirmation)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Confirmation d'adresse email" #: account/forms.py:324 msgid "Email (optional)" msgstr "Email (facultatif)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Vous devez saisir deux fois le même email." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Mot de passe (confirmation)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "L'adresse email est déjà associée à votre compte." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "Vous ne pouvez pas ajouter plus de %d adresses e-mail." #: account/forms.py:524 msgid "Current Password" msgstr "Mot de passe actuel" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Nouveau mot de passe" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Nouveau mot de passe (confirmation)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Merci d'indiquer votre mot de passe actuel." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Cette adresse email n'est pas associée à un compte utilisateur" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Le jeton de réinitialisation de mot de passe est invalide." #: account/models.py:21 msgid "user" msgstr "utilisateur" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "adresse email" #: account/models.py:28 msgid "verified" msgstr "vérifié" #: account/models.py:29 msgid "primary" msgstr "principale" #: account/models.py:35 msgid "email addresses" msgstr "adresses email" #: account/models.py:141 msgid "created" msgstr "créé" #: account/models.py:142 msgid "sent" msgstr "envoyé" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "clé" #: account/models.py:148 msgid "email confirmation" msgstr "confirmation par email" #: account/models.py:149 msgid "email confirmations" msgstr "confirmations par email" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "Vous ne pouvez pas activer l'authentification à deux facteurs tant que vous n'avez pas vérifié votre adresse e-mail." #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "Vous ne pouvez pas ajouter une adresse e-mail à un compte protégé par l'authentification à deux facteurs." #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "Code incorrect." #: mfa/apps.py:7 msgid "MFA" msgstr "MFA" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "Code" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "Code de l'authentificateur" #: mfa/models.py:15 msgid "Recovery codes" msgstr "Codes de récupération" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "Authentificateur TOTP" #: socialaccount/adapter.py:32 #, python-format msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Un compte existe déjà avec cette adresse email. Merci de vous connecter au " "préalable avec ce compte, et ensuite connecter votre compte %s." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Vous devez d'abord définir le mot de passe de votre compte." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Vous devez d'abord associer une adresse email à votre compte." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Comptes sociaux" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "fournisseur" #: socialaccount/models.py:48 msgid "provider ID" msgstr "ID du fournisseur" #: socialaccount/models.py:52 msgid "name" msgstr "nom" #: socialaccount/models.py:54 msgid "client id" msgstr "id client" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "ID de l'app ou clé de l'utilisateur" #: socialaccount/models.py:59 msgid "secret key" msgstr "clé secrète" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "Secret de l'API, secret du client, ou secret de l'utilisateur" #: socialaccount/models.py:65 msgid "Key" msgstr "Clé" #: socialaccount/models.py:77 msgid "social application" msgstr "application sociale" #: socialaccount/models.py:78 msgid "social applications" msgstr "applications sociales" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "dernière identification" #: socialaccount/models.py:116 msgid "date joined" msgstr "date d'inscription" #: socialaccount/models.py:117 msgid "extra data" msgstr "données supplémentaires" #: socialaccount/models.py:121 msgid "social account" msgstr "compte social" #: socialaccount/models.py:122 msgid "social accounts" msgstr "comptes sociaux" #: socialaccount/models.py:156 msgid "token" msgstr "jeton" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) ou jeton d'accès (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "jeton secret" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) ou jeton d'actualisation (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "expire le" #: socialaccount/models.py:170 msgid "social application token" msgstr "jeton de l'application sociale" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "jetons de l'application sociale" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Données de profil incorrectes" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Réponse invalide lors de l'obtention du jeton de requête de \"%s\". La réponse était : %s." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Réponse invalide lors de l'obtention du jeton d'accès depuis \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Aucun jeton de requête sauvegardé pour \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Aucun jeton d'accès sauvegardé pour \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Impossible d'accéder aux ressources privées de \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Réponse invalide lors de l'obtention du jeton de requête de \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Compte inactif" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Ce compte est inactif." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Adresses email" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Les adresses email suivantes sont associées à votre compte :" #: templates/account/email.html:23 msgid "Verified" msgstr "Vérifiée" #: templates/account/email.html:27 msgid "Unverified" msgstr "Non vérifiée" #: templates/account/email.html:32 msgid "Primary" msgstr "Principale" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Rendre Principale" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Renvoyer le message de vérification" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Retirer" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Ajouter une adresse email" #: templates/account/email.html:70 msgid "Add Email" msgstr "Ajouter un email" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Voulez-vous vraiment retirer cette adresse email ?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" "Vous recevez cet email car vous ou quelqu'un d'autre a demandé à créer\n" "un compte en utilisant cette adresse email :\n" "\n" "%(email)s\n" "\n" "Cependant, un compte utilisant cette adresse existe déjà. Au cas où vous " "auriez\n" "oublié, merci d'utiliser la fonction de récupération de mot de passe pour\n" "récupérer votre compte :\n" "\n" "%(password_reset_url)s" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "Ce compte existe déjà" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Bonjour, c'est %(site_name)s !" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Merci d'utiliser %(site_name)s !\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Vous recevez cet e-mail car l'utilisateur %(user_display)s a indiqué votre " "adresse pour se connecter à son compte sur %(site_domain)s.\n" "\n" "Pour confirmer que vous en êtes bien le propriétaire, allez à " "%(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Confirmez votre adresse email" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Vous recevez cet email car vous ou quelqu'un d'autre a demandé le mot de " "passe pour votre compte utilisateur.\n" "Vous pouvez simplement ignorer ce message si vous n'êtes pas à l'origine de " "cette demande. Sinon, cliquez sur le lien ci-dessous pour réinitialiser " "votre mot de passe." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "" "Au cas où vous l'auriez oublié, votre nom d'utilisateur est %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-mail de réinitialisation de mot de passe" #: templates/account/email/unknown_account_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "\"Vous recevez cet e-mail parce que vous ou quelqu'un d'autre a demandé un mot de\n" "passe pour votre compte utilisateur. Cependant, nous n'avons aucun\n" "enregistrement d'un utilisateur avec l'e-mail %(email)s dans notre base de\n" "données.\n" "\n" "Vous pouvez ignorer en toute sécurité cet e-mail si vous n'avez pas demandé de\n" "réinitialisation de mot de passe.\n" "\n" "Si c'était vous, vous pouvez vous inscrire pour un compte en utilisant le lien\n" "ci-dessous." #: templates/account/email_change.html:5 templates/account/email_change.html:9 msgid "Email Address" msgstr "Adresse email" #: templates/account/email_change.html:14 msgid "The following email address is associated with your account:" msgstr "Les adresses email suivantes sont associées à votre compte :" #: templates/account/email_change.html:19 msgid "Your email address is still pending verification:" msgstr "Votre adresse e-mail est toujours en attente de vérification:" #: templates/account/email_change.html:38 msgid "Change Email Address" msgstr "Changer l'adresse e-mail" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 msgid "Change Email" msgstr "Changer d'email" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Confirmer l'adresse email" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Merci de confirmer que %(email)s est " "l'adresse email de %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Confirmer" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, python-format msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Impossible de confirmer %(email)s car il est déjà confirmé par un autre compte." #: templates/account/email_confirm.html:35 #, python-format msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Ce lien de confirmation d'adresse e-mail a expiré ou n'est pas valide. " "Veuillez lancer une nouvelle demande de " "confirmation." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Connexion" #: templates/account/login.html:12 #, python-format msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Si vous n'avez pas encore créé de compte, merci de vous enregistrer au préalable." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Se déconnecter" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Etes-vous sûr(e) de vouloir vous déconnecter ?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "" "Vous ne pouvez pas supprimer votre adresse email principale (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "E-mail de confirmation envoyé à %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Vous avez confirmé %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Adresse email %(email)s supprimée." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Connexion avec %(name)s réussie." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Vous êtes déconnecté." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Mot de passe modifié." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Mot de passe défini." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Adresse email principale enregistrée." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Votre adresse email principale doit être vérifiée." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Modifier le mot de passe" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Mot de passe oublié ?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Réinitialisation du mot de passe" #: templates/account/password_reset.html:14 msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Mot de passe oublié ? Indiquez votre adresse email ci-dessous et nous vous " "enverrons un email pour le réinitialiser." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Réinitialiser mon mot de passe" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Merci de nous contacter si vous ne parvenez pas à réinitialiser votre mot de " "passe." #: templates/account/password_reset_done.html:16 msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Nous vous avons envoyé un e-mail. Si vous ne l'avez pas reçu, veuillez vérifier\n" "votre dossier de spam. Sinon, contactez-nous si vous ne le recevez pas dans\n" "quelques minutes." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Mauvais jeton d'identification" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Le lien de réinitialisation du mot de passe est invalide. Il a peut être " "déjà été utilisé. Veuillez faire une nouvelle demande de réinitialisation de mot de passe." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Votre mot de passe a été modifié." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Définir un mot de passe" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 msgid "Confirm Access" msgstr "Confirmer l'accès" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "Pour garantir la sécurité de votre compte, veuillez entrer votre mot de passe:" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Inscription" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Création de compte" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Vous avez déjà un compte ? Vous pouvez donc vous " "connecter." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Inscriptions fermées" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Nous sommes désolés, mais les inscriptions sont actuellement fermées." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Remarque" #: templates/account/snippets/already_logged_in.html:7 #, python-format msgid "You are already logged in as %(user_display)s." msgstr "Vous êtes déjà connecté en tant que %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Attention :" #: templates/account/snippets/warn_no_email.html:3 msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Vous n'avez aucune adresse email associée à votre compte. Vous devriez " "ajouter une adresse email pour pouvoir recevoir des notifications, " "réinitialiser votre mot de passe, etc." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Vérifiez votre adresse email" #: templates/account/verification_sent.html:12 msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Nous vous avons envoyé un email pour validation. Cliquez sur le lien fourni " "dans l'email pour terminer l'inscription. Merci de nous contacter si vous ne " "le recevez pas d'ici quelques minutes." #: templates/account/verified_email_required.html:13 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Pour accéder à cette partie du site, il faut d'abord que nous ayons vérifié " "que vous êtes bien le propriétaire de l'adresse e-mail que vous nous avez " "indiquée." #: templates/account/verified_email_required.html:18 msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Nous vous avons envoyé un email de vérification. Merci de cliquer sur le " "lien inclus dans ce courriel. Contactez-nous si vous ne l'avez pas reçu " "d'ici quelques minutes." #: templates/account/verified_email_required.html:23 #, python-format msgid "" "Note: you can still change your " "email address." msgstr "" "Remarque : vous pouvez toujours changer votre adresse e-mail." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "Messages :" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "Menu :" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "Authentification à deux facteurs" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "Votre compte est protégé par l'authentification à deux facteurs. Veuillez entrer un code d'authentification:" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "Application d'authentification" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "L'authentification à l'aide d'une application d'authentification est active." #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "Une application d'authentification n'est pas active." #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "Désactiver" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "Activer" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "Codes de récupération" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "Il y a %(unused_count)s codes de récupération disponibles sur %(total_count)s." msgstr[1] "Il y a %(unused_count)s codes de récupération disponibles sur %(total_count)s." #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "Aucun code de récupération n'a été configuré." #: templates/mfa/index.html:56 msgid "View" msgstr "Afficher" #: templates/mfa/index.html:62 msgid "Download" msgstr "Télécharger" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "Générer" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "Un nouveau jeu de codes de récupération a été généré." #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "Application d'authentification activée." #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "Application d'authentification désactivée." #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "Vous êtes sur le point de générer un nouveau jeu de codes de récupération pour votre compte." #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "Cette action invalidera vos codes existants." #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "Êtes-vous sûr?" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "Codes inutilisés" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "Télécharger les codes" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "Générer de nouveaux codes" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "Activer l'application d'authentification" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "Pour protéger votre compte avec l'authentification à deux facteurs, scannez le code QR ci-dessous avec votre application d'authentification. Ensuite, saisissez le code de vérification généré par l'application ci-dessous." #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "Secret d'authentification" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "Vous pouvez stocker ce secret et l'utiliser pour réinstaller votre application d'authentification ultérieurement." #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "Désactiver l'application d'authentification" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "Vous êtes sur le point de désactiver l'authentification basée sur l'application d'authentification. Êtes-vous sûr?" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Echec de la connexion au réseau social" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Une erreur est survenue lors de la tentative de connexion à votre compte de " "réseau social." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Comptes associés" #: templates/socialaccount/connections.html:13 msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Vous pouvez vous connecter à votre compte en utilisant l'un des comptes tiers suivants:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Aucun compte de réseau social n'est actuellement associé à ce compte." #: templates/socialaccount/connections.html:48 msgid "Add a Third-Party Account" msgstr "Ajouter un compte tiers" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "Connecter %(provider)s" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" "Vous êtes sur le point de connecter un nouveau compte tiers de %(provider)s." #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "Connexion via %(provider)s" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" "Vous êtes sur le point de vous connecter en utilisant un compte tiers de " "%(provider)s." #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "Continuer" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Ouverture de session annulée" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Vous avez annulé la connexion à notre site depuis l'un de vos comptes de " "réseau social. S'il s'agit d'une erreur, merci de connecter." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Le compte social a bien été connecté." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Ce compte social est déjà connecté à un autre compte." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Le compte social a été déconnecté." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Vous êtes sur le point de vous connecter via votre compte %(provider_name)s " "au site %(site_name)s. Merci de compléter le formulaire suivant pour " "confirmer la connexion." #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "Ou utilisez un service tiers" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Merci d'ouvrir une session avec l'un de vos comptes sociaux. Vous pouvez " #~ "aussi ouvrir un compte %(site_name)s puis " #~ "vous connecter ci-dessous :" #~ msgid "or" #~ msgstr "ou" #~ msgid "change password" #~ msgstr "modifier le mot de passe" #~ msgid "OpenID Sign In" #~ msgstr "Connexion OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "L'adresse e-mail est déjà associée à un autre compte." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Nous vous avons envoyé un e-mail. Merci de nous contacter si vous ne le " #~ "recevez pas d'ici quelques minutes." #~ msgid "Account" #~ msgstr "Compte" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "L'identifiant ou le mot de passe sont incorrects." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Un pseudonyme ne peut contenir que des lettres, des chiffres, ainsi que " #~ "@/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Ce pseudonyme est déjà utilisé, merci d'en choisir un autre." #~ msgid "Shopify Sign In" #~ msgstr "Connexion Shopify" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Vous avez confirmé que l'adresse e-mail de l'utilsateur %(user_display)s " #~ "est %(email)s." #~ msgid "Thanks for using our site!" #~ msgstr "Merci d'utiliser notre site !" django-allauth-0.58.2/allauth/locale/he/000077500000000000000000000000001452212273200177655ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/he/LC_MESSAGES/000077500000000000000000000000001452212273200215525ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/he/LC_MESSAGES/django.po000066400000000000000000001135001452212273200233540ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2017-08-26 16:11+0300\n" "Last-Translator: Udi Oron \n" "Language-Team: Hebrew\n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.0.3\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "לא ניתן להשתמש בשם משתמש זה. אנא בחר שם משתמש אחר." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "יותר מדי ניסיונות התחברות כושלים. אנא נסה שוב מאוחר יותר." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "משתמש אחר כבר רשום עם כתובת אימייל זו." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "סיסמה נוכחית" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "הסיסמה חייבת להיות באורך של לפחות {0} תווים." #: account/apps.py:9 msgid "Accounts" msgstr "חשבונות" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "יש להזין את אותה הסיסמה פעמיים." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "סיסמה" #: account/forms.py:94 msgid "Remember Me" msgstr "זכור אותי" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "חשבון זה אינו פעיל כעת." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "כתובת האימייל ו/או הסיסמה אינם נכונים." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "שם המשתמש ו/או הסיסמה אינם נכונים." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "כתובת אימייל" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "אימייל" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "שם משתמש" #: account/forms.py:134 msgid "Username or email" msgstr "שם משתמש או אימייל" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "כניסה" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "שכחת סיסמה?" #: account/forms.py:312 msgid "Email (again)" msgstr "אימייל (שוב)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "אישור כתובת אימייל" #: account/forms.py:324 msgid "Email (optional)" msgstr "אימייל (לא חובה)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "יש להזין את אותו האימייל פעמיים." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "סיסמה (שוב)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "כתובת אימייל זו כבר משויכת לחשבון זה." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "לא נמצאו כתובות אימייל מאומתות לחשבונך." #: account/forms.py:524 msgid "Current Password" msgstr "סיסמה נוכחית" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "סיסמה חדשה" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "סיסמה חדשה (שוב)" #: account/forms.py:538 msgid "Please type your current password." msgstr "אנא הזן את הסיסמה הנוכחית." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "כתובת אימייל זו אינה משויכת לאף חשבון" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "אסימון איפוס הסיסמה אינו תקין." #: account/models.py:21 msgid "user" msgstr "משתמש" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "כתובת אימייל" #: account/models.py:28 msgid "verified" msgstr "מאומת" #: account/models.py:29 msgid "primary" msgstr "ראשי" #: account/models.py:35 msgid "email addresses" msgstr "כתובות אימייל" #: account/models.py:141 msgid "created" msgstr "נוצר" #: account/models.py:142 msgid "sent" msgstr "נשלח" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "מפתח" #: account/models.py:148 msgid "email confirmation" msgstr "אישור באימייל" #: account/models.py:149 msgid "email confirmations" msgstr "אישורים בדואל" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "קיים כבר חשבון עם כתובת אימייל זו. אנא התחבר לחשבון זה, ואז קשר את חשבון %s " "שלך." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "לא נבחרה סיסמה לחשבונך." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "לא נמצאו כתובות אימייל מאומתות לחשבונך." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "חשבונות חברתיים" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "" #: socialaccount/models.py:48 msgid "provider ID" msgstr "" #: socialaccount/models.py:52 msgid "name" msgstr "שם" #: socialaccount/models.py:54 msgid "client id" msgstr "" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:59 msgid "secret key" msgstr "" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:65 msgid "Key" msgstr "" #: socialaccount/models.py:77 msgid "social application" msgstr "" #: socialaccount/models.py:78 msgid "social applications" msgstr "" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "התחברות אחרונה" #: socialaccount/models.py:116 msgid "date joined" msgstr "תאריך הצטרפות" #: socialaccount/models.py:117 msgid "extra data" msgstr "" #: socialaccount/models.py:121 msgid "social account" msgstr "חשבון חברתי" #: socialaccount/models.py:122 msgid "social accounts" msgstr "חשבונות חברתיים" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "פג תוקף בתאריך" #: socialaccount/models.py:170 msgid "social application token" msgstr "" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "" #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "" #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "חשבון לא פעיל" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "חשבון זה אינו פעיל." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "כתובות אימייל" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "כתובות האימייל הבאות משויכות לחשבונך:" #: templates/account/email.html:23 msgid "Verified" msgstr "מאומת" #: templates/account/email.html:27 msgid "Unverified" msgstr "לא מאומת" #: templates/account/email.html:32 msgid "Primary" msgstr "ראשי" #: templates/account/email.html:42 msgid "Make Primary" msgstr "הפוך לראשי" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "שלח אימייל אימות מחדש" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "הסר" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "הוסף כתובת אימייל" #: templates/account/email.html:70 msgid "Add Email" msgstr "הוסף אימייל" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "האם ברצונך להסיר את כתובות האימייל המסומנות?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "תודה מ%(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "תודה שהשתמשת באתר %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "שלום מ%(site_name)s.\n" "\n" "אתה מקבל מייל זה מכיוון שהמשתמש %(user_display)s סיפק את האימייל שלך לקישור " "של חשבונם.\n" "\n" "כדי לאמת זאת, לחץ על הקישור %(activate_url)s.\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "אנא אמת את כתובת האימייל שלך" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "שלום מ%(site_name)s!\n" "\n" "מייל זה נשלח אליך כיוון שאתה או מישהו אחר ביקש סיסמה עבור חשבונך ב " "%(site_name)s.\n" "במידה ולא ביקשת איפוס סיסמה ניתן להתעלם ממייל זה ללא חשש. לחץ על הקישור מטה " "לאיפוס סיסמתך." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "במידת ושכחת, שם המשתמש שלך הוא %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "מייל איפוס סיסמה" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "שלום מ%(site_name)s!\n" "\n" "מייל זה נשלח אליך כיוון שאתה או מישהו אחר ביקש סיסמה עבור חשבונך ב " "%(site_name)s.\n" "במידה ולא ביקשת איפוס סיסמה ניתן להתעלם ממייל זה ללא חשש. לחץ על הקישור מטה " "לאיפוס סיסמתך." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "כתובות אימייל" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "כתובות האימייל הבאות משויכות לחשבונך:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "עליך לאמת את כתובת האימייל הראשית שלך." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "אימות כתובת אימייל" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "אימייל" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "אימות כתובת אימייל" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "אנא אמת ש%(email)s היא כתובת האימייל של " "המשתמש %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "אמת" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "חשבון חברתי זה כבר מקושר למשתמש אחר." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "קישור זה לאימות כתובת אימייל פג תוקף או שאינו תקין. יש להנפיק בקשה חדשה לאימות כתובת אימייל." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "כניסה" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "אם לא נרשמת לחשבון בעבר, אנא הרשם תחילה." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "יציאה" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "האם אתה בטוח שברצונך לצאת?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "לא ניתן להסיר את כתובת האימייל הראשית שלך (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "מייל אימות נשלח ל %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "כתובת האימייל %(email)s אומתה בהצלחה." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "כתובת האימייל %(email)s הוסרה." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "מחובר בהצלחה כ %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "התנתקת מהחשבון." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "הסיסמה שונתה בהצלחה." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "הסיסמה נקבעה בהצלחה." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "כתובת אימייל ראשית הוגדרה." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "עליך לאמת את כתובת האימייל הראשית שלך." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "החלפת סיסמה" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "שכחת סיסמה?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "איפוס סיסמה" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "שכחת את סיסמתך? הזן את כתובת האימייל שלך כאן, ונשלח לך מייל לאיפוס הסיסמה." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "אפס את הסיסמה" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "אנא צור איתנו קשר אם אתה מתקשה לאפס את הסיסמה." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "שלחנו אליך מייל למטרת אימות.\n" "אנא ללץ על הקישור בתוך אימייל זה.\n" "אנא צור עמנו קשר במידה והמייל לא התקבל תוך מספר דקות." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "אסימון פגום" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "הקישור לאיפוס הסיסמה אינו תקין, כנראה מכיוון שכבר נעשה בו שימוש. לחץ כאן " "לבקשת איפוס סיסמה מחדש." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "סיסמתך שונתה." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "קביעת סיסמה" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "אימות כתובת אימייל" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "הרשמה" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "הרשמה" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "נרשמת בעבר? כניסה למערכת." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "ההרשמה סגורה" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "אנו מצטערים, אך ההרשמה סגורה כעת." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "הערה" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "הנך מחובר כבר כ%(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "אזהרה:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "טרם שייכת כתובת אימייל לחשבונך. מומלץ לשייך כתובת אימייל על מנת לקבל התראות, " "לאפס סיסמה וכו'." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "אשר את כתובת הדואל שלך" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "שלחנו אליך מייל למטרת אימות. לחץ על הקישור במייל לסיום תהליך ההרשמה. אנא צור " "עמנו קשר במידה והמייל לא התקבל תוך מספר דקות." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "חלק זה באתר דורש מאיתנו לוודא כי הנך אכן מי שאתה טוען שאתה.\n" "למטרה זו, אנו מבקשים כי תאמת בעלות על כתובת האימייל שלך." #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "שלחנו אליך מייל למטרת אימות.\n" "אנא ללץ על הקישור בתוך אימייל זה.\n" "אנא צור עמנו קשר במידה והמייל לא התקבל תוך מספר דקות." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "הערה: אתה עדיין יכול לשנות את " "כתובת האימייל שלך ." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "שגיאת התחברות לרשת חברתית" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "אירעה שגיאה במהלך ניסיון התחברות באמצעות חשבון הרשת החברתית שלך." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "קישורים לחשבון" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "ניתן להתחבר לחשבונך באמצעות כל אחד מחשבונות צד שלישי הבאים:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "לא קיימים חשבונות רשת חברתית המקושרים לחשבון זה כרגע." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "הוסף חשבון צד שלישי" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "התחברות בוטלה" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "ביקשת לבטל את ההתחברות לאתר זה באמצעות אחד מחשבונותיך הקיימים. במידה וטעית, " "אנא המשך להתחברות." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "החשבון החברתי קושר בהצלחה." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "חשבון חברתי זה כבר מקושר למשתמש אחר." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "חשבון חברתי זה נותק." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "אתה עומד להשתמש בחשבון %(provider_name)s שלך כדי\n" "להתחבר ל%(site_name)s. לסיום, אנא מלא את הטופס הבא:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "אנא הכנס עם אחד מהחשבונות הקיימים שלך.\n" #~ "או, הרשם לחשבון %(site_name)s והתחבר:" #~ msgid "or" #~ msgstr "או" #~ msgid "change password" #~ msgstr "החלפת סיסמה" #~ msgid "OpenID Sign In" #~ msgstr "כניסה באמצעות OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "כתובת אימייל זו כבר משויכת לחשבון אחר." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "המייל נשלח. אנא צור איתנו קשר אם הוא אינו מתקבל תוך מספר דקות." #~ msgid "Account" #~ msgstr "חשבון" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "שם המשתמש ו/או הסיסמא אינם נכונים" #~ msgid "This username is already taken. Please choose another." #~ msgstr "שם משתמש זה כבר תפוס, אנא ציין שם אחר" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "כניסה" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "אישרת בהצלחה כי %(email)s הנה כתובת דואר " #~ "אלקטרוני עבור המשתמש %(user_display)s." #~ msgid "Confirmation email sent to %(email)s" #~ msgstr "דואל אישור נשלח אל %(email)s" #~ msgid "Delete Password" #~ msgstr "מחיקת סיסמא" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "אתה רשאי למחוק את סיסמאתך כיוון שהנך מחובר באמצעות OpenID" #~ msgid "delete my password" #~ msgstr "מחק סיסמא" #~ msgid "Password Deleted" #~ msgstr "הסיסמא נמחקה" #~ msgid "Your password has been deleted." #~ msgstr "סיסמתך נמחקה מהמערכת." django-allauth-0.58.2/allauth/locale/hr/000077500000000000000000000000001452212273200200025ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/hr/LC_MESSAGES/000077500000000000000000000000001452212273200215675ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/hr/LC_MESSAGES/django.po000066400000000000000000001111231452212273200233700ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Bojan Mihelac , 2013-05-22 # Mislav Cimperšak . 2013-07-09 # Goran Cetušić . 2015-11-27 # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2014-08-12 00:31+0200\n" "Last-Translator: \n" "Language-Team: Bojan Mihelac \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Poedit 1.5.4\n" "X-Translated-Using: django-rosetta 0.7.2\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Nije moguće koristiti upisano korisničko ime. Molimo odaberite drugo." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "" #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Već postoji korisnik registriran s ovom e-mail adresom." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Trenutna lozinka" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Lozinka treba imati najmanje {0} znakova." #: account/apps.py:9 msgid "Accounts" msgstr "Korisnički računi" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Potrebno je upisati istu lozinku svaki put." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Lozinka" #: account/forms.py:94 msgid "Remember Me" msgstr "Zapamti me" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Ovaj korisnički račun je privremeno neaktivan." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "E-mail adresa i/ili lozinka nisu ispravni." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Korisničko ime i/ili lozinka nisu ispravni." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "E-mail adresa" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Korisničko ime" #: account/forms.py:134 msgid "Username or email" msgstr "Korisničko ime ili e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Prijava" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Zaboravili ste lozinku?" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "E-mail (neobavezno)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "E-mail potvrda" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (neobavezno)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Potrebno je upisati istu lozinku svaki put." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Lozinka (ponovno)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "E-mail adresa je već registrirana s ovim korisničkim računom." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Vaš korisnički račun nema potvrđenu e-mail adresu." #: account/forms.py:524 msgid "Current Password" msgstr "Trenutna lozinka" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Nova lozinka" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Nova lozinka (ponovno)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Molimo unesite trenutnu lozinku." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Upisana e-mail adresa nije dodijeljena niti jednom korisničkom računu" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "" #: account/models.py:21 msgid "user" msgstr "korisnik" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "e-mail adresa" #: account/models.py:28 msgid "verified" msgstr "potvrđena" #: account/models.py:29 msgid "primary" msgstr "primarna" #: account/models.py:35 msgid "email addresses" msgstr "E-mail adrese" #: account/models.py:141 msgid "created" msgstr "" #: account/models.py:142 msgid "sent" msgstr "" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "" #: account/models.py:148 msgid "email confirmation" msgstr "E-mail potvrda" #: account/models.py:149 msgid "email confirmations" msgstr "E-mail potvrde" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Korisnički račun s ovom e-mail adresom već postoji. Molimo da se prvo " "ulogirate pod tim korisničkim računom i spojite svoj %s račun" #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Vaš korisnički račun nema postavljenu lozinku." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Vaš korisnički račun nema potvrđenu e-mail adresu." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Korisnički računi" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "" #: socialaccount/models.py:48 msgid "provider ID" msgstr "" #: socialaccount/models.py:52 msgid "name" msgstr "naziv" #: socialaccount/models.py:54 msgid "client id" msgstr "" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:59 msgid "secret key" msgstr "" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:65 msgid "Key" msgstr "" #: socialaccount/models.py:77 msgid "social application" msgstr "" #: socialaccount/models.py:78 msgid "social applications" msgstr "" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "" #: socialaccount/models.py:116 msgid "date joined" msgstr "" #: socialaccount/models.py:117 msgid "extra data" msgstr "" #: socialaccount/models.py:121 msgid "social account" msgstr "" #: socialaccount/models.py:122 msgid "social accounts" msgstr "" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "" #: socialaccount/models.py:170 msgid "social application token" msgstr "" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Neispravan odaziv pri dohvatu tokena zahtjeva od \\\"%s\\\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Neispravan odaziv pri dohvatu pristupnog tokena od \\\"%s\\\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Ne postoji pohranjeni token za \\\"%s\\\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Token za pristup za \\\"%s\\\" nije pohranjen." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Nemate pristup zaštičenim sadržajima na \\\"%s\\\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Neispravan odaziv pri dohvatu tokena zahtjeva od \\\"%s\\\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Račun je neaktivan" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Ovaj korisnički račun je neaktivan." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "E-mail adrese" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Slijedeće e-mail adrese su povezane sa vašim korisničkim računom" #: templates/account/email.html:23 msgid "Verified" msgstr "Potvrđena" #: templates/account/email.html:27 msgid "Unverified" msgstr "Nepotvrđena" #: templates/account/email.html:32 msgid "Primary" msgstr "Primarna" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Označi kao primarnu" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Ponovno pošalji e-mail za potvrdu" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Ukloni" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Dodaj e-mail adresu" #: templates/account/email.html:70 msgid "Add Email" msgstr "Dodaj e-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Da li zaista želite ukloniti e-mail adresu?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s at " #| "%(site_domain)s has given yours as an e-mail address to connect their " #| "account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Pozdravi od %(site_name)s!\n" "\n" "Primili ste ovaj e-mail jer je korisnik %(user_display)s na stranici " "%(site_domain)s upisao ovu e-mail adresu kao svoju.\n" "\n" "Za potvrdu, kliknite %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Potvrdite vašu e-mail adresu" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Pozdravi od %(site_name)s!\n" "\n" "Primili ste ovaj e-mail jer ste vi ili netko drugi zatražili lozinku za vaš " "korisnički račun na %(site_domain)s.\n" "Ako niste zatražili resetiranje lozinke, slobodno zanemarite ovaj e-mail. " "Kliknite na sljedeći link za resetiranje lozinke." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Za slučaj da ste zaboravili, vaše korisničko ime je %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-mail za resetiranje lozinke" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Pozdravi od %(site_name)s!\n" "\n" "Primili ste ovaj e-mail jer ste vi ili netko drugi zatražili lozinku za vaš " "korisnički račun na %(site_domain)s.\n" "Ako niste zatražili resetiranje lozinke, slobodno zanemarite ovaj e-mail. " "Kliknite na sljedeći link za resetiranje lozinke." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "E-mail adrese" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Slijedeće e-mail adrese su povezane sa vašim korisničkim računom" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Vaša primarna adresa more biti potvrđena." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Potvrdite vašu e-mail adresu" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Potvrdite vašu e-mail adresu" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Molimo potvrdite da %(email)s je e-mail " "adresa za korisnika %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Potvrda" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Korisnički račun društvene mreže je već povezan s drugim računom." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Ovaj link za potvrdu je istekao ili je neispravan. Zatražite novi e-mail za potvrdu." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Prijava" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Ukoliko još niste napravili korisnički račun, prvo se registrirajte." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Odjava" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Jeste li sigurni da se želite odjaviti?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Nije moguće ukloniti vašu primarnu e-mail adresu %(email)s " #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "E-mail s linkom za potvrdu registracije je poslan na %(email)s" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Potvrdili ste e-mail adresu %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Uklonjena e-mail adresa %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Uspješno ste prijavljeni kao %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Uspješno ste se odjavili." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Lozinka je uspješno promijenjena." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Lozinka je uspješno postavljena." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Primarna e-mail adresa je postavljena" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Vaša primarna adresa more biti potvrđena." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Promjena lozinke" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Zaboravili ste lozinku?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Resetiranje lozinke" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Zaboravili ste lozinku? Unesite vašu e-mail adresu i poslati ćemo vam e-mail " "uz pomoć kojeg ćete promijeniti lozinku." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Resetiraj moju lozinku" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "Molimo konktaktirajte nas ukoliko imate problema pri promjeni lozinke." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Poslali smo e-mail na vašu adresu u svrhu potvrde. Molimo kliknite na link " "unutar e-maila.\n" "Molimo kontaktirajte nas ako ga ne primite unutar nekoliko sljedećih minuta." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Neispravan token" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Link za poništavanje lozinke je nevažeći, vjerojatno jer je već bio " "korišten. Molimo vas ponovite zahtjev za " "resetiranje lozinke." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Lozinka je uspješno promjenjena." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Postavljanje lozinke" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Potvrdite vašu e-mail adresu" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registracija" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Registracija" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Već imate korisnički račun? Prijavite se!" #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Prijave zatvorene" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Na žalost, registracija je privremeno nedostupna." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Napomena" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "već ste prijavljeni kao %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Pažnja:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Trenutno nemate postavljenu niti jednu e-mail adresu. Postavite e-mail " "adresu kako biste mogli primati obavijesti, promijeniti lozinku i slično." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Potvrdite vašu e-mail adresu" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Poslali smo e-mail u svrhu potvrde. Sljedite dani link za završetak postupka " "registracije. Molimo kontaktirajte nas ukoliko ga ne primite unutar " "sljedećih nekoliko minuta." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Ovaj dio web stranice zahtjeva da potvrdite da jeste tko tvrdite da jeste. " "Zbog toga je nužno da potvrdite da ste vi vlasnik dane e-mail adrese." #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Poslali smo e-mail na vašu adresu u svrhu potvrde. Molimo kliknite na link " "unutar e-maila.\n" "Molimo kontaktirajte nas ako ga ne primite unutar nekoliko sljedećih minuta." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Napomena: još uvijek možete izmijeniti vašu e-mail adresu." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Greška pri prijavi s računom društvene mreže" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Došlo je do greške pri prijavi s vašim računom društvene mreže." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Povezani računi" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Možete se prijaviti u vaš korisnički račun koristeći jedan od sljedećih " "povezanih računa:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Trenutno nemate niti jedan račun s društvenih mreža povezan s trenutnim " "korisničkim računom." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Dodaj račun društvenih mreža." #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Prijava otkazana" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Odlučili ste da se ne želite prijaviti na našu stranicu koristeći jedan od " "vaših postojećih računa s društvenih mreža. Ako je to bila greška, molimo " "kliknite i prijavite se." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Račun društvene mreže je povezan" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Korisnički račun društvene mreže je već povezan s drugim računom." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Račun društvene mreže je isključen" #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Odabrali ste da ćete koristiti vaš %(provider_name)s račun za prijavu u " "stranicu %(site_name)s. Kao posljednji korak, molimo vas ispunite sljedeći " "obrazac:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Molimo prijavite se s jednim od vaših postojećih računa društvenih mreža " #~ "ili se registrirajte za korisnički račun " #~ "na %(site_name)s i prijavite se." #~ msgid "or" #~ msgstr "ili" #~ msgid "change password" #~ msgstr "promjena lozinke" #~ msgid "OpenID Sign In" #~ msgstr "Prijava s OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "E-mail adresa je već registrirana s drugim korisničkim računom." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Poslali smo vam e-mail. Molimo kontaktirajte nas ako ga ne primite unutar " #~ "nekoliko sljedećih minuta." #~ msgid "Account" #~ msgstr "Korisnički račun" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Korisničko ime i/ili zaporka nisu ispravni." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "Korisničko ime može sadržavati samo slova, brojeve i @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "" #~ "Korisničko ime je već zauzeto. Molimo izaberite drugo korisničko ime." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Prijava" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Potvrdili ste da je %(email)s e-mail " #~ "adresa za korisnika %(user_display)s." django-allauth-0.58.2/allauth/locale/hu/000077500000000000000000000000001452212273200200055ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/hu/LC_MESSAGES/000077500000000000000000000000001452212273200215725ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/hu/LC_MESSAGES/django.po000066400000000000000000001070051452212273200233770ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2015-05-08 22:42+0100\n" "Last-Translator: Tamás Makó \n" "Language-Team: \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.7.6\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Ez a felhasználói azonosító nem használható. Kérlek válassz másikat!" #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "" #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Egy felhasználó már regisztrált ezzel az email címmel." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Jelenlegi jelszó" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "A jelszónak minimum {0} hosszúnak kell lennnie." #: account/apps.py:9 msgid "Accounts" msgstr "Felhasználók" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Ugyanazt a jelszót kell megadni mindannyiszor." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Jelszó" #: account/forms.py:94 msgid "Remember Me" msgstr "Emlékezz rám" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "A felhasználó jelenleg nem aktív." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "A megadott email vagy a jelszó hibás." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "A megadott felhasználó vagy a jelszó hibás." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Email" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "Email" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Felhasználó azonosító" #: account/forms.py:134 msgid "Username or email" msgstr "Felhasználó azonosító vagy email" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Bejelentkezés" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Elfelejtett jelszó?" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "Email (nem kötelező)" #: account/forms.py:316 #, fuzzy #| msgid "Email address" msgid "Email address confirmation" msgstr "Email" #: account/forms.py:324 msgid "Email (optional)" msgstr "Email (nem kötelező)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Ugyanazt a jelszót kell megadni mindannyiszor." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Jelszó (ismét)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Ez az email cím már hozzá van rendelve ehhez a felhasználóhoz." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "A felhasználódnak nincs ellenőrzött email címe." #: account/forms.py:524 msgid "Current Password" msgstr "Jelenlegi jelszó" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Új jelszó" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Új jelszó (ismét)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Kérlek add meg az aktuális jelszavadat!" #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Az email cím nincs hozzárendelve egyetlen felhasználóhoz sem" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "" #: account/models.py:21 msgid "user" msgstr "" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "" #: account/models.py:28 msgid "verified" msgstr "" #: account/models.py:29 msgid "primary" msgstr "" #: account/models.py:35 msgid "email addresses" msgstr "" #: account/models.py:141 msgid "created" msgstr "" #: account/models.py:142 msgid "sent" msgstr "" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "" #: account/models.py:148 msgid "email confirmation" msgstr "" #: account/models.py:149 msgid "email confirmations" msgstr "" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Ezzel az email címmel már létezik egy felhasználó . Először jelentkezz be, " "majd kapcsold össze a(z) %s felhasználóval." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "A felhasználódnak nincs beállított jelszava." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "A felhasználódnak nincs ellenőrzött email címe." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Közösségi Felhasználók" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "" #: socialaccount/models.py:48 msgid "provider ID" msgstr "" #: socialaccount/models.py:52 msgid "name" msgstr "" #: socialaccount/models.py:54 msgid "client id" msgstr "" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:59 msgid "secret key" msgstr "" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:65 msgid "Key" msgstr "" #: socialaccount/models.py:77 msgid "social application" msgstr "" #: socialaccount/models.py:78 msgid "social applications" msgstr "" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "" #: socialaccount/models.py:116 msgid "date joined" msgstr "" #: socialaccount/models.py:117 msgid "extra data" msgstr "" #: socialaccount/models.py:121 msgid "social account" msgstr "" #: socialaccount/models.py:122 msgid "social accounts" msgstr "" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "" #: socialaccount/models.py:170 msgid "social application token" msgstr "" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "" #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "" #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "" #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Felhasználó nem aktív" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "A felhasználó nem aktív." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Email címek" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "A következő email címek tartoznak a felhasználódhoz:" #: templates/account/email.html:23 msgid "Verified" msgstr "Ellenőrzött" #: templates/account/email.html:27 msgid "Unverified" msgstr "Nem ellenőrzött" #: templates/account/email.html:32 msgid "Primary" msgstr "Elsődleges" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Legyen elsődleges" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Ellenőrzés újraküldése" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Töröl" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Új email cím" #: templates/account/email.html:70 msgid "Add Email" msgstr "Új email" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Tényleg törölni akarod a kijelölt email címet?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "A(z) %(user_display)s felhasználó a(z) %(site_name)s oldalon ezt az email " "címet adta meg.\n" "\n" "Megerősítéshez látogasd meg ezt az oldalt %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm Email Address" msgid "Please Confirm Your Email Address" msgstr "Email cím megerősítése" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Azért kaptad ezt a levelet, mert te vagy valaki más jelszócserét kért a(z) " "%(site_domain)s oldalon.\n" "Nyugodtan hagyd levelünket figyelmen kívül, ha nem te kérted. A jelszó " "cseréjéhez kövesd az alábbi linket." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Ha esetleg nem emlékeznél pontosan, a felhasználód %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Jelszó csere email" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Azért kaptad ezt a levelet, mert te vagy valaki más jelszócserét kért a(z) " "%(site_domain)s oldalon.\n" "Nyugodtan hagyd levelünket figyelmen kívül, ha nem te kérted. A jelszó " "cseréjéhez kövesd az alábbi linket." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Email címek" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "A következő email címek tartoznak a felhasználódhoz:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Az elsődleges email címet ellenőriznunk kell." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Email cím megerősítése" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "Email" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Email cím megerősítése" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Kérlek erősítsd meg, hogy a(z) %(email)s " "email a(z) %(user_display)s felhasználóhoz tartozik." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Megerősítés" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "A közösségi felhasználó már egy másik felhasználóhoz tartozik." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Az email visszaigazolás címe már lejárt vagy érvénytelen. Itt kérhetsz újat.\"" #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Belépés" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Ha még nem rendelkezel felhasználóval, akkor\n" "először regisztrálnod kell." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Kilépés" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Biztosan kijelentkezel?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Az elsődleges email cím (%(email)s) nem törölhető." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Megerősítő levelet küldtünk a(z) %(email)s címre." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "A(z) %(email)s cím visszaigazolása megtörtént." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "%(email)s email cím törölve." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Sikeres bejelentkezés, mint %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Sikeresen kijelentkezés." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Jelszó sikeresen megváltoztatva." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Jelszó sikeresen beállítva." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Elsődleges email cím beállítva." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Az elsődleges email címet ellenőriznunk kell." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Jelszócsere" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Elfelejtett jelszó?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Új jelszó kérése" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Elfelejtetted a jelszavadat? Add meg az email címedet és küldünk egy linket, " "ahol újat kérhetsz." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Új jelszó kérése" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Kérlek vedd fel velünk a kapcsolatot, ha problémád adódik a jelszó " "beállításával." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Elküldtük az ellenőrző emailt.\n" "Az ellenőrzéshez kövesd a benne található címet! Kérlek vedd fel \n" "velünk a kapcsolatot, ha az email nem érkezik meg perceken belül!" #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Hibás token" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Az új jelszó kérő cím érvénytelen vagy már felhasználták. Itt tudsz újat kérni." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "A jelszavad megváltozott." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Jelszó beállítása" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Email cím megerősítése" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Regisztráció" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Regisztráció" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Van már felhasználód? Akkor itt jelentkezz be!" #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Regisztráció lezárva" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Sajnáljuk, de jelenleg nem lehet regisztrálni." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Megjegyzés" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "Már bejelentkeztél, mint %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Figyelem:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Jelenleg nincs egyetlen email címed sem beállítva. Nagyon fontos lenne, " "hiszen csak így kaphatsz értesítéseket és így tudod a jelszavadat " "megváltoztatni." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Ellenőrizd az emailedet" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Elküldtük az ellenőrző emailt. A regisztráció befejezéséhez kövesd a benne " "található linket! Kérlek vedd fel velünk a kapcsolatot, ha az email nem " "érkezik meg perceken belül!" #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Az oldal ezen része megköveteli, hogy ellenőrizzük\n" "a felhasználó azonosságát. Ezért most arra kérünk, \n" "hogy ellenőrizd a hozzáférésedet az email címedhez. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Elküldtük az ellenőrző emailt.\n" "Az ellenőrzéshez kövesd a benne található címet! Kérlek vedd fel \n" "velünk a kapcsolatot, ha az email nem érkezik meg perceken belül!" #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Megjegyzés: az email címet még mindig meg tudod változtatni." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Közösségi hálózat bejelentkezési hiba" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Hiba történt, miközben megpróbáltunk bejelentkezni a közösségi " "felhasználóddal." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Egyéb felhasználói fiókok" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Az alábbi felhasználói fiókok bármelyikét használhatod belépéshez:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Jelenleg nincs közösségi felhasználó a fiókodhoz rendelve." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Új közösségi felhasználó hozzáadása" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Bejelentkezés leállítva" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Ha a bejelntkezési folyamatot véletlenül állítottad le, itt újra megpróbálhatod." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "A közösségi felhasználó hozzárendelve." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "A közösségi felhasználó már egy másik felhasználóhoz tartozik." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "A közösségi felhasználó kapcsolat törölve." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "A(z) %(provider_name)s felhasználódat használod a (z) %(site_name)s " "bejelentkezés\n" "Utolsó lépésként kérlek töltsd ki az alábbi adatlapot:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Kérlek jelentkezz be\n" #~ "az egyik felhasználóddal vagy regisztrálj\n" #~ "új %(site_name)s felhasználót és használd azt:" #~ msgid "or" #~ msgstr "vagy" #~ msgid "OpenID Sign In" #~ msgstr "OpenID bejelentkezés" #~ msgid "This email address is already associated with another account." #~ msgstr "Ez az email cím már hozzá van rendelve egy másik felhasználóhoz." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Elküldtük az emailt. Kérlek vedd fel velünk a kapcsolatot, ha nem kapod " #~ "meg perceken belül." #~ msgid "Account" #~ msgstr "Felhasználó" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "A megadott bejelentkezési azonosító vagy a jelszó hibás." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "A felhasználói azonosítók csak betűket, számokat és a @/./+/-/_ " #~ "karaktereket tartalmazhatnak." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Ez a felhasználói azonosító már foglalt. Kérlek válassz másikat!" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Belépés" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Sikeresen visszaigazolás. A(z) %(email)s " #~ "email a(z) %(user_display)s felhasználóhoz tartozik." #~ msgid "Thanks for using our site!" #~ msgstr "Köszönjük, hogy az oldalunkat használja!" django-allauth-0.58.2/allauth/locale/id/000077500000000000000000000000001452212273200177655ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/id/LC_MESSAGES/000077500000000000000000000000001452212273200215525ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/id/LC_MESSAGES/django.po000066400000000000000000001065361452212273200233670ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "" "Name pengguna tidak dapat digunakan. Silahkan gunakan nama pengguna lain." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Terlalu banyak percobaan masuk yang gagal. Coba lagi nanti." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Seorang pengguna sudah terdaftar dengan alamat e-mail ini." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Kata sandi saat ini" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Kata sandi harus memiliki panjang minimal {0} karakter." #: account/apps.py:9 msgid "Accounts" msgstr "Akun" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Anda harus mengetikkan kata sandi yang sama setiap kali." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Kata sandi" #: account/forms.py:94 msgid "Remember Me" msgstr "Ingat Saya" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Akun ini sedang tidak aktif." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Alamat e-mail dan/atau kata sandi yang anda masukkan tidak benar." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Nama pengguna dan/atau kata sandi yang anda masukkan tidak benar." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Alamat e-mail" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Nama pengguna" #: account/forms.py:134 msgid "Username or email" msgstr "Nama pengguna atau e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Masuk" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Lupa Kata Sandi?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-mail (lagi)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Konfirmasi alamat e-mail" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (opsional)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Anda harus mengetikkan e-mail yang sama setiap kali." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Kata sandi (lagi)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Alamat e-mail ini sudah terhubung dengan akun ini." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "Anda tidak dapat menambahkan lebih dari %d alamat e-mail." #: account/forms.py:524 msgid "Current Password" msgstr "Kata sandi saat ini" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Kata sandi baru" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Kata sandi baru (lagi)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Silahkan ketik kata sandi Anda saat ini." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Alamat e-mail ini tidak terhubung dengan akun pengguna mana pun" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Token untuk mengatur ulang kata sandi tidak valid." #: account/models.py:21 msgid "user" msgstr "pengguna" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "alamat e-mail" #: account/models.py:28 msgid "verified" msgstr "terverifikasi" #: account/models.py:29 msgid "primary" msgstr "utama" #: account/models.py:35 msgid "email addresses" msgstr "alamat e-mail" #: account/models.py:141 msgid "created" msgstr "dibuat" #: account/models.py:142 msgid "sent" msgstr "dikirim" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "kunci" #: account/models.py:148 msgid "email confirmation" msgstr "konfirmasi e-mail" #: account/models.py:149 msgid "email confirmations" msgstr "konfirmasi e-mail" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Sudah ada akun yang menggunakan alamat e-mail ini. Silahkan masuk ke akun " "itu terlebih dahulu, lalu sambungkan akun %s Anda." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Akun Anda tidak memiliki kata sandi." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Akun Anda tidak memiliki alamat e-mail yang terverifikasi." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Akun Sosial" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "pemberi" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "pemberi" #: socialaccount/models.py:52 msgid "name" msgstr "nama" #: socialaccount/models.py:54 msgid "client id" msgstr "id klien" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "ID Aplikasi, atau kunci konsumen" #: socialaccount/models.py:59 msgid "secret key" msgstr "kunci rahasia" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "Kunci API, kunci klien, atau kunci konsumen" #: socialaccount/models.py:65 msgid "Key" msgstr "Kunci" #: socialaccount/models.py:77 msgid "social application" msgstr "aplikasi sosial" #: socialaccount/models.py:78 msgid "social applications" msgstr "aplikasi sosial" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "masuk terakhir" #: socialaccount/models.py:116 msgid "date joined" msgstr "tanggal bergabung" #: socialaccount/models.py:117 msgid "extra data" msgstr "data tambahan" #: socialaccount/models.py:121 msgid "social account" msgstr "akun sosial" #: socialaccount/models.py:122 msgid "social accounts" msgstr "akun sosial" #: socialaccount/models.py:156 msgid "token" msgstr "token" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) atau token akses (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "rahasia token" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) atau token refresh (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "kadaluarsa pada" #: socialaccount/models.py:170 msgid "social application token" msgstr "token aplikasi sosial" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "token-token aplikasi sosial" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Data profil tidak valid" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Respon tidak valid saat meminta token request dari \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Respon tidak valid saat meminta token akses dari \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Tidak ada token request yang disimpan untuk \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Tidak ada token akses yang disimpan untuk \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Tidak ada akses ke sumber daya pribadi pada \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Respon tidak valid saat meminta token request dari \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Akun Tidak Aktif" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Akun ini tidak aktif." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Alamat E-mail" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Alamat-alamat e-mail berikut ini terkait dengan akun Anda:" #: templates/account/email.html:23 msgid "Verified" msgstr "Terverifikasi" #: templates/account/email.html:27 msgid "Unverified" msgstr "Tidak Terverifikasi" #: templates/account/email.html:32 msgid "Primary" msgstr "Utama" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Jadikan Utama" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Kirim Ulang Verifikasi" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Hapus" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Tambahkan Alamat E-mail" #: templates/account/email.html:70 msgid "Add Email" msgstr "Tambahkan E-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Apakah Anda benar-benar ingin menghapus alamat e-mail yang dipilih?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Halo dari %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Terima kasih telah menggunakan %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Anda menerima e-mail ini karena pengguna %(user_display)s telah memberikan " "alamat e-mail Anda untuk mendaftarkan akun di %(site_domain)s.\n" "\n" "Untuk mengkonfirmasi bahwa ini benar, kunjungi %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Mohon Konfirmasi Alamat E-mail Anda" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Anda menerima e-mail ini karena Anda atau orang lain telah meminta kata " "sandi untuk akun Anda.\n" "Abaikan jika Anda tidak meminta reset kata sandi. Klik link di bawah untuk " "mereset kata sandi Anda." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Jikalau Anda lupa, nama pengguna Anda adalah %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-mail Reset Kata Sandi" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Anda menerima e-mail ini karena Anda atau orang lain telah meminta kata " "sandi untuk akun Anda.\n" "Abaikan jika Anda tidak meminta reset kata sandi. Klik link di bawah untuk " "mereset kata sandi Anda." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Alamat E-mail" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Alamat-alamat e-mail berikut ini terkait dengan akun Anda:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Alamat e-mail utama Anda harus diverifikasi." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Konfirmasi Alamat E-mail" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Konfirmasi Alamat E-mail" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Mohon konfirmasi bahwa %(email)s adalah " "alamat e-mail untuk pengguna %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Konfirmasi" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Akun sosial sudah terhubung ke akun lain." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Link konfirmasi e-mail ini sudah kadaluwarsa atau tidak valid. Mohon mengirimkan permintaan konfirmasi e-mail baru." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Masuk" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Jika Anda belum membuat akun, mohon\n" "daftar terlebih dahulu." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Keluar" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Anda yakin ingin keluar?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Anda tidak dapat menghapus alamat e-mail utama Anda (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "E-mail konfirmasi dikirim ke %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Anda telah mengkonfirmasi %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Alamat e-mail %(email)s telah dihapus." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Berhasil masuk sebagai %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Anda telah keluar." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Kata sandi berhasil diubah." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Kata sandi berhasil setel." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Alamat e-mail utama telah disetel." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Alamat e-mail utama Anda harus diverifikasi." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Ubah Kata Sandi" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Lupa Kata Sandi?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Reset Kata Sandi" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Lupa kata sandi Anda? Masukkan alamat e-mail Anda di bawah, dan kami akan " "mengirimkan e-mail yang membolehkan Anda untuk mengubahnya." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Reset Kata Sandi Saya" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Mohon hubungi kami jika Anda mengalami masalah saat mengubah kata sandi Anda." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Kami telah mengirimkan e-mail kepada Anda untuk\n" "verifikasi. Silakan klik tautan didalam e-mail ini. Silakan\n" "hubungi kami jika Anda tidak menerimanya dalam beberapa menit." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Token Salah" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Link reset kata sandi tidak valid, mungkin karena telah digunakan. Silakan " "minta reset kata sandi baru." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Kata sandi Anda telah diubah." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Setel Kata Sandi" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Konfirmasi Alamat E-mail" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Daftar" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Daftar" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Sudah memiliki akun? Silakan masuk." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Daftar Ditutup" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Mohon maaf, tapi pendaftaran saat ini ditutup." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Catatan" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "Anda sudah masuk sebagai %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Peringatan:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Anda saat ini tidak memiliki alamat e-mail yang disetel. Anda seharusnya " "menambahkan alamat e-mail untuk menerima notifikasi, mereset kata sandi, dll." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Verifikasi Alamat E-mail Anda" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Kami telah mengirimkan e-mail kepada Anda untuk verifikasi. Ikuti tautan " "yang disediakan untuk menyelesaikan proses pendaftaran. Silahkan hubungi " "kami jika Anda tidak menerimanya dalam beberapa menit." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Bagian dari situs ini mengharuskan kami untuk memverifikasi bahwa\n" "Anda adalah apa yang Anda klaim. Untuk tujuan ini, kami mengharuskan Anda\n" "memverifikasi kepemilikan alamat e-mail Anda. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Kami telah mengirimkan e-mail kepada Anda untuk\n" "verifikasi. Silakan klik tautan didalam e-mail ini. Silakan\n" "hubungi kami jika Anda tidak menerimanya dalam beberapa menit." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Catatan: Anda masih bisa mengganti alamat e-mail Anda." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "rahasia token" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Kegagalan Login Jejaring Sosial" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Terjadi kesalahan saat mencoba untuk masuk menggunakan akun jejaring sosial " "Anda." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Koneksi Akun" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Anda dapat masuk ke akun Anda menggunakan salah satu dari akun jejaring " "sosial berikut:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Anda saat ini tidak memiliki akun jejaring sosial terhubung ke akun ini." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Tambahkan Akun Pihak Ketiga" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Login Dibatalkan" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Anda memutuskan untuk membatalkan masuk ke situs kami menggunakan salah satu " "dari akun Anda. Jika ini adalah kesalahan, silakan lanjutkan ke masuk." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Akun sosial telah terhubung." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Akun sosial sudah terhubung ke akun lain." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Akun sosial telah terputus." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Anda akan menggunakan akun %(provider_name)s untuk masuk ke\n" "%(site_name)s. Sebagai langkah akhir, silakan lengkapi formulir berikut:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Mohon masuk dengan salah satu\n" #~ "dari akun pihak ketiga Anda. Atau, daftar\n" #~ "untuk akun %(site_name)s dan masuk di bawah:" #~ msgid "or" #~ msgstr "atau" #~ msgid "change password" #~ msgstr "ubah kata sandi" #~ msgid "OpenID Sign In" #~ msgstr "Masuk Dengan OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Alamat e-mail ini sudah terhubung dengan akun lain." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Kami telah mengirimkan e-mail. Mohon hubungi kami jika Anda tidak " #~ "menerimanya dalam beberapa menit." django-allauth-0.58.2/allauth/locale/it/000077500000000000000000000000001452212273200200055ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/it/LC_MESSAGES/000077500000000000000000000000001452212273200215725ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/it/LC_MESSAGES/django.po000066400000000000000000001105051452212273200233760ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Translators: # guglielmo , 2014 # joke2k , 2014 # puntosit , 2014 # Sandro , 2019. msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2020-10-15 19:55+0200\n" "Last-Translator: Sandro \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Questo username non può essere usato. Per favore scegline un altro." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Troppo tentativi di accesso. Riprova più tardi." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Un altro utente si è già registrato con questo indirizzo e-mail." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Password attuale" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "La password deve essere lunga almeno {0} caratteri." #: account/apps.py:9 msgid "Accounts" msgstr "Account" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Devi digitare la stessa password." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Password" #: account/forms.py:94 msgid "Remember Me" msgstr "Ricordami" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Questo account non è attualmente attivo." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "L'indirizzo e-mail e/o la password che hai usato non sono corretti." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Lo username e/o la password che hai usato non sono corretti." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Indirizzo e-mail" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Username" #: account/forms.py:134 msgid "Username or email" msgstr "Username o e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Login" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Password dimenticata?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-mail (di nuovo)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Conferma dell'indirizzo emai" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (opzionale)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Devi digitare la stessa password ogni volta." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Password (nuovamente)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Questo indirizzo e-mail è già associato a questo account." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Non hai ancora verificato il tuo indirizzo e-mail." #: account/forms.py:524 msgid "Current Password" msgstr "Password attuale" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Nuova password" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Nuova password (nuovamente)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Per favore digita la tua password attuale." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "L'indirizzo e-mail non è assegnato a nessun account utente" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Il codice per il reset della password non è valido." #: account/models.py:21 msgid "user" msgstr "utente" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "indirizzo e-mail" #: account/models.py:28 msgid "verified" msgstr "verificato" #: account/models.py:29 msgid "primary" msgstr "primario" #: account/models.py:35 #, fuzzy #| msgid "email address" msgid "email addresses" msgstr "indirizzo e-mail" #: account/models.py:141 msgid "created" msgstr "creato" #: account/models.py:142 msgid "sent" msgstr "inviato" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "chiave" #: account/models.py:148 msgid "email confirmation" msgstr "email di conferma" #: account/models.py:149 msgid "email confirmations" msgstr "email di conferma" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Esiste già un account con questo indirizzo e-mail. Per favore entra con " "quell'account, e successivamente connetti il tuo account %s." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Il tuo account non ha ancora nessuna password." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Non hai ancora verificato il tuo indirizzo e-mail." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Account" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "provider" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "provider" #: socialaccount/models.py:52 msgid "name" msgstr "nome" #: socialaccount/models.py:54 msgid "client id" msgstr "Id cliente" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "App ID, o consumer key" #: socialaccount/models.py:59 msgid "secret key" msgstr "secret key" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:65 msgid "Key" msgstr "Chiave" #: socialaccount/models.py:77 msgid "social application" msgstr "" #: socialaccount/models.py:78 msgid "social applications" msgstr "" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "Ultimo accesso" #: socialaccount/models.py:116 msgid "date joined" msgstr "data iscrizione" #: socialaccount/models.py:117 msgid "extra data" msgstr "dati aggiuntivi" #: socialaccount/models.py:121 msgid "social account" msgstr "" #: socialaccount/models.py:122 msgid "social accounts" msgstr "" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "scade il" #: socialaccount/models.py:170 msgid "social application token" msgstr "" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Dati profilo non validi" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Risposta non valida alla richiesta di un token da \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Risposta non valida alla richiesta di un token da \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Nessuna richiesta di token salvata per \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Nessun token di accesso salvato per \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Nessuna accesso alle risorse private a \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Risposta non valida alla richiesta di un token da \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Account non attivo" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Questo account non è attivo." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Indirizzi e-mail" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "I seguenti indirizzi e-mail sono associati al tuo account:" #: templates/account/email.html:23 msgid "Verified" msgstr "Verificato" #: templates/account/email.html:27 msgid "Unverified" msgstr "Non verificato" #: templates/account/email.html:32 msgid "Primary" msgstr "Principale" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Rendi Principale" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Re-invia la Verifica" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Rimuovi" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Aggiungi un Indirizzo e-mail" #: templates/account/email.html:70 msgid "Add Email" msgstr "Aggiungi e-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Sei sicuro di voler rimuovere l'indirizzo e-mail selezionato?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Ciao da %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Grazie per usare %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "L'Utente %(user_display)s di %(site_domain)s ha registrato questo indirizzo " "e-mail.\n" "Per confermare, clicca qui %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Conferma l'Indirizzo E-Mail" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Hai ricevuto questa mail perché hai richiesto la password per il tuo account " "utente.\n" "Se non hai richiesto tu il reset della password, ignora questa mail, " "altrimenti clicca sul link qui sotto per fare il reset della password." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Nel caso tu lo abbia dimenticato, il tuo nome utente è %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-Mail per re-impostare la password " #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Hai ricevuto questa mail perché hai richiesto la password per il tuo account " "utente.\n" "Se non hai richiesto tu il reset della password, ignora questa mail, " "altrimenti clicca sul link qui sotto per fare il reset della password." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Indirizzi e-mail" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "I seguenti indirizzi e-mail sono associati al tuo account:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Dobbiamo verificare il tuo indirizzo e-mail principale." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Conferma l'Indirizzo E-Mail" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Conferma l'Indirizzo E-Mail" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Conferma che %(email)s è un indirizzo e-" "mail per l'utente %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Conferma" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Questo Social Account è già collegato ad un altro account." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Questo link di conferma e-mail è scaduto o non è valido. Ti chiediamo di ripetere la richiesta di conferma via e-mail." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Accedi" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Se non hai ancora creato un account, \n" "Registrati." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Disconnetti" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Sei sicuro di volerti disconnettere?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Non puoi eliminare il tuo indirizzo e-mail principale (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Abbiamo inviato una conferma all’indirizzo %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Hai appena confermato l’indirizzo e-mail %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Indirizzo E-Mail rimosso %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Ti sei collegato con successo come %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Ti sei scollegato." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Password cambiata con successo." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Password impostata correttamente." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Indirizzo e-mail principale definito." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Dobbiamo verificare il tuo indirizzo e-mail principale." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Cambia la tua Password" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Password dimenticata?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Re-imposta la Password" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Hai dimenticato la tua password? Inserisci qui sotto l'indirizzo e-mail con " "cui ti sei registrato, ti invieremo una mail con un link per re-impostarla." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Re-imposta la mia Password" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "Se hai qualche problema a re-impostare la password, contattaci." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Ti abbiamo inviato un messaggio e-mail di verifica.\n" "Clicca sul link contenuto nella mail.\n" "Se non dovessi ricevere il messaggio entro qualche minuto, contattaci.\n" "Grazie." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Token non valido" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Il link di re-impostazione della password non è valido, probabilmente è già " "stato usato. Inoltra una nuova richiesta di " "re-impostazione della password." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Password cambiata." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Imposta una password" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Conferma l'Indirizzo E-Mail" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registrati" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Registrazione" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Hai già un account valido? Accedi." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Registrazioni Chiuse" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Spiacenti, le registrazioni sono per il momento sospese." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Nota" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "sei già collegato come %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Attenzione:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Non hai ancora indicato nessun indirizzo e-mail. Devi inserirne uno se vuoi " "ricevere notifiche, recuperare la password, ecc." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Verifica il tuo indirizzo E-Mail" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Ti abbiamo inviato una e-mail con un Link inserito all'interno. Per " "completare il procedimento di verifica clicca sul Link. Contattaci se non " "ricevi la mail entro qualche minuto." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Per utilizzare questa parte del sito dobbiamo verificare\n" "che sei veramente chi dici di essere. Sarà sufficiente\n" "dimostrare che hai effettivamente accesso al tuo indirizzo e-mail. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Ti abbiamo inviato un messaggio e-mail di verifica.\n" "Clicca sul link contenuto nella mail.\n" "Se non dovessi ricevere il messaggio entro qualche minuto, contattaci.\n" "Grazie." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Nota: Puoi cambiare in ogni " "momento l'indirizzo e-mail usato per la registrazione." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Accesso Social fallito" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "C'è stato un errore mentre hai provato a collegarti con il tuo account " "Social Network." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Connessioni all'account" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Puoi collegarti al tuo account utilizzando uno dei seguenti servizi di " "autenticazione Social Network:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Non hai account di nessun Social Network collegato a questo account." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Aggiungi un account di un Social Network" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Accesso annullato" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Hai deciso di cancellare l'accesso a questo sito usando uno dei tuoi account " "attivi. Se è stato un errore, ripeti l'Accesso." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "L'account Social Network è stato collegato." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Questo Social Account è già collegato ad un altro account." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Social Account scollegato." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Stai per usare il tuo account su %(provider_name)s per effettuare il login " "su\n" "%(site_name)s. Come ultima operazione ti chiediamo di riempire il form qui " "sotto:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Per favore, accedi con uno\n" #~ "dei tuoi account social, o registra\n" #~ "il tuo account per %(site_name)s e accedi:" #~ msgid "or" #~ msgstr "o" #~ msgid "change password" #~ msgstr "cambia password" #~ msgid "OpenID Sign In" #~ msgstr "Accesso con OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Questo indirizzo e-mail è gia associato a un altro account." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Ti abbiamo spedito una mail. Contattaci se non la ricevi entro qualche " #~ "minuto." #~ msgid "Account" #~ msgstr "Account" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Il login e/o la password che hai usato non sono corretti." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "Gli username possono contenere solo lettere, cifre e @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Questo username è già in uso. Per favore scegline un altro." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Accedi" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Hai appena confermato che %(email)s è un " #~ "indirizzo e-mail valido per l'utente %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Grazie per aver utilizzato questo Sito!" django-allauth-0.58.2/allauth/locale/ja/000077500000000000000000000000001452212273200177635ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ja/LC_MESSAGES/000077500000000000000000000000001452212273200215505ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ja/LC_MESSAGES/django.po000066400000000000000000001153401452212273200233560ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2022-11-28 12:06+0900\n" "Last-Translator: Sora Yanai \n" "Language-Team: LANGUAGE \n" "Language: ja-JP\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "このユーザー名は使用できません。他のユーザー名を選んでください。" #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "ログイン失敗が連続しています。時間が経ってからやり直してください。" #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "他のユーザーがこのメールアドレスを使用しています。" #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "現在のパスワード" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "パスワードは {0} 文字以上の長さが必要です。" #: account/apps.py:9 msgid "Accounts" msgstr "アカウント" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "同じパスワードを入力してください。" #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "パスワード" #: account/forms.py:94 msgid "Remember Me" msgstr "ログインしたままにする" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "このアカウントは現在無効です。" #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "入力されたメールアドレスもしくはパスワードが正しくありません。" #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "入力されたユーザー名もしくはパスワードが正しくありません。" #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "メールアドレス" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "メールアドレス" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "ユーザー名" #: account/forms.py:134 msgid "Username or email" msgstr "ユーザー名またはメールアドレス" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "ログイン" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "パスワードをお忘れですか?" #: account/forms.py:312 msgid "Email (again)" msgstr "メールアドレス(確認用)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "メールアドレスの確認" #: account/forms.py:324 msgid "Email (optional)" msgstr "メールアドレス(オプション)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "同じパスワードを入力してください。" #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "パスワード(再入力)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "このメールアドレスはすでに登録されています。" #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "確認済みのメールアドレスの登録が必要です。" #: account/forms.py:524 msgid "Current Password" msgstr "現在のパスワード" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "新しいパスワード" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "新しいパスワード(再入力)" #: account/forms.py:538 msgid "Please type your current password." msgstr "現在のパスワードを入力してください。" #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "このメールアドレスで登録されたユーザーアカウントがありません。" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "パスワードリセットトークンが無効です。" #: account/models.py:21 msgid "user" msgstr "ユーザー" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "メールアドレス" #: account/models.py:28 msgid "verified" msgstr "確認済み" #: account/models.py:29 msgid "primary" msgstr "メイン" #: account/models.py:35 msgid "email addresses" msgstr "メールアドレス" #: account/models.py:141 msgid "created" msgstr "作成日時" #: account/models.py:142 msgid "sent" msgstr "送信日時" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "キー" #: account/models.py:148 msgid "email confirmation" msgstr "メールアドレスの確認" #: account/models.py:149 msgid "email confirmations" msgstr "メールアドレスの確認" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "このメールアドレスを使用するアカウントが既にあります。そのアカウントにログイ" "ンしてから%sアカウントを接続してください" #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "アカウントにパスワードを設定する必要があります。" #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "確認済みのメールアドレスの登録が必要です。" #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "外部アカウント" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "プロバイダー" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "プロバイダー" #: socialaccount/models.py:52 msgid "name" msgstr "ユーザー名" #: socialaccount/models.py:54 msgid "client id" msgstr "ユーザID" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "App IDもしくはコンシューマキー" #: socialaccount/models.py:59 msgid "secret key" msgstr "シークレットキー" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" "APIシークレット、クライアントシークレット、またはコンシューマーシークレット" #: socialaccount/models.py:65 msgid "Key" msgstr "キー" #: socialaccount/models.py:77 msgid "social application" msgstr "ソーシャルアプリケーション" #: socialaccount/models.py:78 msgid "social applications" msgstr "ソーシャルアプリケーション" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "最終ログイン" #: socialaccount/models.py:116 msgid "date joined" msgstr "アカウント作成日" #: socialaccount/models.py:117 msgid "extra data" msgstr "エクストラデータ" #: socialaccount/models.py:121 msgid "social account" msgstr "ソーシャルアカウント" #: socialaccount/models.py:122 msgid "social accounts" msgstr "ソーシャルアカウント" #: socialaccount/models.py:156 msgid "token" msgstr "トークン" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) もしくは Access Token (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "トークンシークレット" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) もしくは Refresh Token (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "失効期限" #: socialaccount/models.py:170 msgid "social application token" msgstr "ソーシャルアプリケーショントークン" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "ソーシャルアプリケーショントークン" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "無効なプロファイルデータ" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "" "不正なレスポンスが返されたため、 \"%s\" からリクエストトークンを取得できませ" "んでした。" #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "" "不正なレスポンスが返されたため、 \"%s\" からアクセストークンを取得できません" "でした。" #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "\"%s\" のリクエストトークンを保存できませんでした。" #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "\"%s\" のアクセストークンを保存できませんでした。" #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "\"%s\" の情報にアクセスできませんでした。" #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "" "不正なレスポンスが返されたため、 \"%s\" からリクエストトークンを取得できませ" "んでした。" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "無効なアカウント" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "このアカウントは無効です。" #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "メールアドレス" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "以下のメールアドレスがアカウントに登録されています:" #: templates/account/email.html:23 msgid "Verified" msgstr "確認済み" #: templates/account/email.html:27 msgid "Unverified" msgstr "未確認" #: templates/account/email.html:32 msgid "Primary" msgstr "メイン" #: templates/account/email.html:42 msgid "Make Primary" msgstr "メインにする" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "確認メールを再送する" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "削除" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "メールアドレスの登録" #: templates/account/email.html:70 msgid "Add Email" msgstr "メールアドレスの登録" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "選択されたメールアドレスを削除してもよろしいですか?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "こんにちは、%(site_name)sです。" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "%(site_name)sを利用いただきありがとうございます!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "%(user_display)s さんが %(site_domain)s にこのメールアドレスを登録しようとし" "ています。問題がなければ、確認のために以下のURLをクリックしてください。\n" "%(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "メールアドレスを確認してください" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "このメールは、あなた(もしくは別の誰か)がパスワードの再設定を行おうとしたた" "めに送られました。\n" "パスワードの再設定を要求したのがあなたではない場合、このメールは無視してくだ" "さい。パスワードを再設定するためには、以下のリンクをクリックしてください。" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "あなたのアカウント(ユーザー名)は %(username)s です。" #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "パスワード再設定メール" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "このメールは、あなた(もしくは別の誰か)がパスワードの再設定を行おうとしたた" "めに送られました。\n" "パスワードの再設定を要求したのがあなたではない場合、このメールは無視してくだ" "さい。パスワードを再設定するためには、以下のリンクをクリックしてください。" #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "メールアドレス" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "以下のメールアドレスがアカウントに登録されています:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "メインのメールアドレスは確認済みでなければいけません。" #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "メールアドレスの確認" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "メールアドレス" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "メールアドレスの確認" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "メールアドレス %(email)s がユーザー " "%(user_display)s さんのものであることを確認してください。" #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "確認する" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "この外部アカウントは他のアカウントにリンクされています。" #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "メールアドレス確認用のリンクが不正か、期限が切れています。確認用のメールを再送してください。" #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "ログイン" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "アカウントをまだお持ちでなければ、こちらから ユー" "ザー登録 してください。" #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "ログアウト" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "ログアウトしますか?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "メインのメールアドレス(%(email)s)を削除することはできません。" #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "%(email)s に確認メールを送信しました。" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "%(email)s は確認されました。" #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "メールアドレス %(email)s を削除しました。" #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "ユーザー %(name)s としてログインしました。" #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "ログアウトしました。" #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "パスワードが変更されました。" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "パスワードが設定されました。" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "メインのメールアドレスが設定されました。" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "メインのメールアドレスは確認済みでなければいけません。" #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "パスワード変更" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "パスワードをお忘れですか?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "パスワード再設定" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "パスワードをお忘れですか?パスワードをリセットするために、メールアドレスを入" "力してください。" #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "パスワードをリセット" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "パスワードの再設定に問題がある場合はご連絡ください。" #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "確認のためのメールを送信しましたので、記載されたリンクをクリックしてくださ" "い。\n" "数分以内にメールが届かない場合はご連絡ください。" #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "不正なトークン" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "パスワード再設定用のリンクが不正です。すでに使用された可能性があります。もう" "一度 パスワードの再設定をお試しくださ" "い。" #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "パスワードが変更されました。" #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "パスワード設定" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "メールアドレスの確認" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "ユーザー登録" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "ユーザー登録" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "すでにアカウントをお持ちであれば、こちらから ログイ" "ン してください。" #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "ユーザー登録停止中" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "申し訳ありません、現在ユーザー登録を停止しています。" #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "注意" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "%(user_display)s さんとしてログイン中です。" #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "注意:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "メールアドレスが設定されていません。通知を受け取ったり、パスワードをリセット" "したりするためにはメールアドレスを登録する必要があります。" #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "メールアドレスを確認してください" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "確認のメールを送信しました。メールに記載されたリンクをクリックして、ユーザー" "登録を完了させてください。数分待っても確認のメールが届かない場合はご連絡くだ" "さい。" #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "このページにアクセスするためには、本人確認が必要です。\n" "そのために、登録されているメールアドレスがご自身のものであることを確認してい" "ただきます。" #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "確認のためのメールを送信しましたので、記載されたリンクをクリックしてくださ" "い。\n" "数分以内にメールが届かない場合はご連絡ください。" #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "注意: メールアドレスの変更をし" "ていただくことも可能です。" #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "トークンシークレット" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "ソーシャルネットワークログインに失敗しました" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "ソーシャルネットワークアカウントにログインする際にエラーが発生しました。" #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "アカウントリンク" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "以下の外部アカウントを使ってログインすることができます:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "あなたのカウントに結びつけられた外部アカウントはありません。" #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "外部アカウントを追加する" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "%(provider)sと連携する" #: templates/socialaccount/login.html:13 #, fuzzy, python-format #| msgid "" #| "You are about to connect a new third party account from %(provider)s." msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" "%(provider)sの新しいサードパーティーアカウントを連携しようとしています。" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "%(provider)sでログインする" #: templates/socialaccount/login.html:20 #, fuzzy, python-format #| msgid "" #| "You are about to sign in using a third party account from %(provider)s." msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" "%(provider)sのサードパーティーアカウントを使用してログインしようとしていま" "す。" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "続ける" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "ログインはキャンセルされました" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "既存の外部アカウントを使ったログインはキャンセルされました。\n" "やり直される場合はログインページにお進みくださ" "い。" #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "外部アカウントがリンクされました" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "この外部アカウントは他のアカウントにリンクされています。" #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "外部アカウントのリンクが解除されました。" #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "%(provider_name)s アカウントを使って %(site_name)s にログインしようとしていま" "す。\n" "ユーザー登録のために、以下のフォームに記入してください。" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "お持ちの外部アカウントでログインするか、%(site_name)sに ユーザー登録 してログインしてください。" #~ msgid "or" #~ msgstr "または" #~ msgid "change password" #~ msgstr "パスワード変更" #~ msgid "OpenID Sign In" #~ msgstr "OpenID ログイン" #~ msgid "This email address is already associated with another account." #~ msgstr "このメールアドレスは別のアカウントで使用されています。" django-allauth-0.58.2/allauth/locale/ka/000077500000000000000000000000001452212273200177645ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ka/LC_MESSAGES/000077500000000000000000000000001452212273200215515ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ka/LC_MESSAGES/django.po000066400000000000000000001355061452212273200233650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Nikoloz Naskidashvili , 2021. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Nikoloz Naskidashvili \n" "Language-Team: LANGUAGE \n" "Language: ka\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "" "ამ მომხმარებლის სახელის გამოყენება შეუძლებელია. გთხოვთ გამოიყენოთ სხვა." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "შესვლის ძალიან ბევრი წარუმატებელი მცდელობა. მოგვიანებით სცადეთ." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "მომხმარებელი ამ ელ. ფოსტით უკვე დარეგისტრირებულია." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "მიმდინარე პაროლი" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "პაროლი უნდა შეიცავდეს მინიმუმ {0} სიმბოლოს." #: account/apps.py:9 msgid "Accounts" msgstr "მომხმარებლის ანგარიშები" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "თქვენ უნდა აკრიფოთ ერთი და იგივე პაროლი ყოველ ჯერზე." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "პაროლი" #: account/forms.py:94 msgid "Remember Me" msgstr "დამიმახსოვრე" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "ეს ანგარიში ამჟამად გაუქმებულია." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "თქვენს მიერ მითითებული ელ. ფოსტა ან პაროლი არასწორია." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "თქვენს მიერ მითითებული მომხმარებლის სახელი ან პაროლი არასწორია." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "ელ. ფოსტა" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "ელ. ფოსტა" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "მომხმარებლის სახელი" #: account/forms.py:134 msgid "Username or email" msgstr "მომხმარებლის სახელი ან ელ. ფოსტა" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "შესვლა" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "დაგავიწყდა პაროლი?" #: account/forms.py:312 msgid "Email (again)" msgstr "ელ. ფოსტა (გაამეორეთ)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "ელ. ფოსტის დადასტურება" #: account/forms.py:324 msgid "Email (optional)" msgstr "ელ. ფოსტა (არ არის აუცილებელი)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "თქვენ უნდა ჩაწეროთ ერთი და იგივე ელ. ფოსტა ყოველ ჯერზე." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "პაროლი (გაამეორეთ)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "ეს ელ.ფოსტის მისამართი უკვე დაკავშირებულია ამ ანგარიშთან." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "თქვენ არ შეგიძლიათ დაამატოთ %d- ზე მეტი ელექტრონული ფოსტის მისამართი." #: account/forms.py:524 msgid "Current Password" msgstr "მიმდინარე პაროლი" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "ახალი პაროლი" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "ახალი პაროლი (გაამეორეთ)" #: account/forms.py:538 msgid "Please type your current password." msgstr "გთხოვთ აკრიფეთ მიმდინარე პაროლი." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "" "ეს ელექტრონული ფოსტის მისამართი არ არის მიბმული რომელიმე მომხმარებლის " "ანგარიშზე" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "პაროლის აღდგენის კოდი არასწორია." #: account/models.py:21 msgid "user" msgstr "მომხმარებელი" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "ელ. ფოსტა" #: account/models.py:28 msgid "verified" msgstr "დადასტურებული" #: account/models.py:29 msgid "primary" msgstr "პირველადი" #: account/models.py:35 msgid "email addresses" msgstr "ელ. ფოსტის ანგარიშები" #: account/models.py:141 msgid "created" msgstr "შექმნილი" #: account/models.py:142 msgid "sent" msgstr "გაგზავნილი" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "კოდი" #: account/models.py:148 msgid "email confirmation" msgstr "ელ. ფოსტის დადასტურება" #: account/models.py:149 msgid "email confirmations" msgstr "ელ. ფოსტის დადასტურებები" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "მომხმარებელი უკვე არსებობს ამ ელ.ფოსტის მისამართით.%s-ით შესვლა ვერ " "მოხერხდება." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "თქვენს ანგარიშს არ აქვს პაროლი დაყენებული." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "თქვენს ანგარიშს არ აქვს დადასტურებული ელ. ფოსტა." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "სოციალური ანგარიშები" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "პროვაიდერი" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "პროვაიდერი" #: socialaccount/models.py:52 msgid "name" msgstr "სახელი" #: socialaccount/models.py:54 msgid "client id" msgstr "კლიენტის id" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "აპლიკაციის ID ან მომხმარებლის კოდი" #: socialaccount/models.py:59 msgid "secret key" msgstr "საიდუმლო კოდი" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" "API-ს საიდუმლო კოდი, კლიენტის საიდუმლო კოდი ან მომხმარებლის საიდუმლო კოდი" #: socialaccount/models.py:65 msgid "Key" msgstr "კოდი" #: socialaccount/models.py:77 msgid "social application" msgstr "სოციალური აპლიკაცია" #: socialaccount/models.py:78 msgid "social applications" msgstr "სოციალური აპლიკაციები" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "ბოლო შესვლის თარიღი" #: socialaccount/models.py:116 msgid "date joined" msgstr "ანგარიშის შექმნის თარიღი" #: socialaccount/models.py:117 msgid "extra data" msgstr "სხვა მონაცემები" #: socialaccount/models.py:121 msgid "social account" msgstr "სოციალური ანგარიში" #: socialaccount/models.py:122 msgid "social accounts" msgstr "სოციალური ანგარიშები" #: socialaccount/models.py:156 msgid "token" msgstr "კოდი" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) ან access token (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "საიდუმლო კოდი" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) ან refresh token (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "ვადა გაუსვლის თარიღი" #: socialaccount/models.py:170 msgid "social application token" msgstr "სოციალური ანგარიშის კოდი" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "სოციალური ანგარიშების კოდი" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "პროფილის მონაცემები არასწორია" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "არასწორი პასუხი მოთხოვნის მიღებისას \"%s\"-დან." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "არასწორი პასუხი მოთხოვნის მიღებისას \"%s\"-დან." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "მოთხოვნის კოდი არ არის შენახული \"%s\" -სთვის." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "მოთხოვნის წვდომის კოდი არ არის შენახული \"%s\" -სთვის." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "\"%s\" - ზე კერძო რესურსებზე წვდომა არ არის." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "არასწორი პასუხი მოთხოვნის მიღებისას \"%s\"-დან." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "ანგარიში გაუქმებულია" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "ეს ანგარიში გაუქმებულია" #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "ელ. ფოსტის მისამართები" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "შემდეგი ელ.ფოსტის მისამართები ასოცირდება თქვენს ანგარიშთან:" #: templates/account/email.html:23 msgid "Verified" msgstr "დადასტურებული" #: templates/account/email.html:27 msgid "Unverified" msgstr "არ არის დადასტურებელი" #: templates/account/email.html:32 msgid "Primary" msgstr "პირველადი" #: templates/account/email.html:42 msgid "Make Primary" msgstr "გახადე პირველადი" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "ვერიფიკაციის თავიდან გაგზავნა" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "წაშლა" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "ელ. ფოსტის მისამართის დამატება" #: templates/account/email.html:70 msgid "Add Email" msgstr "ელ. ფოსტის დამატება" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "ნამდვილად გსურთ წაშალოთ არჩეული ელ.ფოსტის მისამართი?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "მოგესალმებით %(site_name)s!-დან" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "მადლობა რომ იყენებ %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "თქვენ იღებთ ამ ელ. წერილს რადგან მომხმარებემა - %(user_display)s მიუთითა " "თქვენი ელ.ფოსტის ანგარიში რომ დარეგისტრირდეს შემდეგ საიტზე - " "%(site_domain)s.\n" "\n" "იმისთვის, რომ დაადასტუროთ ეს, გადადით შემდეგ ლინკზე %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "გთხოვთ დაადასტუროთ თქვენი ელ. ფოსტა" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "თქვენ იღებთ ამ ელ. წერილს რადგან თქვენ ან სხვა ვიღაცამ მოითხოვა პაროლის " "შეცვლა თქვენს ანგარიშზე.\n" "თქვენ შეგიძლიათ უბრალოდ დააიგნოროთ ეს ელ. წერილი თუ ეს თქვენი მოთხოვნა არ " "იყო. დააჭირეთ ქვემოთ მოცემულ ლინკს პაროლის აღსადგენად." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "თუ თქვენ დაგავიწყდათ, თქვენი მომხმარებლის სახელია: %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "პაროლის აღდგენის ელ. წერილი" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "თქვენ იღებთ ამ ელ. წერილს რადგან თქვენ ან სხვა ვიღაცამ მოითხოვა პაროლის " "შეცვლა თქვენს ანგარიშზე.\n" "თქვენ შეგიძლიათ უბრალოდ დააიგნოროთ ეს ელ. წერილი თუ ეს თქვენი მოთხოვნა არ " "იყო. დააჭირეთ ქვემოთ მოცემულ ლინკს პაროლის აღსადგენად." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "ელ. ფოსტის მისამართები" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "შემდეგი ელ.ფოსტის მისამართები ასოცირდება თქვენს ანგარიშთან:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "თქვენი პირველადი ელ. ფოსტა უნდა იყოს დადასტურებული" #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "დაადასტურეთ ელ. ფოსტა" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "ელ. ფოსტა" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "დაადასტურეთ ელ. ფოსტა" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "გთხოვთ დაადასტურეთ, რომ %(email)s არის ელ. " "ფოსტის მისამართი მომხმარებლისთვის: %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "დადასტურება" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "ეს სოციალური ანგარიში უკვე მიბმულია სხვა მომხმარებლის ანგარიშთან." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "ეს ელ. ფოსტის დადასტურების ლინკი არასწორია ან ვადაგასულია. გთხოვთ გააკეთოთ ახალი მოთხოვნა." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "შესვლა" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "თუ არ გაქვთ შექმნილი ანგარიში, მაშინ გთხოვთ\n" "დარეგისტრირდით." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "გასვლა" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "დარწმუნებული ხარ, რომ გინდა გასვლა?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "შენ არ შეგიძლია წაშალო შენი პირველადი ელ. ფოსტა (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "ელ. ფოსტის დადასტურების წერილი გაგზავნილია %(email)s მისამართით." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "თქვენ დაადასტურეთ %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "ელ. ფოსტა %(email)s წაშლილია." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "თქვენ წარმატებით შეხვედით %(name)s-ად." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "თქვენ წარმატებით გახვედით თქვენი ანგარიშიდან." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "პაროლი წარმატებით შეცვლილია." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "პაროლი წარმატებით დაყენებულია." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "პირველადი ელ. ფოსტა წარმატებით დაყენებულია" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "თქვენი პირველადი ელ. ფოსტა უნდა იყოს დადასტურებული" #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "პაროლის შეცვლა" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "დაგავიწყდა პაროლი?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "პაროლის შეცვლა" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "დაგავიწყდათ თქვენი პაროლი? ჩაწერეთ თქვენი ელ. ფოსტა ქვემოთ და ჩვენ " "გამოგიგზავნით ელ. წერილს აღსადგენად." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "ჩემი პაროლის შეცვლა" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "გთხოვთ დაგვიკავშირდით თუ გაქვთ პრობლემა პაროლის შეცვლასთან." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "ჩვენ გამოგიგზავნეთ ელ. წერილი\n" "ვერიფიკაციისთვის. გთხოვთ მიჰყევით მასში მოცემულ ლინკს. გთხოვთ\n" "გთხოვთ დაგვიკავშირდით თუ არ მიიღებთ მას რამდენიმე წუთში." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "შეცდომა, ცუდი კოდი" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "პაროლის აღდგენის ლინკი არასწორია, ალბათ იმის გამო რომ უკვე გამოყენებული " "იქნა. გთხოვთ მოითხოვეთ პაროლის შეცვლა " "თავიდან." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "თქვენი პაროლი შეცვლილია" #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "პაროლის დაყენება" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "დაადასტურეთ ელ. ფოსტა" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "რეგისტრაცია" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "რეგისტრაცია" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "უკვე გაქვს ანგარიში? შესვლა." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "რეგისტრაცია დროებით გაუქმებულია" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "ბოდიში, რეგისტრაცია დროებით გაუქმებულია" #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "შენიშვნა" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "თქვენ უკვე ხართ შესული როგორც %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "გაფრთხილება:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "თქვენ ამჟამად არ გაქვთ რაიმე ელ.ფოსტის მისამართი დაყენებული. უნდა დაამატოთ " "ელექტრონული ფოსტის მისამართი, რათა მიიღოთ შეტყობინებები, აღადგინოთ პაროლი და " "ა.შ." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "დაადასტურეთ თქვენი ელ. ფოსტა" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "ჩვენ გამოგიგზავნეთ ელ. წერილი ვერიფიკაციისთვის. მიჰყევით მასში მოცემულ " "ლინკს, რომ დაასრულოთ რეგისტრაცია. გთხოვთ დაგვიკავშირდით თუ არ მიიღებთ მას " "რამდენიმე წუთში." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "საიტის ეს ნაწილი ითხოვს იმის დადასტურებას, რომ\n" "თქვენ ხართ ის, ვინც აცხადებთ, რომ ხართ. ამიტომ ჩვენ ვითხოვთ\n" "თქვენი ელ. ფოსტის მისამართის საკუთრების დადასტურებას. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "ჩვენ გამოგიგზავნეთ ელ. წერილი\n" "ვერიფიკაციისთვის, მიჰყევით მასში მოცემულ ლინკს. გთხოვთ\n" "დაგვიკავშირდით თუ არ მიიღებთ მას რამდენიმე წუთში." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "შენიშვნა: თქვენ ჯერ კიდეგ შეგიძლიათ შეცვალოთ ელ. ფოსტის მისამართო." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "საიდუმლო კოდი" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "შეცდომა სოციალური ანგარიშით შესვლისას" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "დაფიქსირდა შეცდომა სოციალური ანგარიშით შესვლის დროს." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "ანგარიშის კავშირები" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "თქვენ შეგიძლიათ შეხვიდეთ თქვენს ანგარიშში რომელიმე შემდეგი სოციალური " "ანგარიშის გამოყენებით:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "თქვენ ამჟამად არ გაქვთ ამ ანგარიშთან დაკავშირებული სოციალური ქსელის " "ანგარიშები." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "სოციალური ანგარიშის დამატება" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "%(provider)s ანგარიშის დაკავშირება" #: templates/socialaccount/login.html:13 #, fuzzy, python-format #| msgid "" #| "You are about to connect a new third party account from %(provider)s." msgid "You are about to connect a new third-party account from %(provider)s." msgstr "თქვენ აპირებთ დააკავშიროთ %(provider)s ანგარიში." #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "შესვლა %(provider)s ანგარიშით" #: templates/socialaccount/login.html:20 #, fuzzy, python-format #| msgid "" #| "You are about to sign in using a third party account from %(provider)s." msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "თქვენ აპირებთ შესვლას %(provider)s ანგარიშით." #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "გაგრძელება" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "შესვლა გაუქმებულია" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "თქვენ გადაწყვიტეთ გააუქმოთ შესვლა ჩვენს საიტზე თქვენი ერთ-ერთი არსებული " "ანგარიშის გამოყენებით. თუ ეს შეცდომა იყო, გთხოვთ ხელახლა შედით." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "სოციალური ანგარიში მიბმულია." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "ეს სოციალური ანგარიში უკვე მიბმულია სხვა მომხმარებლის ანგარიშთან." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "სოციალური ანგარიში გაუქმებულია." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "თქვენ აპირებთ გამოიყენოთ თქვენი %(provider_name)s ანგარიში შესასვლელად\n" "%(site_name)s-ზე. როგორც საბოლოო ნაბიჯი, გთხოვთ შეავსეთ ეს ფორმა:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "გთხოვთ შედით რომელიმე\n" #~ "სოციალური ანგარიშით. ან, დარეგისტრირდით \n" #~ "ან შედით %(site_name)s საიტზე" #~ msgid "or" #~ msgstr "ან" #~ msgid "change password" #~ msgstr "პაროლის შეცვლა" #~ msgid "OpenID Sign In" #~ msgstr "OpenID-ით შესვლა" #~ msgid "This email address is already associated with another account." #~ msgstr "ეს ელ.ფოსტის მისამართი უკვე დაკავშირებულია სხვა ანგარიშთან." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "ჩვენ გამოგიგზავნეთ ელ. წერილი. გთხოვთ დაგვიკავშირდით თუ არ მიიღებთ " #~ "რამდენიმე წუთში." django-allauth-0.58.2/allauth/locale/ko/000077500000000000000000000000001452212273200200025ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ko/LC_MESSAGES/000077500000000000000000000000001452212273200215675ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ko/LC_MESSAGES/django.po000066400000000000000000001115241452212273200233750ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "해당 아이디는 이미 사용중입니다. 다른 사용자명을 이용해 주세요." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "너무 많은 로그인 실패가 감지되었습니다. 잠시 후에 다시 시도하세요." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "해당 이메일은 이미 사용되고 있습니다." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "현재 비밀번호" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "비밀번호는 최소 {0}자 이상이어야 합니다." #: account/apps.py:9 msgid "Accounts" msgstr "계정" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "동일한 비밀번호를 입력해야 합니다." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "비밀번호" #: account/forms.py:94 msgid "Remember Me" msgstr "아이디 저장" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "해당 계정은 현재 비활성화 상태입니다." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "이메일 또는 비밀번호가 올바르지 않습니다." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "아이디 또는 비밀번호가 올바르지 않습니다." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "이메일 주소" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "이메일" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "아이디" #: account/forms.py:134 msgid "Username or email" msgstr "아이디 또는 이메일" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "로그인" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "비밀번호를 잊으셨나요?" #: account/forms.py:312 msgid "Email (again)" msgstr "이메일 (확인)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "이메일 주소 확인" #: account/forms.py:324 msgid "Email (optional)" msgstr "이메일 (선택사항)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "동일한 이메일을 입력해야 합니다." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "비밀번호 (확인)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "해당 이메일은 이미 이 계정에 등록되어 있습니다." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "당신의 계정에는 인증된 이메일이 없습니다." #: account/forms.py:524 msgid "Current Password" msgstr "현재 비밀번호" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "새 비밀번호" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "새 비밀번호 (확인)" #: account/forms.py:538 msgid "Please type your current password." msgstr "현재 비밀번호를 입력하세요." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "해당 이메일을 가지고 있는 사용자가 없습니다." #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "비밀번호 초기화 토큰이 올바르지 않습니다." #: account/models.py:21 msgid "user" msgstr "사용자" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "이메일 주소" #: account/models.py:28 msgid "verified" msgstr "인증완료" #: account/models.py:29 msgid "primary" msgstr "주" #: account/models.py:35 msgid "email addresses" msgstr "이메일 주소" #: account/models.py:141 msgid "created" msgstr "생성됨" #: account/models.py:142 msgid "sent" msgstr "전송됨" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "키" #: account/models.py:148 msgid "email confirmation" msgstr "이메일 확인" #: account/models.py:149 msgid "email confirmations" msgstr "이메일 확인" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "해당 이메일을 사용중인 계정이 이미 존재합니다. 해당 계정으로 로그인 후에 %s " "계정으로 연결하세요." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "당신의 계정에 비밀번호가 설정되어있지 않습니다." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "당신의 계정에는 인증된 이메일이 없습니다." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "소셜 계정" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "제공자" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "제공자" #: socialaccount/models.py:52 msgid "name" msgstr "이름" #: socialaccount/models.py:54 msgid "client id" msgstr "클라이언트 아이디" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "앱 아이디 또는 컨슈머 아이디" #: socialaccount/models.py:59 msgid "secret key" msgstr "비밀 키" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "API 비밀 키, 클라이언트 비밀 키, 또는 컨슈머 비밀 키" #: socialaccount/models.py:65 msgid "Key" msgstr "키" #: socialaccount/models.py:77 msgid "social application" msgstr "소셜 어플리케이션" #: socialaccount/models.py:78 msgid "social applications" msgstr "소셜 어플리케이션" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "최종 로그인" #: socialaccount/models.py:116 msgid "date joined" msgstr "가입 날짜" #: socialaccount/models.py:117 msgid "extra data" msgstr "추가 정보" #: socialaccount/models.py:121 msgid "social account" msgstr "소셜 계정" #: socialaccount/models.py:122 msgid "social accounts" msgstr "소셜 계정" #: socialaccount/models.py:156 msgid "token" msgstr "토큰" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) 또는 access token (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "시크릿 토큰" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) 또는 refresh token (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "만료일" #: socialaccount/models.py:170 msgid "social application token" msgstr "소셜 어플리케이션 토큰" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "소셜 어플리케이션 토큰" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "올바르지 않은 프로필 데이터" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "\"%s\".로 부터 request 토큰을 받는 도중 잘못된 응답을 받았습니다." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "\"%s\".로 부터 access 토큰을 받는 도중 잘못된 응답을 받았습니다." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "\"%s\".을(를) 위한 request 토큰이 없습니다." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "\"%s\".을(를) 위한 access 토큰이 없습니다." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "\"%s\".에 접근하기 위한 권한이 없습니다." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "\"%s\".로 부터 request 토큰을 받는 도중 잘못된 응답을 받았습니다." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "계정 비활성" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "해당 계정은 비활성화된 상태입니다." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "이메일 계정" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "다음 이메일 주소들이 당신의 계정에 등록되어 있습니다." #: templates/account/email.html:23 msgid "Verified" msgstr "인증완료" #: templates/account/email.html:27 msgid "Unverified" msgstr "인증대기" #: templates/account/email.html:32 msgid "Primary" msgstr "주" #: templates/account/email.html:42 msgid "Make Primary" msgstr "주 이메일로 지정" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "인증 재전송" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "제거" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "이메일 주소 추가" #: templates/account/email.html:70 msgid "Add Email" msgstr "이메일 추가" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "정말로 선택하신 이메일을 제거하시겠습니까?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "안녕하세요 %(site_name)s입니다!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "%(site_name)s 서비스를 이용해 주셔서 감사합니다!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "%(user_display)s 에 대해 %(site_domain)s 으로부터 이메일을 인증이 전송되었습" "니다.\n" "\n" "%(activate_url)s 에서 인증을 완료하세요." #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "이메일 주소를 확인하세요." #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "회원님의 계정에 대한 암호 변경 요청이 접수되었습니다.\n" "패스워드 초기화를 원치 않는 경우 본 메일을 무시해 주십시요. 변경을 요청할 경" "우 아래 링크를 클릭하세요." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "잊어버린 경우를 대비하여, 회원님의 사용자 이름은 %(username)s 입니다." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "비밀번호 초기화 이메일" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "회원님의 계정에 대한 암호 변경 요청이 접수되었습니다.\n" "패스워드 초기화를 원치 않는 경우 본 메일을 무시해 주십시요. 변경을 요청할 경" "우 아래 링크를 클릭하세요." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "이메일 계정" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "다음 이메일 주소들이 당신의 계정에 등록되어 있습니다." #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "주 이메일은 인증이 필요합니다." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "이메일 확인" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "이메일" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "이메일 확인" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "%(email)s이 사용자 %(user_display)s의 이메일" "이 맞는지 확인해 주세요." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "확인" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "해당 소셜 계정이 이미 다른 계정에 연결되어 있습니다." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "이 이메일 확인 링크는 만료되었거나 유효하지 않습니다. 새로운 이메일 확인 요청을 해주세요." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "로그인" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "계정이 없다면\n" "회원가입을 진행하세요." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "로그아웃" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "정말로 로그아웃 하시겠습니까?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "주 이메일은 제거할 수 없습니다 (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "%(email)s 으로 확인 메일이 전송되었습니다." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "%(email)s 을 확인하였습니다." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "%(email)s 을 제거하였습니다." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "%(name)s 으로 로그인 되었습니다." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "로그아웃 되었습니다." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "비밀번호가 성공적으로 변경되었습니다." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "비밀번호가 성공적으로 설정되었습니다." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "주 이메일이 지정되었습니다." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "주 이메일은 인증이 필요합니다." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "비밀번호 변경" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "비밀번호를 잊으셨나요?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "비밀번호 초기화" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "비밀번호를 잊으셨나요? 아래에 당신의 이메일을 입력하시면, 비밀번호 초기화 이" "메일을 전송해 드리겠습니다." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "비밀번호 초기화" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "비밀번호 초기화에 문제가 있으시면 저희에게 연락주세요." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "인증메일을 전송하였습니다.\n" "이메일의 링크를 클릭하시고,\n" "몇 분 후에도 메일이 전송되지 않으면 저희에게 연락주세요." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "올비르지 않은 토큰" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "비밀번호 초기화 링크가 올바르지 않습니다. 다시 비밀번호 초기화 하세요." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "비밀번호가 변경되었습니다." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "비밀번호 설정" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "이메일 확인" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "회원가입" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "회원가입" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "이미 계정이 있으신가요? 바로 로그인 하세요." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "회원가입 종료" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "죄송합니다. 회원가입은 현재 종료되었습니다." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "메모" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "%(user_display)s 로 이미 로그인 되어있습니다." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "경고: " #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "등록된 이메일이 없습니다. 알림, 비밀번호 초기화 등을 위해 이메일을 등록해야 " "합니다." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "이메일을 인증하세요" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "이메일 인증 메일이 전송되었습니다.회원가입 완료를 위해 전송된 메일의 링크를 " "클릭하세요.몇 분 후에도 메일이 전송되지 않으면 저희에게 연락주세요." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "해당 페이지는 이메일 인증이 필요합니다.\n" "이메일을 인증하세요." #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "인증메일을 전송하였습니다.\n" "이메일의 링크를 클릭하시고,\n" "몇 분 후에도 메일이 전송되지 않으면 저희에게 연락주세요." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "메모: 이메일 변경이 가능합니" "다." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "시크릿 토큰" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "소셜 계정 로그인 실패" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "소셜 계정을 통해 로그인 하는 도중 오류가 발생했습니다." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "계정 연결" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "다음 서드파티 계정들을 통해 로그인 할 수 있습니다:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "해당 계정에 연결되어있는 소셜 계정이 없습니다." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "서드파티 계정을 추가하세요." #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "%(provider)s 계정 연결" #: templates/socialaccount/login.html:13 #, fuzzy, python-format #| msgid "" #| "You are about to connect a new third party account from %(provider)s." msgid "You are about to connect a new third-party account from %(provider)s." msgstr "%(provider)s에서 제공하는 서드파티 계정을 연결하려 합니다." #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "%(provider)s을 통한 로그인" #: templates/socialaccount/login.html:20 #, fuzzy, python-format #| msgid "" #| "You are about to sign in using a third party account from %(provider)s." msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "서드파티 %(provider)s의 계정을 사용해 로그인을 진행하려 합니다." #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "계속" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "로그인 취소됨" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "기존 계정중 하나를 사용한 로그인을 취소하였습니다. 실수로 인한 경우, 로그인을 진행해 주세요." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "소셜 계정이 연결되었습니다." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "해당 소셜 계정이 이미 다른 계정에 연결되어 있습니다." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "소셜 계정 연결이 해제되었습니다." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "%(provider_name)s 의 계정을 이용하여 %(site_name)s 으로 로그인하려 합니다.\n" "마지막으로 다음 폼을 작성해주세요:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "사용중인 서드파티 계정을 이용해 로그인을 해주세요. 또는, %(site_name)s의 " #~ "회원 가입 진행 후 아래 링크에서 로그인을 해" #~ "주세요." #~ msgid "or" #~ msgstr "또는" #~ msgid "change password" #~ msgstr "비밀번호 변경" #~ msgid "OpenID Sign In" #~ msgstr "OpenID 로그인" #~ msgid "This email address is already associated with another account." #~ msgstr "해당 이메일은 다른 계정에 등록되어 있습니다." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "이메일이 전송되었습니다. 몇 분 후에도 이메일이 오지 않으면 저희에게 연락주" #~ "세요." #~ msgid "Account" #~ msgstr "계정" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "로그인 또는 비밀번호가 올바르지 않습니다." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "아이디는 글자, 숫자 및 @/./+/-/_. 으로만 구성되어야 합니다." django-allauth-0.58.2/allauth/locale/ky/000077500000000000000000000000001452212273200200145ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ky/LC_MESSAGES/000077500000000000000000000000001452212273200216015ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ky/LC_MESSAGES/django.po000066400000000000000000001220371452212273200234100ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2016-07-20 22:24+0600\n" "Last-Translator: Murat Jumashev \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.4\n" "Plural-Forms: nplurals=1; plural=0;\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Бул атты колдонуу мүмкүн эмес. Башкасын тандаңыз." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Өтө көп жолу кирүү аракеттери жасалды. Кайрадан аракеттениңиз." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Мындай эмейл менен катталган колдонуучу бар." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Азыркы купуя" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Купуя жок дегенде {0} белгиден турушу керек." #: account/apps.py:9 msgid "Accounts" msgstr "Эсептер" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Сиз ошол эле купуяны кайрадан териңиз." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Купуя" #: account/forms.py:94 msgid "Remember Me" msgstr "Мени эстеп кал" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Бул эсеп учурда активдүү эмес." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Сиз берген эмейл дарек жана/же купуя туура эмес." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Сиз берген колдонуучу аты жана/же купуя туура эмес." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Эмейл дарек" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "Эмейл" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Колдонуучу аты" #: account/forms.py:134 msgid "Username or email" msgstr "Колдонуучу аты же эмейл" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Логин" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Купуяңызды унуттуңузбу?" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "Эмейл (милдеттүү эмес)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "эмейл ырастоо" #: account/forms.py:324 msgid "Email (optional)" msgstr "Эмейл (милдеттүү эмес)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Сиз ошол эле купуяны кайрадан териңиз." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Купуя (дагы бир жолу)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Бул эмейл дарек ушул эсеп менен буга чейин туташтырылган." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Сиздин эсебиңизде дурусталган эмейл даректер жок." #: account/forms.py:524 msgid "Current Password" msgstr "Азыркы купуя" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Жаңы купуя" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Жаңы купуя (кайрадан)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Учурдагы купуяңызды жазыңыз." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Эмейл дарек эч бир колдонуучу эсебине байланган эмес" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Купуяны жаңыртуу токени туура эмес." #: account/models.py:21 msgid "user" msgstr "колдонуучу" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "эмейл дарек" #: account/models.py:28 msgid "verified" msgstr "дурусталган" #: account/models.py:29 msgid "primary" msgstr "негизги" #: account/models.py:35 msgid "email addresses" msgstr "эмейл даректер" #: account/models.py:141 msgid "created" msgstr "түзүлгөн" #: account/models.py:142 msgid "sent" msgstr "жөнөтүлгөн" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "ачкыч" #: account/models.py:148 msgid "email confirmation" msgstr "эмейл ырастоо" #: account/models.py:149 msgid "email confirmations" msgstr "эмейл ырастоолор" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Бул эмейл менен башка эсеп катталган. Ошол эсеп аркылуу кирип, %s эсебиңизди " "туташтырып алыңыз." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Сиздин эсебиңизде купуя орнотулган эмес." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Сиздин эсебиңизде дурусталган эмейл даректер жок." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Социалдык эсептер" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "провайдер" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "провайдер" #: socialaccount/models.py:52 msgid "name" msgstr "аты" #: socialaccount/models.py:54 msgid "client id" msgstr "кардар id'си" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "Колдонмо ID'си, же керектөөчү ачкычы" #: socialaccount/models.py:59 msgid "secret key" msgstr "жашыруун ачкыч" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "API, кардар же керектөөчүнүн жашыруун ачкычы" #: socialaccount/models.py:65 msgid "Key" msgstr "Ачкыч" #: socialaccount/models.py:77 msgid "social application" msgstr "социалдык колдонмо" #: socialaccount/models.py:78 msgid "social applications" msgstr "социалдык колдонмолор" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "акыркы кириши" #: socialaccount/models.py:116 msgid "date joined" msgstr "кошулган күнү" #: socialaccount/models.py:117 msgid "extra data" msgstr "кошумча маалымат" #: socialaccount/models.py:121 msgid "social account" msgstr "социалдык эсеп" #: socialaccount/models.py:122 msgid "social accounts" msgstr "социалдык эсептер" #: socialaccount/models.py:156 msgid "token" msgstr "токен" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) же жетки токени (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "токендин жашыруун ачкычы" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) же жаңыртуу токени (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "мөөнөтү аяктайт" #: socialaccount/models.py:170 msgid "social application token" msgstr "социалдык колдонмо токени" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "социалдык колдонмо токендери" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "\"%s\" тарабынан сурам токенин алууда туура эмес жооп келди." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "\"%s\" тарабынан жетки токенин алууда туура эмес жооп келди." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "\"%s\" үчүн сурам токени сакталган жок." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "\"%s\" үчүн жетки токени сакталган жок." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "\"%s\" тарабындагы жеке ресурстарга жетки жок." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "\"%s\" тарабынан сурам токенин алууда туура эмес жооп келди." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Эсеп активдүү эмес" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Бул эсеп активдүү эмес." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Эмейл даректер" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Төмөнкү эмейл даректер сиздин эсебиңизге байланган:" #: templates/account/email.html:23 msgid "Verified" msgstr "Дурусталган" #: templates/account/email.html:27 msgid "Unverified" msgstr "Дурустала элек" #: templates/account/email.html:32 msgid "Primary" msgstr "Негизги" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Негизги кылуу" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Дурустоо катын кайрадан жиберүү" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Алып салуу" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Эмейл дарек кошуу" #: templates/account/email.html:70 msgid "Add Email" msgstr "Эмейл кошуу" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Тандалган эмейл даректи алып салууну дурустайсызбы?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "%(site_name)s сайтынан алкыш!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "%(site_name)s сайтын колдонгонуңузга алкыш!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s at " #| "%(site_domain)s has given yours as an e-mail address to connect their " #| "account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "%(site_name)s сайтынан салам!\n" "\n" "%(user_display)s деген колдонуучу %(site_domain)s деген сайттан сиздин эмейл " "дарегиңизди өзүнүн эсебине туташтырыш үчүн жазгандыктан,\n" "сиз ушул эмейл катты алып жатасыз.\n" "\n" "Бул туура десеңиз, анда %(activate_url)s аркылуу өтүп, ырастаңыз\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Эмейл дарегиңизди ырастаңыз" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "%(site_name)s сайтынан салам!\n" "\n" "Сиз бул катты %(site_domain)s сайтынан кимдир бирөө эсебиңиздин купуясын " "жаңыртуу сурамын жөнөткөндүктөн алып жататсыз.\n" "Эгерде сурамды сиз жөнөтпөгөн болсоңуз, бул катка көңүл бурбай эле коюңуз. " "Купуяны жаңыртуу үчүн төмөндөгү шилтемени басыңыз." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Эстей албай жатсаңыз, сиздин колдонуучу атыңыз %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Купуяны жаңыртуу эмейли" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "%(site_name)s сайтынан салам!\n" "\n" "Сиз бул катты %(site_domain)s сайтынан кимдир бирөө эсебиңиздин купуясын " "жаңыртуу сурамын жөнөткөндүктөн алып жататсыз.\n" "Эгерде сурамды сиз жөнөтпөгөн болсоңуз, бул катка көңүл бурбай эле коюңуз. " "Купуяны жаңыртуу үчүн төмөндөгү шилтемени басыңыз." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Эмейл даректер" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Төмөнкү эмейл даректер сиздин эсебиңизге байланган:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Негизги эмейл дарегиңиз дурусталышы керек." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Эмейл даректи ырастаңыз" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "Эмейл" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Эмейл даректи ырастаңыз" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "%(email)s деген эмейл дарек " "%(user_display)s колдонуучусуна таандык экенин ырастаңыз." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Ырастоо" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Бул социалдык эсеп башка эсепке туташтырылган." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Бул эмейлди ырастоо шилтемесинин мөөнөтү өтүп кеткен же ал туура эмес. эмейлди ырастоо сурамын кайрадан жөнөтүңүз." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Кирүү" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Эгерде сиз эсеп түзө элек болсоңуз, анда\n" "биринчи катталыңыз" #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Чыгуу" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Сиз чыгып жатканыңызды дурустайсызбы?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Негизги эмейл даректи алып салуу мүмкүн эмес (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Ырастоо эмейли %(email)s дарегине жөнөтүлдү." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Сиз %(email)s дарегин ырастадыңыз." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "%(email)s дарегин алып салдык." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "%(name)s аты менен ийгиликтүү кирдик." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Сиз чыгып кеттиңиз." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Купуя ийгиликтүү өзгөртүлдү." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Купуя ийгиликтүү орнотулду." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Негизги эмейл орнотулду." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Негизги эмейл дарегиңиз дурусталышы керек." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Купуяны өзгөртүү" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Купуяңызды унуттуңузбу?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Купуяны жаңыртуу" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Купуяңызды унуттуңузбу? Эмейл дарегиңизди төмөндө жазсаңыз, биз сизге кат " "жөнөтүп, аны жаңыртканга жардам беребиз." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Купуямды жаңырт" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "Купуяны жаңыртууда суроолор пайда болсо, бизге кайрылыңыз." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Биз сизге кат жөнөттүк, дурустоо үчүн.\n" "Ичинде берилген шилтемени басыңыз. Эгерде\n" "кат бир нече мүнөттө келбей калса, бизге кайрылыңыз." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Токен туура эмес" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Купуя жаңыртуу шилтемеси туура эмес экен, ал мурун колдонулса керек. Купуяны жаңыртуу сурамын кайрадан жөнөтүңүз." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Купуяңыз эми өзгөртүлдү." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Купуя орнотуу" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Эмейл даректи ырастаңыз" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Катталуу" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Катталуу" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Эсебиңиз барбы? Анда кириңиз." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Катталуу жабык" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Кечирим сурайбых, бирок учурда катталуу жабык." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Эскертүү" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "сиз %(user_display)s катары кирип турасыз." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Эскертүү:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Сизде азыр бир дагы эмейл катталган эмес. Билдирүүлөрдү алуу, купуяны " "жаңыртуу ж.б. үчүн каттап коюңуз." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Эмейл дарегиңизди дурустап бериңиз" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Биз эмейлиңизди дурустоо үчүн кат жөнөттүк. Ошондо берилген шилтеме аркылуу " "өтүп, каттоодон өтүңүз. Кат бир нече мүнөттө келбесе, бизге кайрылыңыз." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Сайттын бул бөлүгүнө өтүш үчүн сиз чын эле сиз айткан \n" "адам экендиңизди такташыбыз керек. Ал үчүн эмейл\n" "дарек сизге таандык экенин дурусташыңыз керек." #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Биз сизге кат жөнөттүк, дурустоо үчүн.\n" "Ичинде берилген шилтемени басыңыз. Эгерде\n" "кат бир нече мүнөттө келбей калса, бизге кайрылыңыз." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Эскертүү: эмейл дарегиңизди дагы деле өзгөртсөңүз болот." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "токендин жашыруун ачкычы" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Социалдык тармак аркылуу кирүү ийгиликсиз" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Социалдык тармак эсебиңиз аркылуу кирүүдө ката кетти." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Эсеп байланыштары" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Эсебиңизге кийинки үчүнчү тарап эсептердин бирин колдонуп кирсеңиз болот:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Азырынча эсебиңизге социалдык тармак эсептер байланган эмес." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "3-тарап эсеп кошуу" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Кирүү токтотулду" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Эсептериңизин бирөөсүн колдонуп сайтыбызга кирүүдөн баш тарттыңыз. Аны " "байкабастан кылып алсаңыз, кирүүнү улантсаңыз " "болот." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Социалдык эсеп туташтырылды." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Бул социалдык эсеп башка эсепке туташтырылган." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Социалдык эсеп ажыратылды." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Сиз азыр %(provider_name)s эсебиңизди колдонуп, %(site_name)s\n" "сайтына кирейин деп турасыз. Акыркы кадам катары кийинки калыпты\n" "толтуруп коюңузду суранабыз :" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Тышкаркы кызматтарда катталган\n" #~ "эсебиңиз аркылуу кириңиз. Же, %(site_name)s \n" #~ "сайтына катталып\n" #~ "\"төмөн жактан кириңиз:" #~ msgid "or" #~ msgstr "же" #~ msgid "change password" #~ msgstr "купуяны өзгөртүү" #~ msgid "OpenID Sign In" #~ msgstr "OpenID менен кирүү" #~ msgid "This email address is already associated with another account." #~ msgstr "Бул эмейл дарек башка бир эсеп менен буга чейин туташтырылган." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Биз сизге кат жөнөттүк. Бир нече мүнөттүн ичинде келбей калса бизге " #~ "кайрылыңыз." #~ msgid "Account" #~ msgstr "Эсеп" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Сиз берген логин жана/же купуя туура эмес." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Колдонуучу аттары тамгалардан, сандардан жана @/./+/-/_ белгилеринен гана " #~ "тура алат." django-allauth-0.58.2/allauth/locale/lt/000077500000000000000000000000001452212273200200105ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/lt/LC_MESSAGES/000077500000000000000000000000001452212273200215755ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/lt/LC_MESSAGES/django.po000066400000000000000000001135351452212273200234070ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " "11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " "1 : n % 1 != 0 ? 2: 3);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "" "Šis naudotojo vardas negalimas. Prašome pasirinkti kitą naudotojo vardą." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "" #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Šiuo el. pašto adresu jau yra užsiregistravęs kitas naudotojas." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Esamas slaptažodis" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Slaptažodis turi būti sudarytas mažiausiai iš {0} simbolių." #: account/apps.py:9 msgid "Accounts" msgstr "Paskyros" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Turite įvesti tą patį slaptažodį kiekvieną kartą." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Slaptažodis" #: account/forms.py:94 msgid "Remember Me" msgstr "Prisimink mane" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Šiuo metu ši paskyra yra neaktyvi." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Pateiktas el. pašto adresas ir/arba slaptažodis yra neteisingi." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Pateiktas naudotojo vardas ir/arba slaptažodis yra neteisingi." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "El. pašto adresas" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "El. paštas" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Naudotojo vardas" #: account/forms.py:134 msgid "Username or email" msgstr "Naudotojo vardas arba el. paštas" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Prisijungimo vardas" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Pamiršote slaptažodį?" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "El. paštas (neprivalomas)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "el. pašto patvirtinimas" #: account/forms.py:324 msgid "Email (optional)" msgstr "El. paštas (neprivalomas)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Turite įvesti tą patį slaptažodį kiekvieną kartą." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Slaptažodis (pakartoti)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Šis el. pašto adresas jau susietas su šia paskyra." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Jūsų paskyra neturi patvirtinto el. pašto adreso." #: account/forms.py:524 msgid "Current Password" msgstr "Esamas slaptažodis" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Naujas slaptažodis" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Naujas slaptažodis (pakartoti)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Prašome įvesti esamą jūsų slaptažodį." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "El. pašto adresas nėra susietas su jokia naudotojo paskyra" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Neteisingas slaptažodžio atstatymo atpažinimo ženklas." #: account/models.py:21 msgid "user" msgstr "naudotojas" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "el. pašto adresas" #: account/models.py:28 msgid "verified" msgstr "patvirtintas" #: account/models.py:29 msgid "primary" msgstr "pirminis" #: account/models.py:35 msgid "email addresses" msgstr "el. pašto adresai" #: account/models.py:141 msgid "created" msgstr "sukurtas" #: account/models.py:142 msgid "sent" msgstr "išsiųstas" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "raktas" #: account/models.py:148 msgid "email confirmation" msgstr "el. pašto patvirtinimas" #: account/models.py:149 msgid "email confirmations" msgstr "el. pašto patvirtinimai" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Paskyra su šiuo el. pašto adresu jau egzistuoja. Prašome pirmiausia " "prisijungti prie tos paskyros ir tada prijunkite %s paskyrą." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Jūsų paskyra neturi nustatyto slaptažodžio." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Jūsų paskyra neturi patvirtinto el. pašto adreso." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Socialinės paskyros" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "tiekėjas" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "tiekėjas" #: socialaccount/models.py:52 msgid "name" msgstr "pavadinimas" #: socialaccount/models.py:54 msgid "client id" msgstr "kliento id" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "App ID arba consumer key" #: socialaccount/models.py:59 msgid "secret key" msgstr "secret key" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "API secret, client secret, arba consumer secret" #: socialaccount/models.py:65 msgid "Key" msgstr "Raktas" #: socialaccount/models.py:77 msgid "social application" msgstr "socialinė programėlė" #: socialaccount/models.py:78 msgid "social applications" msgstr "socialinės programėlės" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "paskutinis prisijungimas" #: socialaccount/models.py:116 msgid "date joined" msgstr "registracijos data" #: socialaccount/models.py:117 msgid "extra data" msgstr "papildomi duomenys" #: socialaccount/models.py:121 msgid "social account" msgstr "socialinė paskyra" #: socialaccount/models.py:122 msgid "social accounts" msgstr "socialinės paskyros" #: socialaccount/models.py:156 msgid "token" msgstr "atpažinimo ženklas" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) arba prieigos atpažinimo ženklas (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "token secret" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" "\"oauth_token_secret\" (OAuth1) arba atnaujintas atpažinimo ženklas (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "galiojimas" #: socialaccount/models.py:170 msgid "social application token" msgstr "socialinės programėlės atpažinimo ženklas" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "socialinės programėlės atpažinimo ženklai" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Klaidingas atsakymas gaunant užklausos atpažinimo ženklą iš \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Klaidingas atsakymas gaunant prieigos atpažinimo ženklą iš \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Nėra užklausos atpažinimo žymės šiam \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Nėra prieigos atpažinimo žymės šiam \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Nėra prieigos prie privataus resurso iš \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Klaidingas atsakymas gaunant užklausos atpažinimo ženklą iš \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Paskyra neaktyvi" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Ši paskyra neaktyvi." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "El. pašto adresai" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Šie el. pašto adresas yra susieti su jūsų paskyra:" #: templates/account/email.html:23 msgid "Verified" msgstr "Patvirtintas" #: templates/account/email.html:27 msgid "Unverified" msgstr "Nepatvirtintas" #: templates/account/email.html:32 msgid "Primary" msgstr "Pirminis" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Padaryti pirminiu" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Pakartotinai siųsti patvirtinimą" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Šalinti" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Pridėti el. pašto adresą" #: templates/account/email.html:70 msgid "Add Email" msgstr "Pridėti el. paštą" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Ar tikrai norite ištrinti pasirinktą el. pašto adresą?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Ačiū nuo %(site_name)s\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Ačiū, kad naudojate %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s at " #| "%(site_domain)s has given yours as an e-mail address to connect their " #| "account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Su jumis sveikinasi %(site_name)s\n" "\n" "Jūs gavote šį laišką, kadangi naudotojas %(user_display)s iš %(site_domain)s " "prijungė šį el. pašto adresą prie savo paskyros.\n" "\n" "Tam, kad patvirtintumėte prijungimą sekite šia nuoroda: %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Prašome patvirtinti savo el. pašto adresą" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Su jumis sveikinasi %(site_name)s\n" "\n" "Jūs gavote šį laišką, kadangi jūs arba kažkas kitas pateikė slaptažodžio " "keitimo užklausą paskyrai susietai su šiuo el. pašto adresu iš " "%(site_domain)s.\n" "Jei jūs neteikėte slaptažodžio keitimo užklausos, galite ignoruoti šį " "laišką. Kad pakeistumėte savo slaptažodį sekite žemiau esančia nuoroda." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Primename, kad jūsų naudotojo vardas yra %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Slaptažodžio keitimo el. paštas" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Su jumis sveikinasi %(site_name)s\n" "\n" "Jūs gavote šį laišką, kadangi jūs arba kažkas kitas pateikė slaptažodžio " "keitimo užklausą paskyrai susietai su šiuo el. pašto adresu iš " "%(site_domain)s.\n" "Jei jūs neteikėte slaptažodžio keitimo užklausos, galite ignoruoti šį " "laišką. Kad pakeistumėte savo slaptažodį sekite žemiau esančia nuoroda." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "El. pašto adresai" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Šie el. pašto adresas yra susieti su jūsų paskyra:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Pirminis el. pašto adresas turi būti patvirtintas." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Patvirtinkite el. pašto adresą" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "El. paštas" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Patvirtinkite el. pašto adresą" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Prašome patvirtinti, kad %(email)s yra " "%(user_display)s el. pašto adresas." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Patvirtinti" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Socialinė paskyra jau yra prijungta prie kitos paskyros." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Šios el. pašto patvirtinimo nuorodos galiojimas baigėsi arba nuoroda yra " "klaidinga. Prašome pateikti naują el. pašto " "patvirtinimo užklausimą." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Prisijungti" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Jei dar nesusikūrėte paskyros, tuomet prašome pirmiausia\n" "susikurti." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Atsijungti" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Ar tikrai norite atsijungti?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Negalite ištrinti pirminio (%(email)s) el. pašto adreso." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Patvirtinimo laiškas išsiųstas adresu %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "%(email)s patvirtintas." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "%(email)s el. pašto adresas ištrintas." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Sėkmingai prisijungėte kaip %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Atsijungėte." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Slaptažodis sėkmingai pakeistas." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Slaptažodis pakeistas sėkmingai." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Pirminis el. pašto adresas pakeistas sėkmingai." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Pirminis el. pašto adresas turi būti patvirtintas." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Keisti slaptažodį" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Pamiršote slaptažodį?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Slaptažodžio atstatymas" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Pamiršote slaptažodį? Įveskite savo el. pašto adresą žemiau ir mes išsiūsime " "jums laišką, kurio pagalba galėsite pasikeisti slaptažodį." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Atstatyti mano slaptažodį" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "Prašome susisiekti su mumis jei negalite atstatyti slaptažodžio." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Išsiuntėme jums patvirtinimo laišką.\n" "Prašome sekite nuoroda pateiktą laiške. Susisiekite su mumis\n" "jei negausite laiško per kelias minutes." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Klaidinga atpažinimo žymė" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Slaptažodžio atstatymo nuoroda klaidinga, taip gali būti dėl to, kad nuoroda " "jau buvo kartą panaudota. Prašome pakartoti slaptažodžio atstatymą." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Jūsų slaptažodis pakeistas." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Nustatyti slaptažodį" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Patvirtinkite el. pašto adresą" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registracija" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Registruotis" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Jau turite paskyrą? Prašome prisijungti." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Registracija uždaryta" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Atsiprašome, tačiau registracija šiuo metu yra uždaryta." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Pastaba" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "jūs jau esate prisijungęs, kaip %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Įspėjimas:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Šiuo metu jūs neturite nustatyto el. pašto adreso. Rekomenduojame pridėti " "el. pašto adresą, kad gautumėte pranešimus, galėtumėte atstatyti slaptažodį " "ir pan." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Patvirtinkite savo el. pašto adresą" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Išsiuntėme jums laišką patvirtinimui. Sekite laiške pateikta nuoroda, kad " "užbaigtumėte registraciją. Prašome susisiekti su mumis, jei laiško negavote " "per kelias minutes." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Šioje svetainės vietoje privalome gauti iš jūsų patvirtinimą,\n" "kad jūs tikrai esate tas asmuo, kaip teigiate. Dėl šios priežasties\n" "prašome patvirtinti el. pašto adreso nuosavybę. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Išsiuntėme jums patvirtinimo laišką.\n" "Prašome sekite nuoroda pateiktą laiške. Susisiekite su mumis\n" "jei negausite laiško per kelias minutes." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Pastaba: vis dar galite pakeisti " "savo el. pašto adresą." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "token secret" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Socialinio tinklo prisijungimo klaida" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Įvyko nenumatyta klaida bandant prisijungti per jūsų socialinio tinklo " "paskyrą." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Paskyros ryšiai" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Galite prisijungti prie savo paskyros naudodami vieną iš galimų trečios " "šalies paskyrų:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Šiuo metu jūs neturite nei vienos prijungtos socialinės paskyros." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Pridėti trečios šalies paskyrą" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Prisijungimas atšauktas" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Nusprendėte atšaukti prisijungimą naudojant vieną iš esamų paskyrų. Jei tai " "buvo klaida, prašome pakartoti prisijungimą." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Socialinė paskyra buvo prijungta." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Socialinė paskyra jau yra prijungta prie kitos paskyros." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Socialinė paskyra buvo atjungta." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Jūs beveik prisijungėte prie %(site_name)s naudodami %(provider_name)s\n" "paskyrą. Liko paskutinis žingsnis, užpildyti sekančią formą:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Prašome prisijungti viena\n" #~ "iš jūsų turimų trečios šalies paskyrų. Arba, susikurkite\n" #~ "naują %(site_name)s paskyrą ir prisijunkite žemiau:" #~ msgid "or" #~ msgstr "arba" #~ msgid "change password" #~ msgstr "keisti slaptažodį" #~ msgid "OpenID Sign In" #~ msgstr "OpenID prisijungimas" #~ msgid "This email address is already associated with another account." #~ msgstr "Šis el. pašto adresas jau susietas su kita paskyra." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Išsiuntėme jums laišką. Prašome susisiekti su mums jei per kelias minutes " #~ "negausite laiško." #~ msgid "Account" #~ msgstr "Paskyra" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Pateiktas prisijungimo vardas ir/arba slaptažodis yra neteisingi." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "Naudotojo vardui galima naudoti tik raides, skaičius ir @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Šis naudotojo vardas jau užimtas. Prašome pasirinkti kitą." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Prisijungti" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Jūs patvirtinote, kad %(email)s yra " #~ "%(user_display)s naudotojo el. pašto adresas." django-allauth-0.58.2/allauth/locale/lv/000077500000000000000000000000001452212273200200125ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/lv/LC_MESSAGES/000077500000000000000000000000001452212273200215775ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/lv/LC_MESSAGES/django.po000066400000000000000000001117231452212273200234060ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " "2);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "" "Lietotājvārds nevar tikt izmantots. Lūdzu izvēlietis citu lietotājvārdu." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "" "Pārāk daudz neveiksmīgi pieslēgšanās mēģinājumi. Mēģiniet vēlreiz vēlāk." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Lietotājs ar šādu e-pasta adresi jau ir reģistrēts." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Šobrīdējā parole" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Parolei jābūt vismaz {0} simbolus garai." #: account/apps.py:9 msgid "Accounts" msgstr "Konti" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Katru reizi jums ir jāievada tā pati parole." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Parole" #: account/forms.py:94 msgid "Remember Me" msgstr "Atcerēties mani" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Šis konts šobrīd ir neaktīvs." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Nepareizs e-pasts un/vai parole." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Nepareizs lietotāja vārds un/vai parole." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "E-pasta adrese" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-pasts" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Lietotājvārds" #: account/forms.py:134 msgid "Username or email" msgstr "Lietotājvārds vai e-pasts" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Ieiet" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Aizmirsāt paroli?" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "E-pasts (izvēles)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "e-pasta apstiprinājums" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-pasts (izvēles)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Katru reizi jums ir jāievada tā pati parole." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Parole (vēlreiz)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Šī e-pasta adrese jau ir piesaistīta šim kontam." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Jūsu kontam nav apstiprinātas e-pasta adreses." #: account/forms.py:524 msgid "Current Password" msgstr "Šobrīdējā parole" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Jaunā parole" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Jaunā parole (vēlreiz)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Lūdzu ievadiet jūsu šobrīdējo paroli." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "E-pasta adrese nav piesaistīta nevienam lietotāja kontam" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Paroles atjaunošanas marķieris bija nederīgs." #: account/models.py:21 msgid "user" msgstr "lietotājs" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "e-pasta adrese" #: account/models.py:28 msgid "verified" msgstr "apstiprināts" #: account/models.py:29 msgid "primary" msgstr "primārā" #: account/models.py:35 msgid "email addresses" msgstr "e-pasta adreses" #: account/models.py:141 msgid "created" msgstr "izveidots" #: account/models.py:142 msgid "sent" msgstr "nosūtīts" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "atslēga" #: account/models.py:148 msgid "email confirmation" msgstr "e-pasta apstiprinājums" #: account/models.py:149 msgid "email confirmations" msgstr "e-pasta apstiprinājumi" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Jau eksistē konts ar šo e-pasta adresi. Lūdzu sākumā ieejiet tajā kontā, tad " "pievienojiet %s kontu." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Jūsu kontam nav uzstādīta parole." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Jūsu kontam nav apstiprinātas e-pasta adreses." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Sociālie konti" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "sniedzējs" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "sniedzējs" #: socialaccount/models.py:52 msgid "name" msgstr "vārds" #: socialaccount/models.py:54 msgid "client id" msgstr "klienta id" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "App ID, vai consumer key" #: socialaccount/models.py:59 msgid "secret key" msgstr "secret key" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "API secret, client secret, vai consumer secret" #: socialaccount/models.py:65 msgid "Key" msgstr "Key" #: socialaccount/models.py:77 msgid "social application" msgstr "sociālā aplikācija" #: socialaccount/models.py:78 msgid "social applications" msgstr "sociālās aplikācijas" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "pēdējā pieslēgšanās" #: socialaccount/models.py:116 msgid "date joined" msgstr "reģistrācijas datums" #: socialaccount/models.py:117 msgid "extra data" msgstr "papildus informācija" #: socialaccount/models.py:121 msgid "social account" msgstr "sociālais konts" #: socialaccount/models.py:122 msgid "social accounts" msgstr "sociālie konti" #: socialaccount/models.py:156 msgid "token" msgstr "token" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) vai piekļūt marķierim (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "token secret" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) vai atjaunot marķieri (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "beidzas" #: socialaccount/models.py:170 msgid "social application token" msgstr "sociālās aplikācijas marķieris" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "sociālās aplikācijas marķieri" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Nederīga atbilde iegūstot pieprasījuma marķieri no \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Nederīga atbilde iegūstot pieejas marķieri no \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Netika saglabāts pieprasījuma marķieris priekš \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Netika saglabāts pieejas marķieris priekš \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Nav pieejas privātam resursam \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Nederīga atbilde iegūstot pieprasījuma marķieri no \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Neaktīvs konts" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Šis konts ir neaktīvs." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "E-pasta adreses" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Sekojošas e-pasta adreses ir piesaistītas jūsu kontam:" #: templates/account/email.html:23 msgid "Verified" msgstr "Apstiprināta" #: templates/account/email.html:27 msgid "Unverified" msgstr "Neapstiprināta" #: templates/account/email.html:32 msgid "Primary" msgstr "Primārā" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Iestatīt kā primāro" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Pārsūtīt apstiprināšanu" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Noņemt" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Pievienot e-pasta adresi" #: templates/account/email.html:70 msgid "Add Email" msgstr "Pievienot e-pastu" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Vai jūs tiešām vēlaties noņemt izvēlēto e-pasta adresi?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Visu labu vēlot, %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Paldies, ka izmantojat %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s at " #| "%(site_domain)s has given yours as an e-mail address to connect their " #| "account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Sveiciens no %(site_name)s!\n" "\n" "Jūs saņemat šo e-pasta vēstuli tāpēc, ka lietotājs %(user_display)s lapā " "%(site_domain)s ir iesniedzis šo e-pasta adresi, lai tā tiktu sasaistīta ar " "viņa kontu.\n" "\n" "Lai apstiprinātu, ka viss ir parezi, ejiet uz %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Lūdzu apstipriniet savu e-pasta adresi" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Sveiciens no %(site_name)s!\n" "\n" "Jūs saņemat šo e-pasta vēstuli tāpēc, ka jūs vai kāds cits ir pieprasījis " "paroles atjaunošanu jūsu kontam lapā %(site_domain)s.\n" "Jūs varat droši ignorēt šo e-pasta vēstuli, ja jūs nepieprasījat paroles " "atjaunošanu. Spiedied uz linka zemāk, lai atjaunotu jūsu paroli." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Gadījumā ja jūs aizmirsāt, tad jūsu lietotājvārds ir %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Paroles atjaunošanas e-pasts" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Sveiciens no %(site_name)s!\n" "\n" "Jūs saņemat šo e-pasta vēstuli tāpēc, ka jūs vai kāds cits ir pieprasījis " "paroles atjaunošanu jūsu kontam lapā %(site_domain)s.\n" "Jūs varat droši ignorēt šo e-pasta vēstuli, ja jūs nepieprasījat paroles " "atjaunošanu. Spiedied uz linka zemāk, lai atjaunotu jūsu paroli." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "E-pasta adreses" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Sekojošas e-pasta adreses ir piesaistītas jūsu kontam:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Jūsu primārajai e-pasta adresei jābūt apstiprinātai." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Apstipriniet e-pasta adresi" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-pasts" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Apstipriniet e-pasta adresi" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Lūdzu apstipriniet ka %(email)s e-pasta " "adrese pieder lietotājam %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Apstiprināt" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Sociālais konts jau ir piesaistīts citam kontam." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Šī e-pasta apstiprināšanas saitei ir beidzies derīguma termiņš vai tas ir " "nederīgs. Lūdzu pieprasiet jaunu e-pasta " "apstiprināšanas linku." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Ieiet" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Ja jūs vēl neesat izveidojuši kontu, tad lūdzu\n" "piereģistrējaties." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Iziet" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Vai jūs tiešām vēlaties iziet?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Jūs nevarat noņemt savu primāro e-pasta adresi (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Apstiprinājuma e-pasts nosūtīts uz %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Jūs esat apstiprinājis %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Noņemta e-pasta adrese %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Veiksmīgi iegājuši kā %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Jūs esat izgājuši." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Parole veiksmīgi nomainīta." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Parole veiksmīgi uzstādīta." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Primārā e-pasta adrese uzstādīta." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Jūsu primārajai e-pasta adresei jābūt apstiprinātai." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Mainīt paroli" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Aizmirsāt paroli?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Atjaunot paroli" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Aizmirsāt savu paroli? Ievadiet zemāk savu e-pasta adresi, un mēs jums " "nosūtīsim e-pasta vēstuli, lai atjaunotu to." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Atjaunot manu paroli" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "Lūdzu sazinieties ar mums, ja jums ir kādas problēmas atjaunojot to." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Mēs esam jums nosūtījuši e-pastu\n" "apstiprināšanai. Lūdzu klikšķiniet uz saites šajā e-pastā. Lūdzu\n" "sazinieties ar mums, ja dažu minūšu laikā nesaņemat vēstuli." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Nederīgs marķieris" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Paroles atjaunošanas links ir nederīgs, iespējams, tāpēc ka tas jau ir " "izmantots. Lūdzu pieprasiet jaunu paroles " "atjaunošanu." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Jūsu parole ir nomainīta." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Uzstādīt paroli" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Apstipriniet e-pasta adresi" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Reģistrēties" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Reģistrēties" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Jau ir konts? Tad lūdzu spiedied šeit." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Reģistrācija slēgta" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Mēs atvainojamies, bet reģistrācija šobrīd ir slēgta." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Piezīme" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "jūs jau esat iegājuši kā %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Brīdinājums:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Jums pašlaik nav izveidota neviena e-pasta adrese. Jums patiešām vajadzētu " "pievienot e-pasta adresi, lai jūs varētu saņemt paziņojumus, atiestatīt savu " "paroli utt." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Apstipriniet savu e-pasta adresi" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Jums ir nosūtīts apstiprinājuma e-pasts. Sekojiet saitei, lai pabeigu " "reģistrācijas procesu. Lūdzu sazinieties ar mums, ja dažu minūšu laikā " "nesaņemat vēstuli." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Šī lapas daļa mums nosaka pārbaudīt, ka\n" "jūs esat tas, kas jūs apgalvojat esam. Šim mērķim, mēs pieprasām, lai jūs\n" "apstipriniet, jūsu e-pasta adreses piederību. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Mēs esam jums nosūtījuši e-pastu\n" "apstiprināšanai. Lūdzu klikšķiniet uz saites šajā e-pastā. Lūdzu\n" "sazinieties ar mums, ja dažu minūšu laikā nesaņemat vēstuli." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Piezīme: jūs vēljoprojām varat nomainīt jūsu e-pasta adresi." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "token secret" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Sociālā tīkla ieiešanas kļūda" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Notikusi kļūme, mēģinot ieiet ar jūsu sociālo kontu." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Konta savienojumi" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Jūs varat ieiet jūsu kontā izmantojot jebkuru no sekojošiem trešo pušu " "kontiem:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Jūsu kontam šobrīd nav piesaistīts neviens sociālais konts." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Pievienot trešās puses kontu" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Ieiešana pārtraukta" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Jūs nolēmāt pārtraukt ieiešanu mūsu lapa izmantojot vienu no jūsu kontiem. " "Ja šī ir kļūda, lūdzu dodaties uz ieiet." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Sociālais konts ir piesaistīts." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Sociālais konts jau ir piesaistīts citam kontam." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Sociālais konts ir atvienots." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Jūs izmantosiet savu %(provider_name)s kontu, lai ieietu\n" "%(site_name)s. Kā pēdējo soli, lūdzu aizpildiet sekojošo formu:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Lūdzu ieejiet iekšā ar vienu\n" #~ "no jūsu eksistējošiem trešās puses kontiem. Vai reģistrējieties\n" #~ "%(site_name)s kontam un ieejiet zemāk:" #~ msgid "or" #~ msgstr "vai" #~ msgid "change password" #~ msgstr "Nomainīt paroli" #~ msgid "OpenID Sign In" #~ msgstr "Ieiet ar OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Šī e-pasta adrese jau ir piesaistīta citam kontam." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Mēs jums nosūtījām e-pasta vēstuli. Lūdzu sazinieties ar mums, ja dažu " #~ "minūšu laikā nesaņemat vēstuli." #~ msgid "Account" #~ msgstr "Konts" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Nepareiza pieteikšanās informācija un/vai parole." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "Lietotājvārds var saturēt tikai burtus, ciparus un @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Šis lietotājvārds jau ir aizņemts. Lūdzu izvēlaties citu." #~ msgid "Shopify Sign In" #~ msgstr "Ieiet ar Shopify" django-allauth-0.58.2/allauth/locale/mn/000077500000000000000000000000001452212273200200035ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/mn/LC_MESSAGES/000077500000000000000000000000001452212273200215705ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/mn/LC_MESSAGES/django.po000066400000000000000000001204151452212273200233750ustar00rootroot00000000000000# Mongolian Translation # Copyright (C) 2021 # This file is distributed under the same license as the PACKAGE package. # Bilgutei Erdenebayar , 2021. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2021-11-12 09:54+0800\n" "Last-Translator: Bilgutei Erdenebayar \n" "Language-Team: Mongolian \n" "Language: mn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Хэрэглэгчийн нэрийг ашиглах боломжгүй. Өөр нэр сонгоно уу." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Хэт олон амжилтгүй нэвтрэх оролдлого. Дараа дахин оролдоорой." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Өөр хэрэглэгч энэ имэйл хаягаар бүртгүүлсэн байна." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Одоогын Нууц Үг" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Нууц үг хамгийн багадаа {0} тэмдэгттэй байх ёстой." #: account/apps.py:9 msgid "Accounts" msgstr "Бүртгэлүүд" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Та өмнө оруулсантай ижил нууц үг оруулах ёстой." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Нууц үг" #: account/forms.py:94 msgid "Remember Me" msgstr "Намайг Санах" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Энэ бүртгэл одоогоор идэвхгүй байна." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Таны оруулсан имэйл хаяг болон/эсвэл нууц үг буруу байна." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Таны оруулсан имэйл хаяг болон/эсвэл нууц үг буруу байна." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "Имэйл хаяг" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Хэрэглэгчийн нэр" #: account/forms.py:134 msgid "Username or email" msgstr "Хэрэглэгчийн нэр эсвэл имэйл" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Нэвтрэх" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Нууц Үг Мартсан?" #: account/forms.py:312 msgid "Email (again)" msgstr "Имэйл (дахин)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Имэйл хаягийн баталгаажуулалт" #: account/forms.py:324 msgid "Email (optional)" msgstr "Имэйл (заавал биш)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Та өмнө оруулсантай ижил имэйл бичих ёстой." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Нууц үг (дахин)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Энэ имэйл хаяг энэ бүртгэлтэй холбогдсон байна." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "Та %d-с илүү имэйл хаяг нэмэх боломжгүй." #: account/forms.py:524 msgid "Current Password" msgstr "Одоогын Нууц Үг" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Шинэ Нууц Үг" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Шинэ Нууц Үг (дахин)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Одоогийн нууц үгээ оруулна уу." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Имэйл хаяг ямар ч хэрэглэгчийн бүртгэлтэй холбогдоогүй" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Нууц үг шинэчлэх токен буруу байна." #: account/models.py:21 msgid "user" msgstr "хэрэглэгч" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "имэйл хаяг" #: account/models.py:28 msgid "verified" msgstr "баталгаажуулсан" #: account/models.py:29 msgid "primary" msgstr "үндсэн" #: account/models.py:35 msgid "email addresses" msgstr "имэйл хаягууд" #: account/models.py:141 msgid "created" msgstr "үүсгэсэн" #: account/models.py:142 msgid "sent" msgstr "илгээсэн" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "түлхүүр" #: account/models.py:148 msgid "email confirmation" msgstr "имэйл баталгаажуулалт" #: account/models.py:149 msgid "email confirmations" msgstr "имэйл баталгаажуулалт" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Энэ имэйл хаягтай бүртгэл системд байна. Түүгээр нэвтэрнэ үүэхлээд бүртгэл, " "дараа нь %s бүртгэлээ холбоно уу" #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Таны бүртгэлд нууц үг тохируулаагүй байна." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Таны бүртгэлд баталгаажсан имэйл хаяг алга." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Сошиал Бүртгэлүүд" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "үйлчилгээ үзүүлэгч" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "үйлчилгээ үзүүлэгч" #: socialaccount/models.py:52 msgid "name" msgstr "нэр" #: socialaccount/models.py:54 msgid "client id" msgstr "клиент ID" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "Апп ID эсвэл хэрэглэгчийн түлхүүр" #: socialaccount/models.py:59 msgid "secret key" msgstr "нууц түлхүүр" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "API нууц, клиент нууц эсвэл хэрэглэгчийн нууц" #: socialaccount/models.py:65 msgid "Key" msgstr "Түлхүүр" #: socialaccount/models.py:77 msgid "social application" msgstr "сошиал апп" #: socialaccount/models.py:78 msgid "social applications" msgstr "сошиал апп-ууд" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "сүүлд нэвтэрсэн" #: socialaccount/models.py:116 msgid "date joined" msgstr "бүртгүүлсэн огноо" #: socialaccount/models.py:117 msgid "extra data" msgstr "нэмэлт өгөгдөл" #: socialaccount/models.py:121 msgid "social account" msgstr "сошиал хаяг" #: socialaccount/models.py:122 msgid "social accounts" msgstr "сошиал хаягууд" #: socialaccount/models.py:156 msgid "token" msgstr "токен" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) эсвэл нэвтрэх токен (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "токен нууц" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) эсвэл шинэчлэх токен (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "дуусах хугацаа" #: socialaccount/models.py:170 msgid "social application token" msgstr "сошиал апп токен" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "сошиал апп токенууд" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Буруу профайлын өгөгдөл" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "\"%s\"-с request токен авах үед буруу хариу." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "\"%s\"-с access токен авах үед буруу хариу." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "\"%s\"-д request токен хадгалагдаагүй." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "\"%s\"-д access токен хадгалагдаагүй." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "\"%s\" дээрх private resource-д хандах боломжгүй." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "\"%s\"-с request токен авах үед буруу хариу." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Бүртгэл идэвхгүй" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Энэ бүртгэл идэвхгүй байна." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Имэйл Хаягууд" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Дараах и-мэйл хаягууд таны бүртгэлтэй холбоотой байна:" #: templates/account/email.html:23 msgid "Verified" msgstr "Баталгаажсан" #: templates/account/email.html:27 msgid "Unverified" msgstr "Баталгаажаагүй" #: templates/account/email.html:32 msgid "Primary" msgstr "Үндсэн" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Үндсэн Болгох" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Баталгаажуулалтыг дахин илгээх" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Устгах" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Имэйл хаяг нэмэх" #: templates/account/email.html:70 msgid "Add Email" msgstr "Имэйл нэмэх" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Та үнэхээр сонгосон имэйл хаягаа устгахыг хүсэж байна уу?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "%(site_name)s-с мэнд хүргэж байна!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "%(site_name)s-г хэрэглэсэнд баярлалаа!%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "%(user_display)s хэрэглэгч %(site_domain)s дээр бүртгэл бүртгүүлэхийн " "тулданы и-мэйл хаягийг өгсөн тул та энэ имэйлийг хүлээн авч байна.\n" "\n" "Үүнийг зөв эсэхийг баталгаажуулахын тулд %(activate_url)s руу очно уу" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Имэйл хаягаа баталгаажуулна уу" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Та эсвэл өөр хэн нэгэн таны бүртгэлтэй нууц үгийг хүссэн тул нэ " "имэйлийгхүлээн авч байна.\n" "Хэрэв та нууц үг шинэчлэх хүсэлт гаргаагүй бол энэ имэйлийг устгаж болно." "Нууц үгээ шинэчлэх бол доорх холбоос дээр дарна уу." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Хэрэв та мартсан бол таны хэрэглэгчийн нэр %(username)s байна." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Нууц Үг Шинэчлэх Имэйл" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Та эсвэл өөр хэн нэгэн таны бүртгэлтэй нууц үгийг хүссэн тул нэ " "имэйлийгхүлээн авч байна.\n" "Хэрэв та нууц үг шинэчлэх хүсэлт гаргаагүй бол энэ имэйлийг устгаж болно." "Нууц үгээ шинэчлэх бол доорх холбоос дээр дарна уу." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Имэйл Хаягууд" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Дараах и-мэйл хаягууд таны бүртгэлтэй холбоотой байна:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Таны үндсэн имэйл хаягийг баталгаажуулсан байх ёстой." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Имэйл Хаяг Баталгаажуулах" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "Имэйл хаяг" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Имэйл Хаяг Баталгаажуулах" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "%(email)s нь %(user_display)s " "хэрэглэгчийнимайл хаяг гэдгийг баталгаажуулна уу." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Баталгаажуулах" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Сошиал хаяг аль хэдийн өөр бүртгэлд холбогдсон байна." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Энэ и-мэйл баталгаажуулах холбоосын хугацаа дууссан эсвэл хүчингүй байна.шинэ имэйлээр баталгаажуулах хүсэлт гаргана уу." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Нэвтрэх" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Хэрэв та бүртгэл үүсгээгүй байгаа бол\n" "эхлээд бүртгүүлнэ үү." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Гарах" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Та холболт салгахдаа итгэлтэй байна уу?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Та үндсэн имэйл хаяг (%(email)s)-г устгах боломжгүй." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "%(email)s-руу баталгаажуулах имэйл илгээсэн." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Та %(email)s-г баталгаажууллаа." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "%(email)s и-мэйл хаягийг устгасан." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "%(name)s нэрээр амжилттай нэвтэрлээ." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Та холболт салгалаа." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Нууц үг амжилттай өөрчлөгдлөө." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Нууц үгийг амжилттай тохирууллаа." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Үндсэн имэйл хаягийг тохируулсан." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Таны үндсэн имэйл хаягийг баталгаажуулсан байх ёстой." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Нууц үг солих" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Нууц Үг Мартсан?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Нууц үг шинэчлэх" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Нууц үгээ мартсан уу? Доор бүртгэлтэй и-мэйл хаягаа оруулж нууц үг шинэчлэх " "имэйлээр нууц үгээ сэргээнэ уу." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Нууц Үг Шинэчлэх" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "Нууц үгээ шинэчлэхэд асуудал гарвал бидэнтэй холбогдоно уу." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Бид танд баталгаажуулах и-мэйл илгээсэн.\n" "Энэ цахим шуудангийн доторх холбоос дээр дарна уу. Хэдэн минутын\n" "дотор хүлээж авахгүй бол бидэнтэй холбоо барина уу." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Муу токен" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Нууц үг шинэчлэх холбоос хүчингүй байсан, үүнийг аль хэдийн ашигласан байж " "магадгүй. шинэ нууц үг шинэчлэх хүсэлт " "гаргана уу." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Таны нууц үг одоо өөрчлөгдсөн байна." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Нууц үг тохируулах" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Имэйл Хаяг Баталгаажуулах" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Бүртгүүлэх" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Бүртгүүлэх" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Бүртгэлтэй юу? Тэгвэл бүртгэлтэй хаягаар нэвтрэнэ " "үү." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Бүртгэл хаалттай" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Уучлаарай, бүртгэл одоогоор хаалттай байна." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Анхаарна уу" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "Та аль хэдийн %(user_display)s нэрээр нэвтэрсэн байна." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Анхааруулга:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Танд одоогоор тохируулсан имэйл хаяг байхгүй байна. Та имэйл хаяг нэмэх " "хэрэгтэйингэснээр та мэдэгдэл хүлээн авах, нууц үгээ шинэчлэх г.м боломжтой " "болно." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Имэйл хаягаа баталгаажуулна уу" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Бид танд баталгаажуулах и-мэйл илгээсэн. Бүртгүүлэх үйл явцыг дуусгахын тулд " "өгөгдсөн холбоосыг дагана уу. Хэдэн минутын дотор хүлээж авахгүй бол " "бидэнтэй холбоо барина уу." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Сайтын энэ хэсэг нь таныг өөрийгөө мөн болохыг\n" "баталгаажуулахыг биднээс шаарддаг. Энэ зорилгоор бид таныг цахим\n" "шуудангийн хаягаа эзэмшиж буй эсэхийг баталгаажуулахыг шаардаж байна." #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Бид танд баталгаажуулах и-мэйл илгээсэн.\n" "Энэ цахим шуудангийн доторх холбоос дээр дарна уу. Хэдэн минутын\n" "дотор хүлээж авахгүй бол бидэнтэй холбоо барина уу." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Санамж: та мэйл хаягаа өөрчлөхболомжтой хэвээр байна." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "токен нууц" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Сошиал-р нэвтрэхэд алдаа гарлаа" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Таны сошиал бүртгэлээр нэвтрэхийг оролдох үед алдаа гарлаа." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Бүртгэлийн холболтууд" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Та дараах гуравдагч этгээдийн аль нэг бүртгэлийг ашиглан өөрийн бүртгэлд " "нэвтэрч болно." #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Танд одоогоор энэ бүртгэлд холбогдсон сошиал бүртгэл байхгүй байна." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Гуравдагч этгээдийн бүртгэл нэмэх" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Нэвтрэлт цуцлагдсан" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Та одоо байгаа бүртгэлийнхээ аль нэгийг ашиглан манай сайтад нэвтрэхээ " "цуцлахаар шийдсэн. Хэрэв энэ нь алдаа байсан бол нэвтэрнэ үү." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Сошиал хаяг холбогдсон байна." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Сошиал хаяг аль хэдийн өөр бүртгэлд холбогдсон байна." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Сошиал хаягыг салгасан." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Та %(site_name)s руу нэвтрэхийн тулд %(provider_name)s бүртгэлээ\n" "ашиглах гэж байна. Эцсийн алхам болгон дараах маягтыг бөглөнө үү:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Одоо байгаа гуравдагч\n" #~ "этгээдийн бүртгэлийн аль нэгээр нэвтэрнэ үү. Эсвэл %(site_name)s бүртгэлд " #~ "бүртгүүлждоор нэвтэрнэ үү:" #~ msgid "or" #~ msgstr "эсвэл" #~ msgid "change password" #~ msgstr "нууц үг солих" #~ msgid "OpenID Sign In" #~ msgstr "OpenID-р Нэвтрэх" #~ msgid "This email address is already associated with another account." #~ msgstr "Энэ имэйл хаяг өөр бүртгэлтэй холбогдсон байна." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Бид танд имэйл илгээсэн. Хэдхэн минутын дотор хүлээж авахгүй бол бидэнтэй " #~ "холбоо барина уу." django-allauth-0.58.2/allauth/locale/nb/000077500000000000000000000000001452212273200177705ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/nb/LC_MESSAGES/000077500000000000000000000000001452212273200215555ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/nb/LC_MESSAGES/django.po000066400000000000000000001072041452212273200233630ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2019-12-18 18:56+0100\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Brukernavnet kan ikke benyttes. Vennligst velg et annet brukernavn." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "For mange innloggingsforsøk. Vennligst prøv igjen senere." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "En bruker med denne e-postadressen er allerede registrert." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Nåværende passord" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Passordet må være minst {0} tegn." #: account/apps.py:9 msgid "Accounts" msgstr "Kontoer" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Du må skrive det samme passordet hver gang." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Passord" #: account/forms.py:94 msgid "Remember Me" msgstr "Husk meg" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Denne kontoen er inaktiv." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "E-postadressen og/eller passordet du oppgav er feil." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Brukernavnet og/eller passordet du oppgav er feil." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "E-postadresse" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-post" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Brukernavn" #: account/forms.py:134 msgid "Username or email" msgstr "Brukernavn eller e-post" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Logg inn" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Glemt passord?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-post (igjen)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Bekreftelse av e-postadresse" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-post (valgfritt)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Du må skrive inn samme e-post hver gang." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Passord (igjen)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Denne e-postadressen er allerede tilknyttet denne kontoen." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Din konto har ingen verifisert e-postadresse." #: account/forms.py:524 msgid "Current Password" msgstr "Nåværende passord" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Nytt passord" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Nytt passord (igjen)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Vennligst skriv inn ditt passord." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "E-postadressen er ikke tilknyttet noen brukerkonto" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Nøkkelen for passordgjenopprettelse var ugyldig." #: account/models.py:21 msgid "user" msgstr "bruker" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "e-postadresse" #: account/models.py:28 msgid "verified" msgstr "verifisert" #: account/models.py:29 msgid "primary" msgstr "primær" #: account/models.py:35 msgid "email addresses" msgstr "e-postadresser" #: account/models.py:141 msgid "created" msgstr "opprettet" #: account/models.py:142 msgid "sent" msgstr "sendt" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "nøkkel" #: account/models.py:148 msgid "email confirmation" msgstr "e-postbekreftelse" #: account/models.py:149 msgid "email confirmations" msgstr "e-postbekreftelser" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "En konto med denne e-postadressen eksisterer fra før. Vennligst logg inn på " "den kontoen først for så å koble til din %s konto." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Kontoen din har ikke noe passord." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Din konto har ingen verifisert e-postadresse." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Sosiale kontoer" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "tilbyder" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "tilbyder" #: socialaccount/models.py:52 msgid "name" msgstr "navn" #: socialaccount/models.py:54 msgid "client id" msgstr "klient-ID" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "App-ID eller konsumentnøkkel" #: socialaccount/models.py:59 msgid "secret key" msgstr "hemmelig nøkkel" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "API-nøkkel, klient-nøkkel eller konsumentnøkkel" #: socialaccount/models.py:65 msgid "Key" msgstr "Nøkkel" #: socialaccount/models.py:77 msgid "social application" msgstr "sosial applikasjon" #: socialaccount/models.py:78 msgid "social applications" msgstr "sosiale applikasjoner" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "siste innlogging" #: socialaccount/models.py:116 msgid "date joined" msgstr "ble med dato" #: socialaccount/models.py:117 msgid "extra data" msgstr "ekstra data" #: socialaccount/models.py:121 msgid "social account" msgstr "sosialkonto" #: socialaccount/models.py:122 msgid "social accounts" msgstr "sosialkontoer" #: socialaccount/models.py:156 msgid "token" msgstr "nøkkel" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) eller aksess token (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "hemmelig nøkkel" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) eller oppdateringsnøkkel (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "utgår den" #: socialaccount/models.py:170 msgid "social application token" msgstr "sosial applikasjonsnøkkel" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "sosial applikasjonsnøkler" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Ugyldig profildata" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Ugyldig respons ved henting av forespørselsnøkkel fra \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Ugyldig respons ved henting av tilgangsnøkkel fra \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Ingen etterspørselsnøkler lagret for \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Ingen tilgangsnøkler lagret for \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Ingen tilgang til private ressurser på \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Ugyldig respons ved henting av forespørselsnøkkel fra \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Inaktiv konto" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Denne kontoen er inaktiv." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "E-postadresser" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Følgende e-postadresser er assosiert med din konto:" #: templates/account/email.html:23 msgid "Verified" msgstr "Verifisert" #: templates/account/email.html:27 msgid "Unverified" msgstr "Ikke verifisert" #: templates/account/email.html:32 msgid "Primary" msgstr "Primær" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Sett som primær" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Send verifikasjon på nytt" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Fjern" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Legg til e-postadresse" #: templates/account/email.html:70 msgid "Add Email" msgstr "Legg til e-post" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Er du sikker på at du vil fjerne valgt e-postadresse?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Takk fra %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Takk for at du bruker %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Hei fra %(site_name)s!\n" "\n" "Du mottar denne e-postadressen fordi %(user_display)s har gitt din e-" "postkonto for å koble til sin brukerkonto.\n" "\n" "For å bekrefte at dette stemmer, gå til %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Vennligst bekreft din e-postadresse" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Hei fra %(site_name)s!\n" "\n" "Du mottar denne e-postadressen fordi du eller noen andre har etterspurt et " "passord for din brukerkonto.\n" "Meldingen kan trygt ignoreres om du ikke foretok denne etterspørselen. Klikk " "på linken nedenfor for å gjennopprette ditt passord." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "I tilfelle du har glemt det: Brukernavnet ditt er %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-post for gjenopprettelse av passord" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Hei fra %(site_name)s!\n" "\n" "Du mottar denne e-postadressen fordi du eller noen andre har etterspurt et " "passord for din brukerkonto.\n" "Meldingen kan trygt ignoreres om du ikke foretok denne etterspørselen. Klikk " "på linken nedenfor for å gjennopprette ditt passord." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "E-postadresser" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Følgende e-postadresser er assosiert med din konto:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Din primære e-postadresse må være verifisert." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Bekreft e-postadresse" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-post" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Bekreft e-postadresse" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Vennligst bekreft at %(email)s er en e-" "postadresse for bruker %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Bekreft" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Tredjepartskonten er allerede tilknytet til en annen konto." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Denne e-postbekreftelseslinken er utgått eller ugyldig. Vennligst etterspør en ny e-postbekreftelseslink." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Logg inn" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Om du enda ikke har laget en konto, vennligst\n" "registrer deg først." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Logg ut" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Er du sikker at du ønsker å logge ut?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Du kan ikke fjerne den primær e-postadressen (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Bekreftelsese-post er sendt til %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Du har bekreftet %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Fjern e-postadressen %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Logget inn som %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Du har logget ut." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Passordet er endret." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Passordet er satt." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Primær e-postadresse er satt." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Din primære e-postadresse må være verifisert." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Endre Passord" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Glemt passord?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Passordgjenopprettelse" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Glemt ditt passord? Skriv inn din e-postadresse nedenfor, så sender vi deg " "en e-post for å lage et nytt." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Gjenopprett mitt passord" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "Vennligst kontakt oss om du har problemer med passordgjenopprettelsen." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Vi har send en e-post til deg for\n" "verifikasjon. Vennligst klikk på linken i e-posten. Vennligst kontakt oss om " "du ikke mottar den innen et par minutter." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Ugyldig token" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Passordgjenopprettelseslinken er ugyldig – muligens fordi den allerede er " "brukt. Vennligst etterspør en ny " "passordgjennopprettelse." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Ditt passord er endret." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Sett passord" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Bekreft e-postadresse" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registrer deg" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Registrer deg" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Har du allerede en konto? Vennligst logg inn." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Registrering stengt" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Beklager, men registrering er for tiden stengt." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Notat" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "du er allerede logget inn som %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Advarsel:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Du har for tiden ingen e-postadresse satt opp. Du burde legge til en e-" "postadresse slik at du kan motta varsler, gjennoprette passord ol." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Bekreft din e-postadresse" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Vi har sendt deg en e-post for verifisering. Følg linken for å fullføre " "registreringen. Vennligst kontakt oss om du ikke har mottatt den innen et " "par minutter." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Denne delen av siden krever at du verifiserer at du er den du er. På grunn " "av dette, må du verifisere ditt eierskap av din e-postadresse. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Vi har send en e-post til deg for\n" "verifikasjon. Vennligst klikk på linken i e-posten. Vennligst kontakt oss om " "du ikke mottar den innen et par minutter." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Merk: du kan fremdeles endre din " "your e-postadresse." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "hemmelig nøkkel" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Innlogging ved hjelp av sosialt nettverk mislyktes" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Det skjedde en feil ved forsøket på å logge inn via din nettverkskonto." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Kontotilkoblinger" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Du kan logge inn på din konto ved å bruke en av følgende tredjeparts kontoer:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Du har for tiden ingen tredjepartskontoer tilkoblet din konto." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Legg til en tredjepartskonto" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Innlogging kansellert" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Du bestemt deg for å kansellere innlogging til siden ved å bruke en av dine " "eksisterende kontoer. Om dette var ved en feil, vennligst fortsett til innloggingen." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Tredjepartskontoen har blitt tilknytet." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Tredjepartskonten er allerede tilknytet til en annen konto." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Tredjepartskontoen er blitt frakoblet." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Du er på vei til å bruke din %(provider_name)s konto for å logge inn på\n" "%(site_name)s. Som et siste steg, vennligst fullfør følgende skjema:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Vennligst logg in med en\n" #~ "av dine eksisterende tredjeparts kontoer på %(site_name)s. Eller, registrer deg\n" #~ "og logg inn nedenfor:" #~ msgid "or" #~ msgstr "eller" #~ msgid "change password" #~ msgstr "Endre passord" #~ msgid "OpenID Sign In" #~ msgstr "OpenID-innlogging" #~ msgid "This email address is already associated with another account." #~ msgstr "Denne e-postadressen er tilknyttet en annen konto." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Vi har sendt deg en e-post. Vennligst kontakt oss om du ikke mottar den " #~ "innen et par minutter." #~ msgid "Account" #~ msgstr "Konto" django-allauth-0.58.2/allauth/locale/nl/000077500000000000000000000000001452212273200200025ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/nl/LC_MESSAGES/000077500000000000000000000000001452212273200215675ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/nl/LC_MESSAGES/django.po000066400000000000000000001074251452212273200234020ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # pennersr , 2013 msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2023-11-03 10:25+0100\n" "Last-Translator: pennersr \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/django-allauth/" "language/nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Deze gebruikersnaam mag je niet gebruiken, kies een andere." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Te veel inlogpogingen. Probeer het later nogmaals." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Er is al een gebruiker geregistreerd met dit e-mailadres." #: account/adapter.py:60 msgid "Incorrect password." msgstr "Ongeldig wachtwoord." #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Het wachtwoord moet minimaal {0} tekens bevatten." #: account/apps.py:9 msgid "Accounts" msgstr "Accounts" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Je moet hetzelfde wachtwoord twee keer intoetsen." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Wachtwoord" #: account/forms.py:94 msgid "Remember Me" msgstr "Onthouden" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Dit account is niet actief" #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Je e-mailadres en/of wachtwoord zijn incorrect." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Je gebruikersnaam en/of wachtwoord zijn incorrect." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "E-mailadres" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Gebruikersnaam" #: account/forms.py:134 msgid "Username or email" msgstr "Gebruikersnaam of e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Login" #: account/forms.py:148 msgid "Forgot your password?" msgstr "Wachtwoord vergeten?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-mail (bevestigen)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Bevestig e-mailadres" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (optioneel)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Je moet hetzelfde e-mailadres twee keer intoetsen." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Wachtwoord (bevestigen)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Dit e-mailadres is al geassocieerd met dit account." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "Je kunt niet meer dan %d e-mailadressen toevoegen." #: account/forms.py:524 msgid "Current Password" msgstr "Huidig wachtwoord" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Nieuw wachtwoord" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Nieuw wachtwoord (bevestigen)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Geef je huidige wachtwoord op." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Dit e-mailadres is niet bij ons bekend" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "De wachtwoordherstel-sleutel is niet geldig." #: account/models.py:21 msgid "user" msgstr "gebruiker" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "e-mailadres" #: account/models.py:28 msgid "verified" msgstr "geverifieerd" #: account/models.py:29 msgid "primary" msgstr "Primair" #: account/models.py:35 msgid "email addresses" msgstr "e-mailadressen" #: account/models.py:141 msgid "created" msgstr "aangemaakt" #: account/models.py:142 msgid "sent" msgstr "verstuurd" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "sleutel" #: account/models.py:148 msgid "email confirmation" msgstr "e-mailadres bevestiging" #: account/models.py:149 msgid "email confirmations" msgstr "e-mailadres bevestigingen" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" "Je moet eerst je e-mailadres verifiëren voordat je twee-factor-authenticatie " "kunt activeren." #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" "Je kunt geen e-mailadres toevoegen aan een account dat beveiligd is met twee-" "factor-authenticatie is." #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "Ongeldige code." #: mfa/apps.py:7 msgid "MFA" msgstr "MFA" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "Code" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "Authenticator code" #: mfa/models.py:15 msgid "Recovery codes" msgstr "Herstelcodes" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "TOTP Authenticator" #: socialaccount/adapter.py:32 #, python-format msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Er bestaat al een account met dit e-mailadres. Meld je eerst aan met dit " "account, verbind daarna je %s account." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Je account heeft geen wachtwoord ingesteld." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Je account heeft geen geverifieerd e-mailadres." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Sociale accounts" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "provider" #: socialaccount/models.py:48 msgid "provider ID" msgstr "provider ID" #: socialaccount/models.py:52 msgid "name" msgstr "naam" #: socialaccount/models.py:54 msgid "client id" msgstr "client id" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "App ID, of consumer key" #: socialaccount/models.py:59 msgid "secret key" msgstr "geheime sleutel" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "API secret, client secret, of consumer secret" #: socialaccount/models.py:65 msgid "Key" msgstr "Sleutel" #: socialaccount/models.py:77 msgid "social application" msgstr "social application" #: socialaccount/models.py:78 msgid "social applications" msgstr "social applications" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "laatst ingelogd" #: socialaccount/models.py:116 msgid "date joined" msgstr "datum toegetreden" #: socialaccount/models.py:117 msgid "extra data" msgstr "extra data" #: socialaccount/models.py:121 msgid "social account" msgstr "social account" #: socialaccount/models.py:122 msgid "social accounts" msgstr "social accounts" #: socialaccount/models.py:156 msgid "token" msgstr "token" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "verloopt op" #: socialaccount/models.py:170 msgid "social application token" msgstr "" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Ongeldige profiel data" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "" "Ongeldig antwoord ontvangen tijdens het ophalen van een verzoeksleutel van " "\"%s\", antwoord: \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "" "Ongeldig antwoord ontvangen tijdens het ophalen van een toegangssleutel van " "\"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Geen verzoeksleutel opgeslagen voor \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Geen toegangssleutel opgeslagen voor \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Geen toegang tot privé data bij \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "" "Ongeldig antwoord ontvangen tijdens het ophalen van een verzoeksleutel van " "\"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Account inactief" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Dit account is niet actief" #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "E-mailadressen" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "De volgende e-mailadressen zijn gekoppeld aan jouw account:" #: templates/account/email.html:23 msgid "Verified" msgstr "Geverifieerd" #: templates/account/email.html:27 msgid "Unverified" msgstr "Ongeverifieerd" #: templates/account/email.html:32 msgid "Primary" msgstr "Primair" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Maak primair" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Stuur verificatie e-mail opnieuw" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Verwijder" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Voeg e-mailadres toe" #: templates/account/email.html:70 msgid "Add Email" msgstr "E-mail toevoegen" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Wil je het geselecteerde e-mailadres echt verwijderen?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" "Je ontvangt deze e-mail omdat jij of iemand anders geprobeerd heeft een " "account\n" "te registreren met dit e-mail adres:\n" "\n" "%(email)s\n" "\n" "Echter, er bestaat al een account met dit e-mail adres. Als je dit " "vergeten\n" "was, gebruik dan de wachtwoord vergeten procedure om de toegang tot je " "account\n" "te herstellen:\n" "\n" "%(password_reset_url)s" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "Account bestaat al" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Hallo van %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Bedankt voor het gebruiken van %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Je ontvangt deze e-mail omdat gebruiker %(user_display)s van\n" "%(site_domain)s dit als e-mailadres heeft opgegeven om te koppelen\n" "aan zijn of haar account.\n" "\n" "Om te bevestigen dat dit correct is, bezoek: %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Bevestig je e-mailadres" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Je ontvangt deze mail omdat er een verzoek is ingelegd om je wachtwoord " "opnieuw\n" "in te stellen. Je kunt deze gerust mail negeren als je dit niet zelf gedaan\n" "hebt. Anders, klik op de volgende link om je wachtwoord opnieuw in te " "stellen." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Deze link hoort bij je account met gebruikersnaam %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Nieuw wachtwoord" #: templates/account/email/unknown_account_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Je ontvang deze e-mail omdat er een verzoek is ingelegd om het wachtwoord " "te\n" "veranderen van account met e-mailadres %(email)s. Echter, dit account " "bestaat\n" "niet.\n" "\n" "Je kunt deze e-mail negeren als jij dit verzoek niet zelf hebt ingelegd.\n" "\n" "Als jij dit wel hebt gedaan, dan kun je je via de volgende link registreren." #: templates/account/email_change.html:5 templates/account/email_change.html:9 msgid "Email Address" msgstr "E-mailadres" #: templates/account/email_change.html:14 msgid "The following email address is associated with your account:" msgstr "De volgende e-mailadressen zijn gekoppeld aan jouw account:" #: templates/account/email_change.html:19 msgid "Your email address is still pending verification:" msgstr "Je primaire e-mailadres wacht op verificatie." #: templates/account/email_change.html:38 msgid "Change Email Address" msgstr "Wijzig e-mailadres" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 msgid "Change Email" msgstr "E-mail wijzigen" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Bevestig e-mailadres" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Bevestig dat %(email)s een e-mailadres is " "voor gebruiker %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Bevestigen" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, python-format msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "" "Het e-mail adres %(email)s kon niet worden geverifieerd omdat het gekoppeld " "is aan een ander account." #: templates/account/email_confirm.html:35 #, python-format msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Deze e-mail verificatie link is verlopen of niet geldig. Dien een\n" "nieuw e-mail verificatie verzoek in." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Aanmelden" #: templates/account/login.html:12 #, python-format msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Als je nog geen account hebt registreer je\n" "dan eerst." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Afmelden" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Weet je zeker dat je wilt afmelden?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "You kunt je primaire e-mailadres (%(email)s) niet verwijderen." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Bevestigings e-mail verzonden aan %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Je hebt het e-mailadres %(email)s bevestigd" #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "E-mailadres %(email)s verwijderd." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Je bent nu ingelogd als %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Je bent afgemeld." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Wachtwoord wijziging geslaagd." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Je wachtwoord is gewijzigd." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Primair e-mailadres ingesteld." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Je primaire e-mailadres moet geverifieerd zijn." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Wachtwoord wijzigen" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Wachtwoord vergeten?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Nieuw wachtwoord" #: templates/account/password_reset.html:14 msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Wachtwoord vergeten? Vul je e-mailadres in en we sturen je een e-mail " "waarmee je een nieuw wachtwoord kunt instellen." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Herstel mijn wachtwoord" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Neem a.u.b. contact met ons op als het niet lukt je wachtwoord opnieuw in te " "stellen." #: templates/account/password_reset_done.html:16 msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Volg de link in de verificatie e-mail om de controle af te ronden. Neem a.u." "b. contact met ons op als je de e-mail niet binnen enkele minuten ontvangt." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Ongeldige sleutel" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "De link om je wachtwoord opnieuw in te stellen is niet geldig. Mogelijk is " "deze al een keer gebruikt. Herstel je " "wachtwoord opnieuw." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Je wachtwoord is gewijzigd." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Zet wachtwoord" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 msgid "Confirm Access" msgstr "Toegang bevestigen" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" "Om de beveiliging van je account te waarborgen, voert eerst je wachtwoord in:" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registreren" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Registreren" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Heb je al een account? Meld je dan aan." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Registratie gesloten" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Helaas, maar je kunt je momenteel niet registreren." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Notitie" #: templates/account/snippets/already_logged_in.html:7 #, python-format msgid "You are already logged in as %(user_display)s." msgstr "Je bent al ingelogd als %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Waarschuwing:" #: templates/account/snippets/warn_no_email.html:3 msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Het is raadzaam een e-mailadres toe te voegen zodat je notificaties kunt " "ontvangen, je wachtwoord opnieuw kunt instellen, enz." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Verifieer je e-mailadres" #: templates/account/verification_sent.html:12 msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "We hebben een e-mail verstuurd ter verificatie. Volg de link in deze mail om " "je registratie af te ronden. Neem a.u.b. contact met ons op als je deze e-" "mail niet binnen enkele minuten ontvangt." #: templates/account/verified_email_required.html:13 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Voor dit gedeelte van de site is het nodig dat we je identiteit\n" "verifiëren. Via een verificatie e-mail kunnen we controleren dat je\n" "daadwerkelijk toegang hebt tot het opgegeven e-mailadres." #: templates/account/verified_email_required.html:18 msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Volg de link in de verificatie e-mail om de controle af te ronden. Neem a.u." "b. contact met ons op als je de e-mail niet binnen enkele minuten ontvangt." #: templates/account/verified_email_required.html:23 #, python-format msgid "" "Note: you can still change your " "email address." msgstr "" "Merk op: je kunt altijd je e-mail " "adres wijzigen." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "Berichten:" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "Menu:" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "Twee-factor-authenticatie" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" "Je account is beveiligd met twee-factor-authenticatie. Voer alstublieft een " "authenticatiecode in:" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "Authenticator-app" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "Authenticatie middels een authenticator-app is actief." #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "Een authenticator-app is not actief." #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "Deactiveer" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "Activeer" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "Herstelcodes" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" "Er is nog %(unused_count)s van de %(total_count)s herstelcodes beschikbaar." msgstr[1] "" "Er zijn nog %(unused_count)s van de %(total_count)s herstelcodes beschikbaar." #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "Er zijn geen herstelcodes ingesteld." #: templates/mfa/index.html:56 msgid "View" msgstr "Bekijk" #: templates/mfa/index.html:62 msgid "Download" msgstr "Downloaden" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "Genereer" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "Er zijn nieuwe herstelcodes gegenereerd." #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "Authenticator-app geactiveerd." #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "Authenticator-app gedeactiveerd." #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "Je staat op het punt nieuwe herstelcodes te genereren voor je account." #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "Hierdoor zullen eerdere herstelcodes niet langer werken." #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "Weet je dit zeker?" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "Ongebruikte codes" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "Codes downloaden" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "Nieuwe codes genereren" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "Activeer authenticator-app" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" "Beveilig je account met twee-factor-authenticatie. Scan eerst de " "onderstaande QR code met je authenticator app, en vul vervolgens de " "resulterende verificatie code in." #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "Authenticator geheim" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" "Je kunt deze code bewaren en later gebruiken om je authenticator app opnieuw " "te installeren." #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "Deactiveer authenticator-app" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" "Je staat op het punt authenticatie middels een authenticator-app te " "deactiveren. Wil je dit echt?" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Aanmelden Mislukt" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Er is een fout opgetreden toen we je wilde inloggen via je externe account." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Account Connecties" #: templates/socialaccount/connections.html:13 msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Je kunt jezelf aanmelden met een van de volgende externe accounts:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Je hebt momenteel geen externe accounts gekoppeld." #: templates/socialaccount/connections.html:48 msgid "Add a Third-Party Account" msgstr "Voeg een extern account toe" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "Koppel %(provider)s" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" "Je staat op het punt om een nieuw account van %(provider)s aan je account te " "koppelen." #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "Aanmelden via %(provider)s" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "Je staat op het punt om jezelf aan te melden via %(provider)s." #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "Ga verder" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Aanmelden geannuleerd" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Je hebt het aanmelden via een extern account geannuleerd. Als dit een " "vergissing was, meld je dan opnieuw aan." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Het externe account is gekoppeld." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Dit externe account is al gekoppeld aan een ander account." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Het externe account is ontkoppeld." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Om bij %(site_name)s in te kunnen loggen via %(provider_name)s hebben we de " "volgende gegevens nodig:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "Of gebruik een derde partij" #, fuzzy #~| msgid "Generate" #~ msgid "Regenerate" #~ msgstr "Genereer" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Meld je aan met een van je bestaande externe accounts. Of, registreer voor een %(site_name)s account en " #~ "meld je hiermee aan:" #~ msgid "or" #~ msgstr "of" #~ msgid "change password" #~ msgstr "Wachtwoord wijzigen" #~ msgid "OpenID Sign In" #~ msgstr "Aanmelden via OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Dit e-mailadres is al geassocieerd met een ander account." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "We hebben je een e-mail verstuurd. Neem a.u.b. contact met ons op als je " #~ "deze niet binnen enkele minuten ontvangen hebt." #~ msgid "Account" #~ msgstr "Account" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Je login en wachtwoord komen niet overeen." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Gebruikersnamen mogen alleen letters, cijfers en @/./+/-/_ bevatten." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Deze gebruikersnaam is al in gebruik. Kies a.u.b. een andere naam." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Aanmelden" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Je hebt bevestigd dat %(email)s een e-" #~ "mail adres is voor gebruiker %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Bedankt voor het gebruik van onze site!" #~ msgid "Confirmation email sent to %(email)s" #~ msgstr "Bevestigings e-mail verzonden aan %(email)s" #~ msgid "Delete Password" #~ msgstr "Verwijder wachtwoord" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "" #~ "Je kunt je wachtwoord verwijderen omdat je via OpenID bent ingelogd." #~ msgid "delete my password" #~ msgstr "Verwijder mijn wachtwoord" #~ msgid "Password Deleted" #~ msgstr "Wachtwoord verwijderd" #~ msgid "Your password has been deleted." #~ msgstr "Je wachtwoord is verwijderd." django-allauth-0.58.2/allauth/locale/pl/000077500000000000000000000000001452212273200200045ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/pl/LC_MESSAGES/000077500000000000000000000000001452212273200215715ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/pl/LC_MESSAGES/django.po000066400000000000000000001126601452212273200234010ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2020-10-12 12:34+0200\n" "Last-Translator: Radek Czajka \n" "Language-Team: \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" "%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" "%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Nie możesz użyć tej nazwy użytkownika. Proszę wybierz inną." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Zbyt wiele nieudanych prób logowania. Spróbuj ponownie później." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "W systemie jest już zarejestrowany użytkownik o tym adresie e-mail." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Obecne hasło" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Hasło musi składać się z co najmniej {0} znaków." #: account/apps.py:9 msgid "Accounts" msgstr "Konta" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Musisz wpisać za każdym razem to samo hasło." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Hasło" #: account/forms.py:94 msgid "Remember Me" msgstr "Pamiętaj mnie" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Konto jest obecnie nieaktywne." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Podany adres e-mail i/lub hasło są niepoprawne." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Podana nazwa użytkownika i/lub hasło są niepoprawne." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Adres e-mail" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Nazwa użytkownika" #: account/forms.py:134 msgid "Username or email" msgstr "Nazwa użytkownika lub e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Login" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Nie pamiętasz hasła?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-mail (ponownie)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Powierdzenie adresu email" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (opcjonalnie)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Musisz wpisać za każdym razem ten sam e-mail." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Hasło (ponownie)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Ten adres e-mail jest już powiązany z tym kontem." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "Nie możesz dodać więcej niż %d adresów e-mail." #: account/forms.py:524 msgid "Current Password" msgstr "Obecne hasło" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Nowe hasło" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Nowe hasło (ponownie)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Proszę wpisz swoje obecne hasło." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Adres e-mail nie jest powiązany z żadnym kontem użytkownika" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Token resetowania hasła był nieprawidłowy." #: account/models.py:21 msgid "user" msgstr "użytkownik" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "adres e-mail" #: account/models.py:28 msgid "verified" msgstr "zweryfikowany" #: account/models.py:29 msgid "primary" msgstr "podstawowy" #: account/models.py:35 msgid "email addresses" msgstr "adresy e-mail" #: account/models.py:141 msgid "created" msgstr "utworzono" #: account/models.py:142 msgid "sent" msgstr "wysłano" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "klucz" #: account/models.py:148 msgid "email confirmation" msgstr "potwierdzenie adresu e-mail" #: account/models.py:149 msgid "email confirmations" msgstr "potwierdzenia adresów e-mail" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Istnieje już konto dla tego adresu e-mail. Zaloguj się najpierw na to konto, " "a następnie połącz swoje konto %s." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Twoje konto nie posiada hasła." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Twoje konto nie ma zweryfikowanego adresu e-mail." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Konta społecznościowe" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "dostawca usług" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "dostawca usług" #: socialaccount/models.py:52 msgid "name" msgstr "nazwa" #: socialaccount/models.py:54 msgid "client id" msgstr "id klienta" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "ID aplikacji lub klucz odbiorcy" #: socialaccount/models.py:59 msgid "secret key" msgstr "klucz prywatny" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "Klucz prywatny API, klienta lub odbiorcy" #: socialaccount/models.py:65 msgid "Key" msgstr "Klucz" #: socialaccount/models.py:77 msgid "social application" msgstr "aplikacja społecznościowa" #: socialaccount/models.py:78 msgid "social applications" msgstr "aplikacje społecznościowe" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "data ostatniego logowania" #: socialaccount/models.py:116 msgid "date joined" msgstr "data przyłączenia" #: socialaccount/models.py:117 msgid "extra data" msgstr "dodatkowe dane" #: socialaccount/models.py:121 msgid "social account" msgstr "konto społecznościowe" #: socialaccount/models.py:122 msgid "social accounts" msgstr "konta społecznościowe" #: socialaccount/models.py:156 msgid "token" msgstr "token" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) lub access token (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "token secret" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) lub refresh token (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "wygasa" #: socialaccount/models.py:170 msgid "social application token" msgstr "token aplikacji społecznościowej" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "tokeny aplikacji społecznościowych" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Nieprawidłowe dane profilu" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Błędna odpowiedź podczas pobierania tokena z \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Błędna odpowiedź podczas pobierania tokena autoryzacji z \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Brak tokena zapisanego dla \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Brak zapisanego tokena autoryzacji \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Brak dostępu do prywatnych zasobów na \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Błędna odpowiedź podczas pobierania tokena z \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Konto nieaktywne" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "To konto jest nieaktywne." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Adresy e-mail" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Poniższe adresy e-mail są powiązane z Twoim kontem:" #: templates/account/email.html:23 msgid "Verified" msgstr "Zweryfikowany" #: templates/account/email.html:27 msgid "Unverified" msgstr "Brak weryfikacji" #: templates/account/email.html:32 msgid "Primary" msgstr "Podstawowy" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Uczyń podstawowym" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Prześlij ponownie wiadomość weryfikacyjną" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Usuń" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Dodaj adres e-mail" #: templates/account/email.html:70 msgid "Add Email" msgstr "Dodaj e-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Czy naprawdę chcesz usunąć wybrany adres e-mail?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Witamy z %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Dziękujemy za korzystanie z %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Otrzymujesz ten e-mail, ponieważ użytkownik %(user_display)s podał niniejszy " "adres e-mail, aby powiązać go z swoim kontem w serwisie %(site_domain)s.\n" "\n" "Aby potwierdzić powiązanie, kliknij w link %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Proszę potwierdź adres e-mail" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Otrzymujesz tę wiadomość, ponieważ Ty lub ktoś inny poprosił o zresetowanie " "hasła do Twojego konta.\n" "Niniejszą wiadomość możesz spokojnie zignorować, jeżeli prośba nie " "pochodziła od Ciebie. Kliknij w link poniżej, aby zresetować hasło." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "" "Na wszelki wypadek przypominamy, że Twoja nazwa użytkownika to %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-mail z łączem do zmiany hasła" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Otrzymujesz tę wiadomość, ponieważ Ty lub ktoś inny poprosił o zresetowanie " "hasła do Twojego konta.\n" "Niniejszą wiadomość możesz spokojnie zignorować, jeżeli prośba nie " "pochodziła od Ciebie. Kliknij w link poniżej, aby zresetować hasło." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Adresy e-mail" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Poniższe adresy e-mail są powiązane z Twoim kontem:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Twój podstawowy adres e-mail musi być zweryfikowany." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Potwierdź adres e-mail" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Potwierdź adres e-mail" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Proszę potwierdź, że adres %(email)s jest " "adresem e-mail dla użytkownika %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Potwierdź" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "To konto społecznościowe jest już połączone z innym kontem." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Łącze z adresem do zresetowania hasła wygasło lub jest niepoprawne. wygenerować nowe łącze dla Twojego adresu. ." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Zaloguj" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Jeżeli nie masz jeszcze konta, to proszę zarejestruj się." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Wyloguj się" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Czy na pewno chcesz się wylogować ?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Nie możesz usunąć podstawowego adresu e-mail (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "E-mail z potwierdzeniem został wysłany na adres %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Adres %(email)s został potwierdzony." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Adres e-mail %(email)s został usunięty." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Zalogowano jako %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Wylogowano." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Hasło zostało zmienione." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Hasło zostało ustawione." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Podstawowy adres e-mail został ustawiony." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Twój podstawowy adres e-mail musi być zweryfikowany." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Zmień hasło" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Nie pamiętasz hasła?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Resetowanie hasła" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Nie pamiętasz swojego hasła? Wpisz swój adres e-mail poniżej, a my wyślemy " "Ci wiadomość, dzięki której dokonasz jego zmiany." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Zresetuj moje hasło" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Skontaktuj się z nami, jeśli masz problem ze zresetowaniem swojego hasła." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Wysłaliśmy Ci wiadomość e-mail.\n" "W celu weryfikacji musisz kliknąć w łącze zawarte w wiadomości. Proszę " "skontaktuj się z nami, jeśli nie dotarła do Ciebie w ciągu kilku minut." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Nieprawidłowy klucz" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Łącze resetujące hasło jest niepoprawne, prawdopodobnie zostało już użyte. " "Zresetuj hasło jeszcze raz." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Twoje hasło zostało zmienione." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Ustaw hasło" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Potwierdź adres e-mail" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Zarejestruj się" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Zarejestruj się" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Masz już konto? Jeżeli tak, to zaloguj się." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Rejestracja zamknięta" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Przepraszamy, ale w tej chwili rejestracja jest zamknięta." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Uwaga" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "jesteś już zalogowany/-a jako %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Uwaga:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Aktualnie nie posiadasz przypisanych do twojego konta adresów e-mail. Warto " "dodać taki adres, aby otrzymywać informacje administracyjne, wiadomości o " "zmianie hasła, itd." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Zweryfikuj swój adres e-mail" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Przesłaliśmy weryfikacyjny e-mail na twój adres. Kliknij w łącze w " "wiadomości, aby zakończyć proces rejestracji. Skontaktuj się z nami, jeśli " "nie otrzymasz jej w ciągu kilku minut." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Ta część strony wymaga weryfikacji tego, kim jesteś. Dlatego wymagamy " "weryfikacji Twojego adresu e-mail. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Wysłaliśmy Ci wiadomość e-mail.\n" "W celu weryfikacji musisz kliknąć w łącze zawarte w wiadomości. Proszę " "skontaktuj się z nami, jeśli nie dotarła do Ciebie w ciągu kilku minut." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Uwaga: możesz ciągle zmienić Twój " "adres e-mail." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "token secret" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Błędne logowanie z konta społecznościowego" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Wystąpił błąd podczas próby logowania za pomocą konta społecznościowego." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Połączone konta" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Możesz zalogować się do swojego konta używając dowolnego z poniższych kont " "zewnętrznych:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Nie masz obecnie żadnych kont społecznościowych połączonych z tym kontem." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Dodaj konto zewnętrzne" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Logowanie anulowane" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Wybrano anulowanie logowania przez jedno z istniejących kont. Jeżeli to była " "pomyłka, proszę przejdź do zaloguj." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Konto społecznościowe zostało połączone." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "To konto społecznościowe jest już połączone z innym kontem." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Konto społecznościowe zostało rozłączone." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Masz zamiar użyć konta %(provider_name)s do zalogowania się w \n" "%(site_name)s. Jako ostatni krok, proszę wypełnij formularz:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Proszę zaloguj się jednym\n" #~ "z Twoich zewnętrznych kont. Lub zarejestruj " #~ "się \n" #~ "w %(site_name)s i zaloguj poniżej:" #~ msgid "or" #~ msgstr "lub" #~ msgid "change password" #~ msgstr "zmień hasło" #~ msgid "OpenID Sign In" #~ msgstr "Zaloguj przez OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Ten adres e-mail jest już powiązany z innym kontem." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Wysłaliśmy Ci e-mail. Proszę skontaktuj się z nami, jeśli go nie " #~ "otrzymasz w ciągu paru minut." #~ msgid "Account" #~ msgstr "Konto" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Login i/lub hasło, które podałeś, są niepoprawne." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Nazwa użytkownika może zawierać tylko litery, cyfry oraz znaki @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Nazwa użytkownika jest już w użyciu. Proszę wybierz inną." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Zaloguj" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Potwierdziłeś, że adres %(email)s jest " #~ "adresem e-mail użytkownika %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Dziękujemy za używanie naszej strony!" #~ msgid "Socialaccount" #~ msgstr "Konta społecznościowe" #~ msgid "Key (Stack Exchange only)" #~ msgstr "Klucz (tylko dla Stack Exchange)" #~ msgid "Confirmation email sent to %(email)s" #~ msgstr "Wiadomość z potwierdzeniem została wysłana na adres %(email)s" #~ msgid "Delete Password" #~ msgstr "Skasuj hasło" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "Możesz skasować swoje hasło jeśli używasz OpenID." #~ msgid "delete my password" #~ msgstr "skasuj moje hasło" #~ msgid "Password Deleted" #~ msgstr "Hasło Skasowane" #~ msgid "Your password has been deleted." #~ msgstr "Twoje hasło zostało skasowane." django-allauth-0.58.2/allauth/locale/pt_BR/000077500000000000000000000000001452212273200203775ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/pt_BR/LC_MESSAGES/000077500000000000000000000000001452212273200221645ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/pt_BR/LC_MESSAGES/django.po000066400000000000000000001112001452212273200237610ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Renato De Giovanni , 2022 # cacarrara , 2014 # Fábio C. Barrionuevo da Luz , 2013-2014 # Rodrigo , 2013 # Rodrigo , 2013-2014 msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2014-12-01 01:20+0000\n" "Last-Translator: cacarrara \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" "django-allauth/language/pt_BR/)\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Este nome de usuário não pode ser usado. É preciso escolher outro." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "" "Excedida a quantidade de tentativas de login. Tente novamente mais tarde." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Um usuário já foi registrado com este endereço de e-mail." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Senha Atual" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "A senha deve ter no mínimo {0} caracteres." #: account/apps.py:9 msgid "Accounts" msgstr "Contas" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "A mesma senha deve ser escrita em ambos os campos." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Senha" #: account/forms.py:94 msgid "Remember Me" msgstr "Continuar logado" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Esta conta está desativada no momento." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "O endereço de e-mail e/ou senha especificados não estão corretos." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "O nome de usuário e/ou senha especificados não estão corretos." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Endereço de e-mail" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Nome de usuário" #: account/forms.py:134 msgid "Username or email" msgstr "Nome de usuário ou e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Login" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Esqueceu a sua senha?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-mail (novamente)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Confirmação de e-mail" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (opcional)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "O mesmo e-mail deve ser escrito em ambos os campos." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Senha (novamente)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Este e-mail já está associado a esta conta." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "Não se pode adicionar mais de %d endereços de e-mail." #: account/forms.py:524 msgid "Current Password" msgstr "Senha Atual" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Nova Senha" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Nova Senha (novamente)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Por favor insira a sua senha atual." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Este endereço de e-mail não está associado a nenhuma conta de usuário" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Token de redefinição de senha inválido" #: account/models.py:21 msgid "user" msgstr "usuário" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "endereço de e-mail" #: account/models.py:28 msgid "verified" msgstr "verificado" #: account/models.py:29 msgid "primary" msgstr "primário" #: account/models.py:35 msgid "email addresses" msgstr "endereços de e-mail" #: account/models.py:141 msgid "created" msgstr "criado" #: account/models.py:142 msgid "sent" msgstr "enviado" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "chave" #: account/models.py:148 msgid "email confirmation" msgstr "confirmação de e-mail" #: account/models.py:149 msgid "email confirmations" msgstr "confirmações de e-mail" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Já existe uma conta com esse endereço de e-mail. Por favor, faça login na " "conta existente e, em seguida, conecte com %s." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Sua conta não tem uma senha definida." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Sua conta não tem um endereço de e-mail verificado." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Contas Sociais" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "provedor" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "provedor" #: socialaccount/models.py:52 msgid "name" msgstr "nome" #: socialaccount/models.py:54 msgid "client id" msgstr "id do cliente" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "App ID ou chave de consumidor" #: socialaccount/models.py:59 msgid "secret key" msgstr "Chave secreta" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "Segredo de API, segredo de cliente ou segredo de consumidor" #: socialaccount/models.py:65 msgid "Key" msgstr "Chave" #: socialaccount/models.py:77 msgid "social application" msgstr "aplicativo social" #: socialaccount/models.py:78 msgid "social applications" msgstr "aplicativos sociais" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "último acesso" #: socialaccount/models.py:116 msgid "date joined" msgstr "data de adesão" #: socialaccount/models.py:117 msgid "extra data" msgstr "dados extras" #: socialaccount/models.py:121 msgid "social account" msgstr "conta social" #: socialaccount/models.py:122 msgid "social accounts" msgstr "contas sociais" #: socialaccount/models.py:156 msgid "token" msgstr "token" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) ou token de acesso (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "token secret" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) ou token de atualização (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "expira em" #: socialaccount/models.py:170 msgid "social application token" msgstr "token de aplicativo social" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "tokens de aplicativo social" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Dados pessoais inválidos" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Resposta inválida ao obter token de permissão de \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Resposta inválida ao obter token de acesso de \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Nenhum token de permissão gravado para \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Nenhum token de acesso gravado para \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Sem acesso a recursos privados de \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Resposta inválida ao obter token de permissão de \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Conta Inativa" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Esta conta está inativa." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Endereços de E-mail" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Os endereços de e-mail seguintes estão associados com a sua conta:" #: templates/account/email.html:23 msgid "Verified" msgstr "Verificado" #: templates/account/email.html:27 msgid "Unverified" msgstr "Não verificado" #: templates/account/email.html:32 msgid "Primary" msgstr "Primário" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Definir como primário" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Re-enviar Verificação" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Remover" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Adicionar endereço de e-mail" #: templates/account/email.html:70 msgid "Add Email" msgstr "Adicionar e-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Deseja mesmo remover o endereço de e-mail selecionado?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Olá do site %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Obrigado por usar o site %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Você está recebendo essa mensagem porque o usuário %(user_display)s utilizou " "este e-mail para se cadastrar no site %(site_domain)s.\n" "\n" "Para confirmar que isso está correto, clique em %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Favor confirmar o endereço de e-mail" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Você está recebendo essa mensagem porque você ou alguém tentou requisitar " "uma senha para sua conta de usuário no site %(site_domain)s.\n" "Caso não tenha sido você que fez a requisição, simplesmente ignore a " "mensagem. Do contrário, clique no link abaixo para redefinir a senha. " #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Caso tenha esquecido, seu nome de usuário é %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-mail de Redefinição de Senha" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You are receiving this e-mail because you or someone else has requested " #| "a\n" #| "password for your user account. However, we do not have any record of a " #| "user\n" #| "with email %(email)s in our database.\n" #| "\n" #| "This mail can be safely ignored if you did not request a password reset.\n" #| "\n" #| "If it was you, you can sign up for an account using the link below." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Você está recebendo essa mensagem porque você ou alguém tentou requisitar\n" " uma senha para sua conta de usuário. Ocorre que não há nenhum usuário com " "o\n" " e-mail %(email)s cadastrado em nosso banco de dados.\n" "\n" "Caso não tenha sido você que fez a requisição, simplesmente ignore a " "mensagem.\n" " Do contrário, clique no link abaixo para se cadastrar. " #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Endereços de E-mail" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Os endereços de e-mail seguintes estão associados com a sua conta:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Seu endereço de e-mail principal precisa ser confirmado." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Confirmar Endereço de E-mail" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Confirmar Endereço de E-mail" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Por favor confirme que %(email)s é um " "endereço de e-mail do usuário %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Confirmar" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Esta conta social já está conectada a outra conta." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Este link de verificação de e-mail expirou ou é inválido. Por favor peça uma nova verificação de e-mail.." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Entrar" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Se você ainda não possui um cadastro, então, por favor\n" "Cadastre-se primeiro." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Sair" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Tem certeza que deseja sair?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Você não pode remover o seu endereço principal de e-mail (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "E-mail de confirmação enviado para %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Você acaba de confirmar %(email)s" #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "%(email)s removido." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Login realizado com sucesso como usuário %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Você saiu do sistema." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Senha alterada com sucesso." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Senha definida com sucesso." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Endereço primário de e-mail configurado." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Seu endereço de e-mail principal precisa ser confirmado." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Alterar senha" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Esqueceu a sua senha?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Redefinição da senha" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Esqueceu a sua senha? Insira seu endereço de e-mail abaixo para receber uma " "mensagem com instruções sobre como alterá-la." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Redefinir a minha senha" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Por favor, entre em contato conosco caso tenha algum problema ao redefinir a " "senha." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent you an e-mail. If you have not received it please check your " #| "spam folder. Otherwise contact us if you do not receive it in a few " #| "minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Acabamos de enviar um e-mail com as instruções. Caso não o receba nos " "próximos minutos, verifique sua pasta de spam ou entre em contato conosco." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Problema no Token" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "O link para redefinição da senha era inválido, provavelmente por já ter sido " "usado. Por favor peça uma nova redefinição " "da senha." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "A sua senha foi alterada." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Definir senha" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Confirmar Endereço de E-mail" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Cadastre-se" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Cadastro" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Já tem uma conta? Faça o login." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Novos cadastros suspensos" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Infelizmente novos cadastros não podem ser feitos no momento." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Nota" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "você já está logado como %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Aviso:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Não há nenhum endereço de e-mail associado a sua conta. Você deve adicionar " "um e-mail para que possa receber notificações, redefinir a senha, etc." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Verifique o seu endereço de e-mail" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. If you do not see the verification e-mail " #| "in your main inbox, check your spam folder. Please contact us if you do " #| "not receive the verification e-mail within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Acabamos de enviar uma mensagem contendo um link para finalizar o cadastro. " "Caso não receba a mensagem, lembre de verificar a caixa de spam. Entre em " "contato conosco se a mensagem não chegar dentro de alguns minutos." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Esta parte do site requer que verifiquemos\n" "que você é quem diz que é. Para esse fim, pedimos que verifique que\n" "é dono do seu endereço de e-mail. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside that e-mail. If you do not " #| "see the verification e-mail in your main inbox, check your spam folder. " #| "Otherwise\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Acabamos de enviar a você um e-mail de verificação.\n" "Por favor clique no link dentro deste e-mail. Caso não receba a mensagem, \n" "lembre de verificar a caixa de spam. Entre em contato conosco se a \n" "mensagem não chegar dentro de alguns minutos." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Nota: você ainda pode alterar o " "seu endereço de e-mail." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "token secret" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Falha ao Entrar com Rede Social" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Houve um erro ao tentar entrar com a sua conta de rede social." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Conexões da Conta" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Você pode entrar usando uma das seguintes contas externas:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "No momento não tem nenhuma conta de rede social conectada a esta conta." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Adicionar uma Conta Externa" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "Conecte com %(provider)s" #: templates/socialaccount/login.html:13 #, fuzzy, python-format #| msgid "" #| "You are about to connect a new third party account from %(provider)s." msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" "Você está prestes a conectar uma nova conta externa do provedor %(provider)s." #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "Entre com %(provider)s" #: templates/socialaccount/login.html:20 #, fuzzy, python-format #| msgid "" #| "You are about to sign in using a third party account from %(provider)s." msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" "Você está prestes a se logar usando uma conta externa do provedor " "%(provider)s." #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "Continuar" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Entrada Cancelada" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Você decidiu cancelar a entrada no site usando uma de suas contas. Se mudar " "de ideia, clique para entrar." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "A conta social foi conectada." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Esta conta social já está conectada a outra conta." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "A conta social foi desconectada." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Você está prestes a usar sua conta do %(provider_name)s para acessar o\n" "%(site_name)s. Para finalizar, por favor preencha o seguinte formulário:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Por favor, entre com uma\n" #~ "de suas contas externas. Ou, Cadastre-se\n" #~ "em uma nova conta %(site_name)s e entre a seguir:" #~ msgid "or" #~ msgstr "ou" #~ msgid "change password" #~ msgstr "alterar a senha" #~ msgid "OpenID Sign In" #~ msgstr "Entrar com OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Este e-mail já está associado a outra conta." django-allauth-0.58.2/allauth/locale/pt_PT/000077500000000000000000000000001452212273200204175ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/pt_PT/LC_MESSAGES/000077500000000000000000000000001452212273200222045ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/pt_PT/LC_MESSAGES/django.po000066400000000000000000001123331452212273200240110ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2019-02-26 19:48+0100\n" "Last-Translator: Jannis Š\n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/" "django-allauth/language/pt_PT/)\n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Nome de utilizador não pode ser utilizado. Por favor, use outro nome." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Demasiadas tentativas para entrar. Tente novamente mais tarde." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Um utilizador já foi registado com este endereço de e-mail." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Palavra-passe atual" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "A palavra-passe deve ter no mínimo {0} caracteres." #: account/apps.py:9 msgid "Accounts" msgstr "Contas" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Deve escrever a mesma palavra-passe em ambos os campos." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Palavra-passe" #: account/forms.py:94 msgid "Remember Me" msgstr "Lembrar-me" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Esta conta está de momento desactivada" #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "" "O endereço de e-mail e/ou palavra-passe que especificou não estão corretos." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "" "O nome de utilizador e/ou palavra-passe que especificou não estão corretos." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Endereço de e-mail" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Nome de utilizador" #: account/forms.py:134 msgid "Username or email" msgstr "Nome de utilizador ou e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Entrar" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Esqueceu-se da sua palavra-passe?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-mail (novamente)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Confirmação de endereço de e-mail" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (opcional)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Deve escrever o mesmo e-mail em ambos os campos." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Palavra-passe (novamente)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Este endereço de e-mail já foi associado com esta conta." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "A sua conta não tem um endereço de e-mail verificado." #: account/forms.py:524 msgid "Current Password" msgstr "Palavra-passe atual" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Nova Palavra-passe" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Nova Palavra-passe (novamente)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Por favor insira a sua palavra-passe atual." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "O endereço de e-mail não está associado a nenhuma conta de utilizador" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "O token para redefinir a palavra-passe está inválido." #: account/models.py:21 msgid "user" msgstr "utilizador" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "endereço de e-mail" #: account/models.py:28 msgid "verified" msgstr "verificado" #: account/models.py:29 msgid "primary" msgstr "primário" #: account/models.py:35 msgid "email addresses" msgstr "endereços de e-mail" #: account/models.py:141 msgid "created" msgstr "criado" #: account/models.py:142 msgid "sent" msgstr "enviado" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "chave" #: account/models.py:148 msgid "email confirmation" msgstr "confirmação de e-mail" #: account/models.py:149 msgid "email confirmations" msgstr "confirmações de e-mail" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Já existe uma conta com este endereço de e-mail. Por favor entre com essa " "conta e depois associe a sua conta %s." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "A sua conta não tem palavra-passe definida." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "A sua conta não tem um endereço de e-mail verificado." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Contas de redes sociais" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "fornecedor" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "fornecedor" #: socialaccount/models.py:52 msgid "name" msgstr "nome" #: socialaccount/models.py:54 msgid "client id" msgstr "" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:59 msgid "secret key" msgstr "" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:65 msgid "Key" msgstr "Chave" #: socialaccount/models.py:77 msgid "social application" msgstr "aplicação social" #: socialaccount/models.py:78 msgid "social applications" msgstr "aplicações sociais" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "último login" #: socialaccount/models.py:116 msgid "date joined" msgstr "data de registo" #: socialaccount/models.py:117 msgid "extra data" msgstr "dados extra" #: socialaccount/models.py:121 msgid "social account" msgstr "conta social" #: socialaccount/models.py:122 msgid "social accounts" msgstr "contas sociais" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "expira a" #: socialaccount/models.py:170 msgid "social application token" msgstr "token da aplicação social" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "tokens das aplicações sociais" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Dados de perfil inválidos" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Resposta inválida ao obter token de permissão de \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Resposta inválida ao obter token de acesso de \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Nenhum token de permissão gravado para \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Nenhum token de acesso gravado para \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Sem acesso a recursos privados de \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Resposta inválida ao obter token de permissão de \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Conta Desactivada" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "A sua conta foi desactivada." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Endereços de E-mail" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Os endereços de e-mail seguintes estão associados com a sua conta:" #: templates/account/email.html:23 msgid "Verified" msgstr "Verificado" #: templates/account/email.html:27 msgid "Unverified" msgstr "Não verificado" #: templates/account/email.html:32 msgid "Primary" msgstr "Primário" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Definir como primário" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Re-enviar Verificação" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Remover" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Adicionar endereço de e-mail" #: templates/account/email.html:70 msgid "Add Email" msgstr "Adicionar e-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Deseja mesmo remover o endereço de e-mail seleccionado?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Obrigado de %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Obrigado por utilizar %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Ola de %(site_name)s!\n" "\n" "Está a receber este e-mail porque o utilizador %(user_display)s deu o seu " "endereço de email para conectar à sua conta.\n" "\n" "Para confirmar que isto está correto, vá a %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Confirme o Endereço de E-mail" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Olá de %(site_name)s!\n" "\n" "Está a receber este e-mail porque você ou outra pessoa pediu uma nova " "palavra-passe para a sua conta.\n" "Pode ignorar este e-mail caso não tenha pedido uma redefinição de palavra-" "passe. Clique no link abaixo para redefinir a sua password." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Caso se tenha esquecido, o seu nome de utilizador é %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-mail de Redefinição de Password" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Olá de %(site_name)s!\n" "\n" "Está a receber este e-mail porque você ou outra pessoa pediu uma nova " "palavra-passe para a sua conta.\n" "Pode ignorar este e-mail caso não tenha pedido uma redefinição de palavra-" "passe. Clique no link abaixo para redefinir a sua password." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Endereços de E-mail" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Os endereços de e-mail seguintes estão associados com a sua conta:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "O seu endereço de e-mail primário tem de ser verificado." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Confirmar Endereço de E-mail" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Confirmar Endereço de E-mail" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Por favor confirme que %(email)s é um " "endereço de e-mail do utilizador %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Confirmar" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "A conta social já está conectada a outra conta." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Este link de verificação de e-mail expirou ou é inválido. Por favor peça uma nova verificação de e-mail.." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Entrar" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "Se já criou uma conta, por favor entre." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Sair" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Tem certeza de que deseja sair?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Não pode remover o seu endereço de e-mail primário (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "E-mail de confirmação enviado para %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Confirmou %(email)s" #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Endereço de e-mail removido %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Entrou com sucesso como %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Terminou sessão." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Palavra-passe alterada com sucesso." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Palavra-passe definida com sucesso." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Endereço de e-mail primário definido." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "O seu endereço de e-mail primário tem de ser verificado." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Alterar palavra-passe" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Esqueceu-se da sua palavra-passe?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Redefinição da palavra-passe" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Esqueceu-se da sua palavra-passe? Insira o seu endereço de e-mail abaixo, e " "enviar-lhe-emos um e-mail permitindo que a redefina." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Redefinir a minha palavra-passe" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Por favor contacte-nos se tiver quaisquer problemas a redefinir a sua " "palavra-passe." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Enviámos-lhe um e-mail para verificação. Por favor clique no link dentro " "deste e-mail. Por favor contacte-nos se não o receber dentro dos próximos " "minutos." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Problema no Token" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "O link para redefinição da palavra-passe era inválido, provávelmente por já " "ter sido usado. Por favor peça uma nova " "redefinição da palavra-passe." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "A sua palavra-passe foi alterada." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Definir palavra-passe" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Confirmar Endereço de E-mail" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registo" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Registo" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Já tem uma conta? Por favor entre." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Registos fechados" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Pedimos desculpa, mas os registos estão fechados." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Nota" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "você já entrou como %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Aviso:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Neste momento não tem um endereço de e-mail definido. Devia mesmo adicionar " "um endereço de e-mail para que possa receber notificações, redefinir a sua " "palavra-passe, etc." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Verifique o seu endereço de e-mail" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Enviámos-lhe um e-mail para para verificação. Siga o link no mesmo para " "finalizar o registo. Por favor contacte-nos se não o receber nos próximos " "minutos." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Esta parte do site requer que verifiquemos que é quem diz que é. Para esse " "fim, pedimos que verifique que é dono do seu endereço de e-mail. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Enviámos-lhe um e-mail para verificação. Por favor clique no link dentro " "deste e-mail. Por favor contacte-nos se não o receber dentro dos próximos " "minutos." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Nota: ainda pode alterar o seu " "endereço de e-mail." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Falha ao Entrar com Rede Social" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Um erro foi encontrado ao tentar entrar com a sua conta de rede social." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Ligações da Conta" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Pode entrar usando uma das seguintes contas externas:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "De momento não tem nenhuma conta de rede social ligada a esta conta." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Adicionar uma Conta Externa" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Entrada Cancelada" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Decidiu cancelar a entrada no nosso site usando uma das seguintes contas. Se " "isto foi um erro, entre." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "A conta social foi conectada." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "A conta social já está conectada a outra conta." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "A conta social foi disconectada." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Está prestes a usar a sua conta no %(provider_name)s para entrar no " "%(site_name)s. Como um passo final, por favor complete o seguinte formulário:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Por favor entre com uma\n" #~ "das suas contas externas. Ou, registe-se\n" #~ "para uma conta em %(site_name)s e entre:" #~ msgid "or" #~ msgstr "ou" #~ msgid "change password" #~ msgstr "alterar a palavra-passe" #~ msgid "OpenID Sign In" #~ msgstr "Entrar com OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Este endereço de e-mail já foi associado com outra conta." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Enviámos-lhe um e-mail. Por favor contacte-nos se não o receber nos " #~ "próximos minutos." #~ msgid "Account" #~ msgstr "Conta" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "O login e/ou password que especificou não estão corretos" #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Nomes de utilizador podem apenas conter letras, dígitos, e @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Este nome de utilizador já está em uso. Por favor escolha outro." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Entrar" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Confirmou que %(email)s é um endereço de " #~ "e-mail do utilizador %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Obrigado por usar o nosso site!" #~ msgid "Confirmation email sent to %(email)s" #~ msgstr "E-mail de confirmação enviado para %(email)s" #~ msgid "Delete Password" #~ msgstr "Remover palavra-passe" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "Pode eliminar a sua palavra-passe já que entrou com OpenID." #~ msgid "delete my password" #~ msgstr "dliminar a minha palavra-passe" #~ msgid "Password Deleted" #~ msgstr "Palavra-passe eliminada" #~ msgid "Your password has been deleted." #~ msgstr "A sua palavra-passe foi eliminada." django-allauth-0.58.2/allauth/locale/ro/000077500000000000000000000000001452212273200200115ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ro/LC_MESSAGES/000077500000000000000000000000001452212273200215765ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ro/LC_MESSAGES/django.po000066400000000000000000001120521452212273200234010ustar00rootroot00000000000000# DJANGO-ALLAUTH. # Copyright (C) 2016 # This file is distributed under the same license as the django-allauth package. # # Translators: # Steve Kossouho , 2016. # Gilou , 2019 # msgid "" msgstr "" "Project-Id-Version: django-allauthrr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2021-11-08 19:23+0200\n" "Last-Translator: Gilou \n" "Language-Team: \n" "Language: ro_RO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n==0 || (n!=1 && n%100>=1 && n" "%100<=19) ? 1 : 2);\n" "X-Generator: Poedit 3.0\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "" "Numele de utilizator nu este disponibil. Te rugam alege alt nume de " "utilizator." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Prea multe incercări de conectare esuate. Incearca mai tarziu." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Un utilizator este deja inregistrat cu aceasta adresa de e-mail." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Parola actuala" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Parola trebuie să aibă minimum {0} caractere." #: account/apps.py:9 msgid "Accounts" msgstr "Conturi" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Trebuie sa tastezi aceeași parolă de fiecare data." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Parola" #: account/forms.py:94 msgid "Remember Me" msgstr "Tine-ma minte" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Acest cont este in prezent inactiv." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Adresa de e-mail si / sau parola sunt incorecte." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Numele de utilizator si / sau parola sunt incorecte." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Adresa de e-mail" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Nume de utilizator" #: account/forms.py:134 msgid "Username or email" msgstr "Nume de utilizator sau e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Nume de utilizator sau e-mail" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Ai uitat parola?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-mail (confirma)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Confirmarea adresei de e-mail" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (optional)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Trebuie sa tastezi aceeasi adresa de e-mail de fiecare data." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Parola (confirma)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Aceasta adresa de e-mail este deja asociata acestui cont." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "Nu poti adauga mai mult de %d adrese de e-mail." #: account/forms.py:524 msgid "Current Password" msgstr "Parola actuala" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Parola noua" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Parola noua (confirma)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Te rugam tasteaza parola actuala." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Adresa de e-mail nu este atribuita niciunui cont de utilizator" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Link-ul de resetare a parolei nu era valid." #: account/models.py:21 msgid "user" msgstr "utilizator" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "adresa de e-mail" #: account/models.py:28 msgid "verified" msgstr "verificata" #: account/models.py:29 msgid "primary" msgstr "principala" #: account/models.py:35 msgid "email addresses" msgstr "adrese de e-mail" #: account/models.py:141 msgid "created" msgstr "creata" #: account/models.py:142 msgid "sent" msgstr "trimis" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "cheie" #: account/models.py:148 msgid "email confirmation" msgstr "confirmare e-mail" #: account/models.py:149 msgid "email confirmations" msgstr "confirmari e-mail" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Exista deja un cont cu această adresa de e-mail. Te rugam sa vt conectați " "mai intai la acel cont, apoi sa conecteazi contul %s." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Contul tau nu are o parola setata." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Contul tau nu are o adresa de e-mail confirmata." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Retele de socializare" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "furnizor" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "furnizor" #: socialaccount/models.py:52 msgid "name" msgstr "nume" #: socialaccount/models.py:54 msgid "client id" msgstr "id client" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "ID-ul aplicatiei sau cheia consumatorului" #: socialaccount/models.py:59 msgid "secret key" msgstr "cheie secreta" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "API secret, client secret sau consumator secret" #: socialaccount/models.py:65 msgid "Key" msgstr "Cheie" #: socialaccount/models.py:77 msgid "social application" msgstr "aplicatie sociala" #: socialaccount/models.py:78 msgid "social applications" msgstr "aplicatii sociale" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "ultima logare" #: socialaccount/models.py:116 msgid "date joined" msgstr "data inscrierii" #: socialaccount/models.py:117 msgid "extra data" msgstr "date suplimentare" #: socialaccount/models.py:121 msgid "social account" msgstr "retea de socializare" #: socialaccount/models.py:122 msgid "social accounts" msgstr "retele de socializare" #: socialaccount/models.py:156 msgid "token" msgstr "token" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) sau token de acces (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "token secret" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) token de reimprospatare (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "expira la" #: socialaccount/models.py:170 msgid "social application token" msgstr "token pentru aplicatia de socializare" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "token-uri pentru aplicatiile de socializare" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Date de profil invalide" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Raspuns invalid la obtinerea token-ului de solicitare de la \"% s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Raspuns invalid la obtinerea token-ului de acces de la \"% s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Nu s-a salvat niciun token de solicitare pentru \"% s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Nu s-a salvat niciun token de acces pentru \"% s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Nu exista acces la resurse private la \"% s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Raspuns invalid la obtinerea token-ului de solicitare de la \"% s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Cont inactiv" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Acest cont este inactiv." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Adrese de e-mail" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Urmatoarele adrese de e-mail sunt asociate contului tau:" #: templates/account/email.html:23 msgid "Verified" msgstr "Verificata" #: templates/account/email.html:27 msgid "Unverified" msgstr "Neverificata" #: templates/account/email.html:32 msgid "Primary" msgstr "Principala" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Seteaza ca principala" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Retrimite e-mail verificare" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Elimina adresa" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Adauga adresa de e-mail" #: templates/account/email.html:70 msgid "Add Email" msgstr "Adauga e-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Sigur doresti sa elimini aceasta adresa de e-mail?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Salutari de la %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Iti multumim ca folosesti %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Ai primit acest e-mail pentru ca utilizatorul %(user_display)s a folosit " "aceasta adresa de e-mail pentru a inregistra un cont pe %(site_domain)s.\n" "\n" "Pentru a confirma, click pe link-ul urmator: %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Te rugam confirma adresa de e-mail" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Ai primit acest e-mail pentru ca tu sau altcineva a solicitat o resetare de " "parola.\n" "Daca nu ai fost tu cel care a solicitat resetarea parolei, te rugam sa " "ignori acest e-mail.\n" "Pentru resetarea parolei acceseaza linkul de mai jos." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "In cazul in care ai uitat, numele tau de utilizator este %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-mail pentru resetarea parolei" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Ai primit acest e-mail pentru ca tu sau altcineva a solicitat o resetare de " "parola.\n" "Daca nu ai fost tu cel care a solicitat resetarea parolei, te rugam sa " "ignori acest e-mail.\n" "Pentru resetarea parolei acceseaza linkul de mai jos." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Adrese de e-mail" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Urmatoarele adrese de e-mail sunt asociate contului tau:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "" "Adresa de e-mail trebuie mai intai confirmata inainte de a o seta ca adresa " "principala. Acceseaza link-ul din e-mailul de verificare." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Confirma adresa de e-mail" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Confirma adresa de e-mail" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Te rugam confirma faptul ca %(email)s este " "o adresa de e-mail a utilizatorului %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Confirma" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "" "Acest cont de socializare este deja asociat unui alt profil pe site-ul " "nostru." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Link-ul de confirmare a adresei de email a expirat sau este invalid. Te " "rugam solicita un nou link de confirmare." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Conecteaza-te" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Daca nu ai un cont inca, te rugam\n" "inregistreaza-te." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Deconecteaza-te" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Esti sigur(a) ca vrei sa te deconectezi?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "" "Nu poti elimina adresa de e-mail (%(email)s). \n" "Aceasta este setata ca adresa principala de e-mail." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Confirma e-mailul trimis catre %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Ai confirmat %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Adresa de e-mail eliminata %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Esti conectat(a) ca %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Te-ai deconectat." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Parola a fost schimbata cu success." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Parola a fost setata cu success." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Adresa principala de e-mail a fost setata." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "" "Adresa de e-mail trebuie mai intai confirmata inainte de a o seta ca adresa " "principala. Acceseaza link-ul din e-mailul de verificare." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Schimba parola" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Ai uitat parola?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Reseteaza parola" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Ti-ai uitat parola? Introdu adresa de e-mail mai jos si-ti vom trimite un e-" "mail ce-ti va permite sa resetezi parola." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Reseteaza parola" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Te rugam contacteaza-ne daca intampini dificultati in resetarea parolei." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Ti-am trimis un e-mail pentru verificare (confirmare). \n" "Acceseaza link-ul din e-mail pentru confirmare. \n" "Te rugam contacteaza-ne daca nu primesti e-mailul in cateva minute." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Token invalid" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Link-ul de resetare a parolei este invalid, posibil din cauza ca a fost deja " "folosit. Te rugam solicita un nou link de " "resetare a parolei." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Parola ta a fost schimbata cu succes." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Seteaza parola" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Confirma adresa de e-mail" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Inregistrare" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Inregistreaza-te" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Ai deja un cont? Te rugam conecteaza-te." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Inregistrare blocata" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Ne pare rau, posibilitatea inregistrarii este momentan blocata." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Nota" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "esti deja conectat ca %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Avertizare:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "În prezent nu ai configurata nicio adresa de e-mail. Adauga o adresa de e-" "mail pentru a primi notificari, a putea reseta parola, etc." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Verifica-ti adresa de e-mail" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Ti-am trimis un e-mail pentru verificare (confirmare). Acceseaza link-ul din " "e-mail pentru a finaliza procesul de inregistrare. Te rugam contacteaza-ne " "daca nu primesti e-mailul in cateva minute." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Pentru a accesa aceasta sectiune a site-ului \n" "te rugam sa confirmi ca aceasta adresa de e-mail iti apartine. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Ti-am trimis un e-mail pentru verificare (confirmare). \n" "Acceseaza link-ul din e-mail pentru confirmare. \n" "Te rugam contacteaza-ne daca nu primesti e-mailul in cateva minute." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Nota: poti in continuarea sa-ti " "schimbi adresa de e-mail." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "token secret" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Conectarea la reteaua sociala a esuat" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "A aparut o eroare in incercarea de a te autentifica folosind aceasta cont de " "retea sociala." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Conexiuni" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Te poti conecta la contul tau folosind oricare dintre urmatoarele conturi de " "socializare (conturi terte):" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "In present nu ai niciun cont de retea sociala asociat cu acest cont." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Adauga un cont de retea sociala" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Conectare anulata" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Ai decis sa anulezi procesul de conectare la contul tau. Daca ai anulat din " "greseala, te rugam acceseaza link-ul conecteaza-te " "la contul tau." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Contul a fost conectat cu success." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "" "Acest cont de socializare este deja asociat unui alt profil pe site-ul " "nostru." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Contul de socializare a fost deconectat." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Esti pe cale de a folosi contul %(provider_name)s pentru a te conecta la\n" "%(site_name)s. Pentru finalizarea procesului, te rugam completeaza urmatorul " "formular:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Te rugam conecteaza-te cu unul\n" #~ "din conturile de mai jos. Sau creeaza un cont\n" #~ "%(site_name)s si apoi conecteaza-te folosind formularul de mai jos:" #~ msgid "or" #~ msgstr "sau" #~ msgid "change password" #~ msgstr "schimba parola" #~ msgid "OpenID Sign In" #~ msgstr "Conectare OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Aceasta adresa de e-mail este deja asociata altui cont." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Ti-am trimis un e-mail. Daca nu-l gasesti in \"inbox\", te rugam verifica " #~ "si folderul \"spam\".\n" #~ "Te rugam contacteaza-ne daca nu-l primesti in cateva minute." #~ msgid "Account" #~ msgstr "Compte" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "L'identifiant ou le mot de passe sont incorrects." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Un pseudonyme ne peut contenir que des lettres, des chiffres, ainsi que " #~ "@/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Ce pseudonyme est déjà utilisé, merci d'en choisir un autre." #~ msgid "Shopify Sign In" #~ msgstr "Connexion Shopify" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Vous avez confirmé que l'adresse e-mail de l'utilsateur %(user_display)s " #~ "est %(email)s." #~ msgid "Thanks for using our site!" #~ msgstr "Merci d'utiliser notre site !" django-allauth-0.58.2/allauth/locale/ru/000077500000000000000000000000001452212273200200175ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ru/LC_MESSAGES/000077500000000000000000000000001452212273200216045ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/ru/LC_MESSAGES/django.po000066400000000000000000001242631452212273200234160ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2017-04-05 22:48+0300\n" "Last-Translator: \n" "Language-Team: \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" "%100>=11 && n%100<=14)? 2 : 3);\n" "X-Generator: Poedit 1.8.7.1\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Такое имя пользователя не может быть использовано, выберите другое." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Слишком много попыток входа в систему, попробуйте позже." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Пользователь с таким e-mail адресом уже зарегистрирован." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Текущий пароль" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Минимальное количество символов в пароле: {0}." #: account/apps.py:9 msgid "Accounts" msgstr "Аккаунты" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Вы должны ввести одинаковый пароль дважды." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Пароль" #: account/forms.py:94 msgid "Remember Me" msgstr "Запомнить меня" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Учетная запись неактивна." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "E-mail адрес и/или пароль не верны." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Имя пользователя и/или пароль не верны." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "E-mail адрес" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Имя пользователя" #: account/forms.py:134 msgid "Username or email" msgstr "Имя пользователя или e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Войти" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Забыли пароль?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-mail (ещё раз)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Подтверждение email адреса" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (опционально)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Вы должны ввести одинаковый e-mail дважды." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Пароль (ещё раз)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Указанный e-mail уже прикреплен к этому аккаунту." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Нет подтвержденных e-mail адресов для вашего аккаунта." #: account/forms.py:524 msgid "Current Password" msgstr "Текущий пароль" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Новый пароль" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Новый пароль (ещё раз)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Пожалуйста, введите свой текущий пароль." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Нет пользователя с таким e-mail" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Неправильный код для сброса пароля." #: account/models.py:21 msgid "user" msgstr "пользователь" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "e-mail адрес" #: account/models.py:28 msgid "verified" msgstr "подтвержден" #: account/models.py:29 msgid "primary" msgstr "основной" #: account/models.py:35 msgid "email addresses" msgstr "email адреса" #: account/models.py:141 msgid "created" msgstr "создано" #: account/models.py:142 msgid "sent" msgstr "отправлено" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "ключ" #: account/models.py:148 msgid "email confirmation" msgstr "подтверждение email адреса" #: account/models.py:149 msgid "email confirmations" msgstr "подтверждения email адресов" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Пользователь с таким e-mail уже зарегистрирован. Чтобы подключить свой %s " "аккаунт, пожалуйста, авторизуйтесь." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Для вашего аккаунта не установлен пароль." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Нет подтвержденных e-mail адресов для вашего аккаунта." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Социальные аккаунты" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "провайдер" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "провайдер" #: socialaccount/models.py:52 msgid "name" msgstr "имя" #: socialaccount/models.py:54 msgid "client id" msgstr "id клиента" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "ID приложения или ключ потребителя" #: socialaccount/models.py:59 msgid "secret key" msgstr "секретный ключ" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "Секретный ключ API, клиента или потребителя" #: socialaccount/models.py:65 msgid "Key" msgstr "Ключ" #: socialaccount/models.py:77 msgid "social application" msgstr "социальное приложение" #: socialaccount/models.py:78 msgid "social applications" msgstr "социальные приложения" #: socialaccount/models.py:113 msgid "uid" msgstr "UID пользователя" #: socialaccount/models.py:115 msgid "last login" msgstr "дата последнего входа в систему" #: socialaccount/models.py:116 msgid "date joined" msgstr "дата регистрации" #: socialaccount/models.py:117 msgid "extra data" msgstr "дополнительные данные" #: socialaccount/models.py:121 msgid "social account" msgstr "аккаунт социальной сети" #: socialaccount/models.py:122 msgid "social accounts" msgstr "аккаунты социальных сетей" #: socialaccount/models.py:156 msgid "token" msgstr "токен" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) или access token (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "секретный токен" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) или refresh token (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "истекает" #: socialaccount/models.py:170 msgid "social application token" msgstr "токен социального приложения" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "токены социальных приложений" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Неверные данные профиля" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Неверный ответ во время получения запроса от \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Неверный ответ при получении токена доступа от \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Нет сохраненного ключа запроса для \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Нет сохраненного ключа доступа для \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Доступ к ресурсам закрыт \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Неверный ответ во время получения запроса от \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Аккаунт неактивен" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Этот аккаунт неактивен." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "E-mail адреса" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Следующие e-mail адреса прикреплены к вашему аккаунту:" #: templates/account/email.html:23 msgid "Verified" msgstr "Подтвержден" #: templates/account/email.html:27 msgid "Unverified" msgstr "Не подтвержден" #: templates/account/email.html:32 msgid "Primary" msgstr "Основной" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Сделать основным" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Отправить подтверждение ещё раз" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Удалить" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Добавить e-mail адрес" #: templates/account/email.html:70 msgid "Add Email" msgstr "Добавить e-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Вы действительно хотите удалить этот e-mail адрес?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Спасибо от сайта «%(site_name)s!»\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Благодарим вас за использование сайта «%(site_name)s!»\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Вас приветствует %(site_name)s!\n" "\n" "Вы получили это письмо, потому что пользователь %(user_display)s указал ваш " "e-mail для подключения к своему аккаунту.\n" "\n" "Чтобы подтвердить, перейдите по ссылке %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Пожалуйста подтвердите ваш e-mail адрес" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Вас приветствует %(site_name)s!\n" "\n" "Вы получили это письмо потому, что вы или кто-то иной запросили смену пароля " "для своего аккаунта.\n" "Если это были не вы, просто проигнорируйте это письмо. Иначе перейдите по " "ссылке для смены пароля." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Если вы вдруг забыли, ваше имя пользователя: %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Письмо для сброса пароля" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Вас приветствует %(site_name)s!\n" "\n" "Вы получили это письмо потому, что вы или кто-то иной запросили смену пароля " "для своего аккаунта.\n" "Если это были не вы, просто проигнорируйте это письмо. Иначе перейдите по " "ссылке для смены пароля." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "E-mail адреса" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Следующие e-mail адреса прикреплены к вашему аккаунту:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Ваш основной e-mail должен быть подтвержден." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Подтвердите e-mail адрес." #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Подтвердите e-mail адрес." #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Пожалуйста, подтвердите %(email)s для " "пользователя %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Подтвердить" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Аккаунт социальной сети уже прикреплен к другому пользователю." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Ссылка некорректна или срок её действия истек. Пожалуйста, запросите подтверждение e-mail заново." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Войти" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Если у вас ещё нет учётной записи, пожалуйста, сначала зарегистрируйтесь." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Выйти" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Вы уверены, что хотите выйти?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Вы не можете удалить ваш основной e-mail (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Подтверждение e-mail адреса отправлено на %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Адрес %(email)s подтверждён." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "E-mail адрес %(email)s удален." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Вы вошли как %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Вы вышли." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Пароль успешно изменён." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Пароль успешно указан." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Выбран основной e-mail адрес." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Ваш основной e-mail должен быть подтвержден." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Сменить пароль" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Забыли пароль?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Сброс пароля" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Забыли пароль? Введите свой e-mail адрес ниже, и мы вышлем вам письмо для " "сброса пароля." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Сбросить мой пароль" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "Свяжитесь с нами, если у вас возникли сложности со сменой пароля." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Мы отправили вам письмо\n" "с подтверждением. Пожалуйста, перейдите по ссылке.\n" "Свяжитесь с нами, если вы не получили письмо в течение нескольких минут." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Неправильный ключ" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Ссылка на сброс пароля неверна, вероятно, она уже была использована. Для " "нового сброса пароля перейдите по ссылке." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Ваш пароль изменён." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Установить пароль" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Подтвердите e-mail адрес." #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Регистрация" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Регистрация" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "Уже зарегистрированы? Войдите." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Регистрация закрыта" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Извините, но регистрация в настоящий момент закрыта." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Заметка" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "вы уже вошли как %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Внимание:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Сейчас у вас нет прикрепленного e-mail адреса. Рекомендуем добавить, чтобы " "начать получать уведомления, сброс пароля и прочее." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Подтвердите ваш e-mail" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Мы отправили вам e-mail с подтверждением. Для завершения процесса " "регистрации перейдите по указанной ссылке. Если вы не получили наше " "сообщение в течение нескольких минут, пожалуйста, свяжитесь с нами." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "Эта часть сайта требует подтверждения e-mail адреса." #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Мы отправили вам письмо\n" "с подтверждением. Пожалуйста, перейдите по ссылке.\n" "Свяжитесь с нами, если вы не получили письмо в течение нескольких минут." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Заметка: вы можете сменить свой e-" "mail адрес." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "секретный токен" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Ошибка авторизации через социальную сеть" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Произошла ошибка во время авторизации через социальную сеть." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Прикрепленные аккаунты" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Вы можете авторизоваться, используя следующие сервисы:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Нет прикрепленных аккаунтов социальных сетей." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Добавить внешний аккаунт" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "Соединение с %(provider)s" #: templates/socialaccount/login.html:13 #, fuzzy, python-format #| msgid "" #| "You are about to connect a new third party account from %(provider)s." msgid "You are about to connect a new third-party account from %(provider)s." msgstr "Вы собираетесь подключить новый сторонний аккаунт из %(provider)s" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "Вход через %(provider)s" #: templates/socialaccount/login.html:20 #, fuzzy, python-format #| msgid "" #| "You are about to sign in using a third party account from %(provider)s." msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" "Вы собираетесь войти, используя стороннюю учетную запись из %(provider)s" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "Продолжить" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Авторизация отменена" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Вы прервали авторизацию, используя один из ваших аккаутов. Если это было " "ошибкой, перейдите к авторизации. " #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Аккаунт социальной сети был прикреплён." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Аккаунт социальной сети уже прикреплен к другому пользователю." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Акакаунт социальной сети был откреплен." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Вы используете %(provider_name)s для авторизации на \n" "%(site_name)s. Чтобы завершить, заполните следующую форму:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Пожалуйста, войдите с одним\n" #~ "из ваших внешних аккаунтов. Или зарегистрируйтесь\n" #~ "и авторизуйтесь на сайте %(site_name)s:" #~ msgid "or" #~ msgstr "или" #~ msgid "change password" #~ msgstr "изменить пароль" #~ msgid "OpenID Sign In" #~ msgstr "Войти с OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Указанный e-mail прикреплен к другому пользователю." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Мы отправили вам письмо. Пожалуйста, свяжитесь с нами, если не получили " #~ "его в течение нескольких минут." #~ msgid "Account" #~ msgstr "Аккаунт" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Логин и/или пароль не верны." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "Имя пользователя может включать буквы, цифры и @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "" #~ "Такое имя пользователя уже используется на сайте. Пожалуйста выберите " #~ "другое." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Войти" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Вы подтвердили адрес %(email)s для " #~ "пользователя %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Спасибо за использование нашего сайта!" #~ msgid "Confirmation email sent to %(email)s" #~ msgstr "Подтверждение выслано на %(email)s" #~ msgid "Delete Password" #~ msgstr "Удалить пароль" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "Вы можете удалить свой пароль, при использовании OpenID." #~ msgid "delete my password" #~ msgstr "удалите мой пароль" #~ msgid "Password Deleted" #~ msgstr "Пароль удалён" #~ msgid "Your password has been deleted." #~ msgstr "Ваш пароль был удален." django-allauth-0.58.2/allauth/locale/sk/000077500000000000000000000000001452212273200200065ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/sk/LC_MESSAGES/000077500000000000000000000000001452212273200215735ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/sk/LC_MESSAGES/django.po000066400000000000000000001124341452212273200234020ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2023-07-11 15:22+0200\n" "Last-Translator: b'Erik Telepovsky '\n" "Language-Team: \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " ">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" "X-Translated-Using: django-rosetta 0.9.4\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Užívateľské meno nemôže byť použité. Prosím, použite iné meno." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Príliš veľa neúspešných pokusov o prihlásenie. Skúste neskôr." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Používateľ s touto e-mailovou adresou už existuje." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Súčasné heslo" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Heslo musí mať aspoň {0} znakov." #: account/apps.py:9 msgid "Accounts" msgstr "Účty" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Heslá sa nezhodujú." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Heslo" #: account/forms.py:94 msgid "Remember Me" msgstr "Zapamätať si ma" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Tento účet nie je momentálne aktívny." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Uvedený e-mail alebo heslo nie je správne." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Uvedené užívateľské meno alebo heslo nie je správne." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "E-mailová adresa" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Užívateľské meno" #: account/forms.py:134 msgid "Username or email" msgstr "Užívateľské meno alebo e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Login" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Zabudnuté heslo?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-mail (znova)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Potvrdenie e-mailu" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (nepovinné)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "E-maily sa nezhodujú." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Heslo (znovu)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Táto e-mailová adresa je už spojená s týmto účtom." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "Nemôžte pridať viac než %d e-mailových adries." #: account/forms.py:524 msgid "Current Password" msgstr "Súčasné heslo" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Nové heslo" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Nové heslo (znovu)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Prosím, napíšte svoje súčasné heslo." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "" "Táto e-mailová adresa nie je pridelená k žiadnemu používateľskému kontu" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Token na obnovu hesla bol nesprávny." #: account/models.py:21 msgid "user" msgstr "používateľ" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "e-mailová adresa" #: account/models.py:28 msgid "verified" msgstr "overený" #: account/models.py:29 msgid "primary" msgstr "primárny" #: account/models.py:35 msgid "email addresses" msgstr "e-mailové adresy" #: account/models.py:141 msgid "created" msgstr "vytvorený" #: account/models.py:142 msgid "sent" msgstr "odoslané" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "kľúč" #: account/models.py:148 msgid "email confirmation" msgstr "potvrdenie e-mailu" #: account/models.py:149 msgid "email confirmations" msgstr "potvrdenia e-mailu" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Účet s touto e-mailovou adresou už existuje. Prosím, prihláste sa najprv na " "tento účet a potom pripojte svoj %s účet." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Váš účet nemá nastavené heslo." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Váš účet nemá overenú e-mailovú adresu." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Účty na sociálnych sieťach" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "poskytovateľ" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "poskytovateľ" #: socialaccount/models.py:52 msgid "name" msgstr "meno" #: socialaccount/models.py:54 msgid "client id" msgstr "identifikátor klienta" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "ID aplikácie alebo zákaznícky kľúč" #: socialaccount/models.py:59 msgid "secret key" msgstr "tajný kľúč" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "Kľúč API, klienta alebo zákazníka" #: socialaccount/models.py:65 msgid "Key" msgstr "Kľúč" #: socialaccount/models.py:77 msgid "social application" msgstr "sociálna aplikácia" #: socialaccount/models.py:78 msgid "social applications" msgstr "sociálne aplikácie" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "posledné prihlásenie" #: socialaccount/models.py:116 msgid "date joined" msgstr "dáum pripojenia" #: socialaccount/models.py:117 msgid "extra data" msgstr "ďalšie údaje" #: socialaccount/models.py:121 msgid "social account" msgstr "sociálny účet" #: socialaccount/models.py:122 msgid "social accounts" msgstr "sociálne účty" #: socialaccount/models.py:156 msgid "token" msgstr "token" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" "\"Oauth_token\" (Podpora protokolu OAuth1) alebo prístup tokenu (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "heslo prístupového tokenu" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" "\"Oauth_token_secret\" (Podpora protokolu OAuth1) alebo token obnovenie " "(OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "vyexpiruje" #: socialaccount/models.py:170 msgid "social application token" msgstr "token sociálnej aplikácie" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "tokeny sociálnej aplikácie" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Nesprávne profilové údaje" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Neplatná odozva pri získavaní požiadavky tokenu z \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Neplatná odozva pri získavaní prístupu tokenu z \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Žiadna uložená požiadavka tokenu pre \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Žiadny uložený prístupový token pre \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Žiadny prístup do privátneho úložiska na \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Neplatná odozva pri získavaní požiadavky tokenu z \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Účet neaktívny" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Tento účet je neaktívny." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "E-mailová adresa" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Nasledujúce e-mailové adresy sú prepojené s vašim účtom:" #: templates/account/email.html:23 msgid "Verified" msgstr "Overený" #: templates/account/email.html:27 msgid "Unverified" msgstr "Neoverený" #: templates/account/email.html:32 msgid "Primary" msgstr "Primárny" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Vytvoriť primárny" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Preposlať overenie" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Odstrániť" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Pridať e-mailovú adresu" #: templates/account/email.html:70 msgid "Add Email" msgstr "Pridať e-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Naozaj chcete odstrániť vybranú e-mailovú adresu?" #: templates/account/email/account_already_exists_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You are receiving this e-mail because you or someone else tried to signup " #| "for an\n" #| "account using e-mail address:\n" #| "\n" #| "%(email)s\n" #| "\n" #| "However, an account using that e-mail address already exists. In case " #| "you have\n" #| "forgotten about this, please use the password forgotten procedure to " #| "recover\n" #| "your account:\n" #| "\n" #| "%(password_reset_url)s" msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" "Tento e-mail ste dostali, pretože ste sa Vy, alebo niekto iný\n" "pokúšali vytvoriť účet pre e-mailovu adresu:\n" "\n" "%(email)s\n" "\n" "Účet s touto e-mailovou adresou už však existuje. V prípade,\n" "že ste na svoju registráciu zabudli, použite prosím funkciu obnovy hesla k " "Vášmu účtu:\n" "\n" "%(password_reset_url)s" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "Účet už existuje" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Dobrý deň z %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Ďakujeme za využitie %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Tento e-mail ste dostali, pretože používateľ %(user_display)s na " "%(site_domain)s zadal túto e-mailovú adresu na prepojenie s jeho účtom.\n" "\n" "Pre potvrdenie nasledujte %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Potvrďte prosím svoju e-mailovú adresu" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Tento e-mail ste dostali, pretože niekto požiadal o heslo k Vášmu " "používateľskému účtu. Ak ste to neboli Vy, správu môžete pokojne ignorovať. " "Odkaz nižšie obnoví heslo." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Ak ste náhodou zabudli, vaše používateľské meno je %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-mail pre obnovu hesla" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You are receiving this e-mail because you or someone else has requested " #| "a\n" #| "password for your user account. However, we do not have any record of a " #| "user\n" #| "with email %(email)s in our database.\n" #| "\n" #| "This mail can be safely ignored if you did not request a password reset.\n" #| "\n" #| "If it was you, you can sign up for an account using the link below." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Tento e-mail ste dostali, pretože niekto požiadal o heslo k Vášmu\n" "používateľskému účtu. V našej databáze však nemáme žiadny záznam o " "používateľovi\n" "s e-mailom %(email)s.\n" "\n" "Ak ste nežidali o obnovenie hesla, môžete tento e-mail pokojne ignorovať.\n" "\n" "Ak ste to boli Vy, môžete si zaregistrovať účet pomocou odkazu nižšie." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "E-mailová adresa" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Nasledujúce e-mailové adresy sú prepojené s vašim účtom:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Primárna e-mailová adresa musí byť overená." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Potvrdiť e-mailovú adresu" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 msgid "Change Email" msgstr "Zmeniť e-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Potvrdiť e-mailovú adresu" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Prosím potvrďte, že %(email)s je e-mailová " "adresa pre používateľa %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Potvrdiť" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Tento sociálny účet už bol pripojený k inému používateľovi." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Odkaz na potvrdenie e-mailu je neplatný alebo vypršal. Zaslať novú žiadosť o overovací e-mail." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Prihlásiť sa" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Ak ešte nemáte vytvorený účet, tak potom sa prosím\n" "najprv zaregistrujte." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Odhlásiť" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Ste si istý, že sa chcete odhlásiť?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Primárna e-mailová adresa sa nedá odstrániť (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Overovací e-mail poslaný na %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "%(email)s potvrdené." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "E-mailová adresa %(email)s úpešne odstránená." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Úspešne ste sa prihlásili ako %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Odhlásili ste sa." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Zmena hesla prebehla úspešne." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr ")Nastavenie hesla bolo úspešné." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Primárna e-mailová adresa bola úspešne zadaná." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Primárna e-mailová adresa musí byť overená." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Zmeniť heslo" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Zabudnuté heslo?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Obnoviť heslo" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Zabudli ste heslo? Vložte nižšie svoju e-mailovú adresu a čoskoro vám " "pošleme e-mail na obnovenie hesla." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Obnov moje heslo" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Prosím, kontaktujte nás, ak máte nejaký problém s obnovením svojho hesla." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent you an e-mail. If you have not received it please check your " #| "spam folder. Otherwise contact us if you do not receive it in a few " #| "minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Poslali sme vám e-mail. Ak ste ho nedostali, skontrolujte si priečinok so " "spamom. Ak ste v priebehu pár minút žiaden neobdržali, kontaktujte nás." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Zlý token" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Odkaz na obnovu heslo je neplatný, pravdepodobne už bol použitý. Nové obnovenie hesla." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Tvoje heslo bolo zmenené." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Nastaviť heslo" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Potvrdiť e-mailovú adresu" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registrácia" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Zaregistrovať" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Už ste sa zaregistrovali? Tak sa prihláste." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Registrácia uzavretá" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Ospravedlňujeme sa, ale registrácia je momentálne uzavretá." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Poznámka" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "už ste prihlásený ako %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Varovanie:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Momentálne nemáte nastavený žiaden e-mail, kvôli čomu nemôžete dostávať " "upozornenia, obnovovať heslo, atď." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Potvrďte e-mailovú adresu" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. If you do not see the verification e-mail " #| "in your main inbox, check your spam folder. Please contact us if you do " #| "not receive the verification e-mail within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Poslali sme Vám overovací e-mail. Kliknutím na uvedený odkaz dokončite " "proces registrácie. Ak ste ho nedostali, skontrolujte si priečinok so " "spamom. V prípade, že do niekoľkých minút nedostanete overovací e-mail, " "kontaktujte nás." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Na prezeranie nasledujúceho obsahu je potrebné overenie vašej e-mailovej " "adresy. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside that e-mail. If you do not " #| "see the verification e-mail in your main inbox, check your spam folder. " #| "Otherwise\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Poslali sme Vám overovací e-mail.\n" "Kliknite prosím na odkaz v e-maili.\n" "V prípade, že ho do niekoľkých minút nedostanete, kontaktujte nás." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Poznámka: stále môžete zmeniť " "svoju e-mailovú adresu." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "Správy:" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "Menu:" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "heslo prístupového tokenu" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Prihlasovanie pomocou sociálnej siete neúspešné" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Pri prihlasovaní pomocou sociálnej siete sa vyskytla chyba." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Pripojenia účtu" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Môžete sa prihlásiť pomocou niektorého z nasledujúcich účtov:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Momentálne nemáte pripojený žiaden sociálny účet." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Pridajte účet tretej strany" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "Prepojiť s %(provider)s" #: templates/socialaccount/login.html:13 #, fuzzy, python-format #| msgid "" #| "You are about to connect a new third party account from %(provider)s." msgid "You are about to connect a new third-party account from %(provider)s." msgstr "Chystáte sa prepojiť nový účet tretej strany %(provider)s." #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "Prihlásiť sa cez %(provider)s." #: templates/socialaccount/login.html:20 #, fuzzy, python-format #| msgid "" #| "You are about to sign in using a third party account from %(provider)s." msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "Chystáte sa registrovať cez účet tretej strany %(provider)s." #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "Pokračovať" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Prihlásenie zrušené" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Rozhodli ste sa zrušiť prihlasovanie sa na našu stránku použitím jedného z " "vašich existujúcich účtov. Ak se chceli vykonať inú operáciu, pokračujte na " "prihlásiť sa." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Sociálny účet bol pripojený." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Tento sociálny účet už bol pripojený k inému používateľovi." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Sociálny účet bol odpojený." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Chystáte sa použiť váš %(provider_name)s účet na prihlásenie do " "%(site_name)s. Ako posledný krok vyplňte nasledujúci formulár:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Prosím prihláste sa s jedným\n" #~ "z vašich existujúcich účtov iných služieb. Alebo sa zaregistrujte\n" #~ "na %(site_name)s a prihláste sa nižšie:" #~ msgid "or" #~ msgstr "alebo" #~ msgid "change password" #~ msgstr "zmeniť heslo" #~ msgid "OpenID Sign In" #~ msgstr "Prihlásiť pomocou OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Táto e-mailová adresa je už spojená s iným účtom." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Odoslali sme vám e-mail. Prosím kontaktujte nás ak ste ho nedostali do " #~ "pár minút." django-allauth-0.58.2/allauth/locale/sl/000077500000000000000000000000001452212273200200075ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/sl/LC_MESSAGES/000077500000000000000000000000001452212273200215745ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/sl/LC_MESSAGES/django.po000066400000000000000000001075341452212273200234100ustar00rootroot00000000000000# Slovenian translations for Django-allauth. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Lev Predan Kowarski , 2020-06-27 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2020-06-27 12:21+0122\n" "Last-Translator: Klemen Štrajhar \n" "Language-Team: Bojan Mihelac , Lev Predan Kowarski, " "Klemen Štrajhar \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" "%100==4 ? 2 : 3);\n" "X-Translated-Using: django-rosetta 0.7.4\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "" "Uporabniško ime je neveljavno. Prosimo uporabite drugo uporabniško ime." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Preveliko število neuspelih prijav. Poskusite znova kasneje." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Za ta e-naslov že obstaja registriran uporabnik." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Trenutno geslo" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Geslo mora vsebovati najmanj {0} znakov. " #: account/apps.py:9 msgid "Accounts" msgstr "Računi" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Vnesti je potrebno isto geslo." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Geslo" #: account/forms.py:94 msgid "Remember Me" msgstr "Zapomni si me" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Račun trenutno ni aktiven." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "E-poštni naslov in/ali geslo nista pravilna." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Uporabniško ime in/ali geslo nista pravilna." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "E-poštni naslov" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-poštni naslov" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Uporabniško ime" #: account/forms.py:134 msgid "Username or email" msgstr "Uporabniško ime ali e-poštni naslov" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Prijava" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Ste pozabili geslo?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-pooštni naslov (ponovno)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Potrditev e-poštni naslova" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-poštni naslov (neobvezno)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Vnesti je potrebno isti e-poštni naslov." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Geslo (ponovno)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "E-poštni naslov že pripada vašemu uporabniškemu računu." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Vaš uporabniški račun nima preverjenega e-poštnega naslova." #: account/forms.py:524 msgid "Current Password" msgstr "Trenutno geslo" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Novo geslo" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Novo geslo (ponovno)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Prosimo vpišite trenutno geslo." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "E-poštni naslov ne pripada nobenemu uporabniškemu računu." #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Žeton za ponastavitev gesla je bil neveljaven." #: account/models.py:21 msgid "user" msgstr "uporabnik" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "E-poštni naslov" #: account/models.py:28 msgid "verified" msgstr "preverjeno" #: account/models.py:29 msgid "primary" msgstr "Primarni" #: account/models.py:35 msgid "email addresses" msgstr "E-poštni naslovi" #: account/models.py:141 msgid "created" msgstr "ustvarjeno" #: account/models.py:142 msgid "sent" msgstr "poslano" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "ključ" #: account/models.py:148 msgid "email confirmation" msgstr "E-poštna potrditev" #: account/models.py:149 msgid "email confirmations" msgstr "E-poštne potrditve" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Uporabniški račun s tem e-poštnim naslovom že obstaja. Prosimo vpišite se v " "tobstoječi račun, nato %s račune povežite." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Vaš uporabniški račun nima nastavljenega gesla." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Vaš uporabniški račun nima preverjenega e-poštnega naslova." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Računi družbenih omrežij." #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "ponudnik" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "ponudnik" #: socialaccount/models.py:52 msgid "name" msgstr "ime" #: socialaccount/models.py:54 msgid "client id" msgstr "id številka" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "ID aplikacije ali uporoabniški ključ" #: socialaccount/models.py:59 msgid "secret key" msgstr "skrivni ključ" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "API skrivnost, skrivnost klienta ali uporabniška skrivnost" #: socialaccount/models.py:65 msgid "Key" msgstr "Ključ" #: socialaccount/models.py:77 msgid "social application" msgstr "družbena aplikacija" #: socialaccount/models.py:78 msgid "social applications" msgstr "družbene aplikacije" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "zadnja prijava" #: socialaccount/models.py:116 msgid "date joined" msgstr "datum pridružitve" #: socialaccount/models.py:117 msgid "extra data" msgstr "dodatni podatki" #: socialaccount/models.py:121 msgid "social account" msgstr "uporabniški račun družbenih omerižij" #: socialaccount/models.py:122 msgid "social accounts" msgstr "uporabniški računi družbenih omerižij" #: socialaccount/models.py:156 msgid "token" msgstr "žeton" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) ali žeton za dostop (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "žeton skrivnost" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) ali žeton za osvežitev (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "veljavnost poteče" #: socialaccount/models.py:170 msgid "social application token" msgstr "žeton družebnih omrežij" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "žetoni družbenih omrežij" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Nevelljavni podatki profila" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Neveljaven odgovor ob pridobivanju žetona za zahtevo od \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Neveljaven odgovor ob pridobivanju žetona za dostop od \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Za \"%s\" ni shranjenega žetona za zahtevo." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Za \"%s\" ni shranjenega žetona za dostop." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Ni dostopa do zasebnega vira na \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Neveljaven odgovor ob pridobivanju žetona za zahtevo od \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Neaktiven račun" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Račun ni aktiven." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "E-poštni naslovi" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "E-poštni naslovi, ki pripadajo vašemu uporabniškemu računu:" #: templates/account/email.html:23 msgid "Verified" msgstr "Preverjeni" #: templates/account/email.html:27 msgid "Unverified" msgstr "Nepreverjeni" #: templates/account/email.html:32 msgid "Primary" msgstr "Primarni" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Spremeni v primarni" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Ponovno pošlji verifikacijo" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Odstrani" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Dodaj e-poštni naslov" #: templates/account/email.html:70 msgid "Add Email" msgstr "Dodaj e-pošto" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Želite odstraniti izbran e-poštni nalsov?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Pozdravljeni iz %(site_name)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Hvala, ker uporabljate %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because user %(user_display)s has given your " #| "e-mail address to register an account on %(site_domain)s.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "To sporočilo ste prejeli, ker je uporabnik %(user_display)s povezal vaš e-" "poštni naslov s svojim uporabniškim računom na %(site_domain)s.\n" "\n" "Za potrditev sledite povezavi: %(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Prosimo, potrdite svoj e-poštni naslov." #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "To sporočilo ste prejeli, ker ste zahtevali ponastavitev gesla za vaš račun." "To sporočilo lahko zavržete, če niste poslali zahtevka za spremembo gesla. " "Za ponastavitev gesla, sledie spodnji povezavi:" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "V primeru, da ste pozabili, vaše uporabniško ime je: %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-poštni naslov za ponastavitev gesla" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Pozdravljeni od %(site_name)s!\n" "To sporočilo ste prejeli, ker ste zahtevali ponastavitev gesla na " "%(site_name)s!\n" "To sporočilo lahko zavržete, če niste poslali zahtevka za spremembo gesla. " "Za ponastavitev gelsa, sledie spodnji pvezavi:" #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "E-poštni naslovi" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "E-poštni naslovi, ki pripadajo vašemu uporabniškemu računu:" #: templates/account/email_change.html:19 msgid "Your email address is still pending verification:" msgstr "" #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Potrdite e-poštni naslov" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-poštni naslov" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Potrdite e-poštni naslov" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Prosimo, potrdite, da je %(email)s e-poštni " "naslov uporabnika %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Potrdi" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Obstoječi račun drugega ponudnika, je povezan z obstoječim računom." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Povezava za potrditev je neveljavna, ali pa se je iztekla. Prosimo, pošljite nov zahtevek za potrditev.." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Prijava" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Če še nimate uporabniškega računa, ga ustvarite\n" "tukaj." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Odjava" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Ali ste prepričani, da se želite odjaviti?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Primarnega e-poštnega naslova (%(email)s) ni mogoče odstraniti." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Na %(email)s je bilo poslano potrditveno sporočilo." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "%(email)s je potrjen." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "E-poštni naslov %(email)s je bil odstranjen." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Uspešno ste se prijavili kot %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Odjavili ste se." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Geslo je uspešno zamenjano." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Geslo je uspešno nastavljeno." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Primarni e-poštni naslov je nastavljen." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "" #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Sprememba gesla" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Ste pozabili geslo?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Ponastavitev gesla" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Vnesite vaš e-potni naslov, na katerega boste prejeli povezavo za " "ponastavitev gesla." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Ponastavi geslo" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "V primeru težav pri ponastavljanju gesla, nas kontaktirajte." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent you an e-mail. If you have not received it please check your " #| "spam folder. Otherwise contact us if you do not receive it in a few " #| "minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Poslali smo vam e-poštno sporočilo s povezavo za \n" "potrditev. Če sporočila ne boste prejeli \n" "v nekaj minutah, nas kontaktirajte." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Napačni žeton" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Povezava za ponastavitev gesla je neveljavna oz. je bila že uporoabljena. " "Prosimo, zahtevajte novo povezavo za " "ponastavitev." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Geslo je spremenjeno." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Nastavi geslo" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Potrdite e-poštni naslov" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Ustvari račun" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Ustvari račun" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Že imate uporabniški račun? Prijavite se. " #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Registracija ni mogoča" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Registracija trenutno ni mogoča" #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Opomba" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "Prijavljeni ste kot %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Opozorilo:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Trenutno nimate natavljlenega e-poštnega naslova. Priporočamo vam, da dodate " "e-poštni naslov, za prejemanje obvestil, zahtevkv za ponastavitev gesla, ipd." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Potrdite e-poštni naslov." #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. If you do not see the verification e-mail " #| "in your main inbox, check your spam folder. Please contact us if you do " #| "not receive the verification e-mail within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Na vaš e-poštni naslov je bil poslano sporočilo za potrditev. Sledite " "povezavi za zaključek registracije. Če sporočila ne boste prejeli v nekaj " "minutah, nas kontaktirajte." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Za dostop morate potrditi svojo identiteto. \n" "Prosimo, da potrdite navedeni e-poštni naslov." #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside that e-mail. If you do not " #| "see the verification e-mail in your main inbox, check your spam folder. " #| "Otherwise\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Poslali smo vam e-poštno sporočilo s povezavo za \n" "potrditev. Če sporočila ne boste prejeli \n" "v nekaj minutah, nas kontaktirajte." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Opomba: e-poštni naslov lahko " "spremenite." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "žeton skrivnost" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Prijava z računom drugega ponudnika ni uspela." #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Prišo je do napake ob poskusu prijave z vašim obstoječim računom drugega " "ponudnuka." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Povezave računov" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Vpišete se lahko s pomčjo vaših obstoječih uoporabniških računov:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Trenutno nimate povezanega nobenega uporabniškega računa drugega ponudnika." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Dodaj obstoječi račun drugega ponudnika" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Prijava je bila prekinjena" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Odločili ste se za prekinitev prijave v našo storitev s pomočjo obstoječega " "računa. Če gre za napako, se lahko prijavite tukaj." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Obstoječi račun je povezan." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Obstoječi račun drugega ponudnika, je povezan z obstoječim računom." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Obstoječi uporabniški račun je razvezan." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Uporabili boste svoj obstoječi %(provider_name)s račun, za vpis v\n" "%(site_name)s. Prosimo izpolnite spodnji obrazec:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Prosimo, vpišite se z enim od vaših\n" #~ "obstoječih računov, ali pa ustvarite nov " #~ "račun\n" #~ "na %(site_name)s in se vpišite spodaj:" #~ msgid "or" #~ msgstr "ali" #~ msgid "change password" #~ msgstr "Sprememba gesla" #~ msgid "OpenID Sign In" #~ msgstr "Prijava z OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "E-poštni naslov že pripada drugemu uporabniškemu računu." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Povezava za ponastavitev gesla je bila poslana. Če je ne boste prejeli v " #~ "nekaj minutah, nas kontaktirajte." django-allauth-0.58.2/allauth/locale/sr/000077500000000000000000000000001452212273200200155ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/sr/LC_MESSAGES/000077500000000000000000000000001452212273200216025ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/sr/LC_MESSAGES/django.po000066400000000000000000001217441452212273200234150ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Nikola Vulovic , 2018. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Nikola Vulovic \n" "Language-Team: NONE\n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "" "Корисничко име се не може користити. Молимо користите друго корисничко име." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Превише неуспелих покушаја пријављивања. Покушајте поново касније." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Корисник је већ регистрован на овој адреси е-поште." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Тренутна лозинка" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Лозинка мора бити најмање {0} знакова." #: account/apps.py:9 msgid "Accounts" msgstr "Рачуни" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Морате унијети исту лозинку сваки пут" #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Лозинка" #: account/forms.py:94 msgid "Remember Me" msgstr "Сети ме се" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Овај налог је тренутно неактиван." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Адреса е-поште и/или лозинка коју сте навели нису тачни." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Корисничко име и/или лозинка коју сте навели нису тачни." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Адреса е-поште" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "Е-пошта" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Корисничко име" #: account/forms.py:134 msgid "Username or email" msgstr "Корисничко име или е-пошта" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Пријавите се" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Заборавили сте лозинку?" #: account/forms.py:312 msgid "Email (again)" msgstr "Е-пошта (опет)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Потврда адресе е-поште" #: account/forms.py:324 msgid "Email (optional)" msgstr "Е-пошта (опционо)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Морате унијети исту адресу е-поште сваки пут." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Лозинка (поново)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Ова адреса е-поште је већ повезана са овим налогом." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Ваш налог нема потврђену е-маил адресу." #: account/forms.py:524 msgid "Current Password" msgstr "Тренутна лозинка" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Нова лозинка" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Нова лозинка (поново)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Молимо унесите тренутну лозинку." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Адреса е-поште није додељена било ком корисничком налогу" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Токен ресетовања лозинке је неважећи." #: account/models.py:21 msgid "user" msgstr "корисник" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "адреса е-поште" #: account/models.py:28 msgid "verified" msgstr "проверено" #: account/models.py:29 msgid "primary" msgstr "примарна" #: account/models.py:35 msgid "email addresses" msgstr "адресе е-поште" #: account/models.py:141 msgid "created" msgstr "створено" #: account/models.py:142 msgid "sent" msgstr "послат" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "кључ" #: account/models.py:148 msgid "email confirmation" msgstr "потврда е-поште" #: account/models.py:149 msgid "email confirmations" msgstr "потврде е-поште" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Рачун постоји већ са овом адресом е-поште. Пријавите се на топрви налог, " "затим повежите свој %s налог." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Ваш налог нема подешену лозинку." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Ваш налог нема потврђену е-маил адресу." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Друштвени рачуни" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "провидер" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "провидер" #: socialaccount/models.py:52 msgid "name" msgstr "име" #: socialaccount/models.py:54 msgid "client id" msgstr "ИД клијента" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "ИД апликације или потрошачки кључ" #: socialaccount/models.py:59 msgid "secret key" msgstr "тајни кључ" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "Тајна АПИ-ја, тајна клијента или тајна потрошача" #: socialaccount/models.py:65 msgid "Key" msgstr "Кључ" #: socialaccount/models.py:77 msgid "social application" msgstr "друштвена апликација" #: socialaccount/models.py:78 msgid "social applications" msgstr "друштвена апликације" #: socialaccount/models.py:113 msgid "uid" msgstr "уид" #: socialaccount/models.py:115 msgid "last login" msgstr "Последње пријављивање" #: socialaccount/models.py:116 msgid "date joined" msgstr "Датум придружио" #: socialaccount/models.py:117 msgid "extra data" msgstr "додатни подаци" #: socialaccount/models.py:121 msgid "social account" msgstr "друштвени рачун" #: socialaccount/models.py:122 msgid "social accounts" msgstr "друштвени рачуни" #: socialaccount/models.py:156 msgid "token" msgstr "токен" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) или токен приступа (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "токен тајна" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) или освежени токен (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "истиче у" #: socialaccount/models.py:170 msgid "social application token" msgstr "Токен друштвених апликација" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "токени друштвених апликација" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Невељавни подаци о профилу" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Неважећи одговор при добијању токена за захтев од \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Неважећи одговор при добијању токена за приступ од \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "нема сачуваних токена за захтев од \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "нема сачуваних токена за приступ од \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Нема приступа приватним ресурсима у \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Неважећи одговор при добијању токена за захтев од \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Рачун неактиван" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Овај налог је неактиван." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Адресе е-поште" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "С вашим налогом су повезане следеће адресе е-пошти:" #: templates/account/email.html:23 msgid "Verified" msgstr "Потврђено" #: templates/account/email.html:27 msgid "Unverified" msgstr "Непотврђени" #: templates/account/email.html:32 msgid "Primary" msgstr "Примарни" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Постави за Примарни" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Поновно пошаљи верификацију" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Уклони" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Додај адресу е-поште" #: templates/account/email.html:70 msgid "Add Email" msgstr "Додај е-пошту" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Да ли стварно желите да уклоните изабрану адресу е-поште?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Хвала од %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Хвала вам што користите %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Здраво из %(site_name)s!\n" "\n" "Примате овај е-маил пошто је корисник %(user_display)s дао вашутвојадресу за " "повезиванје са њиховим налогаом.\n" "\n" "Да бисте потврдили ово, идите на %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Молим вас потврдите вашу адресу е-поште" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Здраво од %(site_name)s!\n" "\n" "Примате ову е-маил поруку јер сте ви или неко други тражилилозинку за ваш " "кориснички налог.\n" "Ова порука се може игнорисати ако нисте затражили ресет лозинке. Кликните на " "линк испод да бисте поништили своју лозинку." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "У случају да сте заборавили, ваше корисничко име је %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Поништавање лозинке е-поштом" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Здраво од %(site_name)s!\n" "\n" "Примате ову е-маил поруку јер сте ви или неко други тражилилозинку за ваш " "кориснички налог.\n" "Ова порука се може игнорисати ако нисте затражили ресет лозинке. Кликните на " "линк испод да бисте поништили своју лозинку." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Адресе е-поште" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "С вашим налогом су повезане следеће адресе е-пошти:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Ваша примарна адреса е-поште мора бити потврђена." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Потврда адресе е-поште" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "Е-пошта" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Потврда адресе е-поште" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Молимо потврдите да је %(email)s је адреса " "е-поште за корисника %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Потврди" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Друштвени рачун је већ повезан са другим налогом." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Овај линк за потврду е-поште је истекао или је неважећи. Молимо вас да затражите нови захтев за потврду е-поште ." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Пријавите се" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Ако још нисте створили рачун, онда се прво региструјте." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Одјава" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Јесте ли сигурни да желите да се одјавите?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Не можете да уклоните примарну адресу е-поште (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Потврдна порука је послата на адресу е-поште %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Потврдили сте %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Уклоњена адреса e-поште %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Успешно сте се пријавили као %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Одјавили сте се." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Лозинка је успешно промењена." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Успешно сте поставили лозинку." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Примарна адреса е-поште постављена." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Ваша примарна адреса е-поште мора бити потврђена." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Промени лозинку" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Заборавили сте лозинку?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Поништаванје лозинке" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Заборавили сте лозинку? Унесите своју адресу е-поште испод, и послат ћемо " "ваме-пошту који вам омогућава да је поништите." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Поништи моју лозинку" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Молимо вас да нас контактирате ако имате проблема са поништавањем ваше " "лозинке." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Послали смо вам поруку е-поштом за\n" "верификацију. Кликните на везу унутар ове е-поруке.\n" "Контактирајте нас ако не примите е-поруку у року од неколико минута." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Лош токен" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Веза за поништавање лозинке је неважећа, вероватно зато што је већ " "билаискоришћена. Молимо Вас да затражите ново поништаванје лозинке." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Ваша лозинка је сада промењена." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Постави лозинку" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Потврда адресе е-поште" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Регистрација" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Региструјте се" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Већ имате налог? Онда Вас молимо да се пројавите." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Регистрација затворена" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Жао нам је, али регистрација је тренутно затворена." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Напомена" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "Ви сте већ пријављени као %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Упозорење:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Тренутно немате никакву адресу е-поште. Требали бисте стварно додатиадресу е-" "поште како бисте могли примати обавештења, ресетовати лозинку итд." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Потврдите Вашу адресу е-поште" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Послали смо вам поруку е-поштом за верификацију. Пратите дату везу који сте " "могли да завршите процес регистрације. Молимо вас да нас контактирате ако га " "не примитеза неколико минута." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Овај део сајта захтева од Вас да потврдите да\n" "сте Ви заиста за особа која тврдите да сте. У ову сврху захтевамо да\n" "потврдите власништво над вашом адресом е-поште." #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Послали смо вам поруку е-поштом за\n" "верификацију. Кликните на везу унутар ове е-поруке.\n" "Контактирајте нас ако не примите е-поруку у року од неколико минута." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Напомена: и даље можете да " "промените адресу Вашее-поште." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "токен тајна" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Друштвене мрежа пријава неуспешна" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Дошло је до грешке приликом покушаја пријављивања преко налога ваше " "друштвене мреже." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Повезани рачуни" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Можете се пријавити на свој рачун помоћу било које од следећих рачуна " "трећихстрана:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Тренутно немате ниједан рачун друштевених мрежа повезане са овим рачуном." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Додајте рачун треће стране" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Пријава је отказана" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Одлучили сте да откажете пријављивање на нашу веб страницу помоћу једног од " "ваших постојећихрачуна. Ако је ово грешка, молимо вас да пређете на и прјавите се." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Друштвени рачун је повезан." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Друштвени рачун је већ повезан са другим налогом." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Друштвени рачун више није повезан." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Управо користите свој рачун код %(provider_name)s да бисте се пријавили на\n" "%(site_name)s. Као последњи корак, молимо попуните следећи образац:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Молимо Вас да се пријавите са једним од\n" #~ "постојећих рачуна трећих страна. Или, се региструјте\n" #~ "за рачун код %(site_name)s и пријавите се доле:" #~ msgid "or" #~ msgstr "или" #~ msgid "change password" #~ msgstr "промени лозинку" #~ msgid "OpenID Sign In" #~ msgstr "ОпенИД Пријава" #~ msgid "This email address is already associated with another account." #~ msgstr "Ова адреса е-поште је већ повезана са другим налогом." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Послали смо вам е-пошту. Молимо Вас да нас контактирате ако га не " #~ "примитеза неколико минута." #~ msgid "Account" #~ msgstr "Рачун" django-allauth-0.58.2/allauth/locale/sr_Latn/000077500000000000000000000000001452212273200207735ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/sr_Latn/LC_MESSAGES/000077500000000000000000000000001452212273200225605ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/sr_Latn/LC_MESSAGES/django.po000066400000000000000000001100601452212273200243600ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Nikola Vulovic , 2018. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Nikola Vulovic \n" "Language-Team: NONE\n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "" "Korisničko ime se ne može koristiti. Molimo koristite drugo korisničko ime." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Previše neuspelih pokušaja prijavljivanja. Pokušajte ponovo kasnije." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Korisnik je već registrovan na ovoj adresi e-pošte." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Trenutna lozinka" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Lozinka mora biti najmanje {0} znakova." #: account/apps.py:9 msgid "Accounts" msgstr "Računi" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Morate unijeti istu lozinku svaki put" #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Lozinka" #: account/forms.py:94 msgid "Remember Me" msgstr "Seti me se" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Ovaj nalog je trenutno neaktivan." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Adresa e-pošte i/ili lozinka koju ste naveli nisu tačni." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Korisničko ime i/ili lozinka koju ste naveli nisu tačni." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Adresa e-pošte" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-pošta" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Korisničko ime" #: account/forms.py:134 msgid "Username or email" msgstr "Korisničko ime ili e-pošta" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Prijavite se" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Zaboravili ste lozinku?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-pošta (opet)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "Potvrda adrese e-pošte" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-pošta (opciono)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Morate unijeti istu adresu e-pošte svaki put." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Lozinka (ponovo)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Ova adresa e-pošte je već povezana sa ovim nalogom." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Vaš nalog nema potvrđenu e-mail adresu." #: account/forms.py:524 msgid "Current Password" msgstr "Trenutna lozinka" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Nova lozinka" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Nova lozinka (ponovo)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Molimo unesite trenutnu lozinku." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Adresa e-pošte nije dodeljena bilo kom korisničkom nalogu" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Token resetovanja lozinke je nevažeći." #: account/models.py:21 msgid "user" msgstr "korisnik" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "adresa e-pošte" #: account/models.py:28 msgid "verified" msgstr "provereno" #: account/models.py:29 msgid "primary" msgstr "primarna" #: account/models.py:35 msgid "email addresses" msgstr "adrese e-pošte" #: account/models.py:141 msgid "created" msgstr "stvoreno" #: account/models.py:142 msgid "sent" msgstr "poslat" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "ključ" #: account/models.py:148 msgid "email confirmation" msgstr "potvrda e-pošte" #: account/models.py:149 msgid "email confirmations" msgstr "potvrde e-pošte" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Račun postoji već sa ovom adresom e-pošte. Prijavite se na toprvi nalog, " "zatim povežite svoj %s nalog." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Vaš nalog nema podešenu lozinku." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Vaš nalog nema potvrđenu e-mail adresu." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Društveni računi" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "provider" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "provider" #: socialaccount/models.py:52 msgid "name" msgstr "ime" #: socialaccount/models.py:54 msgid "client id" msgstr "ID klijenta" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "ID aplikacije ili potrošački ključ" #: socialaccount/models.py:59 msgid "secret key" msgstr "tajni ključ" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "Tajna API-ja, tajna klijenta ili tajna potrošača" #: socialaccount/models.py:65 msgid "Key" msgstr "Ključ" #: socialaccount/models.py:77 msgid "social application" msgstr "društvena aplikacija" #: socialaccount/models.py:78 msgid "social applications" msgstr "društvena aplikacije" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "Poslednje prijavljivanje" #: socialaccount/models.py:116 msgid "date joined" msgstr "Datum pridružio" #: socialaccount/models.py:117 msgid "extra data" msgstr "dodatni podaci" #: socialaccount/models.py:121 msgid "social account" msgstr "društveni račun" #: socialaccount/models.py:122 msgid "social accounts" msgstr "društveni računi" #: socialaccount/models.py:156 msgid "token" msgstr "token" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) ili token pristupa (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "token tajna" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) ili osveženi token (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "ističe u" #: socialaccount/models.py:170 msgid "social application token" msgstr "Token društvenih aplikacija" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "tokeni društvenih aplikacija" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Neveljavni podaci o profilu" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Nevažeći odgovor pri dobijanju tokena za zahtev od \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Nevažeći odgovor pri dobijanju tokena za pristup od \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "nema sačuvanih tokena za zahtev od \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "nema sačuvanih tokena za pristup od \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Nema pristupa privatnim resursima u \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Nevažeći odgovor pri dobijanju tokena za zahtev od \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Račun neaktivan" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Ovaj nalog je neaktivan." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Adrese e-pošte" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "S vašim nalogom su povezane sledeće adrese e-pošti:" #: templates/account/email.html:23 msgid "Verified" msgstr "Potvrđeno" #: templates/account/email.html:27 msgid "Unverified" msgstr "Nepotvrđeni" #: templates/account/email.html:32 msgid "Primary" msgstr "Primarni" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Postavi za Primarni" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Ponovno pošalji verifikaciju" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Ukloni" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Dodaj adresu e-pošte" #: templates/account/email.html:70 msgid "Add Email" msgstr "Dodaj e-poštu" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Da li stvarno želite da uklonite izabranu adresu e-pošte?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "Hvala od %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Hvala vam što koristite %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s has given " #| "yours as an e-mail address to connect their account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Zdravo iz %(site_name)s!\n" "\n" "Primate ovaj e-mail pošto je korisnik %(user_display)s dao vašutvojadresu za " "povezivanje sa njihovim nalogaom.\n" "\n" "Da biste potvrdili ovo, idite na %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Molim vas potvrdite vašu adresu e-pošte" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Zdravo od %(site_name)s!\n" "\n" "Primate ovu e-mail poruku jer ste vi ili neko drugi tražililozinku za vaš " "korisnički nalog.\n" "Ova poruka se može ignorisati ako niste zatražili reset lozinke. Kliknite na " "link ispod da biste poništili svoju lozinku." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "U slučaju da ste zaboravili, vaše korisničko ime je %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Poništavanje lozinke e-poštom" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Zdravo od %(site_name)s!\n" "\n" "Primate ovu e-mail poruku jer ste vi ili neko drugi tražililozinku za vaš " "korisnički nalog.\n" "Ova poruka se može ignorisati ako niste zatražili reset lozinke. Kliknite na " "link ispod da biste poništili svoju lozinku." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Adrese e-pošte" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "S vašim nalogom su povezane sledeće adrese e-pošti:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Vaša primarna adresa e-pošte mora biti potvrđena." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Potvrda adrese e-pošte" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-pošta" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Potvrda adrese e-pošte" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Molimo potvrdite da je %(email)s je adresa " "e-pošte za korisnika %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Potvrdi" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Društveni račun je već povezan sa drugim nalogom." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Ovaj link za potvrdu e-pošte je istekao ili je nevažeći. Molimo vas da zatražite novi zahtev za potvrdu e-pošte ." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Prijavite se" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Ako još niste stvorili račun, onda se prvo registrujte." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Odjava" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Jeste li sigurni da želite da se odjavite?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Ne možete da uklonite primarnu adresu e-pošte (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Potvrdna poruka je poslata na adresu e-pošte %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Potvrdili ste %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Uklonjena adresa e-pošte %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Uspešno ste se prijavili kao %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Odjavili ste se." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Lozinka je uspešno promenjena." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Uspešno ste postavili lozinku." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Primarna adresa e-pošte postavljena." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Vaša primarna adresa e-pošte mora biti potvrđena." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Promeni lozinku" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Zaboravili ste lozinku?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Poništavanje lozinke" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Zaboravili ste lozinku? Unesite svoju adresu e-pošte ispod, i poslat ćemo " "vame-poštu koji vam omogućava da je poništite." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Poništi moju lozinku" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Molimo vas da nas kontaktirate ako imate problema sa poništavanjem vaše " "lozinke." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Poslali smo vam poruku e-poštom za\n" "verifikaciju. Kliknite na vezu unutar ove e-poruke.\n" "Kontaktirajte nas ako ne primite e-poruku u roku od nekoliko minuta." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Loš token" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Veza za poništavanje lozinke je nevažeća, verovatno zato što je već " "bilaiskorišćena. Molimo Vas da zatražite novo poništavanje lozinke." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Vaša lozinka je sada promenjena." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Postavi lozinku" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Potvrda adrese e-pošte" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Registracija" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Registrujte se" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Već imate nalog? Onda Vas molimo da se projavite." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Registracija zatvorena" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Žao nam je, ali registracija je trenutno zatvorena." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Napomena" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "Vi ste već prijavljeni kao %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Upozorenje:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Trenutno nemate nikakvu adresu e-pošte. Trebali biste stvarno dodatiadresu e-" "pošte kako biste mogli primati obaveštenja, resetovati lozinku itd." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Potvrdite Vašu adresu e-pošte" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Poslali smo vam poruku e-poštom za verifikaciju. Pratite datu vezu koji ste " "mogli da završite proces registracije. Molimo vas da nas kontaktirate ako ga " "ne primiteza nekoliko minuta." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Ovaj deo sajta zahteva od Vas da potvrdite da\n" "ste Vi zaista za osoba koja tvrdite da ste. U ovu svrhu zahtevamo da\n" "potvrdite vlasništvo nad vašom adresom e-pošte." #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Poslali smo vam poruku e-poštom za\n" "verifikaciju. Kliknite na vezu unutar ove e-poruke.\n" "Kontaktirajte nas ako ne primite e-poruku u roku od nekoliko minuta." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Napomena: i dalje možete da " "promenite adresu Vašee-pošte." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 #, fuzzy #| msgid "token secret" msgid "Authenticator secret" msgstr "token tajna" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Društvene mreža prijava neuspešna" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Došlo je do greške prilikom pokušaja prijavljivanja preko naloga vaše " "društvene mreže." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Povezani računi" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Možete se prijaviti na svoj račun pomoću bilo koje od sledećih računa " "trećihstrana:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "Trenutno nemate nijedan račun društevenih mreža povezane sa ovim računom." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Dodajte račun treće strane" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Prijava je otkazana" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Odlučili ste da otkažete prijavljivanje na našu veb stranicu pomoću jednog " "od vaših postojećihračuna. Ako je ovo greška, molimo vas da pređete na i prjavite se." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Društveni račun je povezan." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Društveni račun je već povezan sa drugim nalogom." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Društveni račun više nije povezan." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Upravo koristite svoj račun kod %(provider_name)s da biste se prijavili na\n" "%(site_name)s. Kao poslednji korak, molimo popunite sledeći obrazac:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Molimo Vas da se prijavite sa jednim od\n" #~ "postojećih računa trećih strana. Ili, se registrujte\n" #~ "za račun kod %(site_name)s i prijavite se dole:" #~ msgid "or" #~ msgstr "ili" #~ msgid "change password" #~ msgstr "promeni lozinku" #~ msgid "OpenID Sign In" #~ msgstr "OpenID Prijava" #~ msgid "This email address is already associated with another account." #~ msgstr "Ova adresa e-pošte je već povezana sa drugim nalogom." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Poslali smo vam e-poštu. Molimo Vas da nas kontaktirate ako ga ne " #~ "primiteza nekoliko minuta." #~ msgid "Account" #~ msgstr "Račun" django-allauth-0.58.2/allauth/locale/sv/000077500000000000000000000000001452212273200200215ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/sv/LC_MESSAGES/000077500000000000000000000000001452212273200216065ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/sv/LC_MESSAGES/django.po000066400000000000000000001070721452212273200234170ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2014-08-12 00:35+0200\n" "Last-Translator: Jannis Š\n" "Language-Team: Swedish (http://www.transifex.com/projects/p/django-allauth/" "language/sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Användarnamnet kan ej användas. Välj ett annat användarnamn." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "" #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "En användare är redan registrerad med den här epost-adressen" #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Nuvarande lösenord" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Lösenordet måste vara minst {0} tecken långt" #: account/apps.py:9 #, fuzzy msgid "Accounts" msgstr "Konto" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Du måste ange samma lösenord" #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Lösenord" #: account/forms.py:94 msgid "Remember Me" msgstr "Kom ihåg mig" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Detta konto är inaktivt." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Epost-adressen och/eller lösenordet är felaktigt." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Användarnamnet och/eller lösenordet är felaktigt." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "Epost-adress" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "Epost" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Användarnamn" #: account/forms.py:134 msgid "Username or email" msgstr "Användarnamn eller epost-adress" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Logga in" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Glömt lösenordet?" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "Epost (valfritt)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "epost-bekräftelse" #: account/forms.py:324 msgid "Email (optional)" msgstr "Epost (valfritt)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Du måste ange samma lösenord" #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Lösenord (igen)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Denna epost-adress är redan knuten till detta konto" #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Ditt konto har ingen verifierad epost-adress." #: account/forms.py:524 msgid "Current Password" msgstr "Nuvarande lösenord" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Nytt lösenord" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Nytt lösenord (igen)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Skriv in ditt nuvarande lösenord." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Epost-adressen är inte knuten till något konto" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "" #: account/models.py:21 msgid "user" msgstr "" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "epost-adress" #: account/models.py:28 #, fuzzy msgid "verified" msgstr "Ej verifierad" #: account/models.py:29 #, fuzzy msgid "primary" msgstr "Primär" #: account/models.py:35 msgid "email addresses" msgstr "epost-adresser" #: account/models.py:141 msgid "created" msgstr "" #: account/models.py:142 msgid "sent" msgstr "" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "" #: account/models.py:148 msgid "email confirmation" msgstr "epost-bekräftelse" #: account/models.py:149 msgid "email confirmations" msgstr "epost-bekräftelser" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, python-format msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Ditt konto har inget lösenord." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Ditt konto har ingen verifierad epost-adress." #: socialaccount/apps.py:7 #, fuzzy msgid "Social Accounts" msgstr "Konto" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "" #: socialaccount/models.py:48 msgid "provider ID" msgstr "" #: socialaccount/models.py:52 #, fuzzy msgid "name" msgstr "Användarnamn" #: socialaccount/models.py:54 msgid "client id" msgstr "" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:59 msgid "secret key" msgstr "" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:65 msgid "Key" msgstr "" #: socialaccount/models.py:77 msgid "social application" msgstr "" #: socialaccount/models.py:78 msgid "social applications" msgstr "" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "" #: socialaccount/models.py:116 msgid "date joined" msgstr "" #: socialaccount/models.py:117 msgid "extra data" msgstr "" #: socialaccount/models.py:121 msgid "social account" msgstr "" #: socialaccount/models.py:122 msgid "social accounts" msgstr "" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "" #: socialaccount/models.py:170 msgid "social application token" msgstr "" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Felaktigt svar vid hämtning av fråge-nyckel från \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Felaktigt svar vid hämtning av access-nyckel från \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Ingen fråge-nyckel sparad för \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Ingen access-nyckel sparad för \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Ingen access till privata resurser hos \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Felaktigt svar vid hämtning av fråge-nyckel från \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Kontot inaktivt" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Detta konto är inaktivt." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "Epost-adresser" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Följande epost-adresser är knutna till ditt konto:" #: templates/account/email.html:23 msgid "Verified" msgstr "Verifierad" #: templates/account/email.html:27 msgid "Unverified" msgstr "Ej verifierad" #: templates/account/email.html:32 msgid "Primary" msgstr "Primär" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Gör primär" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Sänd verifiering igen" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Ta bort" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Lägg till epost-adress" #: templates/account/email.html:70 msgid "Add Email" msgstr "Lägg till epost" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Vill du verkligen ta bort den valda epost-adressen?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Användare %(user_display)s på %(site_name)s har angivit detta som sin epost-" "adress.\n" "\n" "Klicka på följande adress för att bekräfta att detta stämmer: " "%(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm Email Address" msgid "Please Confirm Your Email Address" msgstr "Verifiera epost-adress" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Du har fått detta mail för att du eller någon annan har begärt en " "återställning av ditt lösenord på %(site_domain)s.\n" "Du kan bortse från detta mail om du inte begärt en återställning. Klicka på " "länken nedan för att återställa ditt lösenord." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Ditt användarnamn är %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Återställning av lösenord" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Du har fått detta mail för att du eller någon annan har begärt en " "återställning av ditt lösenord på %(site_domain)s.\n" "Du kan bortse från detta mail om du inte begärt en återställning. Klicka på " "länken nedan för att återställa ditt lösenord." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "Epost-adresser" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Följande epost-adresser är knutna till ditt konto:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "Din primära epost-adress måste verifieras." #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "Verifiera epost-adress" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "Epost" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Verifiera epost-adress" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Verifiera att %(email)s är en epost-adress " "för %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Verifiera" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "Tredjeparts-kontot är redan knutet till ett annat konto." #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Länken för att verifiera epost-adressen har förfallit eller är ogiltig. Skapa en ny epost-verification." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Logga in" #: templates/account/login.html:12 #, fuzzy, python-format msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Har du redan ett konto? Då kan du logga in." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Logga ut" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Är du säker att du vill logga ut?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Du kan inte ta bort din primära epost-adress (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Verifierings-mail skickat till %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "Du har verifierat %(email)s." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "Ta bort epost-adress %(email)s." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Du har loggat in som %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Du har loggat ut." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Lösenordet ändrat." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Lösenord skapat." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Primär epost-adress satt." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Din primära epost-adress måste verifieras." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Ändra lösenord" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Glömt lösenordet?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Återställning av lösenord" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Glömt ditt lösenord? Ange din epost-adress nedan så skickar vi ett mail med " "instruktioner för att återställa det." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Återställ mitt lösenord" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Vänligen kontakta oss om du har problem med att återställa ditt lösenord." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Vi har skickat ett mail till dig för\n" "verifiering. Klicka på länken inne i detta mail. Kontakta\n" "oss om det inte dyker upp inom ett par minuter." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Felaktig nyckel" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Länken för att återställa lösenordet var ogiltig, möjligtvis för att den " "redan har använts. Begär en ny lösenords-" "återställning." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Ditt lösenord är nu ändrat." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Skapa lösenord" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "Verifiera epost-adress" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Skapa konto" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Skapa konto" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Har du redan ett konto? Då kan du logga in." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Anmälan stängd" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Tyvärr är anmälan stängd för närvarande." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Information" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "du är inloggad som %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Varning:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Du har inte angett någon epost-adress. Du borde lägga till en epost-adress " "så du kan få meddelanden, återställa ditt lösenord och liknande." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Verifiera din epost-adress" #: templates/account/verification_sent.html:12 #, fuzzy msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Ett mail för verifiering har skickats till " "%(email)s. Klicka på länken i mailet för att slutföra anmälan. Kontakta " "oss om det inte dyker upp inom ett par minuter." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "För att få tillgång till denna avdelning måste du verifiera att\n" "du är den du säger att du är. Du måste därför bevisa att du\n" "angett rätt epost-adress. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Vi har skickat ett mail till dig för\n" "verifiering. Klicka på länken inne i detta mail. Kontakta\n" "oss om det inte dyker upp inom ett par minuter." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Information: du kan fortfarande ändra din epost-adress." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Fel vid tredjeparts-inloggning" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Ett fel inträffade vid inloggning via tredjeparts-konto." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Anslutna tredjeparts-konton" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Du kan logga in på ditt konto via något av följande tredjeparts-konton:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Du har för närvarande inga tredjeparts-konton knutna till ditt konto." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Lägg till tredjeparts-konto" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Inloggning avbruten" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Du valde att avbryta inloggningen via ett av dina tredjeparts-konton. Om " "detta var ett misstag kan du logga in igen." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Tredjeparts-kontot har knutits till ditt kontot." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Tredjeparts-kontot är redan knutet till ett annat konto." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Tredjeparts-kontot har tagits bort." #: templates/socialaccount/signup.html:12 #, fuzzy, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Du håller på att logga in via ditt konto på %(provider_name)s på \n" "%(site_name)s. Fyll i följande formulär för att slutföra inloggningen:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, fuzzy, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Logga in med ett\n" #~ "av dina befintliga tredjeparts-konton eller skapa ett konto \n" #~ "för %(site_name)s och logga in nedan:" #~ msgid "or" #~ msgstr "eller" #~ msgid "change password" #~ msgstr "ändra lösenord" #~ msgid "OpenID Sign In" #~ msgstr "Inloggning via OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "Denna epost-adress är redan knuten till ett annat konto" #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Ett mail har nu skickats. Kontakta oss om det inte dyker upp inom ett par " #~ "minuter." #~ msgid "Account" #~ msgstr "Konto" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Inloggningen och/eller lösenordet är felaktigt." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "" #~ "Användarnamn kan endast innehålla bokstäver, siffror samt @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Användarnamnet är upptaget. Välj ett annat." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Logga in" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "Du har verifierat att %(email)s är en " #~ "epost-adress för %(user_display)s." #~ msgid "Thanks for using our site!" #~ msgstr "Tack för att du använder vår hemsida!" #~ msgid "Confirmation email sent to %(email)s" #~ msgstr "Epost-bekräftelse skickad till %(email)s" #~ msgid "Delete Password" #~ msgstr "Ta bort lösenordet" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "Du kan ta bort ditt lösenord eftersom du är inloggad via OpenID." #~ msgid "delete my password" #~ msgstr "ta bort mitt lösenord" #~ msgid "Password Deleted" #~ msgstr "Lösenordet borttaget" #~ msgid "Your password has been deleted." #~ msgstr "Ditt lösenord har tagits bort." django-allauth-0.58.2/allauth/locale/th/000077500000000000000000000000001452212273200200045ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/th/LC_MESSAGES/000077500000000000000000000000001452212273200215715ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/th/LC_MESSAGES/django.po000066400000000000000000001310371452212273200234000ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Nattaphoom Chaipreecha, 2015 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2015-06-26 13:09+0700\n" "Last-Translator: Nattaphoom Chaipreecha \n" "Language-Team: Thai \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "ไม่สามารถใช้ชื่อผู้ใช้นี้ได้ กรุณาใช้ชื่อผู้ใช้อื่น" #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "" #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "ชื่อผู้ใช้ได้ถูกลงทะเบียนด้วยอีเมลนี้แล้ว" #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "รหัสผ่านปัจจุบัน" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "รหัสผ่านต้องมีอย่างน้อย {0} ตัวอักษร" #: account/apps.py:9 msgid "Accounts" msgstr "บัญชี" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "ต้องพิมพ์รหัสผ่านเดิมซ้ำอีกครั้ง" #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "รหัสผ่าน" #: account/forms.py:94 msgid "Remember Me" msgstr "จดจำการเข้าใช้" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "บัญชีนี้อยู่ในสถานะที่ใช้งานไม่ได้่" #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "อีเมลและ/หรือรหัสผ่านที่ระบุมาไม่ถูกต้อง" #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "ชื่อผู้ใช้และ/หรือรหัสผ่านที่ระบุมาไม่ถูกต้อง" #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "อีเมล" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "อีเมล" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "ชื่อผู้ใช้" #: account/forms.py:134 msgid "Username or email" msgstr "ชื่อผู้ใช้ หรือ อีเมล" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "ลงชื่อเข้าใช้" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "ลืมรหัสผ่าน?" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "อีเมล (ไม่จำเป็น)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "การยืนยันอีเมล" #: account/forms.py:324 msgid "Email (optional)" msgstr "อีเมล (ไม่จำเป็น)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "ต้องพิมพ์รหัสผ่านเดิมซ้ำอีกครั้ง" #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "รหัสผ่าน (อีกครั้ง)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "อีเมลนี้ได้ถูกเชื่อมกับบัญชีนี้แล้ว" #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "บัญชีของคุณไม่มีอีเมลที่ยืนยันแล้ว" #: account/forms.py:524 msgid "Current Password" msgstr "รหัสผ่านปัจจุบัน" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "รหัสผ่านใหม่" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "รหัสผ่านใหม่ (อีกครั้ง)" #: account/forms.py:538 msgid "Please type your current password." msgstr "โปรดใส่รหัสผ่านปัจจุบัน" #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "อีเมลนี้ไม่ได้เชื่อมกับบัญชีใดเลย" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "token ที่ใช้รีเซ็ทรหัสผ่านไม่ถูกต้อง" #: account/models.py:21 msgid "user" msgstr "ผู้ใช้" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "อีเมล" #: account/models.py:28 msgid "verified" msgstr "ยืนยันแล้ว" #: account/models.py:29 msgid "primary" msgstr "หลัก" #: account/models.py:35 msgid "email addresses" msgstr "อีเมล" #: account/models.py:141 msgid "created" msgstr "สร้างแล้ว" #: account/models.py:142 msgid "sent" msgstr "ส่งแล้ว" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "คีย์" #: account/models.py:148 msgid "email confirmation" msgstr "การยืนยันอีเมล" #: account/models.py:149 msgid "email confirmations" msgstr "การยืนยันอีเมล" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "มีบัญชีที่ใช้อีเมลนี้แล้ว โปรดลงชื่อเข้าใช้ก่อนแล้วค่อยเชื่อมต่อกับบัญชี %s ของคุณ" #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "บัญชีของคุณไม่ได้ตั้งรหัสผ่านไว้" #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "บัญชีของคุณไม่มีอีเมลที่ยืนยันแล้ว" #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "บัญชีโซเชียล" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "ผู้ให้บริการ" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "ผู้ให้บริการ" #: socialaccount/models.py:52 msgid "name" msgstr "ชื่อ" #: socialaccount/models.py:54 msgid "client id" msgstr "" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:59 msgid "secret key" msgstr "" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:65 msgid "Key" msgstr "คีย์" #: socialaccount/models.py:77 msgid "social application" msgstr "" #: socialaccount/models.py:78 msgid "social applications" msgstr "" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "" #: socialaccount/models.py:116 msgid "date joined" msgstr "" #: socialaccount/models.py:117 msgid "extra data" msgstr "" #: socialaccount/models.py:121 msgid "social account" msgstr "" #: socialaccount/models.py:122 msgid "social accounts" msgstr "" #: socialaccount/models.py:156 msgid "token" msgstr "token" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "" #: socialaccount/models.py:170 msgid "social application token" msgstr "" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "การตอบสนองผิดพลาดขณะที่กำลังได้รับ request token จาก \"%s\"" #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "การตอบสนองผิดพลาดขณะที่กำลังได้รับ access token จาก \"%s\"" #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "ไม่มีการบันทึก request token ของ \"%s\"" #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "ไม่มีการบันทึก access token ของ \"%s\"" #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "ไม่มีสิทธิ์การเข้าใช้ทรัพยากรส่วนตัว ที่ \"%s\"" #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "การตอบสนองผิดพลาดขณะที่กำลังได้รับ request token จาก \"%s\"" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "บัญชีไม่มีการใช้งาน" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "บัญชีนี้ไม่มีการใช้งาน" #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "อีเมล" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "อีเมลต่อไปนี้ได้เชื่อมกับบัญชีของคุณ" #: templates/account/email.html:23 msgid "Verified" msgstr "ยืนยันแล้ว" #: templates/account/email.html:27 msgid "Unverified" msgstr "ยังไม่ได้ยืนยัน" #: templates/account/email.html:32 msgid "Primary" msgstr "หลัก" #: templates/account/email.html:42 msgid "Make Primary" msgstr "ทำให้เป็นอันหลัก" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "ส่งการยืนยันอีกครั้ง" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "ลบ" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "เพิ่มอีเมล" #: templates/account/email.html:70 msgid "Add Email" msgstr "เพิ่มอีเมล" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "คุณต้องการที่จะลบอีเมลนี้จริงหรอ" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "ขอบคุณจาก %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "ขอบคุณที่ใช้บริการของ %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because user %(user_display)s at " #| "%(site_domain)s has given yours as an e-mail address to connect their " #| "account.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "สวัสดีจาก %(site_name)s!\n" "\n" "คุณได้รับอีเมลนี้เพราะว่า ผู้ใช้ %(user_display)s จาก%(site_domain)s " "ได้ใช้อีเมลนี้ในการเชื่อมต่อกับบัญชี\n" "\n" "เพื่อยืนยันว่าการลงทะเบียนนี้ถูกต้อง ไปที่ %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "กรุณายืนยันอีเมลของคุณ" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "สวัสดีจาก %(site_name)s!\n" "\n" "You're receiving this e-mail because you or someone else has requested a " "คุณได้รับอีเมลนี้เพราะว่า คุณหรือใครบางคนได้ทำการร้องขอรหัสผ่านของบัญชีนี้ที่ %(site_domain)s.\n" "It can be safely ignored if you did not request a password reset. Click the " "คุณสามารถมองข้ามและลบอีเมลนี้ทิ้งได้เลยหากคุณไม่ได้ทำการร้องขอการรีเซ็ทรหัสผ่านคลิกที่ลิงค์ข้างล่างนี้เพื่อรีเซ็ทรหัสผ่านของคุณ" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "ในกรณีเผื่อคุณลืม ชื่อผู้ใช้ของคุณคือ %(username)s" #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "อีเมลในการรีเซ็ทรหัสผ่าน" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "Hello from %(site_name)s!\n" #| "\n" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "สวัสดีจาก %(site_name)s!\n" "\n" "You're receiving this e-mail because you or someone else has requested a " "คุณได้รับอีเมลนี้เพราะว่า คุณหรือใครบางคนได้ทำการร้องขอรหัสผ่านของบัญชีนี้ที่ %(site_domain)s.\n" "It can be safely ignored if you did not request a password reset. Click the " "คุณสามารถมองข้ามและลบอีเมลนี้ทิ้งได้เลยหากคุณไม่ได้ทำการร้องขอการรีเซ็ทรหัสผ่านคลิกที่ลิงค์ข้างล่างนี้เพื่อรีเซ็ทรหัสผ่านของคุณ" #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "อีเมล" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "อีเมลต่อไปนี้ได้เชื่อมกับบัญชีของคุณ" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your primary email address must be verified." msgid "Your email address is still pending verification:" msgstr "อีเมลหลักของคุณต้องได้การยืนยัน" #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "ยืนยันอีเมล" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "อีเมล" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "ยืนยันอีเมล" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "กรุณายืนยันว่า %(email)s เป็นอีเมลของชื่อผู้ใช้ " "%(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "ยืนยัน" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "บัญชีโซเชียลนี้ได้ถูกเชื่อมต่อกับบัญชีอื่นแล้ว" #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "ลิงค์ที่ใช้ในการยืนยันอีเมลนี้ หมดอายุหรือมีข้อผิดพลาด กรุณาใช้อีเมล ติดต่อการร้องขอการยืนยันอีเมล." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "ลงชื่อเข้าใช้" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "ถ้าหากคุณยังไม่มีบัญชี, กรุณา\n" "ลงทะเบียนก่อน." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "ลงชื่อออก" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "คุณแน่ใจหรือว่าต้องการจะลงชื่อออก" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "คุณไม่สามารถลบอีเมลของคุณได้ (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "อีเมลยืนยันได้ถูกส่งไปที่ %(email)s" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "คุณได้ทำการยืนยัน %(email)s" #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "ลบอีเมล %(email)s แล้ว" #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "%(name)s ลงชื่อเข้าใช้สำเร็จ" #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "คุณได้ออกจากระบบแล้ว" #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "เปลี่ยนรหัสผ่านสำเร็จ" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "ตั้งรหัสผ่านสำเร็จ" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "ตั้งอีเมลหลักสำเร็จ" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "อีเมลหลักของคุณต้องได้การยืนยัน" #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "เปลี่ยนรหัสผ่าน" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "ลืมรหัสผ่าน?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "รีเซ็ทรหัสผ่าน" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "ลืมรหัสผ่านของคุณ? ใส่อีเมลของคุณข้างล่างนี้ ทางเราจะทำการส่งอีเมลที่ใช้ในการรีเซ็ทรหัสผ่านไปให้คุณ" #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "รีเซ็ทรหัสผ่านของฉัน" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "กรุณาติดต่อเราหากคุณพบปัญหาในการรีเซ็ทรหัสผ่าน" #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "เราได้ส่งอีเมลให้คุณเพื่อ\n" "ทำการยืนยัน กรุณาคลิกลิงค์ที่อยู่ข้างในอีเมล\n" "กรุณาติดต่อเราหากคุณไม่ได้รับอีเมลภายในเวลาไม่กี่นาทีนี้" #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Token เสีย" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "ลิงค์ที่ใช้ในการรีเซ็ทรหัสผ่านไม่ถูกต้อง อาจเป็นไปได้ว่ามันได้ถูกใช้ไปแล้วกรุณาร้องขอ การรีเซ็ทรหัสผ่านใหม่" #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "รหัสผ่านของคุณได้เปลี่ยนแล้ว" #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "ตั้งรหัสผ่าน" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "ยืนยันอีเมล" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "ลงทะเบียน" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "ลงทะเบียน" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "มีบัญชีอยู่แล้ว? กรุณาลงชื่อเข้าใช้" #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "การลงทะเบียนปิดอยู่" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "เราขอโทษด้วย การลงทะเบียนได้ปิดชั่วคราว" #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "หมายเหตุ" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "คุณได้ลงชื่อเข้าใช้เป็น %(user_display)s" #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "คำเตือน:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "คุณยังไม่มีอีเมลในระบบ คุณควรเพิ่มอีเมลเพื่อที่จะสามารถรับ การแจ้งเตือน รีเซ็ทรหัสผ่าน และอื่นๆ" #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "ยืนยันอีเมลของคุณ" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "เราได้ส่งอีเมลถึงคุณเพื่อให้คุณได้ทำการยืนยัน " "ใช้ลิงค์ที่อยู่ในอีเมลเพื่อทำการสิ้นสุดการลงทะเบียนกรุณาติดต่อเราหากคุณไม่ได้รับอีเมลภายในเวลาไม่กี่นาทีนี้" #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "ส่วนนี้ของเว็บไซท์นี้ต้องการให้คุณยืนยันตัวตนของคุณก่อน\n" "ด้วยการนี้ เราขอให้คุณทำการยืนยันการเป็นเจ้าของของอีเมลของคุณก่อน" #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "เราได้ส่งอีเมลให้คุณเพื่อ\n" "ทำการยืนยัน กรุณาคลิกลิงค์ที่อยู่ข้างในอีเมล\n" "กรุณาติดต่อเราหากคุณไม่ได้รับอีเมลภายในเวลาไม่กี่นาทีนี้" #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "หมายเหตุ: คุณยังสามารถเปลี่ยนอีเมลของคุณได้" #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "ลงชื่อเข้าใช้ด้วยระบบโซเชีลไม่สำเร็จ" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "มีปัญหาเกิดขึ้นในขณะที่คุณทำการลงชื่อเข้าใช้ด้วยบัญชีโซเชียล" #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "การเชื่อมต่อบัญชีต่างๆ" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "คุณสามารถลงชื่อเข้าสู่ระบบด้วยบัญชีภายนอกเหล่านี้ได้:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "คุณไม่มีบัญชีโซเชียลใดๆที่เชื่อมกับบัญชีนี้" #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "เพิ่ม บัญชีภายนอก" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "การลงชื่เข้าใช้ยกเลิก" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "คุณตัดสินใจที่จะยกเลิกการลงชื่อเข้าใช้เว็บของเราด้วยหนึ่งในบัญชีของคุณถ้านี้เป็นความผิดพลาด กรุณาลงชื่อเข้าใช้" #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "บัญชีโซเชียลเชื่อมต่อเรียบร้อยแล้ว" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "บัญชีโซเชียลนี้ได้ถูกเชื่อมต่อกับบัญชีอื่นแล้ว" #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "บัญชีโซเชียลได้ถูกตัดการเชื่อมต่อแล้ว" #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "คุณกำลังจะทำการใช้บัญชี %(provider_name)s ของคุณ ในการเข้าสู่ระบบของ\n" "%(site_name)s. ในขั้นตอนสุดท้าย กรุณากรอกฟอร์มข้างล่าง:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "กรุณาลงชื่อเข้าใช้ด้วยบัญชีภายนอกของคุณ\n" #~ "หรือ Or, ลงทะเบียน \n" #~ "สำหรับบัญชีของ %(site_name)s และลงชื่อเข้าใช้ด้านล่าง:" #~ msgid "or" #~ msgstr "sinv" #~ msgid "change password" #~ msgstr "เปลี่ยนรหัสผ่าน" #~ msgid "OpenID Sign In" #~ msgstr "ลงชื่อเข้าใช้ด้วย OpenID" #~ msgid "This email address is already associated with another account." #~ msgstr "อีเมลนี้ได้ถูกเชื่อมกับบัญชีอื่นแล้ว" #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "เราได้ส่งอีเมลให้คุณแล้ว. กรุณาติดต่อเราหากคุณไม่ได้รับอีเมลภายในเวลาไม่กี่นาทีนี้" #~ msgid "Account" #~ msgstr "บัญชี" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "การลงชื่เข้าใช้และ/หรือรหัสผ่านที่ระบุมาไม่ถูกต้อง" #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "ชื่อผู้ใช้สามารถมีตัวอักษรภาษาอังกฤษตัวเลขและ @/./+/-/_. เท่านั้น" #~ msgid "This username is already taken. Please choose another." #~ msgstr "ชื่อผู้ใช้นี้ถูกใช้แล้ว กรุณาเลือกชื่ออื่น" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "ลงชื่อเข้าใช้" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "คุณได้ยืนยันว่า %(email)s เป็นอีเมลของผู้ใช้ " #~ "%(user_display)s." django-allauth-0.58.2/allauth/locale/tr/000077500000000000000000000000001452212273200200165ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/tr/LC_MESSAGES/000077500000000000000000000000001452212273200216035ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/tr/LC_MESSAGES/django.po000066400000000000000000001075031452212273200234130ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2013 msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2023-07-24 22:28+0200\n" "Last-Translator: Jannis Š\n" "Language-Team: Turkish (http://www.transifex.com/projects/p/django-allauth/" "language/tr/)\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "Bu kullanıcı adı kullanılamaz. Lütfen başka bir kullanıcı adı deneyin." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Çok fazla hatalı giriş yapıldı. Lütfen daha sonra tekrar deneyin." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Bu e-posta adresiyle bir kullanıcı zaten kayıtlı." #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "Mevcut Parola" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Parola en az {0} karakter olmalıdır." #: account/apps.py:9 #, fuzzy msgid "Accounts" msgstr "Hesap" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Her seferinde aynı parolayı girmelisiniz." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Parola" #: account/forms.py:94 msgid "Remember Me" msgstr "Beni Hatırla" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Bu hesap şu anda etkin değil." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Girdiğiniz e-posta adresi ve/veya parola doğru değil." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Girdiğiniz kullanıcı adı ve/veya parola doğru değil." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "E-posta adresi" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-posta" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Kullanıcı adı" #: account/forms.py:134 msgid "Username or email" msgstr "Kullanıcı adı ya da e-posta" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Giriş Yap" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Parolanızı mı unuttunuz?" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "E-posta (zorunlu değil)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "e-posta onayı" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-posta (zorunlu değil)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "Her seferinde aynı parolayı girmelisiniz." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Parola (tekrar)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Bu e-post adresi zaten bu hesap ile ilişkilendirilmiş." #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "Hesabınızın doğrulanmış e-posta adresi yok." #: account/forms.py:524 msgid "Current Password" msgstr "Mevcut Parola" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Yeni Parola" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Yeni Parola (tekrar)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Mevcut parolanızı tekrar yazın." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Bu e-posta adresi hiçbir kullanıcı hesabıyla ilişkili değil" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Şifre sıfırlama kodu hatalı." #: account/models.py:21 msgid "user" msgstr "kullanıcı" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "e-posta adresi" #: account/models.py:28 #, fuzzy msgid "verified" msgstr "Doğrulanmamış" #: account/models.py:29 #, fuzzy msgid "primary" msgstr "Birincil" #: account/models.py:35 msgid "email addresses" msgstr "e-posta adresleri" #: account/models.py:141 msgid "created" msgstr "oluşturuldu" #: account/models.py:142 msgid "sent" msgstr "gönderildi" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "" #: account/models.py:148 msgid "email confirmation" msgstr "e-posta onayı" #: account/models.py:149 msgid "email confirmations" msgstr "e-posta onayları" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Bu e-posta ile kayıtlı bir hesap bulunmaktadır. Lütfen önce bu hesaba giriş " "yapıp daha sonra %s hesabınızı bağlayın." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Hesabınız için parola belirlemediniz." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Hesabınızın doğrulanmış e-posta adresi yok." #: socialaccount/apps.py:7 #, fuzzy msgid "Social Accounts" msgstr "Hesap" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "sağlayıcı" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "sağlayıcı" #: socialaccount/models.py:52 #, fuzzy msgid "name" msgstr "Kullanıcı adı" #: socialaccount/models.py:54 msgid "client id" msgstr "" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:59 msgid "secret key" msgstr "" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:65 msgid "Key" msgstr "" #: socialaccount/models.py:77 msgid "social application" msgstr "" #: socialaccount/models.py:78 msgid "social applications" msgstr "" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "son giriş" #: socialaccount/models.py:116 msgid "date joined" msgstr "katıldığı tarih" #: socialaccount/models.py:117 msgid "extra data" msgstr "" #: socialaccount/models.py:121 msgid "social account" msgstr "" #: socialaccount/models.py:122 msgid "social accounts" msgstr "" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "" #: socialaccount/models.py:170 msgid "social application token" msgstr "" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Geçersiz profil bilgisi" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "\"%s\"'dan talep kodu alınırken geçersiz cevap alındı." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "\"%s\"'dan erişim kodu alınırken geçersiz cevap alındı." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "\"%s\" için hiçbir talep kodu kaydedilmedi." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "\"%s\" için hiçbir erişim kodu kaydedilmedi." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "\"%s\"'daki özel kaynaklara erişim yok." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "\"%s\"'dan talep kodu alınırken geçersiz cevap alındı." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Hesap Etkin Değil" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Bu hesap etkin değil." #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "E-posta Adresleri" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Şu e-posta adresleri hesabınızla ilişkilendirildi:" #: templates/account/email.html:23 msgid "Verified" msgstr "Doğrulanmış" #: templates/account/email.html:27 msgid "Unverified" msgstr "Doğrulanmamış" #: templates/account/email.html:32 msgid "Primary" msgstr "Birincil" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Birincil Yap" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Tekrar Doğrula" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Kaldır" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "E-posta Adresi Ekle" #: templates/account/email.html:70 msgid "Add Email" msgstr "E-posta Ekle" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Seçilen e-posta adresini kaldırmak istediğinizden emin misiniz?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, fuzzy, python-format #| msgid "" #| "Thank you from %(site_name)s!\n" #| "%(site_domain)s" msgid "Hello from %(site_name)s!" msgstr "" "%(site_name)s: Teşekkürler!\n" "%(site_domain)s" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "%(site_name)s sitesinde %(user_display)s, bunu e-posta adresi olarak verdi.\n" "\n" "Doğruluğunu onaylamak için %(activate_url)s adresine gidin\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm Email Address" msgid "Please Confirm Your Email Address" msgstr "E-posta Adresi Doğrula" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Bu e-postayı alıyorsunuz çünkü siz veya bir başkası %(site_domain)s " "sitesindeki hesabınız için parola sıfırlama talebinde bulundu.\n" "Eğer böyle bir talepte bulunmadıysanız bu e-postayı gözardı edebilirsiniz. " "Bulunduysanız aşağıdaki bağlantıya tıklayarak parolanızı sıfırlayabilirsiniz." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "Kullanıcı adınızı unuttuysanız, kullanıcı adınız: %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "Parola Sıfırlama E-postası" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Bu e-postayı alıyorsunuz çünkü siz veya bir başkası %(site_domain)s " "sitesindeki hesabınız için parola sıfırlama talebinde bulundu.\n" "Eğer böyle bir talepte bulunmadıysanız bu e-postayı gözardı edebilirsiniz. " "Bulunduysanız aşağıdaki bağlantıya tıklayarak parolanızı sıfırlayabilirsiniz." #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "E-posta Adresleri" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "Şu e-posta adresleri hesabınızla ilişkilendirildi:" #: templates/account/email_change.html:19 msgid "Your email address is still pending verification:" msgstr "" #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "E-posta Adresi Doğrula" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-posta" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "E-posta Adresi Doğrula" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Lütfen %(email)s adresinin %(user_display)s " "kullanıcısına ait olduğunu onaylayın." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Onayla" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, python-format msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "" #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Bu onaylama bağlantısının süresi geçmiş ya da bağlantı geçersiz. Lütfen yeni bir e-posta doğrulama talebinde bulunun.." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Giriş Yap" #: templates/account/login.html:12 #, fuzzy, python-format msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Zaten hesabınız var mı? O zaman lütfen giriş " "yapın." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Çıkış Yap" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Çıkış yapmak istediğinize emin misiniz?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "" #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "Doğrulama e-posta'sı %(email)s adresine gönderildi." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "%(email)s adresini onayladınız." #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "%(email)s adresini sildiniz." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "%(name)s olarak başarıyla giriş yapıldı." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Çıkış yaptınız." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Parola başarıyla değiştirildi." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Parola başarıyla ayarlandı." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "" #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Parola Değiştir" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Parolanızı mı unuttunuz?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Parola Sıfırlama" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Parolanızı mı unuttunuz? E-posta adresinizi aşağıya yazın, size parolanızı " "sıfırlamanıza imkan veren e-postayı göndereceğiz." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Parolamı Sıfırla" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Parolanızı sıfırlarken herhangi bir sorunla karşılaşırsanız lütfen bize " "ulaşın." #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Doğrulama için size bir e-posta gönderdik.\n" "Lütfen e-postadaki bağlantıya tıklayın. Eğer birkaç dakika içinde\n" "bu e-postayı almazsanız bize ulaşın." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Parola sıfırlama bağlantısı gerçersiz, muhtemelen daha önce kullanıldığı " "için. Lütfen yeni parola sıfırlama " "talebinde bulunun." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Parolanız değişti." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Parola Belirle" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "E-posta Adresi Doğrula" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Üye Ol" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Üye Ol" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Zaten hesabınız var mı? O zaman lütfen giriş " "yapın." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Kayıt Kapalı" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "" #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Not" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "zaten %(user_display)s olarak giriş yaptınız." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Uyarı:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "Şu anda kayıtlı hiçbir e-posta adresiniz yok. Bildirim alabilmek, parolanızı " "sıfırlayabilmek, vs. işler için e-posta adresinizi mutlaka eklemelisiniz." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "E-posta Adresinizi Doğrulayın" #: templates/account/verification_sent.html:12 #, fuzzy msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "%(email)s adresinize doğrulama amaçlı e-" "posta gönderdik. Üyelik sürecini tamamlamak için sunulan bağlantıyı takip " "edin. Eğer e-posta birkaç dakika içinde size ulaşmazsa lütfen bize ulaşın." #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Sitenin bu kısmı kim olduğunuzu doğrulamanızı\n" "gerektirmektedir. Bu sebeple, girdiğiniz e-posta adresinize sahip\n" "olduğunuzu doğrulamanızı rica ediyoruz. " #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Doğrulama için size bir e-posta gönderdik.\n" "Lütfen e-postadaki bağlantıya tıklayın. Eğer birkaç dakika içinde\n" "bu e-postayı almazsanız bize ulaşın." #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "Not: hala e-posta adresinizi " "değiştirebilirsiniz." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Sosyal Ağ Girişi Başarısız" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "Sosyal ağ hesabınız ile giriş yapılırken bir hata oluştu." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "Hesap Bağlantıları" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "" "Hesabınıza aşağıdaki üçüncü parti hesaplar aracılığıyla giriş yapabilirsiniz." #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "Hesabınızla bağlantılı hiçbir sosyal ağ hesabınız yok." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "3. Parti Hesap ekle" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Giriş İptal Edildi" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Mevcut hesaplarınızdan birisiyle sitemize girişinizi iptal etmeye karar " "verdiniz. Eğer bu yanlışlıkla olduysa, lütfen devam edin: giriş yapın." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "" #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "" #: templates/socialaccount/signup.html:12 #, fuzzy, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "%(site_name)s sitesine giriş yapmak için %(provider_name)s hesabınızı " "kullanmak üzeresiniz. Son bir adım olarak, lütfen şu formu doldurun:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #~ msgid "or" #~ msgstr "ya da" #~ msgid "change password" #~ msgstr "parola değiştir" #~ msgid "OpenID Sign In" #~ msgstr "OpenID Girişi" #~ msgid "This email address is already associated with another account." #~ msgstr "Bu e-post adresi başka bir hesap ile ilişkilendirilmiş." #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "Size bir e-posta gönderdik. Birkaç dakika içerisinde size ulaşmazsa " #~ "lütfen bize ulaşın." #~ msgid "Account" #~ msgstr "Hesap" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "Girdiğiniz giriş bilgisi ve/veya parola doğru değil." #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "Kullanıcı adları sadece harf, rakam ve @/./+/-/_ içerebilir." #~ msgid "This username is already taken. Please choose another." #~ msgstr "Bu kullanıcı adı alınmış durumda. Lütfen başka bir tane deneyiniz." #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "Giriş Yap" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "%(email)s adresinin %(user_display)s " #~ "kullanıcısına ait olduğunu onayladınız." #~ msgid "Thanks for using our site!" #~ msgstr "Sitemizi kullandığınız için teşekkür ederiz!" #~ msgid "Confirmation email sent to %(email)s" #~ msgstr "Onay e-postası %(email)s adresine gönderildi." #~ msgid "Delete Password" #~ msgstr "Parola Sil" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "" #~ "Şu anda OpenID ile giriş yaptığınız için dilerseniz parolanızı " #~ "silebilirsiniz." #~ msgid "delete my password" #~ msgstr "parolamı sil" #~ msgid "Password Deleted" #~ msgstr "Parola Silindi" #~ msgid "Your password has been deleted." #~ msgstr "Parolanız silindi." django-allauth-0.58.2/allauth/locale/uk/000077500000000000000000000000001452212273200200105ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/uk/LC_MESSAGES/000077500000000000000000000000001452212273200215755ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/uk/LC_MESSAGES/django.po000066400000000000000000001143011452212273200233770ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2020-10-15 19:53+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " "11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " "100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " "(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "" "Ім'я користувача не може бути використаним. Будь ласка, оберіть інше ім'я " "користувача." #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "Занадто багато спроб входу в систему, спробуйте пізніше." #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "Користувач з такою e-mail адресою уже зареєстрований." #: account/adapter.py:60 msgid "Incorrect password." msgstr "Неправильний пароль." #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "Пароль повинен містити мінімум {0} символів." #: account/apps.py:9 msgid "Accounts" msgstr "Акаунти" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "Ви повинні вводити однаковий пароль кожного разу." #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "Пароль" #: account/forms.py:94 msgid "Remember Me" msgstr "Запам'ятати мене" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "Даний акаунт є неактивним." #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "Введена e-mail адреса і/або пароль є некоректними." #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "Введене ім'я користувача і/або пароль є некоректними." #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "E-mail адреса" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "Ім'я користувача" #: account/forms.py:134 msgid "Username or email" msgstr "Ім'я користувача або e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "Увійти" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "Забули пароль?" #: account/forms.py:312 msgid "Email (again)" msgstr "E-mail (ще раз)" #: account/forms.py:316 msgid "Email address confirmation" msgstr "e-mail адреса підтвердження" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (необов'язковий)" #: account/forms.py:379 msgid "You must type the same email each time." msgstr "Ви повинні вводити однакову e-mail адресу кожного разу." #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "Пароль (ще раз)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "Вказаний e-mail уже прикріплений до цього акаунту." #: account/forms.py:486 #, python-format msgid "You cannot add more than %d email addresses." msgstr "Ви не можете додати більше %d адрес електронної пошти." #: account/forms.py:524 msgid "Current Password" msgstr "Поточний пароль" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "Новий пароль" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "Новий пароль (ще раз)" #: account/forms.py:538 msgid "Please type your current password." msgstr "Будь ласка, вкажіть Ваш поточний пароль." #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "Немає користувача з такою e-mail адресою." #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "Токен відновлення паролю був невірним." #: account/models.py:21 msgid "user" msgstr "користувач" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "e-mail адреса" #: account/models.py:28 msgid "verified" msgstr "підтверджено" #: account/models.py:29 msgid "primary" msgstr "основний" #: account/models.py:35 msgid "email addresses" msgstr "e-mail адреса" #: account/models.py:141 msgid "created" msgstr "створено" #: account/models.py:142 msgid "sent" msgstr "відправлено" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "ключ" #: account/models.py:148 msgid "email confirmation" msgstr "e-mail підтвердження" #: account/models.py:149 msgid "email confirmations" msgstr "e-mail підтвердження" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, python-format msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "Обліковий запис з такою адресою вже існує. Будь ласка, спочатку увійдіть до " "цього акаунта, а потім підключіть ваш акаунт %s." #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "Ваш акаунт не має встановленого паролю." #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "Немає підтвердження по e-mail для Вашого акаунту." #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "Соціальні акаунти" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "постачальник" #: socialaccount/models.py:48 msgid "provider ID" msgstr "постачальник ID" #: socialaccount/models.py:52 msgid "name" msgstr "Ім'я" #: socialaccount/models.py:54 msgid "client id" msgstr "ідентифікатор клієнта" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "ідентифікатор додатку або ключ користувача" #: socialaccount/models.py:59 msgid "secret key" msgstr "секретний ключ" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" "секретний ключ додатку, секретний ключ клієнта або секретний ключ користувача" #: socialaccount/models.py:65 msgid "Key" msgstr "Ключ" #: socialaccount/models.py:77 msgid "social application" msgstr "соціальний додаток" #: socialaccount/models.py:78 msgid "social applications" msgstr "соціальні додатки" #: socialaccount/models.py:113 msgid "uid" msgstr "ID користувача" #: socialaccount/models.py:115 msgid "last login" msgstr "дата останнього входу" #: socialaccount/models.py:116 msgid "date joined" msgstr "дата реєстрації" #: socialaccount/models.py:117 msgid "extra data" msgstr "додаткові дані" #: socialaccount/models.py:121 msgid "social account" msgstr "аккаунт соціальної мережі" #: socialaccount/models.py:122 msgid "social accounts" msgstr "акаунти соціальних мереж" #: socialaccount/models.py:156 msgid "token" msgstr "токен" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "\"oauth_token\" (OAuth1) або access token (OAuth2)" #: socialaccount/models.py:161 msgid "token secret" msgstr "секретний токен" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "\"oauth_token_secret\" (OAuth1) або refresh token (OAuth2)" #: socialaccount/models.py:165 msgid "expires at" msgstr "закінчується" #: socialaccount/models.py:170 msgid "social application token" msgstr "токен соціального додатку" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "токени соціальних додатків" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "Невірні дані профілю" #: socialaccount/providers/oauth/client.py:85 #, python-format msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "" "Невірна відповідь під час отримання запиту від \"%s\". Відповідь була: %s." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Невірна відповідь під час отримання токену доступу від \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "Немає збереженого ключа запиту для \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "Токен доступу не збережений для \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "Немає токену доступу для приватних ресурсів від \"%s\"." #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Невірна відповідь під час отримання запиту від \"%s\"" #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "Акаунт неактивний" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "Даний акаунт неактивний" #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "E-mail адреса" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "Вказаний e-mail уже прикріплений до цього акаунту" #: templates/account/email.html:23 msgid "Verified" msgstr "Підтверджено" #: templates/account/email.html:27 msgid "Unverified" msgstr "Непідтверджено" #: templates/account/email.html:32 msgid "Primary" msgstr "Основний" #: templates/account/email.html:42 msgid "Make Primary" msgstr "Зробити основним" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "Надіслати підтвердження ще раз" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "Видалити" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "Додати e-mail адресу" #: templates/account/email.html:70 msgid "Add Email" msgstr "Додати e-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "Ви дійсно бажаєте видалити дану e-mail адресу?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "Вітання від %(site_name)s!" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" "Дякуємо Вам, що користуєтесь %(site_name)s!\n" "%(site_domain)s" #: templates/account/email/email_confirmation_message.txt:5 #, python-format msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "Ви отримали дане повідомлення тому, що користувач %(user_display)s вказав " "вашу адресу електронну пошту для реєстрації акаунта на %(site_domain)s.\n" "\n" "Для підтвердження, що все правильно, будь ласка, перейдіть за посиланням " "%(activate_url)s" #: templates/account/email/email_confirmation_subject.txt:3 msgid "Please Confirm Your Email Address" msgstr "Будь ласка, підтвердіть Вашу e-mail адресу" #: templates/account/email/password_reset_key_message.txt:4 msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "Ви отримали дане повідомлення, тому що Ви або хтось інший зробили запит на " "відновлення паролю для Вашого акаунту користувача на сайті %(site_domain)s.\n" "Дане повідомлення можна проігнорувати, якщо Ви не робили такого запиту. " "Перейдіть за посиланням для відновлення паролю." #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "На випадок, якщо Ви забули Ваше ім'я користувача %(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "E-mail для відновлення паролю" #: templates/account/email/unknown_account_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "Ви отримали цей лист, тому що ви або хтось інший надіслав запит на " "отримання\n" "паролю до вашого облікового запису. Однак у нас немає жодних записів про " "користувача\n" "з адресою %(email)s у нашій базі даних.\n" "\n" "Цей лист можна безпечно ігнорувати, якщо ви не надсилали запит на зміну " "пароля.\n" "\n" "Якщо це були ви, ви можете зареєструватися за посиланням нижче." #: templates/account/email_change.html:5 templates/account/email_change.html:9 msgid "Email Address" msgstr "E-mail адреса" #: templates/account/email_change.html:14 msgid "The following email address is associated with your account:" msgstr "Вказаний e-mail уже прикріплений до цього акаунту:" #: templates/account/email_change.html:19 msgid "Your email address is still pending verification:" msgstr "Ваша e-mail адреса все ще очікує на перевірку:" #: templates/account/email_change.html:38 msgid "Change Email Address" msgstr "Змінити e-mail адресу" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 msgid "Change Email" msgstr "Змінити e-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "Підтвердити e-mail адресу" #: templates/account/email_confirm.html:16 #, python-format msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "Будь ласка, підтвердіть, що %(email)s це e-" "mail адреса для користувача %(user_display)s." #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "Підтвердити" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, python-format msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "" "Не вдалося підтвердити %(email)s, оскільки він вже підтверджений іншим " "акаунтом." #: templates/account/email_confirm.html:35 #, python-format msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "Термін дії посилання для підтвердження електронної пошти закінчився або воно " "недійсне. Будь ласка, надішліть новий запит на " "підтвердження електронної пошти." #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "Увійти" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "Якщо Ви ще не зареєструвались, будь ласка\n" "зареєструйтесь." #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "Вийти" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "Ви впевнені, що бажаєте вийти?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "Ви можете видалити Вашу основну e-mail адресу (%(email)s)." #: templates/account/messages/email_confirmation_sent.txt:2 #, python-format msgid "Confirmation email sent to %(email)s." msgstr "E-mail підтвердження надіслано на %(email)s." #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "E-mail %(email)s підтверджено. " #: templates/account/messages/email_deleted.txt:2 #, python-format msgid "Removed email address %(email)s." msgstr "E-mail %(email)s видалено." #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "Успішно увійшли як %(name)s." #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "Ви вийшли." #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "Пароль успішно змінено." #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "Пароль успішно введено." #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "Основну e-mail адресу введено." #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "Ваша основна e-mail адреса повинна бути підтверджена." #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "Змінити пароль" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "Забули пароль?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "Відновити пароль" #: templates/account/password_reset.html:14 msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "Забули пароль? Введіть Вашу e-mail адресу у поле і ми надішлемо Вам e-mail, " "що дозволить відновити пароль." #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "Відновити мій пароль" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "" "Будь ласка, зв'яжіться з нами, якщо у Вас виникли проблеми по відновленню " "паролю." #: templates/account/password_reset_done.html:16 msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "Ми надіслали вам електронного листа. Якщо ви його не отримали, перевірте, " "будь ласка, папку \"Спам\". В іншому випадку зв'яжіться з нами, якщо ви не " "отримаєте його протягом декількох хвилин." #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Поганий токен" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "Посилання для відновлення паролю некоректне, можливо через те, що посилання " "уже використане. Будь ласка, зробіть запит на нове відновлення паролю." #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "Ваш пароль змінено." #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "Введіть пароль" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 msgid "Confirm Access" msgstr "Підтвердіть доступ" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" "Для забезпечення безпеки вашого облікового запису, будь ласка, введіть " "пароль:" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "Зареєструватись" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "Зареєструватись" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" "Уже зареєстрованні? Будь ласка, увійдіть." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "Реєстрація закрита" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "Перепрошуємо, але реєстрацію закрито." #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "Зауважте" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "Ви уже увійшли як %(user_display)s." #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "Попередження:" #: templates/account/snippets/warn_no_email.html:3 msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "На даний момент у Вас немає збереженої e-mail адреси. Рекомендуємо додати e-" "mail адресу, для того, щоб отримувати сповіщення, оновлювати паролі та інше." #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "Підтвердіть Вашу e-mail адресу" #: templates/account/verification_sent.html:12 msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "Ми надіслали Вам e-mail для підтвердження. Перейдіть за посиланням для " "звершення процесу реєстрації. Будь ласка, зв'яжіться з нами, якщо Ви не " "отримаєте повідомлення впродовж декількох хвилин." #: templates/account/verified_email_required.html:13 msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "Дана частина сайту вимагає підтвердження e-mail адреси. Для цього нам " "потрібно, щоб ви підтвердили право власності на вашу адресу електронної " "пошти. " #: templates/account/verified_email_required.html:18 msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "Ми надіслали Вам e-mail для підтвердження.\n" "Будь ласка, перейдіть за посилання вказаним у e-mail повідомленні. Якщо ви " "не бачите листа з підтвердженням в основній поштовій скриньці, перевірте " "папку \"Спам\". Будь ласка,\n" "зв'яжіться з нами, якщо Ви не отримаєте повідомлення впродовж декількох " "хвилин." #: templates/account/verified_email_required.html:23 #, python-format msgid "" "Note: you can still change your " "email address." msgstr "" "Зауважте: Ви все ще можете змінити Вашу e-mail адресу." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "Секрет аутентифікатора" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "Вхід за допомогою соціальних мереж неуспішний." #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "" "Виникла помилка під час входу за допомогою Вашого акаунту у соц. мережах." #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "З'єднання акаунта" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "Ви можете увійти використовуючи будь-який із зовнішніх акаунтів:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "" "На даний момент Ви не маєте жодного акаунту із соц. мереж приєднаного до " "даного акаунту." #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "Додати зовнішній акаунт" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Вхід відмінено" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "Ви відмінили вхід на наш сайт, використовуючи один з Ваших існуючих " "акаунтів. Якщо це сталось помилково, будь ласка, увійдіть." #: templates/socialaccount/messages/account_connected.txt:2 msgid "The social account has been connected." msgstr "Акаунт із соц. мереж було приєднано." #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "Акаунт із соц. мереж уже приєднано до іншого акаунту." #: templates/socialaccount/messages/account_disconnected.txt:2 msgid "The social account has been disconnected." msgstr "Акаунт із соц. мереж було від'єднано." #: templates/socialaccount/signup.html:12 #, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "Ви використовуєте Ваш %(provider_name)s акаунт для авторизації на\n" "%(site_name)s. Для завершення, будь ласка, заповніть наступну форму:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "Будь ласка, увійдіть із одним \n" #~ "із Ваших існуючих зовнішніх акаунтів accounts. Або, Зареєструйте\n" #~ " %(site_name)s акаунт і Увійдіть:" #~ msgid "or" #~ msgstr "або" #~ msgid "change password" #~ msgstr "змінити пароль" #~ msgid "OpenID Sign In" #~ msgstr "OpenID вхід" django-allauth-0.58.2/allauth/locale/zh_CN/000077500000000000000000000000001452212273200203725ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/zh_CN/LC_MESSAGES/000077500000000000000000000000001452212273200221575ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/zh_CN/LC_MESSAGES/django.po000066400000000000000000001147321452212273200237710ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2023-07-24 22:25+0200\n" "Last-Translator: jresins \n" "Language-Team: LANGUAGE \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "此用户名不能使用,请改用其他用户名。" #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "登录失败次数过多,请稍后重试。" #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "此e-mail地址已被其他用户注册。" #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "当前密码" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "密码长度不得少于 {0} 个字符。" #: account/apps.py:9 #, fuzzy msgid "Accounts" msgstr "账号" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "每次输入的密码必须相同" #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "密码" #: account/forms.py:94 msgid "Remember Me" msgstr "记住我" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "此账号当前未激活。" #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "您提供的e-mail地址或密码不正确。" #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "您提供的用户名或密码不正确。" #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "E-mail地址" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "用户名" #: account/forms.py:134 msgid "Username or email" msgstr "用户名或e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "账号" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "忘记密码了?" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "E-mail (选填项)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "e-mail确认" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (选填项)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "每次输入的密码必须相同" #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "密码(重复)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "此e-mail地址已关联到这个账号。" #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "您的账号下无任何验证过的e-mail地址。" #: account/forms.py:524 msgid "Current Password" msgstr "当前密码" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "新密码" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "新密码(重复)" #: account/forms.py:538 msgid "Please type your current password." msgstr "请输入您的当前密码" #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "此e-mail地址未分配给任何用户账号" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "重设密码的token不合法。" #: account/models.py:21 msgid "user" msgstr "用户" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "e-mail地址" #: account/models.py:28 msgid "verified" msgstr "已验证" #: account/models.py:29 #, fuzzy msgid "primary" msgstr "首选e-mail" #: account/models.py:35 msgid "email addresses" msgstr "e-mail地址" #: account/models.py:141 msgid "created" msgstr "已建立" #: account/models.py:142 msgid "sent" msgstr "已发送" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "key" #: account/models.py:148 msgid "email confirmation" msgstr "e-mail确认" #: account/models.py:149 msgid "email confirmations" msgstr "e-mail确认" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "已有一个账号与此e-mail地址关联,请先登录该账号,然后连接你的 %s 账号。" #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "您的账号未设置密码。" #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "您的账号下无任何验证过的e-mail地址。" #: socialaccount/apps.py:7 #, fuzzy msgid "Social Accounts" msgstr "账号" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "提供商" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "提供商" #: socialaccount/models.py:52 #, fuzzy msgid "name" msgstr "用户名" #: socialaccount/models.py:54 msgid "client id" msgstr "客户端 id" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:59 msgid "secret key" msgstr "" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:65 #, fuzzy msgid "Key" msgstr "key" #: socialaccount/models.py:77 msgid "social application" msgstr "" #: socialaccount/models.py:78 msgid "social applications" msgstr "" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "最后登录" #: socialaccount/models.py:116 msgid "date joined" msgstr "注册日期" #: socialaccount/models.py:117 msgid "extra data" msgstr "" #: socialaccount/models.py:121 msgid "social account" msgstr "社交账号" #: socialaccount/models.py:122 msgid "social accounts" msgstr "社交账号" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "" #: socialaccount/models.py:170 msgid "social application token" msgstr "" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Invalid response while obtaining request token from \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Invalid response while obtaining access token from \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "No request token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "No access token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "无权访问私有资源 \"%s\"。" #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Invalid response while obtaining request token from \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "账号未激活" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "此账号未激活" #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "E-mail地址" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "以下e-mail地址已关联到您的帐号:" #: templates/account/email.html:23 msgid "Verified" msgstr "已验证" #: templates/account/email.html:27 msgid "Unverified" msgstr "未验证" #: templates/account/email.html:32 msgid "Primary" msgstr "首选e-mail" #: templates/account/email.html:42 msgid "Make Primary" msgstr "设置首选e-mail" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "重发验证e-mail" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "移除" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "添加E-mail地址" #: templates/account/email.html:70 msgid "Add Email" msgstr "添加E-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "您真的想移除选定的e-mail地址吗?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "网站%(site_name)s上的用户%(user_display)s将此设为其e-mail地址。\n" "\n" "为验证这是正确的,请访问%(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm Email Address" msgid "Please Confirm Your Email Address" msgstr "确认E-mail地址" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "您收到此邮件表示您或者他人在网站 %(site_domain)s上为您的账号请求了密码重" "置。\n" "若您未请求密码重置,可以直接忽略此邮件。如要重置密码,请点击下面的链接。" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "作为提示,您的用户名是%(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "密码重置邮件" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "您收到此邮件表示您或者他人在网站 %(site_domain)s上为您的账号请求了密码重" "置。\n" "若您未请求密码重置,可以直接忽略此邮件。如要重置密码,请点击下面的链接。" #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "E-mail地址" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "以下e-mail地址已关联到您的帐号:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your email address has already been verified" msgid "Your email address is still pending verification:" msgstr "您的e-mail地址已经认证。" #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "确认E-mail地址" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "确认E-mail地址" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "请确认%(email)s是否是用户 %(user_display)s的" "e-mail地址。" #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "确认" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "社交账号已连接到另一个账号。" #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "e-mail验证链接失效或无效。请点击 发起新的e-mail验证" "请求。" #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "登录" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "如果没有账号,请先\n" "注册 。" #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "注销" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "您确定要注销登录吗?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "您不能删除您的主e-mail地址 (%(email)s) " #: templates/account/messages/email_confirmation_sent.txt:2 #, fuzzy, python-format msgid "Confirmation email sent to %(email)s." msgstr "确认e-mail已发往 %(email)s" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "您已确认e-mail地址 %(email)s " #: templates/account/messages/email_deleted.txt:2 #, fuzzy, python-format msgid "Removed email address %(email)s." msgstr "e-mail地址 %(email)s 已删除" #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "以 %(name)s..身份成功登录" #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "您已注销登录。" #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "密码修改成功。" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "密码设置成功。" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "主e-mail地址已设置" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "您的主e-mail地址必须被验证。" #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "修改密码" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "忘记密码了?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "密码重置" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "忘记密码?在下面输入您的e-mail地址,我们将给您发送一封e-mail,以便重置密码。" #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "重置我的密码" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "如在重置密码时遇到问题,请与我们联系。" #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "我们已经给您发送了一封e-mail验证邮件。\n" "请点击e-mail中的链接。若您在几分钟后仍未收到邮件,请联系我们。" #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Bad Token" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "密码重置链接无效,可能该链接已被使用。请重新申请链接重置。" #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "您的密码现已被修改。" #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "设置密码" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "确认E-mail地址" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "注册" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "注册" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "已经有一个账号? 请登录." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "已关闭注册" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "非常抱歉,当前已关闭注册。" #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "注意" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "您已以 %(user_display)s的身份登录" #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "警告:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "您当前未设置任何邮件地址。您需要设置一个邮件地址,以便接收通知,重置密码等。" #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "验证您的E-mail地址。" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "我们已向您发了一封验证e-mail。点击e-mail中的链接完成注册流程。如果您在几分钟" "后仍未收到邮件,请与我们联系。" #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "网站的这部分功能要求验证您的真实身份。\n" "为此,我们需要您确认您是此账号e-mail地址的所有者。" #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "我们已经给您发送了一封e-mail验证邮件。\n" "请点击e-mail中的链接。若您在几分钟后仍未收到邮件,请联系我们。" #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "注意: 您仍然能够修改您的e-mail地" "址 ." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "社交网络登录失败" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "当尝试用您的社交网络账号登录时,发生了一个错误。" #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "账号链接" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "您可以用您的以下任何第三方账号登录" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "您当前没有任何社交网络账号与此账号关联" #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "添加一个第三方账号" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "登录已取消" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "您决定取消使用您的已有账号登录我们的网站。如果这是一个失误,请继续登录." #: templates/socialaccount/messages/account_connected.txt:2 #, fuzzy msgid "The social account has been connected." msgstr "社交账号已连接" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "社交账号已连接到另一个账号。" #: templates/socialaccount/messages/account_disconnected.txt:2 #, fuzzy msgid "The social account has been disconnected." msgstr "社交账号已断开连接" #: templates/socialaccount/signup.html:12 #, fuzzy, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "您将使用您的%(provider_name)s账号登录\n" "%(site_name)s。作为最后一步,请完成以下表单:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, fuzzy, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "请用您的第三方账号登录。\n" #~ "或者注册 \n" #~ "一个 %(site_name)s账号并登录:" #~ msgid "or" #~ msgstr "或" #~ msgid "change password" #~ msgstr "修改密码" #~ msgid "OpenID Sign In" #~ msgstr "OpenID登录" #~ msgid "This email address is already associated with another account." #~ msgstr "此e-mail地址已关联到其他账号。" #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "我们已给您发了一封e-mail,如您在几分钟后仍没收到,请与我们联系。" #~ msgid "Account" #~ msgstr "账号" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "您提供的账号或密码错误" #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "用户名只能包含字母,数字和@/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "此用户名已被使用,请选择其他用户名。" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "登录" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "您已确认%(email)s是用户%(user_display)s的" #~ "e-mail地址。" #~ msgid "Thanks for using our site!" #~ msgstr "感谢您使用我们的网站!" #~ msgid "Confirmation email sent to %(email)s" #~ msgstr "确认e-mail已发往 %(email)s" #~ msgid "Delete Password" #~ msgstr "删除密码" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "您当前使用OpenID登录,因此您可以删除你的密码。" #~ msgid "delete my password" #~ msgstr "删除我的密码" #~ msgid "Password Deleted" #~ msgstr "密码已删除" #~ msgid "Your password has been deleted." #~ msgstr "您的密码已被删除。" #~ msgid "" #~ "If you have any trouble resetting your password, contact us at %(CONTACT_EMAIL)s." #~ msgstr "" #~ "如果您在重置密码中遇到任何问题,请联系我们%(CONTACT_EMAIL)s." #~ msgid "Invalid confirmation key." #~ msgstr "不合法的确认密匙" #~ msgid "OpenID" #~ msgstr "OpenID" #~ msgid "Already have an account?" #~ msgstr "已经有账户了?" #~ msgid "Sign in" #~ msgstr "注册" #~ msgid "Language" #~ msgstr "语言" #~ msgid "Pinax can be used in your preferred language." #~ msgstr "Pinax可以在您的首选语言中使用。" #~ msgid "Change my language" #~ msgstr "切换我的语言" #~ msgid "Timezone" #~ msgstr "时区" #, fuzzy #~ msgid "" #~ "You're receiving this e-mail because you requested a password reset\n" #~ "for your user account at Pinax.\n" #~ "\n" #~ "Your new password is: %(new_password)s\n" #~ "\n" #~ "Your username, in case you've forgotten: %(username)s\n" #~ "\n" #~ "You should log in as soon as possible and change your password.\n" #~ "\n" #~ "Thanks for using our site!\n" #~ msgstr "" #~ "Je ontvangt deze mail omdat er een verzoek is ingelegd om het wachtwoord\n" #~ "behorende bij je %(site_name)s account opnieuw in te stellen.\n" #~ "\n" #~ "Je nieuwe wachtwoord is: %(new_password)s\n" #~ "\n" #~ "Je gebruikersnaam, voor het geval je die vergeten bent, is: %(username)s\n" #~ "\n" #~ "Je moet zo snel mogelijk inloggen en bovenstaand wachtwoord veranderen.\n" #~ "\n" #~ "Bedankt voor het gebruik van onze site!\n" #~ msgid "If checked you will stay logged in for 3 weeks" #~ msgstr "Bij 'Onthouden' blijf je ingelogd gedurende 3 weken" #~ msgid "Timezone successfully updated." #~ msgstr "Tijdzone gewijzigd." #~ msgid "Language successfully updated." #~ msgstr "Taal gewijzigd." #~ msgid "None" #~ msgstr "Geen" #~ msgid "add" #~ msgstr "Voeg toe" #~ msgid "Log In" #~ msgstr "Inloggen" #~ msgid "Log in" #~ msgstr "Inloggen" #~ msgid "Logout" #~ msgstr "Afmelden" #~ msgid "" #~ "When you receive the new password, you should log in and change it as soon as possible." #~ msgstr "" #~ "Zodra je het nieuwe wachtwoord ontvangen hebt moet je zo snel mogelijk inloggen en het wachtwoord wijzigen." #~ msgid "You are already logged in." #~ msgstr "Je bent al ingelogd." #~ msgid "" #~ "By clicking \"Sign Up\", you are indicating that you have read and agree " #~ "to the Terms of Use and Privacy Policy." #~ msgstr "" #~ "Door te registreren geef je aan dat je de gebruiksvoorwaarden en de privacy " #~ "policy gelezen hebt en ermee akkoord gaat." #~ msgid "" #~ "If you have any trouble creating your account, contact us at %(contact_email)s." #~ msgstr "" #~ "Als je problemen hebt om een account aan te maken, neem dan contact op " #~ "met %(contact_email)s." #~ msgid "Log in »" #~ msgstr "Inloggen" django-allauth-0.58.2/allauth/locale/zh_Hans/000077500000000000000000000000001452212273200207635ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/zh_Hans/LC_MESSAGES/000077500000000000000000000000001452212273200225505ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/zh_Hans/LC_MESSAGES/django.po000066400000000000000000001146141452212273200243610ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2023-07-24 22:31+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "此用户名不能使用,请改用其他用户名。" #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "登录失败次数过多,请稍后重试。" #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "此e-mail地址已被其他用户注册。" #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "当前密码" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "密码长度不得少于 {0} 个字符。" #: account/apps.py:9 #, fuzzy msgid "Accounts" msgstr "账号" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "每次输入的密码必须相同" #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "密码" #: account/forms.py:94 msgid "Remember Me" msgstr "记住我" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "此账号当前未激活。" #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "您提供的e-mail地址或密码不正确。" #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "您提供的用户名或密码不正确。" #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "E-mail地址" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "用户名" #: account/forms.py:134 msgid "Username or email" msgstr "用户名或e-mail" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "账号" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "忘记密码了?" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "E-mail (选填项)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "e-mail确认" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (选填项)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "每次输入的密码必须相同" #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "密码(重复)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "此e-mail地址已关联到这个账号。" #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "您的账号下无任何验证过的e-mail地址。" #: account/forms.py:524 msgid "Current Password" msgstr "当前密码" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "新密码" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "新密码(重复)" #: account/forms.py:538 msgid "Please type your current password." msgstr "请输入您的当前密码" #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "此e-mail地址未分配给任何用户账号" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "" #: account/models.py:21 msgid "user" msgstr "用户" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "e-mail地址" #: account/models.py:28 msgid "verified" msgstr "已验证" #: account/models.py:29 #, fuzzy msgid "primary" msgstr "首选e-mail" #: account/models.py:35 msgid "email addresses" msgstr "e-mail地址" #: account/models.py:141 msgid "created" msgstr "已建立" #: account/models.py:142 msgid "sent" msgstr "已发送" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "key" #: account/models.py:148 msgid "email confirmation" msgstr "e-mail确认" #: account/models.py:149 msgid "email confirmations" msgstr "e-mail确认" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "已有一个账号与此e-mail地址关联,请先登录该账号,然后连接你的 %s 账号。" #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "您的账号未设置密码。" #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "您的账号下无任何验证过的e-mail地址。" #: socialaccount/apps.py:7 #, fuzzy msgid "Social Accounts" msgstr "账号" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "" #: socialaccount/models.py:48 msgid "provider ID" msgstr "" #: socialaccount/models.py:52 #, fuzzy msgid "name" msgstr "用户名" #: socialaccount/models.py:54 msgid "client id" msgstr "" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "" #: socialaccount/models.py:59 msgid "secret key" msgstr "" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "" #: socialaccount/models.py:65 #, fuzzy msgid "Key" msgstr "key" #: socialaccount/models.py:77 msgid "social application" msgstr "" #: socialaccount/models.py:78 msgid "social applications" msgstr "" #: socialaccount/models.py:113 msgid "uid" msgstr "" #: socialaccount/models.py:115 msgid "last login" msgstr "" #: socialaccount/models.py:116 msgid "date joined" msgstr "" #: socialaccount/models.py:117 msgid "extra data" msgstr "" #: socialaccount/models.py:121 msgid "social account" msgstr "" #: socialaccount/models.py:122 msgid "social accounts" msgstr "" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "" #: socialaccount/models.py:170 msgid "social application token" msgstr "" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Invalid response while obtaining request token from \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Invalid response while obtaining access token from \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "No request token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "No access token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "无权访问私有资源 \"%s\"。" #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Invalid response while obtaining request token from \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "账号未激活" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "此账号未激活" #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "E-mail地址" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "以下e-mail地址已关联到您的帐号:" #: templates/account/email.html:23 msgid "Verified" msgstr "已验证" #: templates/account/email.html:27 msgid "Unverified" msgstr "未验证" #: templates/account/email.html:32 msgid "Primary" msgstr "首选e-mail" #: templates/account/email.html:42 msgid "Make Primary" msgstr "设置首选e-mail" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "重发验证e-mail" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "移除" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "添加E-mail地址" #: templates/account/email.html:70 msgid "Add Email" msgstr "添加E-mail" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "您真的想移除选定的e-mail地址吗?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "网站%(site_name)s上的用户%(user_display)s将此设为其e-mail地址。\n" "\n" "为验证这是正确的,请访问%(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm Email Address" msgid "Please Confirm Your Email Address" msgstr "确认E-mail地址" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "您收到此邮件表示您或者他人在网站 %(site_name)s上为您的账号请求了密码重置。\n" "若您未请求密码重置,可以直接忽略此邮件。如要重置密码,请点击下面的链接。" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "作为提示,您的用户名是%(username)s." #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "密码重置邮件" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "您收到此邮件表示您或者他人在网站 %(site_name)s上为您的账号请求了密码重置。\n" "若您未请求密码重置,可以直接忽略此邮件。如要重置密码,请点击下面的链接。" #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "E-mail地址" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "以下e-mail地址已关联到您的帐号:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your email address has already been verified" msgid "Your email address is still pending verification:" msgstr "Je e-mail adres is al geverifieerd" #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "确认E-mail地址" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "确认E-mail地址" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "请确认%(email)s是否是用户 %(user_display)s的" "e-mail地址。" #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "确认" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "社交账号已连接到另一个账号。" #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "e-mail验证链接失效或无效。请点击 发起新的e-mail验证" "请求。" #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "登录" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "如果没有账号,请先\n" "注册 。" #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "注销" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "您确定要注销登录吗?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "您不能删除您的主e-mail地址 (%(email)s) " #: templates/account/messages/email_confirmation_sent.txt:2 #, fuzzy, python-format msgid "Confirmation email sent to %(email)s." msgstr "确认e-mail已发往 %(email)s" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "您已确认e-mail地址 %(email)s " #: templates/account/messages/email_deleted.txt:2 #, fuzzy, python-format msgid "Removed email address %(email)s." msgstr "e-mail地址 %(email)s 已删除" #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "以 %(name)s..身份成功登录" #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "您已注销登录。" #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "密码修改成功。" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "密码设置成功。" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "主e-mail地址已设置" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "您的主e-mail地址必须被验证。" #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "修改密码" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "忘记密码了?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "密码重置" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "忘记密码?在下面输入您的e-mail地址,我们将给您发送一封e-mail,以便重置密码。" #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "重置我的密码" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "如在重置密码时遇到问题,请与我们联系。" #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "我们已经给您发送了一封e-mail验证邮件。\n" "请点击e-mail中的链接。若您在几分钟后仍未收到邮件,请联系我们。" #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Bad Token" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "密码重置链接无效,可能该链接已被使用。请重新申请链接重置。" #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "您的密码现已被修改。" #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "设置密码" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "确认E-mail地址" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "注册" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "注册" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "已经有一个账号? 请登录." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "已关闭注册" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "非常抱歉,当前已关闭注册。" #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "注意" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "您已以 %(user_display)s的身份登录" #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "警告:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "您当前未设置任何邮件地址。您需要设置一个邮件地址,以便接收通知,重置密码等。" #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "验证您的E-mail地址。" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "我们已向您发了一封验证e-mail。点击e-mail中的链接完成注册流程。如果您在几分钟" "后仍未收到邮件,请与我们联系。" #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "网站的这部分功能要求验证您的真实身份。\n" "为此,我们需要您确认您是此账号e-mail地址的所有者。" #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "我们已经给您发送了一封e-mail验证邮件。\n" "请点击e-mail中的链接。若您在几分钟后仍未收到邮件,请联系我们。" #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "注意: 您仍然能够修改您的e-mail地" "址 ." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "社交网络登录失败" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "当尝试用您的社交网络账号登录时,发生了一个错误。" #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "账号链接" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "您可以用您的以下任何第三方账号登录" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "您当前没有任何社交网络账号与此账号关联" #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "添加一个第三方账号" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "登录已取消" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "您决定取消使用您的已有账号登录我们的网站。如果这是一个失误,请继续登录." #: templates/socialaccount/messages/account_connected.txt:2 #, fuzzy msgid "The social account has been connected." msgstr "社交账号已连接" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "社交账号已连接到另一个账号。" #: templates/socialaccount/messages/account_disconnected.txt:2 #, fuzzy msgid "The social account has been disconnected." msgstr "社交账号已断开连接" #: templates/socialaccount/signup.html:12 #, fuzzy, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "您将使用您的%(provider_name)s账号登录\n" "%(site_name)s。作为最后一步,请完成以下表单:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, fuzzy, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "请用您的第三方账号登录。\n" #~ "或者注册 \n" #~ "一个 %(site_name)s账号并登录:" #~ msgid "or" #~ msgstr "或" #~ msgid "change password" #~ msgstr "修改密码" #~ msgid "OpenID Sign In" #~ msgstr "OpenID登录" #~ msgid "This email address is already associated with another account." #~ msgstr "此e-mail地址已关联到其他账号。" #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "我们已给您发了一封e-mail,如您在几分钟后仍没收到,请与我们联系。" #~ msgid "Account" #~ msgstr "账号" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "您提供的账号或密码错误" #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "用户名只能包含字母,数字和@/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "此用户名已被使用,请选择其他用户名。" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "登录" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "您已确认%(email)s是用户%(user_display)s的" #~ "e-mail地址。" #~ msgid "Thanks for using our site!" #~ msgstr "感谢您使用我们的网站!" #~ msgid "Confirmation email sent to %(email)s" #~ msgstr "确认e-mail已发往 %(email)s" #~ msgid "Delete Password" #~ msgstr "删除密码" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "您当前使用OpenID登录,因此您可以删除你的密码。" #~ msgid "delete my password" #~ msgstr "删除我的密码" #~ msgid "Password Deleted" #~ msgstr "密码已删除" #~ msgid "Your password has been deleted." #~ msgstr "您的密码已被删除。" #~ msgid "" #~ "If you have any trouble resetting your password, contact us at %(CONTACT_EMAIL)s." #~ msgstr "" #~ "Als je problemen hebt je wachtwoord opnieuw in te stellen, neem dan " #~ "contact op met %(CONTACT_EMAIL)s." #~ msgid "Invalid confirmation key." #~ msgstr "Ongeldige bevestigingssleutel." #~ msgid "OpenID" #~ msgstr "OpenID" #~ msgid "Already have an account?" #~ msgstr "Heb je al een account?" #~ msgid "Sign in" #~ msgstr "Aanmelden" #~ msgid "Language" #~ msgstr "Taal" #~ msgid "Pinax can be used in your preferred language." #~ msgstr "Deze site kan in jouw voorkeurstaal gebruikt worden." #~ msgid "Change my language" #~ msgstr "Verander mijn taal" #~ msgid "Timezone" #~ msgstr "Tijdzone" #, fuzzy #~ msgid "" #~ "You're receiving this e-mail because you requested a password reset\n" #~ "for your user account at Pinax.\n" #~ "\n" #~ "Your new password is: %(new_password)s\n" #~ "\n" #~ "Your username, in case you've forgotten: %(username)s\n" #~ "\n" #~ "You should log in as soon as possible and change your password.\n" #~ "\n" #~ "Thanks for using our site!\n" #~ msgstr "" #~ "Je ontvangt deze mail omdat er een verzoek is ingelegd om het wachtwoord\n" #~ "behorende bij je %(site_name)s account opnieuw in te stellen.\n" #~ "\n" #~ "Je nieuwe wachtwoord is: %(new_password)s\n" #~ "\n" #~ "Je gebruikersnaam, voor het geval je die vergeten bent, is: %(username)s\n" #~ "\n" #~ "Je moet zo snel mogelijk inloggen en bovenstaand wachtwoord veranderen.\n" #~ "\n" #~ "Bedankt voor het gebruik van onze site!\n" #~ msgid "If checked you will stay logged in for 3 weeks" #~ msgstr "Bij 'Onthouden' blijf je ingelogd gedurende 3 weken" #~ msgid "Timezone successfully updated." #~ msgstr "Tijdzone gewijzigd." #~ msgid "Language successfully updated." #~ msgstr "Taal gewijzigd." #~ msgid "None" #~ msgstr "Geen" #~ msgid "add" #~ msgstr "Voeg toe" #~ msgid "Log In" #~ msgstr "Inloggen" #~ msgid "Log in" #~ msgstr "Inloggen" #~ msgid "Logout" #~ msgstr "Afmelden" #~ msgid "" #~ "When you receive the new password, you should log in and change it as soon as possible." #~ msgstr "" #~ "Zodra je het nieuwe wachtwoord ontvangen hebt moet je zo snel mogelijk inloggen en het wachtwoord wijzigen." #~ msgid "You are already logged in." #~ msgstr "Je bent al ingelogd." #~ msgid "" #~ "By clicking \"Sign Up\", you are indicating that you have read and agree " #~ "to the Terms of Use and Privacy Policy." #~ msgstr "" #~ "Door te registreren geef je aan dat je de gebruiksvoorwaarden en de privacy " #~ "policy gelezen hebt en ermee akkoord gaat." #~ msgid "" #~ "If you have any trouble creating your account, contact us at %(contact_email)s." #~ msgstr "" #~ "Als je problemen hebt om een account aan te maken, neem dan contact op " #~ "met %(contact_email)s." #~ msgid "Log in »" #~ msgstr "Inloggen" django-allauth-0.58.2/allauth/locale/zh_Hant/000077500000000000000000000000001452212273200207645ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/zh_Hant/LC_MESSAGES/000077500000000000000000000000001452212273200225515ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/zh_Hant/LC_MESSAGES/django.po000066400000000000000000001161741452212273200243650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "無法使用此使用者名稱,請使用其他名稱。" #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "登錄失敗次數過多,請稍後再試。" #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "已經有人使用這一個電子郵件註冊了。" #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "目前密碼" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "密碼長度至少要有 {0} 個字元。" #: account/apps.py:9 msgid "Accounts" msgstr "帳號" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "每次輸入的密碼必須相同" #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "密碼" #: account/forms.py:94 msgid "Remember Me" msgstr "記住我" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "此帳號目前沒有啟用。" #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "您提供的電子郵件地址或密碼不正確。" #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "您提供的使用者名稱或密碼不正確。" #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "電子郵件地址" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "使用者名稱" #: account/forms.py:134 msgid "Username or email" msgstr "使用者名稱或電子郵件" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "登入" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "忘記密碼了?" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "E-mail (可不填)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "電子郵件確認" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (可不填)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "每次輸入的密碼必須相同" #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "密碼 (再一次)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "此電子郵件已與這個帳號連結了。" #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "您的帳號下沒有驗證過的電子郵件地址。" #: account/forms.py:524 msgid "Current Password" msgstr "目前密碼" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "新密碼" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "新密碼 (再一次)" #: account/forms.py:538 msgid "Please type your current password." msgstr "請輸入您目前的密碼" #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "還沒有其他帳號使用這個電子郵件地址" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "" #: account/models.py:21 msgid "user" msgstr "使用者" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "電子郵件地址" #: account/models.py:28 msgid "verified" msgstr "已驗證" #: account/models.py:29 msgid "primary" msgstr "主要的" #: account/models.py:35 msgid "email addresses" msgstr "電子郵件地址" #: account/models.py:141 msgid "created" msgstr "以建立" #: account/models.py:142 msgid "sent" msgstr "已送出" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "key" #: account/models.py:148 msgid "email confirmation" msgstr "電子郵件確認" #: account/models.py:149 msgid "email confirmations" msgstr "電子郵件確認" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "已經有一個帳號與此電子郵件連結了,請先登入該帳號,然後連接你的 %s 帳號。" #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "您的帳號沒有設置密碼。" #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "您的帳號下沒有驗證過的電子郵件地址。" #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "社群帳號" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "提供者" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "提供者" #: socialaccount/models.py:52 msgid "name" msgstr "名稱" #: socialaccount/models.py:54 msgid "client id" msgstr "client id" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "App ID, or consumer key" #: socialaccount/models.py:59 msgid "secret key" msgstr "secret key" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "API secret, client secret, or consumer secret" #: socialaccount/models.py:65 msgid "Key" msgstr "Key" #: socialaccount/models.py:77 msgid "social application" msgstr "社群應用程式" #: socialaccount/models.py:78 msgid "social applications" msgstr "社群應用程式" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "最後一次登入" #: socialaccount/models.py:116 msgid "date joined" msgstr "加入日期" #: socialaccount/models.py:117 msgid "extra data" msgstr "額外資料" #: socialaccount/models.py:121 msgid "social account" msgstr "社群帳號" #: socialaccount/models.py:122 msgid "social accounts" msgstr "社群帳號" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "過期日" #: socialaccount/models.py:170 msgid "social application token" msgstr "社群應用程式 Token" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "社群應用程式 Token" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Invalid response while obtaining request token from \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Invalid response while obtaining access token from \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "No request token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "No access token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "無權訪問私有資源 \"%s\"。" #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Invalid response while obtaining request token from \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "帳號未啟用" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "這個帳號未啟用" #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "電子郵件地址" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "下列電子郵件已與你的帳號連結:" #: templates/account/email.html:23 msgid "Verified" msgstr "已驗證" #: templates/account/email.html:27 msgid "Unverified" msgstr "未驗證" #: templates/account/email.html:32 msgid "Primary" msgstr "主要的" #: templates/account/email.html:42 msgid "Make Primary" msgstr "設為主要的" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "重寄驗証信" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "移除" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "增加電子郵件" #: templates/account/email.html:70 msgid "Add Email" msgstr "增加電子郵件" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "您真的要移除所選擇電子郵件嗎?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "網站%(site_name)s上的使用者%(user_display)s將此設為他的電子郵件地址。\n" "\n" "為了確認這是正確的,請開啟這個連結: %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm Email Address" msgid "Please Confirm Your Email Address" msgstr "確認電子郵件" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "您會收到這封信是因為您或是某人在 %(site_domain)s 這個網站上要求重設您帳號的密" "碼。\n" "若您沒有要求我們重設密碼,請您直接忽略這封信。若要重設您的密碼,請點擊下面的" "連結。" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "提醒您,您的使用者名稱是 %(username)s 。" #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "密碼重設電子郵件" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "您會收到這封信是因為您或是某人在 %(site_domain)s 這個網站上要求重設您帳號的密" "碼。\n" "若您沒有要求我們重設密碼,請您直接忽略這封信。若要重設您的密碼,請點擊下面的" "連結。" #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "電子郵件地址" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "下列電子郵件已與你的帳號連結:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your email address has already been verified" msgid "Your email address is still pending verification:" msgstr "Je e-mail adres is al geverifieerd" #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "確認電子郵件" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "確認電子郵件" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "請確認%(email)s是否是使用者 " "%(user_display)s 的電子郵件地址。" #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "確認" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "這個社群網站帳號已經與另一個帳號連結過了。" #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "電子郵件確認連結已經過期或失效了,請點擊 以要求發" "送新的電子郵件確認信。" #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "登入" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "若你沒有帳號,請先\n" "註冊 。" #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "登出" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "您確定要登出嗎?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "您不能移除您的主要的電子郵件地址 (%(email)s) 。" #: templates/account/messages/email_confirmation_sent.txt:2 #, fuzzy, python-format msgid "Confirmation email sent to %(email)s." msgstr "確認信已發至 %(email)s 。" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "您以確認電子郵件地址 %(email)s 。 " #: templates/account/messages/email_deleted.txt:2 #, fuzzy, python-format msgid "Removed email address %(email)s." msgstr "電子郵件地址 %(email)s 已刪除。" #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "成功以 %(name)s..的身份登入。" #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "您已登出。" #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "密碼修改完成。" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "密碼設定完成。" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "已設定好主要的電子郵件地址。" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "您的主要電子郵件位址必須被驗證過。" #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "修改密碼" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "忘記密碼了?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "密碼重設" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "忘記您的密碼了嗎? 請在下方輸入您的電子郵件,我們會發送一封電子郵件給您,以便" "重新設定您的密碼。" #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "重設我的密碼" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "如果在重設密碼時碰到問題,請與我們聯絡。" #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "我們剛剛寄了一封電子郵件確認信給您,\n" "請點擊郵件中的連結。您在數分鐘內尚無法收到郵件,請與我們聯絡。" #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Bad Token" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "密碼重設連結已失效,可能是因為該連結已經被人用過了,請重新申請重設密碼。" #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "您的密碼已變更。" #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "設定密碼" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "確認電子郵件" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "註冊" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "註冊" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "已有帳號了嗎?請登入." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "註冊未開放" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "很抱歉,目前不開放註冊。" #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "注意" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "您已經以 %(user_display)s 的身份登入了。" #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "警告:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "您尚未設定任何電子郵件。建議您最好設定一個電子郵件,以便您接收通知或重新設定" "密碼等等。" #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "驗證您的電子郵件地址" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "我們剛剛寄了一封電子郵件確認信給您,請點擊郵件中的連結以完成註冊流程。若您在" "數分鐘內尚無法收到郵件,請與我們聯絡。" #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "此網站的這部分功能需要驗證您的身份,\n" "因此我們需要確認您的電子郵件地址。" #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "我們剛剛寄了一封電子郵件確認信給您,\n" "請點擊郵件中的連結。您在數分鐘內尚無法收到郵件,請與我們聯絡。" #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "注意: 您仍能修改您的電子郵件地址 " "." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "社群網路登入失敗" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "當嘗試用您的社群網路帳號登入時發生錯誤。" #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "帳號連結" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "您可以使用下列任何第三方帳號登入您的帳號:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "您目前沒有任何社群網路帳號與此帳號連結。" #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "增加一個第三方帳號" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "登入取消了" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "您決定不繼續登入這一個網站。若這是一個失誤,請由此" "重新登入。" #: templates/socialaccount/messages/account_connected.txt:2 #, fuzzy msgid "The social account has been connected." msgstr "社群網站帳號已連結。" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "這個社群網站帳號已經與另一個帳號連結過了。" #: templates/socialaccount/messages/account_disconnected.txt:2 #, fuzzy msgid "The social account has been disconnected." msgstr "社群網站帳號已斷開連結。" #: templates/socialaccount/signup.html:12 #, fuzzy, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "您將使用 %(provider_name)s 這個帳號登入\n" " %(site_name)s 這個網站。最後一步,請填完下列表單:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, fuzzy, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "請用您的第三方帳號登入。\n" #~ "或者註冊 \n" #~ "一個 %(site_name)s帳號後登入:" #~ msgid "or" #~ msgstr "或" #~ msgid "change password" #~ msgstr "修改密碼" #~ msgid "OpenID Sign In" #~ msgstr "OpenID 登入" #~ msgid "This email address is already associated with another account." #~ msgstr "此電子郵件已經與別的帳號連結了。" #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "我們已經寄了一封電子郵件給您,如果數分鐘內您沒有收到,請與我們聯絡。" #~ msgid "Account" #~ msgstr "帳號" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "您提供的帳號或密碼不正確。" #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "使用者名稱只能包含字母,數字及 @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "這個使用者名稱已經有人用了,請換一個。" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "登入" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "您以確認%(email)s是使用者%(user_display)s" #~ "的電子郵件地址。" #~ msgid "Thanks for using our site!" #~ msgstr "感謝您使用我們的網站!" #~ msgid "Confirmation email sent to %(email)s" #~ msgstr "确认e-mail已发往 %(email)s" #~ msgid "Delete Password" #~ msgstr "删除密码" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "您当前使用OpenID登录,因此您可以删除你的密码。" #~ msgid "delete my password" #~ msgstr "删除我的密码" #~ msgid "Password Deleted" #~ msgstr "密码已删除" #~ msgid "Your password has been deleted." #~ msgstr "您的密码已被删除。" #~ msgid "" #~ "If you have any trouble resetting your password, contact us at %(CONTACT_EMAIL)s." #~ msgstr "" #~ "Als je problemen hebt je wachtwoord opnieuw in te stellen, neem dan " #~ "contact op met %(CONTACT_EMAIL)s." #~ msgid "Invalid confirmation key." #~ msgstr "Ongeldige bevestigingssleutel." #~ msgid "OpenID" #~ msgstr "OpenID" #~ msgid "Already have an account?" #~ msgstr "Heb je al een account?" #~ msgid "Sign in" #~ msgstr "Aanmelden" #~ msgid "Language" #~ msgstr "Taal" #~ msgid "Pinax can be used in your preferred language." #~ msgstr "Deze site kan in jouw voorkeurstaal gebruikt worden." #~ msgid "Change my language" #~ msgstr "Verander mijn taal" #~ msgid "Timezone" #~ msgstr "Tijdzone" #, fuzzy #~ msgid "" #~ "You're receiving this e-mail because you requested a password reset\n" #~ "for your user account at Pinax.\n" #~ "\n" #~ "Your new password is: %(new_password)s\n" #~ "\n" #~ "Your username, in case you've forgotten: %(username)s\n" #~ "\n" #~ "You should log in as soon as possible and change your password.\n" #~ "\n" #~ "Thanks for using our site!\n" #~ msgstr "" #~ "Je ontvangt deze mail omdat er een verzoek is ingelegd om het wachtwoord\n" #~ "behorende bij je %(site_name)s account opnieuw in te stellen.\n" #~ "\n" #~ "Je nieuwe wachtwoord is: %(new_password)s\n" #~ "\n" #~ "Je gebruikersnaam, voor het geval je die vergeten bent, is: %(username)s\n" #~ "\n" #~ "Je moet zo snel mogelijk inloggen en bovenstaand wachtwoord veranderen.\n" #~ "\n" #~ "Bedankt voor het gebruik van onze site!\n" #~ msgid "If checked you will stay logged in for 3 weeks" #~ msgstr "Bij 'Onthouden' blijf je ingelogd gedurende 3 weken" #~ msgid "Timezone successfully updated." #~ msgstr "Tijdzone gewijzigd." #~ msgid "Language successfully updated." #~ msgstr "Taal gewijzigd." #~ msgid "None" #~ msgstr "Geen" #~ msgid "add" #~ msgstr "Voeg toe" #~ msgid "Log In" #~ msgstr "Inloggen" #~ msgid "Log in" #~ msgstr "Inloggen" #~ msgid "Logout" #~ msgstr "Afmelden" #~ msgid "" #~ "When you receive the new password, you should log in and change it as soon as possible." #~ msgstr "" #~ "Zodra je het nieuwe wachtwoord ontvangen hebt moet je zo snel mogelijk inloggen en het wachtwoord wijzigen." #~ msgid "You are already logged in." #~ msgstr "Je bent al ingelogd." #~ msgid "" #~ "By clicking \"Sign Up\", you are indicating that you have read and agree " #~ "to the Terms of Use and Privacy Policy." #~ msgstr "" #~ "Door te registreren geef je aan dat je de gebruiksvoorwaarden en de privacy " #~ "policy gelezen hebt en ermee akkoord gaat." #~ msgid "" #~ "If you have any trouble creating your account, contact us at %(contact_email)s." #~ msgstr "" #~ "Als je problemen hebt om een account aan te maken, neem dan contact op " #~ "met %(contact_email)s." #~ msgid "Log in »" #~ msgstr "Inloggen" django-allauth-0.58.2/allauth/locale/zh_TW/000077500000000000000000000000001452212273200204245ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/zh_TW/LC_MESSAGES/000077500000000000000000000000001452212273200222115ustar00rootroot00000000000000django-allauth-0.58.2/allauth/locale/zh_TW/LC_MESSAGES/django.po000066400000000000000000001157761452212273200240340ustar00rootroot00000000000000# Copyright (C) 2014 # This file is distributed under the same license as the django-allauth package. # Kirby Wu , 2014 # msgid "" msgstr "" "Project-Id-Version: django-allauth\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-11-03 04:26-0500\n" "PO-Revision-Date: 2014-08-12 00:36+0200\n" "Last-Translator: jresins \n" "Language-Team: Chinese (Traditional)\n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: account/adapter.py:51 msgid "Username can not be used. Please use other username." msgstr "無法使用此使用者名稱,請使用其他名稱。" #: account/adapter.py:57 msgid "Too many failed login attempts. Try again later." msgstr "" #: account/adapter.py:59 msgid "A user is already registered with this email address." msgstr "已經有人使用這一個電子郵件註冊了。" #: account/adapter.py:60 #, fuzzy #| msgid "Current Password" msgid "Incorrect password." msgstr "目前密碼" #: account/adapter.py:340 #, python-brace-format msgid "Password must be a minimum of {0} characters." msgstr "密碼長度至少要有 {0} 個字元。" #: account/apps.py:9 msgid "Accounts" msgstr "帳號" #: account/forms.py:61 account/forms.py:445 msgid "You must type the same password each time." msgstr "每次輸入的密碼必須相同" #: account/forms.py:93 account/forms.py:408 account/forms.py:547 #: account/forms.py:685 msgid "Password" msgstr "密碼" #: account/forms.py:94 msgid "Remember Me" msgstr "記住我" #: account/forms.py:98 msgid "This account is currently inactive." msgstr "此帳號目前沒有啟用。" #: account/forms.py:100 msgid "The email address and/or password you specified are not correct." msgstr "您提供的電子郵件地址或密碼不正確。" #: account/forms.py:103 msgid "The username and/or password you specified are not correct." msgstr "您提供的使用者名稱或密碼不正確。" #: account/forms.py:114 account/forms.py:283 account/forms.py:472 #: account/forms.py:567 msgid "Email address" msgstr "電子郵件地址" #: account/forms.py:118 account/forms.py:321 account/forms.py:469 #: account/forms.py:562 msgid "Email" msgstr "E-mail" #: account/forms.py:121 account/forms.py:124 account/forms.py:273 #: account/forms.py:276 msgid "Username" msgstr "使用者名稱" #: account/forms.py:134 msgid "Username or email" msgstr "使用者名稱或電子郵件" #: account/forms.py:137 msgctxt "field label" msgid "Login" msgstr "登入" #: account/forms.py:148 #, fuzzy #| msgid "Forgot Password?" msgid "Forgot your password?" msgstr "忘記密碼了?" #: account/forms.py:312 #, fuzzy #| msgid "Email (optional)" msgid "Email (again)" msgstr "E-mail (可不填)" #: account/forms.py:316 #, fuzzy #| msgid "email confirmation" msgid "Email address confirmation" msgstr "電子郵件確認" #: account/forms.py:324 msgid "Email (optional)" msgstr "E-mail (可不填)" #: account/forms.py:379 #, fuzzy #| msgid "You must type the same password each time." msgid "You must type the same email each time." msgstr "每次輸入的密碼必須相同" #: account/forms.py:414 account/forms.py:550 msgid "Password (again)" msgstr "密碼 (再一次)" #: account/forms.py:484 msgid "This email address is already associated with this account." msgstr "此電子郵件已與這個帳號連結了。" #: account/forms.py:486 #, fuzzy, python-format #| msgid "Your account has no verified email address." msgid "You cannot add more than %d email addresses." msgstr "您的帳號下沒有驗證過的電子郵件地址。" #: account/forms.py:524 msgid "Current Password" msgstr "目前密碼" #: account/forms.py:527 account/forms.py:634 msgid "New Password" msgstr "新密碼" #: account/forms.py:530 account/forms.py:635 msgid "New Password (again)" msgstr "新密碼 (再一次)" #: account/forms.py:538 msgid "Please type your current password." msgstr "請輸入您目前的密碼" #: account/forms.py:579 msgid "The email address is not assigned to any user account" msgstr "還沒有其他帳號使用這個電子郵件地址" #: account/forms.py:655 msgid "The password reset token was invalid." msgstr "" #: account/models.py:21 msgid "user" msgstr "使用者" #: account/models.py:26 account/models.py:34 account/models.py:138 msgid "email address" msgstr "電子郵件地址" #: account/models.py:28 msgid "verified" msgstr "已驗證" #: account/models.py:29 msgid "primary" msgstr "主要的" #: account/models.py:35 msgid "email addresses" msgstr "電子郵件地址" #: account/models.py:141 msgid "created" msgstr "以建立" #: account/models.py:142 msgid "sent" msgstr "已送出" #: account/models.py:143 socialaccount/models.py:65 msgid "key" msgstr "key" #: account/models.py:148 msgid "email confirmation" msgstr "電子郵件確認" #: account/models.py:149 msgid "email confirmations" msgstr "電子郵件確認" #: mfa/adapter.py:19 msgid "" "You cannot activate two-factor authentication until you have verified your " "email address." msgstr "" #: mfa/adapter.py:22 msgid "" "You cannot add an email address to an account protected by two-factor " "authentication." msgstr "" #: mfa/adapter.py:24 msgid "Incorrect code." msgstr "" #: mfa/apps.py:7 msgid "MFA" msgstr "" #: mfa/forms.py:15 mfa/forms.py:17 msgid "Code" msgstr "" #: mfa/forms.py:48 msgid "Authenticator code" msgstr "" #: mfa/models.py:15 msgid "Recovery codes" msgstr "" #: mfa/models.py:16 msgid "TOTP Authenticator" msgstr "" #: socialaccount/adapter.py:32 #, fuzzy, python-format #| msgid "" #| "An account already exists with this e-mail address. Please sign in to " #| "that account first, then connect your %s account." msgid "" "An account already exists with this email address. Please sign in to that " "account first, then connect your %s account." msgstr "" "已經有一個帳號與此電子郵件連結了,請先登入該帳號,然後連接你的 %s 帳號。" #: socialaccount/adapter.py:138 msgid "Your account has no password set up." msgstr "您的帳號沒有設置密碼。" #: socialaccount/adapter.py:145 msgid "Your account has no verified email address." msgstr "您的帳號下沒有驗證過的電子郵件地址。" #: socialaccount/apps.py:7 msgid "Social Accounts" msgstr "社群帳號" #: socialaccount/models.py:39 socialaccount/models.py:93 msgid "provider" msgstr "提供者" #: socialaccount/models.py:48 #, fuzzy #| msgid "provider" msgid "provider ID" msgstr "提供者" #: socialaccount/models.py:52 msgid "name" msgstr "名稱" #: socialaccount/models.py:54 msgid "client id" msgstr "client id" #: socialaccount/models.py:56 msgid "App ID, or consumer key" msgstr "App ID, or consumer key" #: socialaccount/models.py:59 msgid "secret key" msgstr "secret key" #: socialaccount/models.py:62 msgid "API secret, client secret, or consumer secret" msgstr "API secret, client secret, or consumer secret" #: socialaccount/models.py:65 msgid "Key" msgstr "Key" #: socialaccount/models.py:77 msgid "social application" msgstr "社群應用程式" #: socialaccount/models.py:78 msgid "social applications" msgstr "社群應用程式" #: socialaccount/models.py:113 msgid "uid" msgstr "uid" #: socialaccount/models.py:115 msgid "last login" msgstr "最後一次登入" #: socialaccount/models.py:116 msgid "date joined" msgstr "加入日期" #: socialaccount/models.py:117 msgid "extra data" msgstr "額外資料" #: socialaccount/models.py:121 msgid "social account" msgstr "社群帳號" #: socialaccount/models.py:122 msgid "social accounts" msgstr "社群帳號" #: socialaccount/models.py:156 msgid "token" msgstr "" #: socialaccount/models.py:157 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)" msgstr "" #: socialaccount/models.py:161 msgid "token secret" msgstr "" #: socialaccount/models.py:162 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)" msgstr "" #: socialaccount/models.py:165 msgid "expires at" msgstr "過期日" #: socialaccount/models.py:170 msgid "social application token" msgstr "社群應用程式 Token" #: socialaccount/models.py:171 msgid "social application tokens" msgstr "社群應用程式 Token" #: socialaccount/providers/douban/views.py:36 msgid "Invalid profile data" msgstr "" #: socialaccount/providers/oauth/client.py:85 #, fuzzy, python-format #| msgid "Invalid response while obtaining request token from \"%s\"." msgid "" "Invalid response while obtaining request token from \"%s\". Response was: %s." msgstr "Invalid response while obtaining request token from \"%s\"." #: socialaccount/providers/oauth/client.py:119 #: socialaccount/providers/pocket/client.py:78 #, python-format msgid "Invalid response while obtaining access token from \"%s\"." msgstr "Invalid response while obtaining access token from \"%s\"." #: socialaccount/providers/oauth/client.py:140 #, python-format msgid "No request token saved for \"%s\"." msgstr "No request token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:191 #, python-format msgid "No access token saved for \"%s\"." msgstr "No access token saved for \"%s\"." #: socialaccount/providers/oauth/client.py:212 #, python-format msgid "No access to private resources at \"%s\"." msgstr "無權訪問私有資源 \"%s\"。" #: socialaccount/providers/pocket/client.py:37 #, python-format msgid "Invalid response while obtaining request token from \"%s\"." msgstr "Invalid response while obtaining request token from \"%s\"." #: templates/account/account_inactive.html:5 #: templates/account/account_inactive.html:9 msgid "Account Inactive" msgstr "帳號未啟用" #: templates/account/account_inactive.html:11 msgid "This account is inactive." msgstr "這個帳號未啟用" #: templates/account/email.html:4 templates/account/email.html:8 msgid "Email Addresses" msgstr "電子郵件地址" #: templates/account/email.html:11 msgid "The following email addresses are associated with your account:" msgstr "下列電子郵件已與你的帳號連結:" #: templates/account/email.html:23 msgid "Verified" msgstr "已驗證" #: templates/account/email.html:27 msgid "Unverified" msgstr "未驗證" #: templates/account/email.html:32 msgid "Primary" msgstr "主要的" #: templates/account/email.html:42 msgid "Make Primary" msgstr "設為主要的" #: templates/account/email.html:45 templates/account/email_change.html:29 msgid "Re-send Verification" msgstr "重寄驗証信" #: templates/account/email.html:48 templates/socialaccount/connections.html:40 msgid "Remove" msgstr "移除" #: templates/account/email.html:57 msgid "Add Email Address" msgstr "增加電子郵件" #: templates/account/email.html:70 msgid "Add Email" msgstr "增加電子郵件" #: templates/account/email.html:79 msgid "Do you really want to remove the selected email address?" msgstr "您真的要移除所選擇電子郵件嗎?" #: templates/account/email/account_already_exists_message.txt:4 #, python-format msgid "" "You are receiving this email because you or someone else tried to signup for " "an\n" "account using email address:\n" "\n" "%(email)s\n" "\n" "However, an account using that email address already exists. In case you " "have\n" "forgotten about this, please use the password forgotten procedure to " "recover\n" "your account:\n" "\n" "%(password_reset_url)s" msgstr "" #: templates/account/email/account_already_exists_subject.txt:3 msgid "Account Already Exists" msgstr "" #: templates/account/email/base_message.txt:1 #, python-format msgid "Hello from %(site_name)s!" msgstr "" #: templates/account/email/base_message.txt:5 #, python-format msgid "" "Thank you for using %(site_name)s!\n" "%(site_domain)s" msgstr "" #: templates/account/email/email_confirmation_message.txt:5 #, fuzzy, python-format #| msgid "" #| "User %(user_display)s at %(site_name)s has given this as an email " #| "address.\n" #| "\n" #| "To confirm this is correct, go to %(activate_url)s\n" msgid "" "You're receiving this email because user %(user_display)s has given your " "email address to register an account on %(site_domain)s.\n" "\n" "To confirm this is correct, go to %(activate_url)s" msgstr "" "網站%(site_name)s上的使用者%(user_display)s將此設為他的電子郵件地址。\n" "\n" "為了確認這是正確的,請開啟這個連結: %(activate_url)s\n" #: templates/account/email/email_confirmation_subject.txt:3 #, fuzzy #| msgid "Confirm Email Address" msgid "Please Confirm Your Email Address" msgstr "確認電子郵件" #: templates/account/email/password_reset_key_message.txt:4 #, fuzzy #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You're receiving this email because you or someone else has requested a " "password reset for your user account.\n" "It can be safely ignored if you did not request a password reset. Click the " "link below to reset your password." msgstr "" "您會收到這封信是因為您或是某人在 %(site_domain)s 這個網站上要求重設您帳號的密" "碼。\n" "若您沒有要求我們重設密碼,請您直接忽略這封信。若要重設您的密碼,請點擊下面的" "連結。" #: templates/account/email/password_reset_key_message.txt:9 #, python-format msgid "In case you forgot, your username is %(username)s." msgstr "提醒您,您的使用者名稱是 %(username)s 。" #: templates/account/email/password_reset_key_subject.txt:3 #: templates/account/email/unknown_account_subject.txt:3 msgid "Password Reset Email" msgstr "密碼重設電子郵件" #: templates/account/email/unknown_account_message.txt:4 #, fuzzy, python-format #| msgid "" #| "You're receiving this e-mail because you or someone else has requested a " #| "password for your user account at %(site_domain)s.\n" #| "It can be safely ignored if you did not request a password reset. Click " #| "the link below to reset your password." msgid "" "You are receiving this email because you or someone else has requested a\n" "password for your user account. However, we do not have any record of a " "user\n" "with email %(email)s in our database.\n" "\n" "This mail can be safely ignored if you did not request a password reset.\n" "\n" "If it was you, you can sign up for an account using the link below." msgstr "" "您會收到這封信是因為您或是某人在 %(site_domain)s 這個網站上要求重設您帳號的密" "碼。\n" "若您沒有要求我們重設密碼,請您直接忽略這封信。若要重設您的密碼,請點擊下面的" "連結。" #: templates/account/email_change.html:5 templates/account/email_change.html:9 #, fuzzy #| msgid "Email Addresses" msgid "Email Address" msgstr "電子郵件地址" #: templates/account/email_change.html:14 #, fuzzy #| msgid "The following email addresses are associated with your account:" msgid "The following email address is associated with your account:" msgstr "下列電子郵件已與你的帳號連結:" #: templates/account/email_change.html:19 #, fuzzy #| msgid "Your email address has already been verified" msgid "Your email address is still pending verification:" msgstr "Je e-mail adres is al geverifieerd" #: templates/account/email_change.html:38 #, fuzzy #| msgid "Confirm Email Address" msgid "Change Email Address" msgstr "確認電子郵件" #: templates/account/email_change.html:49 #: templates/allauth/layouts/base.html:29 #, fuzzy #| msgid "Email" msgid "Change Email" msgstr "E-mail" #: templates/account/email_confirm.html:6 #: templates/account/email_confirm.html:10 msgid "Confirm Email Address" msgstr "確認電子郵件" #: templates/account/email_confirm.html:16 #, fuzzy, python-format #| msgid "" #| "Please confirm that %(email)s is an e-" #| "mail address for user %(user_display)s." msgid "" "Please confirm that %(email)s is an email " "address for user %(user_display)s." msgstr "" "請確認%(email)s是否是使用者 " "%(user_display)s 的電子郵件地址。" #: templates/account/email_confirm.html:23 #: templates/account/reauthenticate.html:28 msgid "Confirm" msgstr "確認" #: templates/account/email_confirm.html:29 #: templates/account/messages/email_confirmation_failed.txt:2 #, fuzzy, python-format #| msgid "The social account is already connected to a different account." msgid "" "Unable to confirm %(email)s because it is already confirmed by a different " "account." msgstr "這個社群網站帳號已經與另一個帳號連結過了。" #: templates/account/email_confirm.html:35 #, fuzzy, python-format #| msgid "" #| "This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request." msgid "" "This email confirmation link expired or is invalid. Please issue a new email confirmation request." msgstr "" "電子郵件確認連結已經過期或失效了,請點擊 以要求發" "送新的電子郵件確認信。" #: templates/account/login.html:5 templates/account/login.html:9 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36 #: templates/mfa/authenticate.html:5 templates/mfa/authenticate.html:23 #: templates/openid/login.html:5 templates/openid/login.html:9 #: templates/openid/login.html:20 templates/socialaccount/login.html:5 msgid "Sign In" msgstr "登入" #: templates/account/login.html:12 #, fuzzy, python-format #| msgid "" #| "If you have not created an account yet, then please\n" #| "sign up first." msgid "" "If you have not created an account yet, then please\n" " sign up first." msgstr "" "若你沒有帳號,請先\n" "註冊 。" #: templates/account/logout.html:4 templates/account/logout.html:8 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32 msgid "Sign Out" msgstr "登出" #: templates/account/logout.html:10 msgid "Are you sure you want to sign out?" msgstr "您確定要登出嗎?" #: templates/account/messages/cannot_delete_primary_email.txt:2 #, python-format msgid "You cannot remove your primary email address (%(email)s)." msgstr "您不能移除您的主要的電子郵件地址 (%(email)s) 。" #: templates/account/messages/email_confirmation_sent.txt:2 #, fuzzy, python-format msgid "Confirmation email sent to %(email)s." msgstr "確認信已發至 %(email)s 。" #: templates/account/messages/email_confirmed.txt:2 #, python-format msgid "You have confirmed %(email)s." msgstr "您以確認電子郵件地址 %(email)s 。 " #: templates/account/messages/email_deleted.txt:2 #, fuzzy, python-format msgid "Removed email address %(email)s." msgstr "電子郵件地址 %(email)s 已刪除。" #: templates/account/messages/logged_in.txt:4 #, python-format msgid "Successfully signed in as %(name)s." msgstr "成功以 %(name)s..的身份登入。" #: templates/account/messages/logged_out.txt:2 msgid "You have signed out." msgstr "您已登出。" #: templates/account/messages/password_changed.txt:2 msgid "Password successfully changed." msgstr "密碼修改完成。" #: templates/account/messages/password_set.txt:2 msgid "Password successfully set." msgstr "密碼設定完成。" #: templates/account/messages/primary_email_set.txt:2 msgid "Primary email address set." msgstr "已設定好主要的電子郵件地址。" #: templates/account/messages/unverified_primary_email.txt:2 msgid "Your primary email address must be verified." msgstr "您的主要電子郵件位址必須被驗證過。" #: templates/account/password_change.html:4 #: templates/account/password_change.html:8 #: templates/account/password_change.html:19 #: templates/account/password_reset_from_key.html:5 #: templates/account/password_reset_from_key.html:12 #: templates/account/password_reset_from_key.html:29 #: templates/account/password_reset_from_key_done.html:5 #: templates/account/password_reset_from_key_done.html:9 msgid "Change Password" msgstr "修改密碼" #: templates/account/password_change.html:21 msgid "Forgot Password?" msgstr "忘記密碼了?" #: templates/account/password_reset.html:4 #: templates/account/password_reset.html:8 #: templates/account/password_reset_done.html:6 #: templates/account/password_reset_done.html:10 msgid "Password Reset" msgstr "密碼重設" #: templates/account/password_reset.html:14 #, fuzzy #| msgid "" #| "Forgotten your password? Enter your e-mail address below, and we'll send " #| "you an e-mail allowing you to reset it." msgid "" "Forgotten your password? Enter your email address below, and we'll send you " "an email allowing you to reset it." msgstr "" "忘記您的密碼了嗎? 請在下方輸入您的電子郵件,我們會發送一封電子郵件給您,以便" "重新設定您的密碼。" #: templates/account/password_reset.html:25 msgid "Reset My Password" msgstr "重設我的密碼" #: templates/account/password_reset.html:29 msgid "Please contact us if you have any trouble resetting your password." msgstr "如果在重設密碼時碰到問題,請與我們聯絡。" #: templates/account/password_reset_done.html:16 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent you an email. If you have not received it please check your " "spam folder. Otherwise contact us if you do not receive it in a few minutes." msgstr "" "我們剛剛寄了一封電子郵件確認信給您,\n" "請點擊郵件中的連結。您在數分鐘內尚無法收到郵件,請與我們聯絡。" #: templates/account/password_reset_from_key.html:10 msgid "Bad Token" msgstr "Bad Token" #: templates/account/password_reset_from_key.html:18 #, python-format msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" "密碼重設連結已失效,可能是因為該連結已經被人用過了,請重新申請重設密碼。" #: templates/account/password_reset_from_key_done.html:11 msgid "Your password is now changed." msgstr "您的密碼已變更。" #: templates/account/password_set.html:5 templates/account/password_set.html:9 #: templates/account/password_set.html:20 msgid "Set Password" msgstr "設定密碼" #: templates/account/reauthenticate.html:5 #: templates/account/reauthenticate.html:9 #, fuzzy #| msgid "Confirm Email Address" msgid "Confirm Access" msgstr "確認電子郵件" #: templates/account/reauthenticate.html:12 msgid "To safeguard the security of your account, please enter your password:" msgstr "" #: templates/account/signup.html:4 templates/socialaccount/signup.html:5 msgid "Signup" msgstr "註冊" #: templates/account/signup.html:8 templates/account/signup.html:27 #: templates/allauth/layouts/base.html:39 templates/socialaccount/signup.html:9 #: templates/socialaccount/signup.html:29 msgid "Sign Up" msgstr "註冊" #: templates/account/signup.html:11 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "已有帳號了嗎?請登入." #: templates/account/signup_closed.html:5 #: templates/account/signup_closed.html:9 msgid "Sign Up Closed" msgstr "註冊未開放" #: templates/account/signup_closed.html:11 msgid "We are sorry, but the sign up is currently closed." msgstr "很抱歉,目前不開放註冊。" #: templates/account/snippets/already_logged_in.html:7 msgid "Note" msgstr "注意" #: templates/account/snippets/already_logged_in.html:7 #, fuzzy, python-format #| msgid "you are already logged in as %(user_display)s." msgid "You are already logged in as %(user_display)s." msgstr "您已經以 %(user_display)s 的身份登入了。" #: templates/account/snippets/warn_no_email.html:3 msgid "Warning:" msgstr "警告:" #: templates/account/snippets/warn_no_email.html:3 #, fuzzy #| msgid "" #| "You currently do not have any e-mail address set up. You should really " #| "add an e-mail address so you can receive notifications, reset your " #| "password, etc." msgid "" "You currently do not have any email address set up. You should really add an " "email address so you can receive notifications, reset your password, etc." msgstr "" "您尚未設定任何電子郵件。建議您最好設定一個電子郵件,以便您接收通知或重新設定" "密碼等等。" #: templates/account/verification_sent.html:5 #: templates/account/verification_sent.html:9 #: templates/account/verified_email_required.html:5 #: templates/account/verified_email_required.html:9 msgid "Verify Your Email Address" msgstr "驗證您的電子郵件地址" #: templates/account/verification_sent.html:12 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for verification. Follow the link provided " #| "to finalize the signup process. Please contact us if you do not receive " #| "it within a few minutes." msgid "" "We have sent an email to you for verification. Follow the link provided to " "finalize the signup process. If you do not see the verification email in " "your main inbox, check your spam folder. Please contact us if you do not " "receive the verification email within a few minutes." msgstr "" "我們剛剛寄了一封電子郵件確認信給您,請點擊郵件中的連結以完成註冊流程。若您在" "數分鐘內尚無法收到郵件,請與我們聯絡。" #: templates/account/verified_email_required.html:13 #, fuzzy #| msgid "" #| "This part of the site requires us to verify that\n" #| "you are who you claim to be. For this purpose, we require that you\n" #| "verify ownership of your e-mail address. " msgid "" "This part of the site requires us to verify that\n" "you are who you claim to be. For this purpose, we require that you\n" "verify ownership of your email address. " msgstr "" "此網站的這部分功能需要驗證您的身份,\n" "因此我們需要確認您的電子郵件地址。" #: templates/account/verified_email_required.html:18 #, fuzzy #| msgid "" #| "We have sent an e-mail to you for\n" #| "verification. Please click on the link inside this e-mail. Please\n" #| "contact us if you do not receive it within a few minutes." msgid "" "We have sent an email to you for\n" "verification. Please click on the link inside that email. If you do not see " "the verification email in your main inbox, check your spam folder. " "Otherwise\n" "contact us if you do not receive it within a few minutes." msgstr "" "我們剛剛寄了一封電子郵件確認信給您,\n" "請點擊郵件中的連結。您在數分鐘內尚無法收到郵件,請與我們聯絡。" #: templates/account/verified_email_required.html:23 #, fuzzy, python-format #| msgid "" #| "Note: you can still change " #| "your e-mail address." msgid "" "Note: you can still change your " "email address." msgstr "" "注意: 您仍能修改您的電子郵件地址 " "." #: templates/allauth/layouts/base.html:18 msgid "Messages:" msgstr "" #: templates/allauth/layouts/base.html:25 msgid "Menu:" msgstr "" #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5 #: templates/mfa/index.html:9 msgid "Two-Factor Authentication" msgstr "" #: templates/mfa/authenticate.html:12 msgid "" "Your account is protected by two-factor authentication. Please enter an " "authenticator code:" msgstr "" #: templates/mfa/index.html:13 templates/mfa/totp/base.html:4 msgid "Authenticator App" msgstr "" #: templates/mfa/index.html:17 msgid "Authentication using an authenticator app is active." msgstr "" #: templates/mfa/index.html:19 msgid "An authenticator app is not active." msgstr "" #: templates/mfa/index.html:27 templates/mfa/totp/deactivate_form.html:24 msgid "Deactivate" msgstr "" #: templates/mfa/index.html:31 templates/mfa/totp/activate_form.html:32 msgid "Activate" msgstr "" #: templates/mfa/index.html:39 templates/mfa/recovery_codes/base.html:4 #: templates/mfa/recovery_codes/generate.html:6 #: templates/mfa/recovery_codes/index.html:6 msgid "Recovery Codes" msgstr "" #: templates/mfa/index.html:44 templates/mfa/recovery_codes/index.html:9 #, python-format msgid "" "There is %(unused_count)s out of %(total_count)s recovery codes available." msgid_plural "" "There are %(unused_count)s out of %(total_count)s recovery codes available." msgstr[0] "" msgstr[1] "" #: templates/mfa/index.html:47 msgid "No recovery codes set up." msgstr "" #: templates/mfa/index.html:56 msgid "View" msgstr "" #: templates/mfa/index.html:62 msgid "Download" msgstr "" #: templates/mfa/index.html:70 templates/mfa/recovery_codes/generate.html:29 msgid "Generate" msgstr "" #: templates/mfa/messages/recovery_codes_generated.txt:2 msgid "A new set of recovery codes has been generated." msgstr "" #: templates/mfa/messages/totp_activated.txt:2 msgid "Authenticator app activated." msgstr "" #: templates/mfa/messages/totp_deactivated.txt:2 msgid "Authenticator app deactivated." msgstr "" #: templates/mfa/recovery_codes/generate.html:9 msgid "You are about to generate a new set of recovery codes for your account." msgstr "" #: templates/mfa/recovery_codes/generate.html:11 msgid "This action will invalidate your existing codes." msgstr "" #: templates/mfa/recovery_codes/generate.html:13 msgid "Are you sure?" msgstr "" #: templates/mfa/recovery_codes/index.html:13 msgid "Unused codes" msgstr "" #: templates/mfa/recovery_codes/index.html:25 msgid "Download codes" msgstr "" #: templates/mfa/recovery_codes/index.html:30 msgid "Generate new codes" msgstr "" #: templates/mfa/totp/activate_form.html:4 #: templates/mfa/totp/activate_form.html:8 msgid "Activate Authenticator App" msgstr "" #: templates/mfa/totp/activate_form.html:11 msgid "" "To protect your account with two-factor authentication, scan the QR code " "below with your authenticator app. Then, input the verification code " "generated by the app below." msgstr "" #: templates/mfa/totp/activate_form.html:21 msgid "Authenticator secret" msgstr "" #: templates/mfa/totp/activate_form.html:24 msgid "" "You can store this secret and use it to reinstall your authenticator app at " "a later time." msgstr "" #: templates/mfa/totp/deactivate_form.html:5 #: templates/mfa/totp/deactivate_form.html:9 msgid "Deactivate Authenticator App" msgstr "" #: templates/mfa/totp/deactivate_form.html:12 msgid "" "You are about to deactivate authenticator app based authentication. Are you " "sure?" msgstr "" #: templates/socialaccount/authentication_error.html:5 #: templates/socialaccount/authentication_error.html:9 msgid "Social Network Login Failure" msgstr "社群網路登入失敗" #: templates/socialaccount/authentication_error.html:11 msgid "" "An error occurred while attempting to login via your social network account." msgstr "當嘗試用您的社群網路帳號登入時發生錯誤。" #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:9 msgid "Account Connections" msgstr "帳號連結" #: templates/socialaccount/connections.html:13 #, fuzzy #| msgid "" #| "You can sign in to your account using any of the following third party " #| "accounts:" msgid "" "You can sign in to your account using any of the following third-party " "accounts:" msgstr "您可以使用下列任何第三方帳號登入您的帳號:" #: templates/socialaccount/connections.html:45 msgid "" "You currently have no social network accounts connected to this account." msgstr "您目前沒有任何社群網路帳號與此帳號連結。" #: templates/socialaccount/connections.html:48 #, fuzzy #| msgid "Add a 3rd Party Account" msgid "Add a Third-Party Account" msgstr "增加一個第三方帳號" #: templates/socialaccount/login.html:10 #, python-format msgid "Connect %(provider)s" msgstr "" #: templates/socialaccount/login.html:13 #, python-format msgid "You are about to connect a new third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:17 #, python-format msgid "Sign In Via %(provider)s" msgstr "" #: templates/socialaccount/login.html:20 #, python-format msgid "You are about to sign in using a third-party account from %(provider)s." msgstr "" #: templates/socialaccount/login.html:27 msgid "Continue" msgstr "" #: templates/socialaccount/login_cancelled.html:5 #: templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "登入取消了" #: templates/socialaccount/login_cancelled.html:13 #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " "accounts. If this was a mistake, please proceed to sign in." msgstr "" "您決定不繼續登入這一個網站。若這是一個失誤,請由此" "重新登入。" #: templates/socialaccount/messages/account_connected.txt:2 #, fuzzy msgid "The social account has been connected." msgstr "社群網站帳號已連結。" #: templates/socialaccount/messages/account_connected_other.txt:2 msgid "The social account is already connected to a different account." msgstr "這個社群網站帳號已經與另一個帳號連結過了。" #: templates/socialaccount/messages/account_disconnected.txt:2 #, fuzzy msgid "The social account has been disconnected." msgstr "社群網站帳號已斷開連結。" #: templates/socialaccount/signup.html:12 #, fuzzy, python-format msgid "" "You are about to use your %(provider_name)s account to login to\n" "%(site_name)s. As a final step, please complete the following form:" msgstr "" "您將使用 %(provider_name)s 這個帳號登入\n" " %(site_name)s 這個網站。最後一步,請填完下列表單:" #: templates/socialaccount/snippets/login.html:8 msgid "Or use a third-party" msgstr "" #, fuzzy, python-format #~ msgid "" #~ "Please sign in with one\n" #~ "of your existing third party accounts. Or, sign up\n" #~ "for a %(site_name)s account and sign in below:" #~ msgstr "" #~ "請用您的第三方帳號登入。\n" #~ "或者註冊 \n" #~ "一個 %(site_name)s帳號後登入:" #~ msgid "or" #~ msgstr "或" #~ msgid "change password" #~ msgstr "修改密碼" #~ msgid "OpenID Sign In" #~ msgstr "OpenID 登入" #~ msgid "This email address is already associated with another account." #~ msgstr "此電子郵件已經與別的帳號連結了。" #~ msgid "" #~ "We have sent you an e-mail. Please contact us if you do not receive it " #~ "within a few minutes." #~ msgstr "" #~ "我們已經寄了一封電子郵件給您,如果數分鐘內您沒有收到,請與我們聯絡。" #~ msgid "Account" #~ msgstr "帳號" #~ msgid "The login and/or password you specified are not correct." #~ msgstr "您提供的帳號或密碼不正確。" #~ msgid "Usernames can only contain letters, digits and @/./+/-/_." #~ msgstr "使用者名稱只能包含字母,數字及 @/./+/-/_." #~ msgid "This username is already taken. Please choose another." #~ msgstr "這個使用者名稱已經有人用了,請換一個。" #, fuzzy #~| msgid "Sign In" #~ msgid "Shopify Sign In" #~ msgstr "登入" #~ msgid "" #~ "You have confirmed that %(email)s is an " #~ "e-mail address for user %(user_display)s." #~ msgstr "" #~ "您以確認%(email)s是使用者%(user_display)s" #~ "的電子郵件地址。" #~ msgid "Thanks for using our site!" #~ msgstr "感謝您使用我們的網站!" #~ msgid "Confirmation email sent to %(email)s" #~ msgstr "确认e-mail已发往 %(email)s" #~ msgid "Delete Password" #~ msgstr "删除密码" #~ msgid "" #~ "You may delete your password since you are currently logged in using " #~ "OpenID." #~ msgstr "您当前使用OpenID登录,因此您可以删除你的密码。" #~ msgid "delete my password" #~ msgstr "删除我的密码" #~ msgid "Password Deleted" #~ msgstr "密码已删除" #~ msgid "Your password has been deleted." #~ msgstr "您的密码已被删除。" #~ msgid "" #~ "If you have any trouble resetting your password, contact us at %(CONTACT_EMAIL)s." #~ msgstr "" #~ "Als je problemen hebt je wachtwoord opnieuw in te stellen, neem dan " #~ "contact op met %(CONTACT_EMAIL)s." #~ msgid "Invalid confirmation key." #~ msgstr "Ongeldige bevestigingssleutel." #~ msgid "OpenID" #~ msgstr "OpenID" #~ msgid "Already have an account?" #~ msgstr "Heb je al een account?" #~ msgid "Sign in" #~ msgstr "Aanmelden" #~ msgid "Language" #~ msgstr "Taal" #~ msgid "Pinax can be used in your preferred language." #~ msgstr "Deze site kan in jouw voorkeurstaal gebruikt worden." #~ msgid "Change my language" #~ msgstr "Verander mijn taal" #~ msgid "Timezone" #~ msgstr "Tijdzone" #, fuzzy #~ msgid "" #~ "You're receiving this e-mail because you requested a password reset\n" #~ "for your user account at Pinax.\n" #~ "\n" #~ "Your new password is: %(new_password)s\n" #~ "\n" #~ "Your username, in case you've forgotten: %(username)s\n" #~ "\n" #~ "You should log in as soon as possible and change your password.\n" #~ "\n" #~ "Thanks for using our site!\n" #~ msgstr "" #~ "Je ontvangt deze mail omdat er een verzoek is ingelegd om het wachtwoord\n" #~ "behorende bij je %(site_name)s account opnieuw in te stellen.\n" #~ "\n" #~ "Je nieuwe wachtwoord is: %(new_password)s\n" #~ "\n" #~ "Je gebruikersnaam, voor het geval je die vergeten bent, is: %(username)s\n" #~ "\n" #~ "Je moet zo snel mogelijk inloggen en bovenstaand wachtwoord veranderen.\n" #~ "\n" #~ "Bedankt voor het gebruik van onze site!\n" #~ msgid "If checked you will stay logged in for 3 weeks" #~ msgstr "Bij 'Onthouden' blijf je ingelogd gedurende 3 weken" #~ msgid "Timezone successfully updated." #~ msgstr "Tijdzone gewijzigd." #~ msgid "Language successfully updated." #~ msgstr "Taal gewijzigd." #~ msgid "None" #~ msgstr "Geen" #~ msgid "add" #~ msgstr "Voeg toe" #~ msgid "Log In" #~ msgstr "Inloggen" #~ msgid "Log in" #~ msgstr "Inloggen" #~ msgid "Logout" #~ msgstr "Afmelden" #~ msgid "" #~ "When you receive the new password, you should log in and change it as soon as possible." #~ msgstr "" #~ "Zodra je het nieuwe wachtwoord ontvangen hebt moet je zo snel mogelijk inloggen en het wachtwoord wijzigen." #~ msgid "You are already logged in." #~ msgstr "Je bent al ingelogd." #~ msgid "" #~ "By clicking \"Sign Up\", you are indicating that you have read and agree " #~ "to the Terms of Use and Privacy Policy." #~ msgstr "" #~ "Door te registreren geef je aan dat je de gebruiksvoorwaarden en de privacy " #~ "policy gelezen hebt en ermee akkoord gaat." #~ msgid "" #~ "If you have any trouble creating your account, contact us at %(contact_email)s." #~ msgstr "" #~ "Als je problemen hebt om een account aan te maken, neem dan contact op " #~ "met %(contact_email)s." #~ msgid "Log in »" #~ msgstr "Inloggen" django-allauth-0.58.2/allauth/mfa/000077500000000000000000000000001452212273200166755ustar00rootroot00000000000000django-allauth-0.58.2/allauth/mfa/__init__.py000066400000000000000000000000001452212273200207740ustar00rootroot00000000000000django-allauth-0.58.2/allauth/mfa/adapter.py000066400000000000000000000044421452212273200206730ustar00rootroot00000000000000from django.utils.translation import gettext_lazy as _ from allauth import app_settings as allauth_settings from allauth.account.utils import user_email, user_username from allauth.core import context from allauth.mfa import app_settings from allauth.utils import import_attribute class DefaultMFAAdapter: """The adapter class allows you to override various functionality of the ``allauth.mfa`` app. To do so, point ``settings.MFA_ADAPTER`` to your own class that derives from ``DefaultMFAAdapter`` and override the behavior by altering the implementation of the methods according to your own need. """ error_messages = { "unverified_email": _( "You cannot activate two-factor authentication until you have verified your email address." ), "add_email_blocked": _( "You cannot add an email address to an account protected by two-factor authentication." ), "incorrect_code": _("Incorrect code."), } "The error messages that can occur as part of MFA form handling." def get_totp_label(self, user) -> str: """Returns the label used for representing the given user in a TOTP QR code. """ label = user_email(user) if not label: label = user_username(user) if not label: label = str(user) return label def get_totp_issuer(self) -> str: """Returns the TOTP issuer name that will be contained in the TOTP QR code. """ issuer = app_settings.TOTP_ISSUER if not issuer: if allauth_settings.SITES_ENABLED: from django.contrib.sites.models import Site issuer = Site.objects.get_current(context.request).name else: issuer = context.request.get_host() return issuer def encrypt(self, text: str) -> str: """Secrets such as the TOTP key are stored in the database. This hook can be used to encrypt those so that they are not stored in the clear in the database. """ return text def decrypt(self, encrypted_text: str) -> str: """Counter part of ``encrypt()``.""" text = encrypted_text return text def get_adapter(): return import_attribute(app_settings.ADAPTER)() django-allauth-0.58.2/allauth/mfa/app_settings.py000066400000000000000000000021531452212273200217500ustar00rootroot00000000000000class AppSettings(object): def __init__(self, prefix): self.prefix = prefix def _setting(self, name, dflt): from allauth.utils import get_setting return get_setting(self.prefix + name, dflt) @property def ADAPTER(self): return self._setting("ADAPTER", "allauth.mfa.adapter.DefaultMFAAdapter") @property def RECOVERY_CODE_COUNT(self): """ The number of recovery codes. """ return self._setting("RECOVERY_CODE_COUNT", 10) @property def TOTP_PERIOD(self): """ The period that a TOTP code will be valid for, in seconds. """ return self._setting("TOTP_PERIOD", 30) @property def TOTP_DIGITS(self): """ The number of digits for TOTP codes """ return self._setting("TOTP_DIGITS", 6) @property def TOTP_ISSUER(self): """ The issuer. """ return self._setting("TOTP_ISSUER", "") _app_settings = AppSettings("MFA_") def __getattr__(name): # See https://peps.python.org/pep-0562/ return getattr(_app_settings, name) django-allauth-0.58.2/allauth/mfa/apps.py000066400000000000000000000006441452212273200202160ustar00rootroot00000000000000from django.apps import AppConfig from django.utils.translation import gettext_lazy as _ class MFAConfig(AppConfig): name = "allauth.mfa" verbose_name = _("MFA") default_auto_field = "django.db.models.BigAutoField" def ready(self): from allauth.account import signals as account_signals from allauth.mfa import signals account_signals._add_email.connect(signals.on_add_email) django-allauth-0.58.2/allauth/mfa/forms.py000066400000000000000000000051701452212273200204000ustar00rootroot00000000000000from django import forms from django.utils.translation import gettext_lazy as _ from allauth.account import app_settings as account_settings from allauth.account.adapter import get_adapter as get_account_adapter from allauth.account.models import EmailAddress from allauth.core import context, ratelimit from allauth.mfa import totp from allauth.mfa.adapter import get_adapter from allauth.mfa.models import Authenticator class AuthenticateForm(forms.Form): code = forms.CharField( label=_("Code"), widget=forms.TextInput( attrs={"placeholder": _("Code"), "autocomplete": "off"}, ), ) def __init__(self, *args, **kwargs): self.user = kwargs.pop("user") super().__init__(*args, **kwargs) def clean_code(self): if account_settings.LOGIN_ATTEMPTS_LIMIT: if not ratelimit.consume( context.request, action="login_failed", user=self.user, amount=account_settings.LOGIN_ATTEMPTS_LIMIT, duration=account_settings.LOGIN_ATTEMPTS_TIMEOUT, ): raise forms.ValidationError( get_account_adapter().error_messages["too_many_login_attempts"] ) code = self.cleaned_data["code"] for auth in Authenticator.objects.filter(user=self.user): if auth.wrap().validate_code(code): self.authenticator = auth ratelimit.clear(context.request, action="login_failed", user=self.user) return code raise forms.ValidationError(get_adapter().error_messages["incorrect_code"]) class ActivateTOTPForm(forms.Form): code = forms.CharField(label=_("Authenticator code")) def __init__(self, *args, **kwargs): self.user = kwargs.pop("user") self.email_verified = not EmailAddress.objects.filter( user=self.user, verified=False ).exists() super().__init__(*args, **kwargs) self.secret = totp.get_totp_secret(regenerate=not self.is_bound) def clean_code(self): try: code = self.cleaned_data["code"] if not self.email_verified: raise forms.ValidationError( get_adapter().error_messages["unverified_email"] ) if not totp.validate_totp_code(self.secret, code): raise forms.ValidationError( get_adapter().error_messages["incorrect_code"] ) return code except forms.ValidationError as e: self.secret = totp.get_totp_secret(regenerate=True) raise e django-allauth-0.58.2/allauth/mfa/migrations/000077500000000000000000000000001452212273200210515ustar00rootroot00000000000000django-allauth-0.58.2/allauth/mfa/migrations/0001_initial.py000066400000000000000000000027161452212273200235220ustar00rootroot00000000000000# Generated by Django 3.2.20 on 2023-08-19 14:43 import django.db.models.deletion from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name="Authenticator", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "type", models.CharField( choices=[ ("recovery_codes", "Recovery codes"), ("totp", "TOTP Authenticator"), ], max_length=20, ), ), ("data", models.JSONField()), ( "user", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, ), ), ], options={ "unique_together": {("user", "type")}, }, ), ] django-allauth-0.58.2/allauth/mfa/migrations/__init__.py000066400000000000000000000000001452212273200231500ustar00rootroot00000000000000django-allauth-0.58.2/allauth/mfa/models.py000066400000000000000000000021231452212273200205300ustar00rootroot00000000000000from django.conf import settings from django.db import models from django.utils.translation import gettext_lazy as _ class AuthenticatorManager(models.Manager): def delete_dangling_recovery_codes(self, user): qs = Authenticator.objects.filter(user=user) if not qs.exclude(type=Authenticator.Type.RECOVERY_CODES).exists(): qs.delete() class Authenticator(models.Model): class Type(models.TextChoices): RECOVERY_CODES = "recovery_codes", _("Recovery codes") TOTP = "totp", _("TOTP Authenticator") objects = AuthenticatorManager() user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) type = models.CharField(max_length=20, choices=Type.choices) data = models.JSONField() class Meta: unique_together = (("user", "type"),) def wrap(self): from allauth.mfa.recovery_codes import RecoveryCodes from allauth.mfa.totp import TOTP return { self.Type.TOTP: TOTP, self.Type.RECOVERY_CODES: RecoveryCodes, }[ self.type ](self) django-allauth-0.58.2/allauth/mfa/recovery_codes.py000066400000000000000000000062611452212273200222670ustar00rootroot00000000000000import binascii import hmac import os import struct from hashlib import sha1 from allauth.mfa import app_settings from allauth.mfa.models import Authenticator from allauth.mfa.utils import decrypt, encrypt class RecoveryCodes: def __init__(self, instance): self.instance = instance @classmethod def activate(cls, user): instance = Authenticator.objects.filter( user=user, type=Authenticator.Type.RECOVERY_CODES ).first() if instance: return cls(instance) instance = Authenticator( user=user, type=Authenticator.Type.RECOVERY_CODES, data={ "seed": encrypt(cls.generate_seed()), "used_mask": 0, }, ) instance.save() return cls(instance) @classmethod def generate_seed(self): key = binascii.hexlify(os.urandom(20)).decode("ascii") return key def _get_migrated_codes(self): codes = self.instance.data.get("migrated_codes") if codes is not None: return [decrypt(code) for code in codes] def generate_codes(self): migrated_codes = self._get_migrated_codes() if migrated_codes is not None: return migrated_codes ret = [] seed = decrypt(self.instance.data["seed"]) h = hmac.new(key=seed.encode("ascii"), msg=None, digestmod=sha1) for i in range(app_settings.RECOVERY_CODE_COUNT): h.update((f"{i:3},").encode("utf-8")) value = struct.unpack(">I", h.digest()[:4])[0] value %= 10**8 fmt_value = f"{value:08}" ret.append(fmt_value) return ret def _is_code_used(self, i): used_mask = self.instance.data["used_mask"] return bool(used_mask & (1 << i)) def _mark_code_used(self, i): used_mask = self.instance.data["used_mask"] used_mask |= 1 << i self.instance.data["used_mask"] = used_mask self.instance.save() def get_unused_codes(self): migrated_codes = self._get_migrated_codes() if migrated_codes is not None: return migrated_codes ret = [] for i, code in enumerate(self.generate_codes()): if self._is_code_used(i): continue ret.append(code) return ret def _validate_migrated_code(self, code): migrated_codes = self._get_migrated_codes() if migrated_codes is None: return None try: idx = migrated_codes.index(code) except ValueError: return False else: migrated_codes = self.instance.data["migrated_codes"] migrated_codes.pop(idx) self.instance.data["migrated_codes"] = migrated_codes self.instance.save() return True def validate_code(self, code): ret = self._validate_migrated_code(code) if ret is not None: return ret for i, c in enumerate(self.generate_codes()): if self._is_code_used(i): continue if code == c: self._mark_code_used(i) return True return False django-allauth-0.58.2/allauth/mfa/signals.py000066400000000000000000000004761452212273200207160ustar00rootroot00000000000000from django.forms import ValidationError from allauth.mfa.adapter import get_adapter from allauth.mfa.utils import is_mfa_enabled def on_add_email(sender, email, user, **kwargs): if is_mfa_enabled(user): adapter = get_adapter() raise ValidationError(adapter.error_messages["add_email_blocked"]) django-allauth-0.58.2/allauth/mfa/stages.py000066400000000000000000000006731452212273200205430ustar00rootroot00000000000000from django.http import HttpResponseRedirect from django.urls import reverse from allauth.account.stages import LoginStage from allauth.mfa.utils import is_mfa_enabled class AuthenticateStage(LoginStage): key = "mfa_authenticate" def handle(self): response, cont = None, True if is_mfa_enabled(self.login.user): response = HttpResponseRedirect(reverse("mfa_authenticate")) return response, cont django-allauth-0.58.2/allauth/mfa/tests/000077500000000000000000000000001452212273200200375ustar00rootroot00000000000000django-allauth-0.58.2/allauth/mfa/tests/__init__.py000066400000000000000000000000001452212273200221360ustar00rootroot00000000000000django-allauth-0.58.2/allauth/mfa/tests/conftest.py000066400000000000000000000011021452212273200222300ustar00rootroot00000000000000from contextlib import contextmanager from unittest.mock import patch import pytest from allauth.mfa import recovery_codes, totp @pytest.fixture def user_with_totp(user): totp.TOTP.activate(user, totp.generate_totp_secret()) return user @pytest.fixture def user_with_recovery_codes(user): recovery_codes.RecoveryCodes.activate(user) return user @pytest.fixture def totp_validation_bypass(): @contextmanager def f(): with patch("allauth.mfa.totp.validate_totp_code") as m: m.return_value = True yield return f django-allauth-0.58.2/allauth/mfa/tests/test_recovery_codes.py000066400000000000000000000023731452212273200244700ustar00rootroot00000000000000from allauth.mfa import app_settings from allauth.mfa.models import Authenticator from allauth.mfa.recovery_codes import RecoveryCodes def test_flow(user): rc = RecoveryCodes.activate(user) codes = rc.generate_codes() assert len(set(codes)) == app_settings.RECOVERY_CODE_COUNT for i in range(app_settings.RECOVERY_CODE_COUNT): assert not rc._is_code_used(i) idx = 3 assert rc.validate_code(codes[idx]) for i in range(app_settings.RECOVERY_CODE_COUNT): assert rc._is_code_used(i) == (i == idx) assert not rc.validate_code(codes[idx]) unused_codes = rc.get_unused_codes() assert codes[idx] not in unused_codes assert len(unused_codes) == app_settings.RECOVERY_CODE_COUNT - 1 def test_migrated_codes(db, user): auth = Authenticator(user=user, data={"migrated_codes": ["abc", "def"]}) rc = RecoveryCodes(auth) assert rc.generate_codes() == ["abc", "def"] assert rc.get_unused_codes() == ["abc", "def"] assert not rc.validate_code("bad") assert rc.validate_code("abc") auth.refresh_from_db() rc = RecoveryCodes(auth) assert rc.generate_codes() == ["def"] assert rc.get_unused_codes() == ["def"] rc.validate_code("def") assert rc.instance.data["migrated_codes"] == [] django-allauth-0.58.2/allauth/mfa/tests/test_views.py000066400000000000000000000166221452212273200226140ustar00rootroot00000000000000import django from django.conf import settings from django.urls import reverse import pytest from pytest_django.asserts import assertFormError from allauth.account.models import EmailAddress from allauth.mfa import app_settings from allauth.mfa.adapter import get_adapter from allauth.mfa.models import Authenticator @pytest.mark.parametrize( "url_name", ( "mfa_activate_totp", "mfa_index", "mfa_deactivate_totp", ), ) def test_login_required_views(client, url_name): resp = client.get(reverse(url_name)) assert resp.status_code == 302 assert resp["location"].startswith(reverse("account_login")) def test_activate_totp_with_incorrect_code(auth_client, reauthentication_bypass): with reauthentication_bypass(): resp = auth_client.get(reverse("mfa_activate_totp")) resp = auth_client.post( reverse("mfa_activate_totp"), { "code": "123", }, ) assert resp.context["form"].errors == { "code": [get_adapter().error_messages["incorrect_code"]] } def test_activate_totp_with_unverified_email( auth_client, user, totp_validation_bypass, reauthentication_bypass ): EmailAddress.objects.filter(user=user).update(verified=False) with reauthentication_bypass(): resp = auth_client.get(reverse("mfa_activate_totp")) with totp_validation_bypass(): resp = auth_client.post( reverse("mfa_activate_totp"), { "code": "123", }, ) assert resp.context["form"].errors == { "code": [get_adapter().error_messages["unverified_email"]], } def test_activate_totp_success( auth_client, totp_validation_bypass, user, reauthentication_bypass ): with reauthentication_bypass(): resp = auth_client.get(reverse("mfa_activate_totp")) with totp_validation_bypass(): resp = auth_client.post( reverse("mfa_activate_totp"), { "code": "123", }, ) assert resp["location"] == reverse("mfa_view_recovery_codes") assert Authenticator.objects.filter( user=user, type=Authenticator.Type.TOTP ).exists() assert Authenticator.objects.filter( user=user, type=Authenticator.Type.RECOVERY_CODES ).exists() def test_index(auth_client, user_with_totp): resp = auth_client.get(reverse("mfa_index")) assert "authenticators" in resp.context def test_deactivate_totp_success(auth_client, user_with_totp, user_password): resp = auth_client.get(reverse("mfa_deactivate_totp")) assert resp.status_code == 302 assert resp["location"].startswith(reverse("account_reauthenticate")) resp = auth_client.post(resp["location"], {"password": user_password}) assert resp.status_code == 302 resp = auth_client.post(reverse("mfa_deactivate_totp")) assert resp.status_code == 302 assert resp["location"] == reverse("mfa_index") def test_user_without_totp_deactivate_totp(auth_client): resp = auth_client.get(reverse("mfa_deactivate_totp")) assert resp.status_code == 404 def test_user_with_totp_activate_totp( auth_client, user_with_totp, reauthentication_bypass ): with reauthentication_bypass(): resp = auth_client.get(reverse("mfa_activate_totp")) assert resp.status_code == 302 assert resp["location"] == reverse("mfa_deactivate_totp") def test_totp_login(client, user_with_totp, user_password, totp_validation_bypass): resp = client.post( reverse("account_login"), {"login": user_with_totp.username, "password": user_password}, ) assert resp.status_code == 302 assert resp["location"] == reverse("mfa_authenticate") resp = client.get(reverse("mfa_authenticate")) assert resp.context["request"].user.is_anonymous resp = client.post(reverse("mfa_authenticate"), {"code": "123"}) assert resp.context["form"].errors == { "code": [get_adapter().error_messages["incorrect_code"]] } with totp_validation_bypass(): resp = client.post( reverse("mfa_authenticate"), {"code": "123"}, ) assert resp.status_code == 302 assert resp["location"] == settings.LOGIN_REDIRECT_URL def test_download_recovery_codes(auth_client, user_with_recovery_codes, user_password): resp = auth_client.get(reverse("mfa_download_recovery_codes")) assert resp["location"].startswith(reverse("account_reauthenticate")) resp = auth_client.post(resp["location"], {"password": user_password}) assert resp.status_code == 302 resp = auth_client.get(resp["location"]) assert resp["content-disposition"] == 'attachment; filename="recovery-codes.txt"' def test_view_recovery_codes(auth_client, user_with_recovery_codes, user_password): resp = auth_client.get(reverse("mfa_view_recovery_codes")) assert resp["location"].startswith(reverse("account_reauthenticate")) resp = auth_client.post(resp["location"], {"password": user_password}) assert resp.status_code == 302 resp = auth_client.get(resp["location"]) assert len(resp.context["unused_codes"]) == app_settings.RECOVERY_CODE_COUNT def test_generate_recovery_codes(auth_client, user_with_recovery_codes, user_password): rc = Authenticator.objects.get( user=user_with_recovery_codes, type=Authenticator.Type.RECOVERY_CODES ).wrap() prev_code = rc.get_unused_codes()[0] resp = auth_client.get(reverse("mfa_generate_recovery_codes")) assert resp["location"].startswith(reverse("account_reauthenticate")) resp = auth_client.post(resp["location"], {"password": user_password}) assert resp.status_code == 302 resp = auth_client.post(resp["location"]) assert resp["location"] == reverse("mfa_view_recovery_codes") rc = Authenticator.objects.get( user=user_with_recovery_codes, type=Authenticator.Type.RECOVERY_CODES ).wrap() assert not rc.validate_code(prev_code) def test_add_email_not_allowed(auth_client, user_with_totp): resp = auth_client.post( reverse("account_email"), {"action_add": "", "email": "change-to@this.org"}, ) assert resp.status_code == 200 assert resp.context["form"].errors == { "email": [ "You cannot add an email address to an account protected by two-factor authentication." ] } def test_totp_login_rate_limit( settings, enable_cache, user_with_totp, user_password, client ): settings.ACCOUNT_LOGIN_ATTEMPTS_LIMIT = 3 resp = client.post( reverse("account_login"), {"login": user_with_totp.username, "password": user_password}, ) assert resp.status_code == 302 assert resp["location"] == reverse("mfa_authenticate") for i in range(5): is_locked = i >= 3 resp = client.post( reverse("mfa_authenticate"), { "code": "wrong", }, ) if django.VERSION >= (4, 1): assertFormError( resp.context["form"], "code", "Too many failed login attempts. Try again later." if is_locked else "Incorrect code.", ) else: assertFormError( resp, "form", "code", "Too many failed login attempts. Try again later." if is_locked else "Incorrect code.", ) django-allauth-0.58.2/allauth/mfa/totp.py000066400000000000000000000063571452212273200202500ustar00rootroot00000000000000import base64 import hashlib import hmac import secrets import struct import time from io import BytesIO from urllib.parse import quote from django.utils.http import urlencode import qrcode from qrcode.image.svg import SvgPathImage from allauth.core import context from allauth.mfa import app_settings from allauth.mfa.models import Authenticator from allauth.mfa.utils import decrypt, encrypt SECRET_SESSION_KEY = "mfa.totp.secret" def generate_totp_secret(length=20): random_bytes = secrets.token_bytes(length) return base64.b32encode(random_bytes).decode("utf-8") def get_totp_secret(regenerate=False): secret = None if not regenerate: secret = context.request.session.get(SECRET_SESSION_KEY) if not secret: secret = context.request.session[SECRET_SESSION_KEY] = generate_totp_secret() return secret def hotp_counter_from_time(): current_time = int(time.time()) # Get the current Unix timestamp return current_time // app_settings.TOTP_PERIOD def hotp_value(secret, counter): # Convert the counter to a byte array using big-endian encoding counter_bytes = struct.pack(">Q", counter) secret_enc = base64.b32decode(secret.encode("ascii"), casefold=True) # Calculate the HMAC-SHA1 hash using the secret and counter hmac_result = hmac.new(secret_enc, counter_bytes, hashlib.sha1).digest() # Get the last 4 bits of the HMAC result to determine the offset offset = hmac_result[-1] & 0x0F # Extract an 31-bit slice from the HMAC result starting at the offset + 1 bit truncated_hash = bytearray(hmac_result[offset : offset + 4]) truncated_hash[0] = truncated_hash[0] & 0x7F # Convert the truncated hash to an integer value value = struct.unpack(">I", truncated_hash)[0] # Apply modulo to get a value within the specified number of digits value %= 10**app_settings.TOTP_DIGITS return value def build_totp_url(label, issuer, secret): params = { "secret": secret, # This is the default # "algorithm": "SHA1", "issuer": issuer, } if app_settings.TOTP_DIGITS != 6: params["digits"] = app_settings.TOTP_DIGITS if app_settings.TOTP_PERIOD != 30: params["period"] = app_settings.TOTP_PERIOD return f"otpauth://totp/{quote(label)}?{urlencode(params)}" def build_totp_svg(url): img = qrcode.make(url, image_factory=SvgPathImage) buf = BytesIO() img.save(buf) return buf.getvalue().decode("utf8") def format_hotp_value(value): return f"{value:0{app_settings.TOTP_DIGITS}}" def validate_totp_code(secret, code): value = hotp_value(secret, hotp_counter_from_time()) return code == format_hotp_value(value) class TOTP: def __init__(self, instance): self.instance = instance @classmethod def activate(cls, user, secret): instance = Authenticator( user=user, type=Authenticator.Type.TOTP, data={"secret": encrypt(secret)} ) instance.save() return cls(instance) def deactivate(self): self.instance.delete() Authenticator.objects.delete_dangling_recovery_codes(self.instance.user) def validate_code(self, code): secret = decrypt(self.instance.data["secret"]) return validate_totp_code(secret, code) django-allauth-0.58.2/allauth/mfa/urls.py000066400000000000000000000017651452212273200202450ustar00rootroot00000000000000from django.urls import include, path from allauth.mfa import views urlpatterns = [ path("", views.index, name="mfa_index"), path("authenticate/", views.authenticate, name="mfa_authenticate"), path( "totp/", include( [ path("activate/", views.activate_totp, name="mfa_activate_totp"), path("deactivate/", views.deactivate_totp, name="mfa_deactivate_totp"), ] ), ), path( "recovery-codes/", include( [ path("", views.view_recovery_codes, name="mfa_view_recovery_codes"), path( "generate/", views.generate_recovery_codes, name="mfa_generate_recovery_codes", ), path( "download/", views.download_recovery_codes, name="mfa_download_recovery_codes", ), ] ), ), ] django-allauth-0.58.2/allauth/mfa/utils.py000066400000000000000000000007051452212273200204110ustar00rootroot00000000000000from allauth.mfa.adapter import get_adapter from allauth.mfa.models import Authenticator def encrypt(text): return get_adapter().encrypt(text) def decrypt(encrypted_text): return get_adapter().decrypt(encrypted_text) def is_mfa_enabled(user, types=None): if user.is_anonymous: return False qs = Authenticator.objects.filter(user=user) if types is not None: qs = qs.filter(type__in=types) return qs.exists() django-allauth-0.58.2/allauth/mfa/views.py000066400000000000000000000205151452212273200204070ustar00rootroot00000000000000import base64 from django import forms from django.contrib import messages from django.contrib.auth.decorators import login_required from django.http import Http404, HttpResponseRedirect from django.shortcuts import get_object_or_404 from django.urls import reverse, reverse_lazy from django.utils.decorators import method_decorator from django.views.generic import TemplateView from django.views.generic.edit import FormView from allauth.account import app_settings as account_settings from allauth.account.adapter import get_adapter as get_account_adapter from allauth.account.decorators import reauthentication_required from allauth.account.stages import LoginStageController from allauth.mfa import app_settings, totp from allauth.mfa.adapter import get_adapter from allauth.mfa.forms import ActivateTOTPForm, AuthenticateForm from allauth.mfa.models import Authenticator from allauth.mfa.recovery_codes import RecoveryCodes from allauth.mfa.stages import AuthenticateStage from allauth.mfa.utils import is_mfa_enabled class AuthenticateView(FormView): form_class = AuthenticateForm template_name = "mfa/authenticate." + account_settings.TEMPLATE_EXTENSION def dispatch(self, request, *args, **kwargs): self.stage = LoginStageController.enter(request, AuthenticateStage.key) if not self.stage or not is_mfa_enabled( self.stage.login.user, [Authenticator.Type.TOTP] ): return HttpResponseRedirect(reverse("account_login")) return super().dispatch(request, *args, **kwargs) def get_form_kwargs(self): ret = super().get_form_kwargs() ret["user"] = self.stage.login.user return ret def form_valid(self, form): return self.stage.exit() authenticate = AuthenticateView.as_view() @method_decorator(login_required, name="dispatch") class IndexView(TemplateView): template_name = "mfa/index." + account_settings.TEMPLATE_EXTENSION def get_context_data(self, **kwargs): ret = super().get_context_data(**kwargs) authenticators = { auth.type: auth.wrap() for auth in Authenticator.objects.filter(user=self.request.user) } ret["authenticators"] = authenticators ret["is_mfa_enabled"] = is_mfa_enabled(self.request.user) return ret index = IndexView.as_view() @method_decorator(reauthentication_required, name="dispatch") class ActivateTOTPView(FormView): form_class = ActivateTOTPForm template_name = "mfa/totp/activate_form." + account_settings.TEMPLATE_EXTENSION success_url = reverse_lazy("mfa_view_recovery_codes") def dispatch(self, request, *args, **kwargs): if is_mfa_enabled(request.user, [Authenticator.Type.TOTP]): return HttpResponseRedirect(reverse("mfa_deactivate_totp")) return super().dispatch(request, *args, **kwargs) def get_context_data(self, **kwargs): ret = super().get_context_data(**kwargs) adapter = get_adapter() totp_url = totp.build_totp_url( adapter.get_totp_label(self.request.user), adapter.get_totp_issuer(), ret["form"].secret, ) totp_svg = totp.build_totp_svg(totp_url) base64_data = base64.b64encode(totp_svg.encode("utf8")).decode("utf-8") totp_data_uri = f"data:image/svg+xml;base64,{base64_data}" ret.update( { "totp_svg": totp_svg, "totp_svg_data_uri": totp_data_uri, "totp_url": totp_url, } ) return ret def get_form_kwargs(self): ret = super().get_form_kwargs() ret["user"] = self.request.user return ret def form_valid(self, form): totp.TOTP.activate(self.request.user, form.secret) RecoveryCodes.activate(self.request.user) adapter = get_account_adapter(self.request) adapter.add_message( self.request, messages.SUCCESS, "mfa/messages/totp_activated.txt" ) return super().form_valid(form) activate_totp = ActivateTOTPView.as_view() @method_decorator(login_required, name="dispatch") class DeactivateTOTPView(FormView): form_class = forms.Form template_name = "mfa/totp/deactivate_form." + account_settings.TEMPLATE_EXTENSION success_url = reverse_lazy("mfa_index") def dispatch(self, request, *args, **kwargs): self.authenticator = get_object_or_404( Authenticator, user=self.request.user, type=Authenticator.Type.TOTP, ) if not is_mfa_enabled(request.user, [Authenticator.Type.TOTP]): return HttpResponseRedirect(reverse("mfa_activate_totp")) return self._dispatch(request, *args, **kwargs) @method_decorator(reauthentication_required) def _dispatch(self, request, *args, **kwargs): """There's no point to reauthenticate when MFA is not enabled, so the `is_mfa_enabled` chheck needs to go first, which is why we cannot slap a `reauthentication_required` decorator on the `dispatch` directly. """ return super().dispatch(request, *args, **kwargs) def form_valid(self, form): self.authenticator.wrap().deactivate() adapter = get_account_adapter(self.request) adapter.add_message( self.request, messages.SUCCESS, "mfa/messages/totp_deactivated.txt" ) return super().form_valid(form) deactivate_totp = DeactivateTOTPView.as_view() @method_decorator(reauthentication_required, name="dispatch") class GenerateRecoveryCodesView(FormView): form_class = forms.Form template_name = "mfa/recovery_codes/generate." + account_settings.TEMPLATE_EXTENSION success_url = reverse_lazy("mfa_view_recovery_codes") def form_valid(self, form): Authenticator.objects.filter( user=self.request.user, type=Authenticator.Type.RECOVERY_CODES ).delete() RecoveryCodes.activate(self.request.user) adapter = get_account_adapter(self.request) adapter.add_message( self.request, messages.SUCCESS, "mfa/messages/recovery_codes_generated.txt" ) return super().form_valid(form) def get_context_data(self, **kwargs): ret = super().get_context_data(**kwargs) unused_codes = [] authenticator = Authenticator.objects.filter( user=self.request.user, type=Authenticator.Type.RECOVERY_CODES ).first() if authenticator: unused_codes = authenticator.wrap().get_unused_codes() ret["unused_code_count"] = len(unused_codes) return ret generate_recovery_codes = GenerateRecoveryCodesView.as_view() @method_decorator(reauthentication_required, name="dispatch") class DownloadRecoveryCodesView(TemplateView): template_name = "mfa/recovery_codes/download.txt" content_type = "text/plain" def dispatch(self, request, *args, **kwargs): self.authenticator = get_object_or_404( Authenticator, user=self.request.user, type=Authenticator.Type.RECOVERY_CODES, ) self.unused_codes = self.authenticator.wrap().get_unused_codes() if not self.unused_codes: return Http404() return super().dispatch(request, *args, **kwargs) def get_context_data(self, **kwargs): ret = super().get_context_data(**kwargs) ret["unused_codes"] = self.unused_codes return ret def render_to_response(self, context, **response_kwargs): response = super().render_to_response(context, **response_kwargs) response["Content-Disposition"] = 'attachment; filename="recovery-codes.txt"' return response download_recovery_codes = DownloadRecoveryCodesView.as_view() @method_decorator(reauthentication_required, name="dispatch") class ViewRecoveryCodesView(TemplateView): template_name = "mfa/recovery_codes/index." + account_settings.TEMPLATE_EXTENSION def get_context_data(self, **kwargs): ret = super().get_context_data(**kwargs) authenticator = get_object_or_404( Authenticator, user=self.request.user, type=Authenticator.Type.RECOVERY_CODES, ) ret.update( { "unused_codes": authenticator.wrap().get_unused_codes(), "total_count": app_settings.RECOVERY_CODE_COUNT, } ) return ret view_recovery_codes = ViewRecoveryCodesView.as_view() django-allauth-0.58.2/allauth/models.py000066400000000000000000000000001452212273200177550ustar00rootroot00000000000000django-allauth-0.58.2/allauth/ratelimit.py000066400000000000000000000003231452212273200204740ustar00rootroot00000000000000import warnings from allauth.core.ratelimit import clear, consume, consume_or_429 __all__ = ["consume", "consume_or_429", "clear"] warnings.warn("allauth.ratelimit is deprecated, use allauth.core.ratelimit") django-allauth-0.58.2/allauth/socialaccount/000077500000000000000000000000001452212273200207615ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/__init__.py000066400000000000000000000000001452212273200230600ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/adapter.py000066400000000000000000000250241452212273200227560ustar00rootroot00000000000000import warnings from django.core.exceptions import ( ImproperlyConfigured, MultipleObjectsReturned, ValidationError, ) from django.db.models import Q from django.urls import reverse from django.utils.translation import gettext_lazy as _ from allauth.core import context from ..account.adapter import get_adapter as get_account_adapter from ..account.app_settings import EmailVerificationMethod from ..account.models import EmailAddress from ..account.utils import user_email, user_field, user_username from ..utils import ( deserialize_instance, import_attribute, serialize_instance, valid_email_or_none, ) from . import app_settings class DefaultSocialAccountAdapter(object): error_messages = { "email_taken": _( "An account already exists with this email address." " Please sign in to that account first, then connect" " your %s account." ) } def __init__(self, request=None): # Explicitly passing `request` is deprecated, just use: # `allauth.core.context.request`. self.request = context.request def pre_social_login(self, request, sociallogin): """ Invoked just after a user successfully authenticates via a social provider, but before the login is actually processed (and before the pre_social_login signal is emitted). You can use this hook to intervene, e.g. abort the login by raising an ImmediateHttpResponse Why both an adapter hook and the signal? Intervening in e.g. the flow from within a signal handler is bad -- multiple handlers may be active and are executed in undetermined order. """ pass def authentication_error( self, request, provider_id, error=None, exception=None, extra_context=None, ): """ Invoked when there is an error in the authentication cycle. In this case, pre_social_login will not be reached. You can use this hook to intervene, e.g. redirect to an educational flow by raising an ImmediateHttpResponse. """ pass def new_user(self, request, sociallogin): """ Instantiates a new User instance. """ return get_account_adapter().new_user(request) def save_user(self, request, sociallogin, form=None): """ Saves a newly signed up social login. In case of auto-signup, the signup form is not available. """ u = sociallogin.user u.set_unusable_password() if form: get_account_adapter().save_user(request, u, form) else: get_account_adapter().populate_username(request, u) sociallogin.save(request) return u def populate_user(self, request, sociallogin, data): """ Hook that can be used to further populate the user instance. For convenience, we populate several common fields. Note that the user instance being populated represents a suggested User instance that represents the social user that is in the process of being logged in. The User instance need not be completely valid and conflict free. For example, verifying whether or not the username already exists, is not a responsibility. """ username = data.get("username") first_name = data.get("first_name") last_name = data.get("last_name") email = data.get("email") name = data.get("name") user = sociallogin.user user_username(user, username or "") user_email(user, valid_email_or_none(email) or "") name_parts = (name or "").partition(" ") user_field(user, "first_name", first_name or name_parts[0]) user_field(user, "last_name", last_name or name_parts[2]) return user def get_connect_redirect_url(self, request, socialaccount): """ Returns the default URL to redirect to after successfully connecting a social account. """ url = reverse("socialaccount_connections") return url def validate_disconnect(self, account, accounts): """ Validate whether or not the socialaccount account can be safely disconnected. """ if len(accounts) == 1: # No usable password would render the local account unusable if not account.user.has_usable_password(): raise ValidationError(_("Your account has no password set up.")) # No email address, no password reset if app_settings.EMAIL_VERIFICATION == EmailVerificationMethod.MANDATORY: if not EmailAddress.objects.filter( user=account.user, verified=True ).exists(): raise ValidationError( _("Your account has no verified email address.") ) def is_auto_signup_allowed(self, request, sociallogin): # If email is specified, check for duplicate and if so, no auto signup. auto_signup = app_settings.AUTO_SIGNUP return auto_signup def is_open_for_signup(self, request, sociallogin): """ Checks whether or not the site is open for signups. Next to simply returning True/False you can also intervene the regular flow by raising an ImmediateHttpResponse """ return get_account_adapter(request).is_open_for_signup(request) def get_signup_form_initial_data(self, sociallogin): user = sociallogin.user initial = { "email": user_email(user) or "", "username": user_username(user) or "", "first_name": user_field(user, "first_name") or "", "last_name": user_field(user, "last_name") or "", } return initial def deserialize_instance(self, model, data): return deserialize_instance(model, data) def serialize_instance(self, instance): return serialize_instance(instance) def list_providers(self, request): from allauth.socialaccount.providers import registry ret = [] provider_classes = registry.get_class_list() apps = self.list_apps(request) apps_map = {} for app in apps: apps_map.setdefault(app.provider, []).append(app) for provider_class in provider_classes: provider_apps = apps_map.get(provider_class.id, []) if not provider_apps: if provider_class.uses_apps: continue provider_apps = [None] for app in provider_apps: provider = provider_class(request=request, app=app) ret.append(provider) return ret def get_provider(self, request, provider): """Looks up a `provider`, supporting subproviders by looking up by `provider_id`. """ from allauth.socialaccount.providers import registry provider_class = registry.get_class(provider) if provider_class is None or provider_class.uses_apps: app = self.get_app(request, provider=provider) if not provider_class: # In this case, the `provider` argument passed was a # `provider_id`. provider_class = registry.get_class(app.provider) if not provider_class: raise ImproperlyConfigured(f"unknown provider: {app.provider}") return provider_class(request, app=app) elif provider_class: assert not provider_class.uses_apps return provider_class(request, app=None) else: raise ImproperlyConfigured(f"unknown provider: {app.provider}") def list_apps(self, request, provider=None, client_id=None): """SocialApp's can be setup in the database, or, via `settings.SOCIALACCOUNT_PROVIDERS`. This methods returns a uniform list of all known apps matching the specified criteria, and blends both (db/settings) sources of data. """ # NOTE: Avoid loading models at top due to registry boot... from allauth.socialaccount.models import SocialApp # Map provider to the list of apps. provider_to_apps = {} # First, populate it with the DB backed apps. db_apps = SocialApp.objects.on_site(request) if provider: db_apps = db_apps.filter(Q(provider=provider) | Q(provider_id=provider)) if client_id: db_apps = db_apps.filter(client_id=client_id) for app in db_apps: apps = provider_to_apps.setdefault(app.provider, []) apps.append(app) # Then, extend it with the settings backed apps. for p, pcfg in app_settings.PROVIDERS.items(): app_configs = pcfg.get("APPS") if app_configs is None: app_config = pcfg.get("APP") if app_config is None: continue app_configs = [app_config] apps = provider_to_apps.setdefault(p, []) for config in app_configs: app = SocialApp(provider=p) for field in [ "name", "provider_id", "client_id", "secret", "key", "settings", ]: if field in config: setattr(app, field, config[field]) if "certificate_key" in config: warnings.warn("'certificate_key' should be moved into app.settings") app.settings["certificate_key"] = config["certificate_key"] if client_id and app.client_id != client_id: continue if ( provider and app.provider_id != provider and app.provider != provider ): continue apps.append(app) # Flatten the list of apps. apps = [] for provider_apps in provider_to_apps.values(): apps.extend(provider_apps) return apps def get_app(self, request, provider, client_id=None): from allauth.socialaccount.models import SocialApp apps = self.list_apps(request, provider=provider, client_id=client_id) if len(apps) > 1: raise MultipleObjectsReturned elif len(apps) == 0: raise SocialApp.DoesNotExist() return apps[0] def get_adapter(request=None): return import_attribute(app_settings.ADAPTER)(request) django-allauth-0.58.2/allauth/socialaccount/admin.py000066400000000000000000000032411452212273200224230ustar00rootroot00000000000000from django import forms from django.contrib import admin from allauth import app_settings from allauth.account.adapter import get_adapter from .models import SocialAccount, SocialApp, SocialToken class SocialAppForm(forms.ModelForm): class Meta: model = SocialApp exclude = [] widgets = { "client_id": forms.TextInput(attrs={"size": "100"}), "key": forms.TextInput(attrs={"size": "100"}), "secret": forms.TextInput(attrs={"size": "100"}), } class SocialAppAdmin(admin.ModelAdmin): form = SocialAppForm list_display = ( "name", "provider", ) filter_horizontal = ("sites",) if app_settings.SITES_ENABLED else () class SocialAccountAdmin(admin.ModelAdmin): search_fields = [] raw_id_fields = ("user",) list_display = ("user", "uid", "provider") list_filter = ("provider",) def get_search_fields(self, request): base_fields = get_adapter().get_user_search_fields() return list(map(lambda a: "user__" + a, base_fields)) class SocialTokenAdmin(admin.ModelAdmin): raw_id_fields = ( "app", "account", ) list_display = ("app", "account", "truncated_token", "expires_at") list_filter = ("app", "app__provider", "expires_at") def truncated_token(self, token): max_chars = 40 ret = token.token if len(ret) > max_chars: ret = ret[0:max_chars] + "...(truncated)" return ret truncated_token.short_description = "Token" admin.site.register(SocialApp, SocialAppAdmin) admin.site.register(SocialToken, SocialTokenAdmin) admin.site.register(SocialAccount, SocialAccountAdmin) django-allauth-0.58.2/allauth/socialaccount/app_settings.py000066400000000000000000000121161452212273200240340ustar00rootroot00000000000000class AppSettings(object): def __init__(self, prefix): self.prefix = prefix def _setting(self, name, dflt): from allauth.utils import get_setting return get_setting(self.prefix + name, dflt) @property def QUERY_EMAIL(self): """ Request email address from 3rd party account provider? E.g. using OpenID AX """ from allauth.account import app_settings as account_settings return self._setting("QUERY_EMAIL", account_settings.EMAIL_REQUIRED) @property def AUTO_SIGNUP(self): """ Attempt to bypass the signup form by using fields (e.g. username, email) retrieved from the social account provider. If a conflict arises due to a duplicate email signup form will still kick in. """ return self._setting("AUTO_SIGNUP", True) @property def PROVIDERS(self): """ Provider specific settings """ ret = self._setting("PROVIDERS", {}) oidc = ret.get("openid_connect") if oidc: ret["openid_connect"] = self._migrate_oidc(oidc) return ret def _migrate_oidc(self, oidc): servers = oidc.get("SERVERS") if servers is None: return oidc ret = {} apps = [] for server in servers: app = dict(**server["APP"]) app_settings = {} if "token_auth_method" in server: app_settings["token_auth_method"] = server["token_auth_method"] app_settings["server_url"] = server["server_url"] app.update( { "name": server.get("name", ""), "provider_id": server["id"], "settings": app_settings, } ) assert app["provider_id"] apps.append(app) ret["APPS"] = apps return ret @property def EMAIL_REQUIRED(self): """ The user is required to hand over an email address when signing up """ from allauth.account import app_settings as account_settings return self._setting("EMAIL_REQUIRED", account_settings.EMAIL_REQUIRED) @property def EMAIL_VERIFICATION(self): """ See email verification method """ from allauth.account import app_settings as account_settings return self._setting("EMAIL_VERIFICATION", account_settings.EMAIL_VERIFICATION) @property def EMAIL_AUTHENTICATION(self): """Consider a scenario where a social login occurs, and the social account comes with a verified email address (verified by the account provider), but that email address is already taken by a local user account. Additionally, assume that the local user account does not have any social account connected. Now, if the provider can be fully trusted, you can argue that we should treat this scenario as a login to the existing local user account even if the local account does not already have the social account connected, because -- according to the provider -- the user logging in has ownership of the email address. This is how this scenario is handled when `EMAIL_AUTHENTICATION` is set to `True`. As this implies that an untrustworthy provider can login to any local account by fabricating social account data, this setting defaults to `False`. Only set it to `True` if you are using providers that can be fully trusted. """ return self._setting("EMAIL_AUTHENTICATION", False) @property def EMAIL_AUTHENTICATION_AUTO_CONNECT(self): """In case email authentication is applied, this setting controls whether or not the social account is automatically connected to the local account. In case of ``False`` (the default) the local account remains unchanged during the login. In case of ``True``, the social account for which the email matched, is automatically added to the list of social accounts connected to the local account. As a result, even if the user were to change the email address afterwards, social login would still be possible when using ``True``, but not in case of ``False``. """ return self._setting("EMAIL_AUTHENTICATION_AUTO_CONNECT", False) @property def ADAPTER(self): return self._setting( "ADAPTER", "allauth.socialaccount.adapter.DefaultSocialAccountAdapter", ) @property def FORMS(self): return self._setting("FORMS", {}) @property def LOGIN_ON_GET(self): return self._setting("LOGIN_ON_GET", False) @property def STORE_TOKENS(self): return self._setting("STORE_TOKENS", False) @property def UID_MAX_LENGTH(self): return 191 @property def SOCIALACCOUNT_STR(self): return self._setting("SOCIALACCOUNT_STR", None) _app_settings = AppSettings("SOCIALACCOUNT_") def __getattr__(name): # See https://peps.python.org/pep-0562/ return getattr(_app_settings, name) django-allauth-0.58.2/allauth/socialaccount/apps.py000066400000000000000000000004021452212273200222720ustar00rootroot00000000000000from django.apps import AppConfig from django.utils.translation import gettext_lazy as _ class SocialAccountConfig(AppConfig): name = "allauth.socialaccount" verbose_name = _("Social Accounts") default_auto_field = "django.db.models.AutoField" django-allauth-0.58.2/allauth/socialaccount/conftest.py000066400000000000000000000013631452212273200231630ustar00rootroot00000000000000import pytest from allauth.account.models import EmailAddress from allauth.socialaccount.models import SocialAccount, SocialLogin @pytest.fixture def sociallogin_factory(user_factory): def factory( email=None, with_email=True, provider="unittest-server", uid="123", email_verified=True, ): user = user_factory(email=email, commit=False, with_email=with_email) account = SocialAccount(provider=provider, uid=uid) sociallogin = SocialLogin(user=user, account=account) if with_email: sociallogin.email_addresses = [ EmailAddress(email=user.email, verified=email_verified, primary=True) ] return sociallogin return factory django-allauth-0.58.2/allauth/socialaccount/forms.py000066400000000000000000000041641452212273200224660ustar00rootroot00000000000000from django import forms from allauth.account.forms import BaseSignupForm from . import app_settings, signals from .adapter import get_adapter from .models import SocialAccount class SignupForm(BaseSignupForm): def __init__(self, *args, **kwargs): self.sociallogin = kwargs.pop("sociallogin") initial = get_adapter().get_signup_form_initial_data(self.sociallogin) kwargs.update( { "initial": initial, "email_required": kwargs.get( "email_required", app_settings.EMAIL_REQUIRED ), } ) super(SignupForm, self).__init__(*args, **kwargs) def save(self, request): adapter = get_adapter() user = adapter.save_user(request, self.sociallogin, form=self) self.custom_signup(request, user) return user def validate_unique_email(self, value): try: return super(SignupForm, self).validate_unique_email(value) except forms.ValidationError: raise forms.ValidationError( get_adapter().error_messages["email_taken"] % self.sociallogin.account.get_provider().name ) class DisconnectForm(forms.Form): account = forms.ModelChoiceField( queryset=SocialAccount.objects.none(), widget=forms.RadioSelect, required=True, ) def __init__(self, *args, **kwargs): self.request = kwargs.pop("request") self.accounts = SocialAccount.objects.filter(user=self.request.user) super(DisconnectForm, self).__init__(*args, **kwargs) self.fields["account"].queryset = self.accounts def clean(self): cleaned_data = super(DisconnectForm, self).clean() account = cleaned_data.get("account") if account: get_adapter(self.request).validate_disconnect(account, self.accounts) return cleaned_data def save(self): account = self.cleaned_data["account"] account.delete() signals.social_account_removed.send( sender=SocialAccount, request=self.request, socialaccount=account ) django-allauth-0.58.2/allauth/socialaccount/helpers.py000066400000000000000000000220111452212273200227710ustar00rootroot00000000000000from django.contrib import messages from django.forms import ValidationError from django.http import HttpResponseRedirect from django.shortcuts import render from django.urls import reverse from allauth.account import app_settings as account_settings from allauth.account.adapter import get_adapter as get_account_adapter from allauth.account.reauthentication import reauthenticate_then_callback from allauth.account.utils import ( assess_unique_email, complete_signup, perform_login, user_display, user_email, user_username, ) from allauth.core.exceptions import ImmediateHttpResponse from allauth.socialaccount import app_settings, signals from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.models import SocialLogin from allauth.socialaccount.providers.base import AuthError, AuthProcess def _process_auto_signup(request, sociallogin): auto_signup = get_adapter().is_auto_signup_allowed(request, sociallogin) if not auto_signup: return False, None email = user_email(sociallogin.user) # Let's check if auto_signup is really possible... if email: assessment = assess_unique_email(email) if assessment is True: # Auto signup is fine. pass elif assessment is False: # Oops, another user already has this address. We cannot simply # connect this social account to the existing user. Reason is # that the email address may not be verified, meaning, the user # may be a hacker that has added your email address to their # account in the hope that you fall in their trap. We cannot # check on 'email_address.verified' either, because # 'email_address' is not guaranteed to be verified. auto_signup = False # TODO: We redirect to signup form -- user will see email # address conflict only after posting whereas we detected it # here already. else: assert assessment is None # Prevent enumeration is properly turned on, meaning, we cannot # show the signup form to allow the user to input another email # address. Instead, we're going to send the user an email that # the account already exists, and on the outside make it appear # as if an email verification mail was sent. account_adapter = get_account_adapter(request) account_adapter.send_account_already_exists_mail(email) resp = account_adapter.respond_email_verification_sent(request, None) return False, resp elif app_settings.EMAIL_REQUIRED: # Nope, email is required and we don't have it yet... auto_signup = False return auto_signup, None def _process_signup(request, sociallogin): auto_signup, resp = _process_auto_signup(request, sociallogin) if resp: return resp if not auto_signup: request.session["socialaccount_sociallogin"] = sociallogin.serialize() url = reverse("socialaccount_signup") resp = HttpResponseRedirect(url) else: # Ok, auto signup it is, at least the email address is ok. # We still need to check the username though... if account_settings.USER_MODEL_USERNAME_FIELD: username = user_username(sociallogin.user) try: get_account_adapter(request).clean_username(username) except ValidationError: # This username is no good ... user_username(sociallogin.user, "") # TODO: This part contains a lot of duplication of logic # ("closed" rendering, create user, send email, in active # etc..) if not get_adapter().is_open_for_signup(request, sociallogin): return render( request, "account/signup_closed." + account_settings.TEMPLATE_EXTENSION, ) get_adapter().save_user(request, sociallogin, form=None) resp = complete_social_signup(request, sociallogin) return resp def _login_social_account(request, sociallogin): return perform_login( request, sociallogin.user, email_verification=app_settings.EMAIL_VERIFICATION, redirect_url=sociallogin.get_redirect_url(request), signal_kwargs={"sociallogin": sociallogin}, ) def render_authentication_error( request, provider_id, error=AuthError.UNKNOWN, exception=None, extra_context=None, ): try: if extra_context is None: extra_context = {} get_adapter().authentication_error( request, provider_id, error=error, exception=exception, extra_context=extra_context, ) except ImmediateHttpResponse as e: return e.response if error == AuthError.CANCELLED: return HttpResponseRedirect(reverse("socialaccount_login_cancelled")) context = { "auth_error": { "provider": provider_id, "code": error, "exception": exception, } } context.update(extra_context) return render( request, "socialaccount/authentication_error." + account_settings.TEMPLATE_EXTENSION, context, ) def resume_add_social_account(request, serialized_state): sociallogin = SocialLogin.deserialize(serialized_state) return _add_social_account(request, sociallogin) def _add_social_account(request, sociallogin): if request.user.is_anonymous: # This should not happen. Simply redirect to the connections # view (which has a login required) connect_redirect_url = get_adapter().get_connect_redirect_url( request, sociallogin.account ) return HttpResponseRedirect(connect_redirect_url) if account_settings.REAUTHENTICATION_REQUIRED: response = reauthenticate_then_callback( request, lambda request: sociallogin.serialize(), "allauth.socialaccount.helpers.resume_add_social_account", ) if response: return response level = messages.INFO message = "socialaccount/messages/account_connected.txt" action = None if sociallogin.is_existing: if sociallogin.user != request.user: # Social account of other user. For now, this scenario # is not supported. Issue is that one cannot simply # remove the social account from the other user, as # that may render the account unusable. level = messages.ERROR message = "socialaccount/messages/account_connected_other.txt" else: # This account is already connected -- we give the opportunity # for customized behaviour through use of a signal. action = "updated" message = "socialaccount/messages/account_connected_updated.txt" else: # New account, let's connect action = "added" sociallogin.connect(request, request.user) assert request.user.is_authenticated default_next = get_adapter().get_connect_redirect_url(request, sociallogin.account) next_url = sociallogin.get_redirect_url(request) or default_next get_account_adapter(request).add_message( request, level, message, message_context={"sociallogin": sociallogin, "action": action}, ) return HttpResponseRedirect(next_url) def complete_social_login(request, sociallogin): assert not sociallogin.is_existing sociallogin.lookup() try: get_adapter().pre_social_login(request, sociallogin) signals.pre_social_login.send( sender=SocialLogin, request=request, sociallogin=sociallogin ) process = sociallogin.state.get("process") if process == AuthProcess.REDIRECT: return _social_login_redirect(request, sociallogin) elif process == AuthProcess.CONNECT: return _add_social_account(request, sociallogin) else: return _complete_social_login(request, sociallogin) except ImmediateHttpResponse as e: return e.response def _social_login_redirect(request, sociallogin): next_url = sociallogin.get_redirect_url(request) or "/" return HttpResponseRedirect(next_url) def _complete_social_login(request, sociallogin): if request.user.is_authenticated: get_account_adapter(request).logout(request) if sociallogin.is_existing: # Login existing user ret = _login_social_account(request, sociallogin) else: # New social user ret = _process_signup(request, sociallogin) return ret def complete_social_signup(request, sociallogin): return complete_signup( request, sociallogin.user, app_settings.EMAIL_VERIFICATION, sociallogin.get_redirect_url(request), signal_kwargs={"sociallogin": sociallogin}, ) def socialaccount_user_display(socialaccount): func = app_settings.SOCIALACCOUNT_STR if not func: return user_display(socialaccount.user) return func(socialaccount) django-allauth-0.58.2/allauth/socialaccount/migrations/000077500000000000000000000000001452212273200231355ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/migrations/0001_initial.py000066400000000000000000000145401452212273200256040ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.conf import settings from django.db import migrations, models from allauth import app_settings from allauth.socialaccount.providers import registry class Migration(migrations.Migration): dependencies = ( [ ("sites", "0001_initial"), ] if app_settings.SITES_ENABLED else [] ) + [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name="SocialAccount", fields=[ ( "id", models.AutoField( verbose_name="ID", serialize=False, auto_created=True, primary_key=True, ), ), ( "provider", models.CharField( max_length=30, verbose_name="provider", choices=registry.as_choices(), ), ), ( "uid", models.CharField( max_length=getattr( settings, "SOCIALACCOUNT_UID_MAX_LENGTH", 191 ), verbose_name="uid", ), ), ( "last_login", models.DateTimeField(auto_now=True, verbose_name="last login"), ), ( "date_joined", models.DateTimeField(auto_now_add=True, verbose_name="date joined"), ), ( "extra_data", models.TextField(default="{}", verbose_name="extra data"), ), ( "user", models.ForeignKey( to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE ), ), ], options={ "verbose_name": "social account", "verbose_name_plural": "social accounts", }, bases=(models.Model,), ), migrations.CreateModel( name="SocialApp", fields=[ ( "id", models.AutoField( verbose_name="ID", serialize=False, auto_created=True, primary_key=True, ), ), ( "provider", models.CharField( max_length=30, verbose_name="provider", choices=registry.as_choices(), ), ), ("name", models.CharField(max_length=40, verbose_name="name")), ( "client_id", models.CharField( help_text="App ID, or consumer key", max_length=100, verbose_name="client id", ), ), ( "secret", models.CharField( help_text="API secret, client secret, or consumer secret", max_length=100, verbose_name="secret key", ), ), ( "key", models.CharField( help_text="Key", max_length=100, verbose_name="key", blank=True, ), ), ] + ( [ ("sites", models.ManyToManyField(to="sites.Site", blank=True)), ] if app_settings.SITES_ENABLED else [] ), options={ "verbose_name": "social application", "verbose_name_plural": "social applications", }, bases=(models.Model,), ), migrations.CreateModel( name="SocialToken", fields=[ ( "id", models.AutoField( verbose_name="ID", serialize=False, auto_created=True, primary_key=True, ), ), ( "token", models.TextField( help_text='"oauth_token" (OAuth1) or access token (OAuth2)', verbose_name="token", ), ), ( "token_secret", models.TextField( help_text='"oauth_token_secret" (OAuth1) or refresh token (OAuth2)', verbose_name="token secret", blank=True, ), ), ( "expires_at", models.DateTimeField( null=True, verbose_name="expires at", blank=True ), ), ( "account", models.ForeignKey( to="socialaccount.SocialAccount", on_delete=models.CASCADE, ), ), ( "app", models.ForeignKey( to="socialaccount.SocialApp", on_delete=models.CASCADE ), ), ], options={ "verbose_name": "social application token", "verbose_name_plural": "social application tokens", }, bases=(models.Model,), ), migrations.AlterUniqueTogether( name="socialtoken", unique_together=set([("app", "account")]), ), migrations.AlterUniqueTogether( name="socialaccount", unique_together=set([("provider", "uid")]), ), ] django-allauth-0.58.2/allauth/socialaccount/migrations/0002_token_max_lengths.py000066400000000000000000000025751452212273200276720ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ("socialaccount", "0001_initial"), ] operations = [ migrations.AlterField( model_name="socialaccount", name="uid", field=models.CharField( max_length=getattr(settings, "SOCIALACCOUNT_UID_MAX_LENGTH", 191), verbose_name="uid", ), ), migrations.AlterField( model_name="socialapp", name="client_id", field=models.CharField( help_text="App ID, or consumer key", max_length=191, verbose_name="client id", ), ), migrations.AlterField( model_name="socialapp", name="key", field=models.CharField( help_text="Key", max_length=191, verbose_name="key", blank=True ), ), migrations.AlterField( model_name="socialapp", name="secret", field=models.CharField( help_text="API secret, client secret, or consumer secret", max_length=191, verbose_name="secret key", blank=True, ), ), ] django-allauth-0.58.2/allauth/socialaccount/migrations/0003_extra_data_default_dict.py000066400000000000000000000007361452212273200310020ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ("socialaccount", "0002_token_max_lengths"), ] operations = [ migrations.AlterField( model_name="socialaccount", name="extra_data", field=models.TextField(default="{}", verbose_name="extra data"), preserve_default=True, ), ] django-allauth-0.58.2/allauth/socialaccount/migrations/0004_app_provider_id_settings.py000066400000000000000000000014751452212273200312470ustar00rootroot00000000000000# Generated by Django 3.2.19 on 2023-06-30 13:16 from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ("socialaccount", "0003_extra_data_default_dict"), ] operations = [ migrations.AddField( model_name="socialapp", name="provider_id", field=models.CharField( blank=True, max_length=200, verbose_name="provider ID" ), ), migrations.AddField( model_name="socialapp", name="settings", field=models.JSONField(blank=True, default=dict), ), migrations.AlterField( model_name="socialaccount", name="provider", field=models.CharField(max_length=200, verbose_name="provider"), ), ] django-allauth-0.58.2/allauth/socialaccount/migrations/0005_socialtoken_nullable_app.py000066400000000000000000000011251452212273200312030ustar00rootroot00000000000000# Generated by Django 3.2.20 on 2023-09-03 19:46 import django.db.models.deletion from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ("socialaccount", "0004_app_provider_id_settings"), ] operations = [ migrations.AlterField( model_name="socialtoken", name="app", field=models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="socialaccount.socialapp", ), ), ] django-allauth-0.58.2/allauth/socialaccount/migrations/0006_alter_socialaccount_extra_data.py000066400000000000000000000006631452212273200323730ustar00rootroot00000000000000# Generated by Django 3.2.20 on 2023-10-11 09:23 from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ("socialaccount", "0005_socialtoken_nullable_app"), ] operations = [ migrations.AlterField( model_name="socialaccount", name="extra_data", field=models.JSONField(default=dict, verbose_name="extra data"), ), ] django-allauth-0.58.2/allauth/socialaccount/migrations/__init__.py000066400000000000000000000000001452212273200252340ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/models.py000066400000000000000000000325071452212273200226250ustar00rootroot00000000000000from django.conf import settings from django.contrib.auth import authenticate, get_user_model from django.contrib.sites.shortcuts import get_current_site from django.core.exceptions import PermissionDenied from django.db import models from django.utils.crypto import get_random_string from django.utils.translation import gettext_lazy as _ import allauth.app_settings from allauth.account.models import EmailAddress from allauth.account.utils import ( filter_users_by_email, get_next_redirect_url, setup_user_email, ) from allauth.core import context from allauth.socialaccount import signals from ..utils import get_request_param from . import app_settings, providers from .adapter import get_adapter class SocialAppManager(models.Manager): def on_site(self, request): if allauth.app_settings.SITES_ENABLED: site = get_current_site(request) return self.filter(sites__id=site.id) return self.all() class SocialApp(models.Model): objects = SocialAppManager() # The provider type, e.g. "google", "telegram", "saml". provider = models.CharField( verbose_name=_("provider"), max_length=30, choices=providers.registry.as_choices(), ) # For providers that support subproviders, such as OpenID Connect and SAML, # this ID identifies that instance. SocialAccount's originating from app # will have their `provider` field set to the `provider_id` if available, # else `provider`. provider_id = models.CharField( verbose_name=_("provider ID"), max_length=200, blank=True, ) name = models.CharField(verbose_name=_("name"), max_length=40) client_id = models.CharField( verbose_name=_("client id"), max_length=191, help_text=_("App ID, or consumer key"), ) secret = models.CharField( verbose_name=_("secret key"), max_length=191, blank=True, help_text=_("API secret, client secret, or consumer secret"), ) key = models.CharField( verbose_name=_("key"), max_length=191, blank=True, help_text=_("Key") ) settings = models.JSONField(default=dict, blank=True) if allauth.app_settings.SITES_ENABLED: # Most apps can be used across multiple domains, therefore we use # a ManyToManyField. Note that Facebook requires an app per domain # (unless the domains share a common base name). # blank=True allows for disabling apps without removing them sites = models.ManyToManyField("sites.Site", blank=True) class Meta: verbose_name = _("social application") verbose_name_plural = _("social applications") def __str__(self): return self.name def get_provider(self, request): provider_class = providers.registry.get_class(self.provider) return provider_class(request=request, app=self) class SocialAccount(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) # Given a `SocialApp` from which this account originates, this field equals # the app's `app.provider_id` if available, `app.provider` otherwise. provider = models.CharField( verbose_name=_("provider"), max_length=200, ) # Just in case you're wondering if an OpenID identity URL is going # to fit in a 'uid': # # Ideally, URLField(max_length=1024, unique=True) would be used # for identity. However, MySQL has a max_length limitation of 191 # for URLField (in case of utf8mb4). How about # models.TextField(unique=True) then? Well, that won't work # either for MySQL due to another bug[1]. So the only way out # would be to drop the unique constraint, or switch to shorter # identity URLs. Opted for the latter, as [2] suggests that # identity URLs are supposed to be short anyway, at least for the # old spec. # # [1] http://code.djangoproject.com/ticket/2495. # [2] http://openid.net/specs/openid-authentication-1_1.html#limits uid = models.CharField( verbose_name=_("uid"), max_length=app_settings.UID_MAX_LENGTH ) last_login = models.DateTimeField(verbose_name=_("last login"), auto_now=True) date_joined = models.DateTimeField(verbose_name=_("date joined"), auto_now_add=True) extra_data = models.JSONField(verbose_name=_("extra data"), default=dict) class Meta: unique_together = ("provider", "uid") verbose_name = _("social account") verbose_name_plural = _("social accounts") def authenticate(self): return authenticate(account=self) def __str__(self): from .helpers import socialaccount_user_display return socialaccount_user_display(self) def get_profile_url(self): return self.get_provider_account().get_profile_url() def get_avatar_url(self): return self.get_provider_account().get_avatar_url() def get_provider(self, request=None): provider = getattr(self, "_provider", None) if provider: return provider adapter = get_adapter() provider = self._provider = adapter.get_provider( request, provider=self.provider ) return provider def get_provider_account(self): return self.get_provider().wrap_account(self) class SocialToken(models.Model): app = models.ForeignKey(SocialApp, on_delete=models.SET_NULL, blank=True, null=True) account = models.ForeignKey(SocialAccount, on_delete=models.CASCADE) token = models.TextField( verbose_name=_("token"), help_text=_('"oauth_token" (OAuth1) or access token (OAuth2)'), ) token_secret = models.TextField( blank=True, verbose_name=_("token secret"), help_text=_('"oauth_token_secret" (OAuth1) or refresh token (OAuth2)'), ) expires_at = models.DateTimeField( blank=True, null=True, verbose_name=_("expires at") ) class Meta: unique_together = ("app", "account") verbose_name = _("social application token") verbose_name_plural = _("social application tokens") def __str__(self): return self.token class SocialLogin(object): """ Represents a social user that is in the process of being logged in. This consists of the following information: `account` (`SocialAccount` instance): The social account being logged in. Providers are not responsible for checking whether or not an account already exists or not. Therefore, a provider typically creates a new (unsaved) `SocialAccount` instance. The `User` instance pointed to by the account (`account.user`) may be prefilled by the provider for use as a starting point later on during the signup process. `token` (`SocialToken` instance): An optional access token token that results from performing a successful authentication handshake. `state` (`dict`): The state to be preserved during the authentication handshake. Note that this state may end up in the url -- do not put any secrets in here. It currently only contains the url to redirect to after login. `email_addresses` (list of `EmailAddress`): Optional list of email addresses retrieved from the provider. """ def __init__(self, user=None, account=None, token=None, email_addresses=[]): if token: assert token.account is None or token.account == account self.token = token self.user = user self.account = account self.email_addresses = email_addresses self.state = {} def connect(self, request, user): self.user = user self.save(request, connect=True) signals.social_account_added.send( sender=SocialLogin, request=request, sociallogin=self ) def serialize(self): serialize_instance = get_adapter().serialize_instance ret = dict( account=serialize_instance(self.account), user=serialize_instance(self.user), state=self.state, email_addresses=[serialize_instance(ea) for ea in self.email_addresses], ) if self.token: ret["token"] = serialize_instance(self.token) return ret @classmethod def deserialize(cls, data): deserialize_instance = get_adapter().deserialize_instance account = deserialize_instance(SocialAccount, data["account"]) user = deserialize_instance(get_user_model(), data["user"]) if "token" in data: token = deserialize_instance(SocialToken, data["token"]) else: token = None email_addresses = [] for ea in data["email_addresses"]: email_address = deserialize_instance(EmailAddress, ea) email_addresses.append(email_address) ret = cls() ret.token = token ret.account = account ret.user = user ret.email_addresses = email_addresses ret.state = data["state"] return ret def save(self, request, connect=False): """ Saves a new account. Note that while the account is new, the user may be an existing one (when connecting accounts) """ user = self.user user.save() self.account.user = user self.account.save() if app_settings.STORE_TOKENS and self.token: self.token.account = self.account self.token.save() if connect: # TODO: Add any new email addresses automatically? pass else: setup_user_email(request, user, self.email_addresses) @property def is_existing(self): """When `False`, this social login represents a temporary account, not yet backed by a database record. """ if self.user.pk is None: return False return get_user_model().objects.filter(pk=self.user.pk).exists() def lookup(self): """Look up the existing local user account to which this social login points, if any. """ if not self._lookup_by_socialaccount(): provider_id = self.account.get_provider().id if app_settings.EMAIL_AUTHENTICATION or app_settings.PROVIDERS.get( provider_id, {} ).get("EMAIL_AUTHENTICATION", False): self._lookup_by_email() def _lookup_by_socialaccount(self): assert not self.is_existing try: a = SocialAccount.objects.get( provider=self.account.provider, uid=self.account.uid ) # Update account a.extra_data = self.account.extra_data self.account = a self.user = self.account.user a.save() signals.social_account_updated.send( sender=SocialLogin, request=context.request, sociallogin=self ) # Update token if app_settings.STORE_TOKENS and self.token: assert not self.token.pk try: t = SocialToken.objects.get( account=self.account, app=self.token.app ) t.token = self.token.token if self.token.token_secret: # only update the refresh token if we got one # many oauth2 providers do not resend the refresh token t.token_secret = self.token.token_secret t.expires_at = self.token.expires_at t.save() self.token = t except SocialToken.DoesNotExist: self.token.account = a self.token.save() return True except SocialAccount.DoesNotExist: pass def _lookup_by_email(self): emails = [e.email for e in self.email_addresses if e.verified] for email in emails: users = filter_users_by_email(email, is_active=True, prefer_verified=True) if users: self.user = users[0] if app_settings.EMAIL_AUTHENTICATION_AUTO_CONNECT: self.connect(context.request, self.user) return def get_redirect_url(self, request): url = self.state.get("next") return url @classmethod def state_from_request(cls, request): state = {} next_url = get_next_redirect_url(request) if next_url: state["next"] = next_url state["process"] = get_request_param(request, "process", "login") state["scope"] = get_request_param(request, "scope", "") state["auth_params"] = get_request_param(request, "auth_params", "") return state @classmethod def stash_state(cls, request): state = cls.state_from_request(request) verifier = get_random_string(16) request.session["socialaccount_state"] = (state, verifier) return verifier @classmethod def unstash_state(cls, request): if "socialaccount_state" not in request.session: raise PermissionDenied() state, verifier = request.session.pop("socialaccount_state") return state @classmethod def verify_and_unstash_state(cls, request, verifier): if "socialaccount_state" not in request.session: raise PermissionDenied() state, verifier2 = request.session.pop("socialaccount_state") if verifier != verifier2: raise PermissionDenied() return state django-allauth-0.58.2/allauth/socialaccount/providers/000077500000000000000000000000001452212273200227765ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/__init__.py000066400000000000000000000037171452212273200251170ustar00rootroot00000000000000import importlib from collections import OrderedDict from django.apps import apps from django.conf import settings from allauth.utils import import_attribute class ProviderRegistry(object): def __init__(self): self.provider_map = OrderedDict() self.loaded = False def get_class_list(self): self.load() return list(self.provider_map.values()) def register(self, cls): self.provider_map[cls.id] = cls def get_class(self, id): return self.provider_map.get(id) def as_choices(self): self.load() for provider_cls in self.provider_map.values(): yield (provider_cls.id, provider_cls.name) def load(self): # TODO: Providers register with the provider registry when # loaded. Here, we build the URLs for all registered providers. So, we # really need to be sure all providers did register, which is why we're # forcefully importing the `provider` modules here. The overall # mechanism is way to magical and depends on the import order et al, so # all of this really needs to be revisited. if not self.loaded: for app_config in apps.get_app_configs(): try: provider_module = importlib.import_module( app_config.name + ".provider" ) except ImportError: pass else: provider_settings = getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) for cls in getattr(provider_module, "provider_classes", []): provider_class = provider_settings.get(cls.id, {}).get( "provider_class" ) if provider_class: cls = import_attribute(provider_class) self.register(cls) self.loaded = True registry = ProviderRegistry() django-allauth-0.58.2/allauth/socialaccount/providers/agave/000077500000000000000000000000001452212273200240615ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/agave/__init__.py000066400000000000000000000000001452212273200261600ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/agave/provider.py000066400000000000000000000020771452212273200262730ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class AgaveAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("web_url", "dflt") def get_avatar_url(self): return self.account.extra_data.get("avatar_url", "dflt") def to_str(self): dflt = super(AgaveAccount, self).to_str() return self.account.extra_data.get("name", dflt) class AgaveProvider(OAuth2Provider): id = "agave" name = "Agave" account_class = AgaveAccount def extract_uid(self, data): return str(data.get("create_time")) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username", ""), name=( (data.get("first_name", "") + " " + data.get("last_name", "")).strip() ), ) def get_default_scope(self): scope = ["PRODUCTION"] return scope provider_classes = [AgaveProvider] django-allauth-0.58.2/allauth/socialaccount/providers/agave/tests.py000066400000000000000000000014661452212273200256040ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import AgaveProvider class AgaveTests(OAuth2TestsMixin, TestCase): provider_id = AgaveProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "status": "success", "message": "User details retrieved successfully.", "version": "2.0.0-SNAPSHOT-rc3fad", "result": { "first_name": "John", "last_name": "Doe", "full_name": "John Doe", "email": "jon@doe.edu", "phone": "", "mobile_phone": "", "status": "Active", "create_time": "20180322043812Z", "username": "jdoe" } } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/agave/urls.py000066400000000000000000000003101452212273200254120ustar00rootroot00000000000000from allauth.socialaccount.providers.agave.provider import AgaveProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(AgaveProvider) django-allauth-0.58.2/allauth/socialaccount/providers/agave/views.py000066400000000000000000000023651452212273200255760ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.agave.provider import AgaveProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class AgaveAdapter(OAuth2Adapter): provider_id = AgaveProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("API_URL", "https://public.agaveapi.co") access_token_url = "{0}/token".format(provider_base_url) authorize_url = "{0}/authorize".format(provider_base_url) profile_url = "{0}/profiles/v2/me".format(provider_base_url) def complete_login(self, request, app, token, response): extra_data = requests.get( self.profile_url, params={"access_token": token.token}, headers={ "Authorization": "Bearer " + token.token, }, ) user_profile = ( extra_data.json()["result"] if "result" in extra_data.json() else {} ) return self.get_provider().sociallogin_from_response(request, user_profile) oauth2_login = OAuth2LoginView.adapter_view(AgaveAdapter) oauth2_callback = OAuth2CallbackView.adapter_view(AgaveAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/amazon/000077500000000000000000000000001452212273200242635ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/amazon/__init__.py000066400000000000000000000000001452212273200263620ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/amazon/provider.py000066400000000000000000000017221452212273200264710ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class AmazonAccount(ProviderAccount): def to_str(self): return self.account.extra_data.get("name", super(AmazonAccount, self).to_str()) class AmazonProvider(OAuth2Provider): id = "amazon" name = "Amazon" account_class = AmazonAccount def get_default_scope(self): return ["profile"] def extract_uid(self, data): return str(data["user_id"]) def extract_common_fields(self, data): # Hackish way of splitting the fullname. # Assumes no middlenames. name = data.get("name", "") first_name, last_name = name, "" if name and " " in name: first_name, last_name = name.split(" ", 1) return dict( email=data.get("email", ""), last_name=last_name, first_name=first_name ) provider_classes = [AmazonProvider] django-allauth-0.58.2/allauth/socialaccount/providers/amazon/tests.py000066400000000000000000000011041452212273200257730ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import AmazonProvider class AmazonTests(OAuth2TestsMixin, TestCase): provider_id = AmazonProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "Profile":{ "CustomerId":"amzn1.account.K2LI23KL2LK2", "Name":"John Doe", "PrimaryEmail":"johndoe@example.com" } }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/amazon/urls.py000066400000000000000000000002461452212273200256240ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import AmazonProvider urlpatterns = default_urlpatterns(AmazonProvider) django-allauth-0.58.2/allauth/socialaccount/providers/amazon/views.py000066400000000000000000000021341452212273200257720ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import AmazonProvider class AmazonOAuth2Adapter(OAuth2Adapter): provider_id = AmazonProvider.id access_token_url = "https://api.amazon.com/auth/o2/token" authorize_url = "http://www.amazon.com/ap/oa" profile_url = "https://api.amazon.com/user/profile" supports_state = False def complete_login(self, request, app, token, **kwargs): response = requests.get(self.profile_url, params={"access_token": token}) extra_data = response.json() if "Profile" in extra_data: extra_data = { "user_id": extra_data["Profile"]["CustomerId"], "name": extra_data["Profile"]["Name"], "email": extra_data["Profile"]["PrimaryEmail"], } return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(AmazonOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(AmazonOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/amazon_cognito/000077500000000000000000000000001452212273200260055ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/amazon_cognito/__init__.py000066400000000000000000000000001452212273200301040ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/amazon_cognito/provider.py000066400000000000000000000050501452212273200302110ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.amazon_cognito.utils import ( convert_to_python_bool_if_value_is_json_string_bool, ) from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class AmazonCognitoAccount(ProviderAccount): def to_str(self): dflt = super(AmazonCognitoAccount, self).to_str() return self.account.extra_data.get("username", dflt) def get_avatar_url(self): return self.account.extra_data.get("picture") def get_profile_url(self): return self.account.extra_data.get("profile") class AmazonCognitoProvider(OAuth2Provider): id = "amazon_cognito" name = "Amazon Cognito" account_class = AmazonCognitoAccount def extract_uid(self, data): return str(data["sub"]) def extract_common_fields(self, data): return { "email": data.get("email"), "first_name": data.get("given_name"), "last_name": data.get("family_name"), } def get_default_scope(self): return ["openid", "profile", "email"] def extract_email_addresses(self, data): email = data.get("email") verified = convert_to_python_bool_if_value_is_json_string_bool( data.get("email_verified", False) ) return ( [EmailAddress(email=email, verified=verified, primary=True)] if email else [] ) def extract_extra_data(self, data): return { "address": data.get("address"), "birthdate": data.get("birthdate"), "gender": data.get("gender"), "locale": data.get("locale"), "middlename": data.get("middlename"), "nickname": data.get("nickname"), "phone_number": data.get("phone_number"), "phone_number_verified": convert_to_python_bool_if_value_is_json_string_bool( data.get("phone_number_verified") ), "picture": data.get("picture"), "preferred_username": data.get("preferred_username"), "profile": data.get("profile"), "website": data.get("website"), "zoneinfo": data.get("zoneinfo"), } @classmethod def get_slug(cls): # IMPORTANT: Amazon Cognito does not support `_` characters # as part of their redirect URI. return super(AmazonCognitoProvider, cls).get_slug().replace("_", "-") provider_classes = [AmazonCognitoProvider] django-allauth-0.58.2/allauth/socialaccount/providers/amazon_cognito/tests.py000066400000000000000000000051521452212273200275240ustar00rootroot00000000000000import json from django.test import override_settings import pytest from allauth.account.models import EmailAddress from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.providers.amazon_cognito.provider import ( AmazonCognitoProvider, ) from allauth.socialaccount.providers.amazon_cognito.utils import ( convert_to_python_bool_if_value_is_json_string_bool, ) from allauth.socialaccount.providers.amazon_cognito.views import ( AmazonCognitoOAuth2Adapter, ) from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase def _get_mocked_claims(): return { "sub": "4993b410-8a1b-4c36-b843-a9c1a697e6b7", "given_name": "John", "family_name": "Doe", "email": "jdoe@example.com", "username": "johndoe", } @override_settings( SOCIALACCOUNT_PROVIDERS={ "amazon_cognito": {"DOMAIN": "https://domain.auth.us-east-1.amazoncognito.com"} } ) class AmazonCognitoTestCase(OAuth2TestsMixin, TestCase): provider_id = AmazonCognitoProvider.id def get_mocked_response(self): mocked_payload = json.dumps(_get_mocked_claims()) return MockedResponse(status_code=200, content=mocked_payload) @override_settings(SOCIALACCOUNT_PROVIDERS={"amazon_cognito": {}}) def test_oauth2_adapter_raises_if_domain_settings_is_missing( self, ): mocked_response = self.get_mocked_response() with self.assertRaises( ValueError, msg=AmazonCognitoOAuth2Adapter.DOMAIN_KEY_MISSING_ERROR, ): self.login(mocked_response) def test_saves_email_as_verified_if_email_is_verified_in_cognito( self, ): mocked_claims = _get_mocked_claims() mocked_claims["email_verified"] = True mocked_payload = json.dumps(mocked_claims) mocked_response = MockedResponse(status_code=200, content=mocked_payload) self.login(mocked_response) user_id = SocialAccount.objects.get(uid=mocked_claims["sub"]).user_id email_address = EmailAddress.objects.get(user_id=user_id) self.assertEqual(email_address.email, mocked_claims["email"]) self.assertTrue(email_address.verified) def test_provider_slug_replaces_underscores_with_hyphens(self): self.assertTrue("_" not in self.provider.get_slug()) @pytest.mark.parametrize( "input,output", [ (True, True), ("true", True), ("false", False), (False, False), ], ) def test_convert_bool(input, output): assert convert_to_python_bool_if_value_is_json_string_bool(input) == output django-allauth-0.58.2/allauth/socialaccount/providers/amazon_cognito/urls.py000066400000000000000000000003521452212273200273440ustar00rootroot00000000000000from allauth.socialaccount.providers.amazon_cognito.provider import ( AmazonCognitoProvider, ) from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(AmazonCognitoProvider) django-allauth-0.58.2/allauth/socialaccount/providers/amazon_cognito/utils.py000066400000000000000000000002361452212273200275200ustar00rootroot00000000000000def convert_to_python_bool_if_value_is_json_string_bool(s): if s == "true": return True elif s == "false": return False return s django-allauth-0.58.2/allauth/socialaccount/providers/amazon_cognito/views.py000066400000000000000000000030731452212273200275170ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.amazon_cognito.provider import ( AmazonCognitoProvider, ) from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class AmazonCognitoOAuth2Adapter(OAuth2Adapter): provider_id = AmazonCognitoProvider.id DOMAIN_KEY_MISSING_ERROR = ( '"DOMAIN" key is missing in Amazon Cognito configuration.' ) @property def settings(self): return app_settings.PROVIDERS.get(self.provider_id, {}) @property def domain(self): domain = self.settings.get("DOMAIN") if domain is None: raise ValueError(self.DOMAIN_KEY_MISSING_ERROR) return domain @property def access_token_url(self): return "{}/oauth2/token".format(self.domain) @property def authorize_url(self): return "{}/oauth2/authorize".format(self.domain) @property def profile_url(self): return "{}/oauth2/userInfo".format(self.domain) def complete_login(self, request, app, access_token, **kwargs): headers = { "Authorization": "Bearer {}".format(access_token), } extra_data = requests.get(self.profile_url, headers=headers) extra_data.raise_for_status() return self.get_provider().sociallogin_from_response(request, extra_data.json()) oauth2_login = OAuth2LoginView.adapter_view(AmazonCognitoOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(AmazonCognitoOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/angellist/000077500000000000000000000000001452212273200247605ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/angellist/__init__.py000066400000000000000000000000001452212273200270570ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/angellist/provider.py000066400000000000000000000016431452212273200271700ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class AngelListAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("angellist_url") def get_avatar_url(self): return self.account.extra_data.get("image") def to_str(self): dflt = super(AngelListAccount, self).to_str() return self.account.extra_data.get("name", dflt) class AngelListProvider(OAuth2Provider): id = "angellist" name = "AngelList" account_class = AngelListAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("angellist_url").split("/")[-1], name=data.get("name"), ) provider_classes = [AngelListProvider] django-allauth-0.58.2/allauth/socialaccount/providers/angellist/tests.py000066400000000000000000000015701452212273200264770ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import AngelListProvider class AngelListTests(OAuth2TestsMixin, TestCase): provider_id = AngelListProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"name":"pennersr","id":424732,"bio":"","follower_count":0, "angellist_url":"https://angel.co/dsxtst", "image":"https://angel.co/images/shared/nopic.png", "email":"raymond.penners@example.com","blog_url":null, "online_bio_url":null,"twitter_url":"https://twitter.com/dsxtst", "facebook_url":null,"linkedin_url":null,"aboutme_url":null, "github_url":null,"dribbble_url":null,"behance_url":null, "what_ive_built":null,"locations":[],"roles":[],"skills":[], "investor":false,"scopes":["message","talent","dealflow","comment", "email"]} """, ) django-allauth-0.58.2/allauth/socialaccount/providers/angellist/urls.py000066400000000000000000000002541452212273200263200ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import AngelListProvider urlpatterns = default_urlpatterns(AngelListProvider) django-allauth-0.58.2/allauth/socialaccount/providers/angellist/views.py000066400000000000000000000015431452212273200264720ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import AngelListProvider class AngelListOAuth2Adapter(OAuth2Adapter): provider_id = AngelListProvider.id access_token_url = "https://angel.co/api/oauth/token/" authorize_url = "https://angel.co/api/oauth/authorize/" profile_url = "https://api.angel.co/1/me/" supports_state = False def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(AngelListOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(AngelListOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/apple/000077500000000000000000000000001452212273200240775ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/apple/__init__.py000066400000000000000000000000001452212273200261760ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/apple/apple_session.py000066400000000000000000000003411452212273200273130ustar00rootroot00000000000000from allauth.socialaccount.sessions import LoginSession APPLE_SESSION_COOKIE_NAME = "apple-login-session" def get_apple_session(request): return LoginSession(request, "apple_login_session", APPLE_SESSION_COOKIE_NAME) django-allauth-0.58.2/allauth/socialaccount/providers/apple/client.py000066400000000000000000000064511452212273200257350ustar00rootroot00000000000000import requests from datetime import datetime, timedelta from urllib.parse import parse_qsl, quote, urlencode from django.core.exceptions import ImproperlyConfigured import jwt from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.providers.oauth2.client import ( OAuth2Client, OAuth2Error, ) def jwt_encode(*args, **kwargs): resp = jwt.encode(*args, **kwargs) if isinstance(resp, bytes): # For PyJWT <2 resp = resp.decode("utf-8") return resp class Scope(object): EMAIL = "email" NAME = "name" class AppleOAuth2Client(OAuth2Client): """ Custom client because `Sign In With Apple`: * requires `response_mode` field in redirect_url * requires special `client_secret` as JWT """ def generate_client_secret(self): """Create a JWT signed with an apple provided private key""" now = datetime.utcnow() app = get_adapter(self.request).get_app(self.request, "apple") if not app.key: raise ImproperlyConfigured("Apple 'key' missing") certificate_key = app.settings.get("certificate_key") if not certificate_key: raise ImproperlyConfigured("Apple 'certificate_key' missing") claims = { "iss": app.key, "aud": "https://appleid.apple.com", "sub": self.get_client_id(), "iat": now, "exp": now + timedelta(hours=1), } headers = {"kid": self.consumer_secret, "alg": "ES256"} client_secret = jwt_encode( payload=claims, key=certificate_key, algorithm="ES256", headers=headers ) return client_secret def get_client_id(self): """We support multiple client_ids, but use the first one for api calls""" return self.consumer_key.split(",")[0] def get_access_token(self, code, pkce_code_verifier=None): url = self.access_token_url client_secret = self.generate_client_secret() data = { "client_id": self.get_client_id(), "code": code, "grant_type": "authorization_code", "redirect_uri": self.callback_url, "client_secret": client_secret, } if pkce_code_verifier: data["code_verifier"] = pkce_code_verifier self._strip_empty_keys(data) resp = requests.request( self.access_token_method, url, data=data, headers=self.headers ) access_token = None if resp.status_code in [200, 201]: try: access_token = resp.json() except ValueError: access_token = dict(parse_qsl(resp.text)) if not access_token or "access_token" not in access_token: raise OAuth2Error("Error retrieving access token: %s" % resp.content) return access_token def get_redirect_url(self, authorization_url, extra_params): params = { "client_id": self.get_client_id(), "redirect_uri": self.callback_url, "response_mode": "form_post", "scope": self.scope, "response_type": "code id_token", } if self.state: params["state"] = self.state params.update(extra_params) return "%s?%s" % (authorization_url, urlencode(params, quote_via=quote)) django-allauth-0.58.2/allauth/socialaccount/providers/apple/provider.py000066400000000000000000000025441452212273200263100ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.app_settings import QUERY_EMAIL from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class AppleProvider(OAuth2Provider): id = "apple" name = "Apple" account_class = ProviderAccount def extract_uid(self, data): return str(data["sub"]) def extract_common_fields(self, data): fields = {"email": data.get("email")} # If the name was provided name = data.get("name") if name: fields["first_name"] = name.get("firstName", "") fields["last_name"] = name.get("lastName", "") return fields def extract_email_addresses(self, data): ret = [] email = data.get("email") verified = data.get("email_verified") if isinstance(verified, str): verified = verified.lower() == "true" if email: ret.append( EmailAddress( email=email, verified=verified, primary=True, ) ) return ret def get_default_scope(self): scopes = ["name"] if QUERY_EMAIL: scopes.append("email") return scopes provider_classes = [AppleProvider] django-allauth-0.58.2/allauth/socialaccount/providers/apple/tests.py000066400000000000000000000220651452212273200256200ustar00rootroot00000000000000import json from datetime import datetime, timedelta from importlib import import_module from urllib.parse import parse_qs, urlparse from django.conf import settings from django.test.utils import override_settings from django.urls import reverse from django.utils.http import urlencode import jwt from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase, mocked_response from .apple_session import APPLE_SESSION_COOKIE_NAME from .client import jwt_encode from .provider import AppleProvider # Generated on https://mkjwk.org/, used to sign and verify the apple id_token TESTING_JWT_KEYSET = { "p": ( "4ADzS5jKx_kdQihyOocVS0Qwwo7m0f7Ow56EadySJ-cmnwoHHF3AxgRaq-h-KwybSphv" "dc-X7NbS79-b9dumHKyt1MeVLAsDZD1a-uQCEneY1g9LsQkscNr7OggcpvMg5UUFwv6A" "kavu8cB0iyhNdha5_AWX27K5lNebvpaXEJ8" ), "kty": "RSA", "q": ( "yy5UvMjrvZyO1Os_nxXIugCa3NyWOkC8oMppPvr1Bl5AnF_xwXN2n9ozPd9Nb3Q3n-om" "NgLayyUxhwIjWDlI67Vbx-ESuff8ZEBKuTK0Gdmr4C_QU_j0gvvNMNJweSPxDdRmIUgO" "njTVNWmdqFTZs43jXAT4J519rgveNLAkGNE" ), "d": ( "riPuGIDde88WS03CVbo_mZ9toFWPyTxvuz8VInJ9S1ZxULo-hQWDBohWGYwvg8cgfXck" "cqWt5OBqNvPYdLgwb84uVi2JeEHmhcQSc_x0zfRTau5HVE2KdR-gWxQjPWoaBHeDVqwo" "PKaU2XYxa-gYDXcuSJWHz3BX13oInDEFCXr6VwiLiwLBFsb63EEHwyWXJbTpoar7AARW" "kz76qtngDkk4t9gk_Q0L1y1qf1GeWiAL7xWb-bdptma4-1ui-R2219-1ONEZ41v_jsIS" "_z8ooXmVCbUsHV4Z1UDpRvpORVE3u57WK3qXUdAtZsXjaIwkdItbDmL1jFUgefwfO91Y" "YQ" ), "e": "AQAB", "use": "sig", "kid": "testkey", "qi": ( "R0Hu4YmpHzw3SKWGYuAcAo6B97-JlN2fXiTjZ2g8eHGQX7LSoKEu0Hmu5hcBZYSgOuor" "IPsPUu3mNtx3pjLMOaJRk34VwcYu7h23ogEKGcPUt1c4tTotFDdw8WFptDOw4ow31Tml" "BPExLqzzGjJeQSNULB1bExuuhYMWx6wBXo8" ), "dp": ( "WBaHlnbjZ3hDVTzqjrGIYizSr-_aPUJitPKlR6wBncd8nJYo7bLAmB4mOewXkX5HozIG" "wuF78RsZoFLi1fAmhqgxQ7eopcU-9DBcksUPO4vkgmlJbrkYzNiQauW9vrllekOGXIQQ" "szhVoqP4MLEMpR-Sy9S3PyItcKbJDE3T4ik" ), "alg": "RS256", "dq": ( "Ar5kbIw2CsBzeVKX8FkF9eUOMk9URAMdyPoSw8P1zRk2vCXbiOY7Qttad8ptLEUgfytV" "SsNtGvMsoQsZWRak8nHnhGJ4s0QzB1OK7sdNgU_cL1HV-VxSSPaHhdJBrJEcrzggDPEB" "KYfDHU6Iz34d1nvjBxoWE8rfqJsGbCW4xxE" ), "n": ( "sclLPioUv4VOcOZWAKoRhcvwIH2jOhoHhSI_Cj5c5zSp7qaK8jCU6T7-GObsgrhpty-k" "26ZuqRdgu9d-62WO8OBGt1e0wxbTh128-nTTrOESHUlV_K1wpJmXOxNpJiybcgzZNbAm" "ACmsHfxZvN9bt7gKPXxf3-_zFAf12PbYMrOionAJ1N_4HxL7fz3xkr5C87Av06QNilIC" "-mA-4n9Eqw_R2DYNpE3RYMdWtwKqBwJC8qs3677RpG9vcc-yZ_97pEiytd2FBJ8uoTwH" "d3DHJB8UVgBSh1kMUpSdoM7HxVzKx732nx6Kusln79LrsfOzrXF4enkfKJYI40-uwT95" "zw" ), } # Mocked version of the test data from https://appleid.apple.com/auth/keys KEY_SERVER_RESP_JSON = json.dumps( { "keys": [ { "kty": TESTING_JWT_KEYSET["kty"], "kid": TESTING_JWT_KEYSET["kid"], "use": TESTING_JWT_KEYSET["use"], "alg": TESTING_JWT_KEYSET["alg"], "n": TESTING_JWT_KEYSET["n"], "e": TESTING_JWT_KEYSET["e"], } ] } ) def sign_id_token(payload): """ Sign a payload as apple normally would for the id_token. """ signing_key = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(TESTING_JWT_KEYSET)) return jwt_encode( payload, signing_key, algorithm="RS256", headers={"kid": TESTING_JWT_KEYSET["kid"]}, ) @override_settings( SOCIALACCOUNT_STORE_TOKENS=False, SOCIALACCOUNT_PROVIDERS={ "apple": { "APP": { "client_id": "app123id", "key": "apple", "secret": "dummy", "settings": { "certificate_key": """-----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg2+Eybl8ojH4wB30C 3/iDkpsrxuPfs3DZ+3nHNghBOpmhRANCAAQSpo1eQ+EpNgQQyQVs/F27dkq3gvAI 28m95JEk26v64YAea5NTH56mru30RDqTKPgRVi5qRu3XGyqy3mdb8gMy -----END PRIVATE KEY----- """, }, } } }, ) class AppleTests(OAuth2TestsMixin, TestCase): provider_id = AppleProvider.id def get_apple_id_token_payload(self): now = datetime.utcnow() return { "iss": "https://appleid.apple.com", "aud": "app123id", # Matches `setup_app` "exp": now + timedelta(hours=1), "iat": now, "sub": "000313.c9720f41e9434e18987a.1218", "at_hash": "CkaUPjk4MJinaAq6Z0tGUA", "email": "test@privaterelay.appleid.com", "email_verified": "true", "is_private_email": "true", "auth_time": 1234345345, # not converted automatically by pyjwt } def get_login_response_json(self, with_refresh_token=True): """ `with_refresh_token` is not optional for apple, so it's ignored. """ id_token = sign_id_token(self.get_apple_id_token_payload()) return json.dumps( { "access_token": "testac", # Matches OAuth2TestsMixin value "expires_in": 3600, "id_token": id_token, "refresh_token": "testrt", # Matches OAuth2TestsMixin value "token_type": "Bearer", } ) def get_mocked_response(self): """ Apple is unusual in that the `id_token` contains all the user info so no profile info request is made. However, it does need the public key verification, so this mocked response is the public key request in order to verify the authenticity of the id_token. """ return MockedResponse( 200, KEY_SERVER_RESP_JSON, {"content-type": "application/json"} ) def get_complete_parameters(self, auth_request_params): """ Add apple specific response parameters which they include in the form_post response. https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/incorporating_sign_in_with_apple_into_other_platforms """ params = super().get_complete_parameters(auth_request_params) params.update( { "id_token": sign_id_token(self.get_apple_id_token_payload()), "user": json.dumps( { "email": "private@appleid.apple.com", "name": { "firstName": "A", "lastName": "B", }, } ), } ) return params def login(self, resp_mock, process="login", with_refresh_token=True): resp = self.client.post( reverse(self.provider.id + "_login") + "?" + urlencode(dict(process=process)) ) p = urlparse(resp["location"]) q = parse_qs(p.query) complete_url = reverse(self.provider.id + "_callback") self.assertGreater(q["redirect_uri"][0].find(complete_url), 0) response_json = self.get_login_response_json( with_refresh_token=with_refresh_token ) with mocked_response( MockedResponse(200, response_json, {"content-type": "application/json"}), resp_mock, ): resp = self.client.post( complete_url, data=self.get_complete_parameters(q), ) assert reverse("apple_finish_callback") in resp.url # Follow the redirect resp = self.client.get(resp.url) return resp def test_authentication_error(self): """Override base test because apple posts errors""" resp = self.client.post( reverse(self.provider.id + "_callback"), data={"error": "misc", "state": "testingstate123"}, ) assert reverse("apple_finish_callback") in resp.url # Follow the redirect resp = self.client.get(resp.url) self.assertTemplateUsed( resp, "socialaccount/authentication_error.%s" % getattr(settings, "ACCOUNT_TEMPLATE_EXTENSION", "html"), ) def test_apple_finish(self): resp = self.login(self.get_mocked_response()) # Check request generating the response finish_url = reverse("apple_finish_callback") self.assertEqual(resp.request["PATH_INFO"], finish_url) self.assertTrue("state" in resp.request["QUERY_STRING"]) self.assertTrue("code" in resp.request["QUERY_STRING"]) # Check have cookie containing apple session self.assertTrue(APPLE_SESSION_COOKIE_NAME in self.client.cookies) # Session should have been cleared apple_session_cookie = self.client.cookies.get(APPLE_SESSION_COOKIE_NAME) engine = import_module(settings.SESSION_ENGINE) SessionStore = engine.SessionStore apple_login_session = SessionStore(apple_session_cookie.value) self.assertEqual(len(apple_login_session.keys()), 0) # Check cookie path was correctly set self.assertEqual(apple_session_cookie.get("path"), finish_url) django-allauth-0.58.2/allauth/socialaccount/providers/apple/urls.py000066400000000000000000000006161452212273200254410ustar00rootroot00000000000000from django.urls import path from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import AppleProvider from .views import oauth2_finish_login urlpatterns = default_urlpatterns(AppleProvider) urlpatterns += [ path( AppleProvider.get_slug() + "/login/callback/finish/", oauth2_finish_login, name="apple_finish_callback", ), ] django-allauth-0.58.2/allauth/socialaccount/providers/apple/views.py000066400000000000000000000145751452212273200256220ustar00rootroot00000000000000import json import requests from datetime import timedelta from django.http import HttpResponseNotAllowed, HttpResponseRedirect from django.urls import reverse from django.utils import timezone from django.utils.http import urlencode from django.views.decorators.csrf import csrf_exempt import jwt from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.models import SocialToken from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from allauth.utils import build_absolute_uri, get_request_param from .apple_session import get_apple_session from .client import AppleOAuth2Client from .provider import AppleProvider class AppleOAuth2Adapter(OAuth2Adapter): client_class = AppleOAuth2Client provider_id = AppleProvider.id access_token_url = "https://appleid.apple.com/auth/token" authorize_url = "https://appleid.apple.com/auth/authorize" public_key_url = "https://appleid.apple.com/auth/keys" def _get_apple_public_key(self, kid): response = requests.get(self.public_key_url) response.raise_for_status() try: data = response.json() except json.JSONDecodeError as e: raise OAuth2Error("Error retrieving apple public key.") from e for d in data["keys"]: if d["kid"] == kid: return d def get_public_key(self, id_token): """ Get the public key which matches the `kid` in the id_token header. """ kid = jwt.get_unverified_header(id_token)["kid"] apple_public_key = self._get_apple_public_key(kid=kid) public_key = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(apple_public_key)) return public_key def get_client_id(self, provider): app = get_adapter().get_app(request=None, provider=self.provider_id) return [aud.strip() for aud in app.client_id.split(",")] def get_verified_identity_data(self, id_token): provider = self.get_provider() allowed_auds = self.get_client_id(provider) try: public_key = self.get_public_key(id_token) identity_data = jwt.decode( id_token, public_key, algorithms=["RS256"], audience=allowed_auds, issuer="https://appleid.apple.com", ) return identity_data except jwt.PyJWTError as e: raise OAuth2Error("Invalid id_token") from e def parse_token(self, data): token = SocialToken( token=data["access_token"], ) token.token_secret = data.get("refresh_token", "") expires_in = data.get(self.expires_in_key) if expires_in: token.expires_at = timezone.now() + timedelta(seconds=int(expires_in)) # `user_data` is a big flat dictionary with the parsed JWT claims # access_tokens, and user info from the apple post. identity_data = self.get_verified_identity_data(data["id_token"]) token.user_data = {**data, **identity_data} return token def complete_login(self, request, app, token, **kwargs): extra_data = token.user_data login = self.get_provider().sociallogin_from_response( request=request, response=extra_data ) login.state["id_token"] = token.user_data # We can safely remove the apple login session now # Note: The cookie will remain, but it's set to delete on browser close get_apple_session(request).delete() return login def get_user_scope_data(self, request): user_scope_data = request.apple_login_session.get("user", "") try: return json.loads(user_scope_data) except json.JSONDecodeError: # We do not care much about user scope data as it maybe blank # so return blank dictionary instead return {} def get_access_token_data(self, request, app, client): """We need to gather the info from the apple specific login""" apple_session = get_apple_session(request) # Exchange `code` code = get_request_param(request, "code") pkce_code_verifier = request.session.pop("pkce_code_verifier", None) access_token_data = client.get_access_token( code, pkce_code_verifier=pkce_code_verifier ) id_token = access_token_data.get("id_token", None) # In case of missing id_token in access_token_data if id_token is None: id_token = apple_session.store.get("id_token") return { **access_token_data, **self.get_user_scope_data(request), "id_token": id_token, } @csrf_exempt def apple_post_callback(request, finish_endpoint_name="apple_finish_callback"): """ Apple uses a `form_post` response type, which due to CORS/Samesite-cookie rules means this request cannot access the request since the session cookie is unavailable. We work around this by storing the apple response in a separate, temporary session and redirecting to a more normal oauth flow. args: finish_endpoint_name (str): The name of a defined URL, which can be overridden in your url configuration if you have more than one callback endpoint. """ if request.method != "POST": return HttpResponseNotAllowed(["POST"]) apple_session = get_apple_session(request) # Add regular OAuth2 params to the URL - reduces the overrides required keys_to_put_in_url = ["code", "state", "error"] url_params = {} for key in keys_to_put_in_url: value = get_request_param(request, key, "") if value: url_params[key] = value # Add other params to the apple_login_session keys_to_save_to_session = ["user", "id_token"] for key in keys_to_save_to_session: apple_session.store[key] = get_request_param(request, key, "") url = build_absolute_uri(request, reverse(finish_endpoint_name)) response = HttpResponseRedirect( "{url}?{query}".format(url=url, query=urlencode(url_params)) ) apple_session.save(response) return response oauth2_login = OAuth2LoginView.adapter_view(AppleOAuth2Adapter) oauth2_callback = apple_post_callback oauth2_finish_login = OAuth2CallbackView.adapter_view(AppleOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/asana/000077500000000000000000000000001452212273200240615ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/asana/__init__.py000066400000000000000000000000001452212273200261600ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/asana/models.py000066400000000000000000000000001452212273200257040ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/asana/provider.py000066400000000000000000000007761452212273200262770ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class AsanaAccount(ProviderAccount): pass class AsanaProvider(OAuth2Provider): id = "asana" name = "Asana" account_class = AsanaAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict(email=data.get("email"), name=data.get("name")) provider_classes = [AsanaProvider] django-allauth-0.58.2/allauth/socialaccount/providers/asana/tests.py000066400000000000000000000010261452212273200255740ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import AsanaProvider class AsanaTests(OAuth2TestsMixin, TestCase): provider_id = AsanaProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"data": {"photo": null, "workspaces": [{"id": 31337, "name": "example.com"}, {"id": 3133777, "name": "Personal Projects"}], "email": "test@example.com", "name": "Test Name", "id": 43748387}}""", ) django-allauth-0.58.2/allauth/socialaccount/providers/asana/urls.py000066400000000000000000000002441452212273200254200ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import AsanaProvider urlpatterns = default_urlpatterns(AsanaProvider) django-allauth-0.58.2/allauth/socialaccount/providers/asana/views.py000066400000000000000000000015141452212273200255710ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import AsanaProvider class AsanaOAuth2Adapter(OAuth2Adapter): provider_id = AsanaProvider.id access_token_url = "https://app.asana.com/-/oauth_token" authorize_url = "https://app.asana.com/-/oauth_authorize" profile_url = "https://app.asana.com/api/1.0/users/me" def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json()["data"] return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(AsanaOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(AsanaOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/auth0/000077500000000000000000000000001452212273200240175ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/auth0/__init__.py000066400000000000000000000000001452212273200261160ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/auth0/provider.py000066400000000000000000000016021452212273200262220ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class Auth0Account(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("picture") def to_str(self): dflt = super(Auth0Account, self).to_str() return self.account.extra_data.get("name", dflt) class Auth0Provider(OAuth2Provider): id = "auth0" name = "Auth0" account_class = Auth0Account def get_default_scope(self): return ["openid", "profile", "email"] def extract_uid(self, data): return str(data["sub"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), name=data.get("name"), ) provider_classes = [Auth0Provider] django-allauth-0.58.2/allauth/socialaccount/providers/auth0/tests.py000066400000000000000000000012631452212273200255350ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.auth0.provider import Auth0Provider from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class Auth0Tests(OAuth2TestsMixin, TestCase): provider_id = Auth0Provider.id def get_mocked_response(self): return MockedResponse( 200, """ { "picture": "https://secure.gravatar.com/avatar/123", "email": "mr.bob@your.Auth0.server.example.com", "id": 2, "sub": 2, "identities": [], "name": "Mr Bob" } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/auth0/urls.py000066400000000000000000000003401452212273200253530ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.auth0.provider import Auth0Provider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(Auth0Provider) django-allauth-0.58.2/allauth/socialaccount/providers/auth0/views.py000066400000000000000000000021001452212273200255170ustar00rootroot00000000000000# -*- coding: utf-8 -*- import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.auth0.provider import Auth0Provider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class Auth0OAuth2Adapter(OAuth2Adapter): provider_id = Auth0Provider.id supports_state = True settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("AUTH0_URL") access_token_url = "{0}/oauth/token".format(provider_base_url) authorize_url = "{0}/authorize".format(provider_base_url) profile_url = "{0}/userinfo".format(provider_base_url) def complete_login(self, request, app, token, response): extra_data = requests.get( self.profile_url, params={"access_token": token.token} ).json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(Auth0OAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(Auth0OAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/authentiq/000077500000000000000000000000001452212273200250005ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/authentiq/__init__.py000066400000000000000000000000001452212273200270770ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/authentiq/provider.py000066400000000000000000000057701452212273200272150ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import AuthAction, ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class Scope(object): NAME = "aq:name" EMAIL = "email" PHONE = "phone" ADDRESS = "address" LOCATION = "aq:location" PUSH = "aq:push" IDENTITY_CLAIMS = frozenset( [ "sub", "name", "given_name", "family_name", "middle_name", "nickname", "preferred_username", "profile", "picture", "website", "email", "email_verified", "gender", "birthdate", "zoneinfo", "locale", "phone_number", "phone_number_verified", "address", "updated_at", "aq:location", ] ) class AuthentiqAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("profile") def get_avatar_url(self): return self.account.extra_data.get("picture") def to_str(self): dflt = super(AuthentiqAccount, self).to_str() return self.account.extra_data.get("name", dflt) class AuthentiqProvider(OAuth2Provider): id = "authentiq" name = "Authentiq" account_class = AuthentiqAccount def get_scope(self, request): scope = set(super(AuthentiqProvider, self).get_scope(request)) scope.add("openid") if Scope.EMAIL in scope: modifiers = "" if app_settings.EMAIL_REQUIRED: modifiers += "r" if app_settings.EMAIL_VERIFICATION: modifiers += "s" if modifiers: scope.add(Scope.EMAIL + "~" + modifiers) scope.remove(Scope.EMAIL) return list(scope) def get_default_scope(self): scope = [Scope.NAME, Scope.PUSH] if app_settings.QUERY_EMAIL: scope.append(Scope.EMAIL) return scope def get_auth_params(self, request, action): ret = super(AuthentiqProvider, self).get_auth_params(request, action) if action == AuthAction.REAUTHENTICATE: ret["prompt"] = "select_account" return ret def extract_uid(self, data): return str(data["sub"]) def extract_common_fields(self, data): return dict( username=data.get("preferred_username", data.get("given_name")), email=data.get("email"), name=data.get("name"), first_name=data.get("given_name"), last_name=data.get("family_name"), ) def extract_extra_data(self, data): return {k: v for k, v in data.items() if k in IDENTITY_CLAIMS} def extract_email_addresses(self, data): ret = [] email = data.get("email") if email and data.get("email_verified"): ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [AuthentiqProvider] django-allauth-0.58.2/allauth/socialaccount/providers/authentiq/tests.py000066400000000000000000000066051452212273200265230ustar00rootroot00000000000000import json from django.test.client import RequestFactory from django.test.utils import override_settings from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import AuthentiqProvider from .views import AuthentiqOAuth2Adapter class AuthentiqTests(OAuth2TestsMixin, TestCase): provider_id = AuthentiqProvider.id def get_mocked_response(self): return MockedResponse( 200, json.dumps( { "sub": "ZLARGMFT1M", "email": "jane@email.invalid", "email_verified": True, "given_name": "Jane", "family_name": "Doe", } ), ) @override_settings( SOCIALACCOUNT_QUERY_EMAIL=False, ) def test_default_scopes_no_email(self): scopes = self.provider.get_default_scope() self.assertIn("aq:name", scopes) self.assertNotIn("email", scopes) @override_settings( SOCIALACCOUNT_QUERY_EMAIL=True, ) def test_default_scopes_email(self): scopes = self.provider.get_default_scope() self.assertIn("aq:name", scopes) self.assertIn("email", scopes) def test_scopes(self): request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url) scopes = self.provider.get_scope(request) self.assertIn("openid", scopes) self.assertIn("aq:name", scopes) def test_dynamic_scopes(self): request = RequestFactory().get( AuthentiqOAuth2Adapter.authorize_url, dict(scope="foo") ) scopes = self.provider.get_scope(request) self.assertIn("openid", scopes) self.assertIn("aq:name", scopes) self.assertIn("foo", scopes) @override_settings( SOCIALACCOUNT_QUERY_EMAIL=True, SOCIALACCOUNT_EMAIL_REQUIRED=True, SOCIALACCOUNT_EMAIL_VERIFICATION=True, ) def test_scopes_required_verified_email(self): request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url) scopes = self.provider.get_scope(request) self.assertIn("email~rs", scopes) self.assertNotIn("email", scopes) @override_settings( SOCIALACCOUNT_QUERY_EMAIL=True, SOCIALACCOUNT_EMAIL_REQUIRED=False, SOCIALACCOUNT_EMAIL_VERIFICATION=True, ) def test_scopes_optional_verified_email(self): request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url) scopes = self.provider.get_scope(request) self.assertIn("email~s", scopes) self.assertNotIn("email", scopes) @override_settings( SOCIALACCOUNT_QUERY_EMAIL=True, SOCIALACCOUNT_EMAIL_REQUIRED=True, SOCIALACCOUNT_EMAIL_VERIFICATION=False, ) def test_scopes_required_email(self): request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url) scopes = self.provider.get_scope(request) self.assertIn("email~r", scopes) self.assertNotIn("email", scopes) @override_settings( SOCIALACCOUNT_QUERY_EMAIL=True, SOCIALACCOUNT_EMAIL_REQUIRED=False, SOCIALACCOUNT_EMAIL_VERIFICATION=False, ) def test_scopes_optional_email(self): request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url) scopes = self.provider.get_scope(request) self.assertIn("email", scopes) django-allauth-0.58.2/allauth/socialaccount/providers/authentiq/urls.py000066400000000000000000000002541452212273200263400ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import AuthentiqProvider urlpatterns = default_urlpatterns(AuthentiqProvider) django-allauth-0.58.2/allauth/socialaccount/providers/authentiq/views.py000066400000000000000000000022751452212273200265150ustar00rootroot00000000000000import requests from urllib.parse import urljoin from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import AuthentiqProvider class AuthentiqOAuth2Adapter(OAuth2Adapter): provider_id = AuthentiqProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) provider_url = settings.get("PROVIDER_URL", "https://connect.authentiq.io/") if not provider_url.endswith("/"): provider_url += "/" access_token_url = urljoin(provider_url, "token") authorize_url = urljoin(provider_url, "authorize") profile_url = urljoin(provider_url, "userinfo") def complete_login(self, request, app, token, **kwargs): auth = {"Authorization": "Bearer " + token.token} resp = requests.get(self.profile_url, headers=auth) resp.raise_for_status() extra_data = resp.json() login = self.get_provider().sociallogin_from_response(request, extra_data) return login oauth2_login = OAuth2LoginView.adapter_view(AuthentiqOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(AuthentiqOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/baidu/000077500000000000000000000000001452212273200240625ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/baidu/__init__.py000066400000000000000000000000001452212273200261610ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/baidu/provider.py000066400000000000000000000016201452212273200262650ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class BaiduAccount(ProviderAccount): def get_profile_url(self): return "http://www.baidu.com/p/" + self.account.extra_data.get("uname") def get_avatar_url(self): return ( "http://tb.himg.baidu.com/sys/portraitn/item/" + self.account.extra_data.get("portrait") ) def to_str(self): dflt = super(BaiduAccount, self).to_str() return self.account.extra_data.get("uname", dflt) class BaiduProvider(OAuth2Provider): id = "baidu" name = "Baidu" account_class = BaiduAccount def extract_uid(self, data): return data["uid"] def extract_common_fields(self, data): return dict(username=data.get("uid"), name=data.get("uname")) provider_classes = [BaiduProvider] django-allauth-0.58.2/allauth/socialaccount/providers/baidu/tests.py000066400000000000000000000006651452212273200256050ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import BaiduProvider class BaiduTests(OAuth2TestsMixin, TestCase): provider_id = BaiduProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"portrait": "78c0e9839de59bbde7859ccf43", "uname": "\u90dd\u56fd\u715c", "uid": "3225892368"}""", ) django-allauth-0.58.2/allauth/socialaccount/providers/baidu/urls.py000066400000000000000000000002441452212273200254210ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import BaiduProvider urlpatterns = default_urlpatterns(BaiduProvider) django-allauth-0.58.2/allauth/socialaccount/providers/baidu/views.py000066400000000000000000000016031452212273200255710ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import BaiduProvider class BaiduOAuth2Adapter(OAuth2Adapter): provider_id = BaiduProvider.id access_token_url = "https://openapi.baidu.com/oauth/2.0/token" authorize_url = "https://openapi.baidu.com/oauth/2.0/authorize" profile_url = ( "https://openapi.baidu.com/rest/2.0/passport/users/getLoggedInUser" # noqa ) def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(BaiduOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(BaiduOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/base/000077500000000000000000000000001452212273200237105ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/base/__init__.py000066400000000000000000000002151452212273200260170ustar00rootroot00000000000000from .constants import AuthAction, AuthError, AuthProcess # noqa from .provider import Provider, ProviderAccount, ProviderException # noqa django-allauth-0.58.2/allauth/socialaccount/providers/base/constants.py000066400000000000000000000005721452212273200263020ustar00rootroot00000000000000class AuthProcess(object): LOGIN = "login" CONNECT = "connect" REDIRECT = "redirect" class AuthAction(object): AUTHENTICATE = "authenticate" REAUTHENTICATE = "reauthenticate" REREQUEST = "rerequest" class AuthError(object): UNKNOWN = "unknown" CANCELLED = "cancelled" # Cancelled on request of user DENIED = "denied" # Denied by server django-allauth-0.58.2/allauth/socialaccount/providers/base/mixins.py000066400000000000000000000013731452212273200255750ustar00rootroot00000000000000from django.shortcuts import render from allauth.account import app_settings as account_app_settings from allauth.socialaccount import app_settings class OAuthLoginMixin: def dispatch(self, request, *args, **kwargs): provider = self.adapter.get_provider() if (not app_settings.LOGIN_ON_GET) and request.method == "GET": return render( request, "socialaccount/login." + account_app_settings.TEMPLATE_EXTENSION, { "provider": provider, "process": request.GET.get("process"), }, ) return self.login(request, *args, **kwargs) def login(self, request, *args, **kwargs): raise NotImplementedError django-allauth-0.58.2/allauth/socialaccount/providers/base/provider.py000066400000000000000000000143651452212273200261250ustar00rootroot00000000000000from django.core.exceptions import ImproperlyConfigured from allauth.socialaccount import app_settings class ProviderException(Exception): pass class Provider(object): slug = None uses_apps = True def __init__(self, request, app=None): self.request = request if self.uses_apps and app is None: raise ValueError("missing: app") self.app = app @classmethod def get_slug(cls): return cls.slug or cls.id def get_login_url(self, request, next=None, **kwargs): """ Builds the URL to redirect to when initiating a login for this provider. """ raise NotImplementedError("get_login_url() for " + self.name) def media_js(self, request): """ Some providers may require extra scripts (e.g. a Facebook connect) """ return "" def wrap_account(self, social_account): return self.account_class(social_account) def get_settings(self): return app_settings.PROVIDERS.get(self.id, {}) def sociallogin_from_response(self, request, response): """ Instantiates and populates a `SocialLogin` model based on the data retrieved in `response`. The method does NOT save the model to the DB. Data for `SocialLogin` will be extracted from `response` with the help of the `.extract_uid()`, `.extract_extra_data()`, `.extract_common_fields()`, and `.extract_email_addresses()` methods. :param request: a Django `HttpRequest` object. :param response: object retrieved via the callback response of the social auth provider. :return: A populated instance of the `SocialLogin` model (unsaved). """ # NOTE: Avoid loading models at top due to registry boot... from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.models import SocialAccount, SocialLogin adapter = get_adapter() uid = self.extract_uid(response) if not isinstance(uid, str): raise ValueError(f"uid must be a string: {repr(uid)}") if len(uid) > app_settings.UID_MAX_LENGTH: raise ImproperlyConfigured( f"SOCIALACCOUNT_UID_MAX_LENGTH too small (<{len(uid)})" ) extra_data = self.extract_extra_data(response) common_fields = self.extract_common_fields(response) socialaccount = SocialAccount( extra_data=extra_data, uid=uid, provider=(self.app.provider_id or self.app.provider) if self.app else self.id, ) email_addresses = self.extract_email_addresses(response) self.cleanup_email_addresses( common_fields.get("email"), email_addresses, email_verified=common_fields.get("email_verified"), ) sociallogin = SocialLogin( account=socialaccount, email_addresses=email_addresses ) user = sociallogin.user = adapter.new_user(request, sociallogin) user.set_unusable_password() adapter.populate_user(request, sociallogin, common_fields) return sociallogin def extract_uid(self, data): """ Extracts the unique user ID from `data` """ raise NotImplementedError( "The provider must implement the `extract_uid()` method" ) def extract_extra_data(self, data): """ Extracts fields from `data` that will be stored in `SocialAccount`'s `extra_data` JSONField. :return: any JSON-serializable Python structure. """ return data def extract_common_fields(self, data): """ Extracts fields from `data` that will be used to populate the `User` model in the `SOCIALACCOUNT_ADAPTER`'s `populate_user()` method. For example: {'first_name': 'John'} :return: dictionary of key-value pairs. """ return {} def cleanup_email_addresses(self, email, addresses, email_verified=False): # Avoid loading models before adapters have been registered. from allauth.account.models import EmailAddress # Move user.email over to EmailAddress if email and email.lower() not in [a.email.lower() for a in addresses]: addresses.append( EmailAddress(email=email, verified=bool(email_verified), primary=True) ) # Force verified emails settings = self.get_settings() verified_email = settings.get("VERIFIED_EMAIL", False) if verified_email: for address in addresses: address.verified = True def extract_email_addresses(self, data): """ For example: [EmailAddress(email='john@example.com', verified=True, primary=True)] """ return [] @classmethod def get_package(cls): pkg = getattr(cls, "package", None) if not pkg: pkg = cls.__module__.rpartition(".")[0] return pkg class ProviderAccount(object): def __init__(self, social_account): self.account = social_account def get_profile_url(self): return None def get_avatar_url(self): return None def get_brand(self): """ Returns a dict containing an id and name identifying the brand. Useful when displaying logos next to accounts in templates. For most providers, these are identical to the provider. For OpenID however, the brand can derived from the OpenID identity url. """ provider = self.account.get_provider() return dict(id=provider.id, name=provider.name) def __str__(self): return self.to_str() def to_str(self): """ This did not use to work in the past due to py2 compatibility: class GoogleAccount(ProviderAccount): def __str__(self): dflt = super(GoogleAccount, self).__str__() return self.account.extra_data.get('name', dflt) So we have this method `to_str` that can be overridden in a conventional fashion, without having to worry about it. """ return self.get_brand()["name"] django-allauth-0.58.2/allauth/socialaccount/providers/basecamp/000077500000000000000000000000001452212273200245515ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/basecamp/__init__.py000066400000000000000000000000001452212273200266500ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/basecamp/provider.py000066400000000000000000000022251452212273200267560ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class BasecampAccount(ProviderAccount): def get_avatar_url(self): return None def to_str(self): dflt = super(BasecampAccount, self).to_str() return self.account.extra_data.get("name", dflt) class BasecampProvider(OAuth2Provider): id = "basecamp" name = "Basecamp" account_class = BasecampAccount def get_auth_params(self, request, action): data = super(BasecampProvider, self).get_auth_params(request, action) data["type"] = "web_server" return data def extract_uid(self, data): data = data["identity"] return str(data["id"]) def extract_common_fields(self, data): data = data["identity"] return dict( email=data.get("email_address"), username=data.get("email_address"), first_name=data.get("first_name"), last_name=data.get("last_name"), name="%s %s" % (data.get("first_name"), data.get("last_name")), ) provider_classes = [BasecampProvider] django-allauth-0.58.2/allauth/socialaccount/providers/basecamp/tests.py000066400000000000000000000025231452212273200262670ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import BasecampProvider class BasecampTests(OAuth2TestsMixin, TestCase): provider_id = BasecampProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "expires_at": "2012-03-22T16:56:48-05:00", "identity": { "id": 9999999, "first_name": "Jason Fried", "last_name": "Jason Fried", "email_address": "jason@example.com" }, "accounts": [ { "product": "bcx", "id": 88888888, "name": "Wayne Enterprises, Ltd.", "href": "https://basecamp.com/88888888/api/v1" }, { "product": "bcx", "id": 77777777, "name": "Veidt, Inc", "href": "https://basecamp.com/77777777/api/v1" }, { "product": "campfire", "id": 44444444, "name": "Acme Shipping Co.", "href": "https://acme4444444.campfirenow.com" } ] }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/basecamp/urls.py000066400000000000000000000002521452212273200261070ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import BasecampProvider urlpatterns = default_urlpatterns(BasecampProvider) django-allauth-0.58.2/allauth/socialaccount/providers/basecamp/views.py000066400000000000000000000017221452212273200262620ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import BasecampProvider class BasecampOAuth2Adapter(OAuth2Adapter): provider_id = BasecampProvider.id access_token_url = ( "https://launchpad.37signals.com/authorization/token?type=web_server" # noqa ) authorize_url = "https://launchpad.37signals.com/authorization/new" profile_url = "https://launchpad.37signals.com/authorization.json" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(BasecampOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(BasecampOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/battlenet/000077500000000000000000000000001452212273200247605ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/battlenet/__init__.py000066400000000000000000000000001452212273200270570ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/battlenet/models.py000066400000000000000000000000001452212273200266030ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/battlenet/provider.py000066400000000000000000000016451452212273200271720ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class BattleNetAccount(ProviderAccount): def to_str(self): battletag = self.account.extra_data.get("battletag") return battletag or super(BattleNetAccount, self).to_str() class BattleNetProvider(OAuth2Provider): id = "battlenet" name = "Battle.net" account_class = BattleNetAccount def extract_uid(self, data): uid = str(data["id"]) if data.get("region") == "cn": # China is on a different account system. UIDs can clash with US. return uid + "-cn" return uid def extract_common_fields(self, data): return {"username": data.get("battletag")} def get_default_scope(self): # Optional scopes: "sc2.profile", "wow.profile" return [] provider_classes = [BattleNetProvider] django-allauth-0.58.2/allauth/socialaccount/providers/battlenet/tests.py000066400000000000000000000044601452212273200265000ustar00rootroot00000000000000import json from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import BattleNetProvider from .views import _check_errors class BattleNetTests(OAuth2TestsMixin, TestCase): provider_id = BattleNetProvider.id _uid = 123456789 _battletag = "LuckyDragon#1953" def get_mocked_response(self): data = {"battletag": self._battletag, "id": self._uid} return MockedResponse(200, json.dumps(data)) def test_valid_response_no_battletag(self): data = {"id": 12345} response = MockedResponse(200, json.dumps(data)) self.assertEqual(_check_errors(response), data) def test_invalid_data(self): response = MockedResponse(200, json.dumps({})) with self.assertRaises(OAuth2Error): # No id, raises _check_errors(response) def test_profile_invalid_response(self): data = {"code": 403, "type": "Forbidden", "detail": "Account Inactive"} response = MockedResponse(401, json.dumps(data)) with self.assertRaises(OAuth2Error): # no id, 4xx code, raises _check_errors(response) def test_error_response(self): body = json.dumps({"error": "invalid_token"}) response = MockedResponse(400, body) with self.assertRaises(OAuth2Error): # no id, 4xx code, raises _check_errors(response) def test_service_not_found(self): response = MockedResponse(596, "

596 Service Not Found

") with self.assertRaises(OAuth2Error): # bad json, 5xx code, raises _check_errors(response) def test_invalid_response(self): response = MockedResponse(200, "invalid json data") with self.assertRaises(OAuth2Error): # bad json, raises _check_errors(response) def test_extra_data(self): self.login(self.get_mocked_response()) account = SocialAccount.objects.get(uid=str(self._uid)) self.assertEqual(account.extra_data["battletag"], self._battletag) self.assertEqual(account.extra_data["id"], self._uid) self.assertEqual(account.extra_data["region"], "us") django-allauth-0.58.2/allauth/socialaccount/providers/battlenet/urls.py000066400000000000000000000002541452212273200263200ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import BattleNetProvider urlpatterns = default_urlpatterns(BattleNetProvider) django-allauth-0.58.2/allauth/socialaccount/providers/battlenet/validators.py000066400000000000000000000001611452212273200275000ustar00rootroot00000000000000from django.core.validators import RegexValidator BattletagUsernameValidator = RegexValidator(r"^[\w.]+#\d+$") django-allauth-0.58.2/allauth/socialaccount/providers/battlenet/views.py000066400000000000000000000110111452212273200264610ustar00rootroot00000000000000""" OAuth2 Adapter for Battle.net Resources: * Battle.net OAuth2 documentation: https://dev.battle.net/docs/read/oauth * Battle.net API documentation: https://dev.battle.net/io-docs * Original announcement: https://us.battle.net/en/forum/topic/13979297799 * The Battle.net API forum: https://us.battle.net/en/forum/15051532/ """ import requests from django.conf import settings from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import BattleNetProvider class Region: APAC = "apac" CN = "cn" EU = "eu" KR = "kr" SEA = "sea" TW = "tw" US = "us" def _check_errors(response): try: data = response.json() except ValueError: # JSONDecodeError on py3 raise OAuth2Error("Invalid JSON from Battle.net API: %r" % (response.text)) if response.status_code >= 400 or "error" in data: # For errors, we expect the following format: # {"error": "error_name", "error_description": "Oops!"} # For example, if the token is not valid, we will get: # { # "error": "invalid_token", # "error_description": "Invalid access token: abcdef123456" # } # For the profile API, this may also look like the following: # {"code": 403, "type": "Forbidden", "detail": "Account Inactive"} error = data.get("error", "") or data.get("type", "") desc = data.get("error_description", "") or data.get("detail", "") raise OAuth2Error("Battle.net error: %s (%s)" % (error, desc)) # The expected output from the API follows this format: # {"id": 12345, "battletag": "Example#12345"} # The battletag is optional. if "id" not in data: # If the id is not present, the output is not usable (no UID) raise OAuth2Error("Invalid data from Battle.net API: %r" % (data)) return data class BattleNetOAuth2Adapter(OAuth2Adapter): """ OAuth2 adapter for Battle.net https://dev.battle.net/docs/read/oauth Region is set to us by default, but can be overridden with the `region` GET parameter when performing a login. Can be any of eu, us, kr, sea, tw or cn """ provider_id = BattleNetProvider.id valid_regions = ( Region.APAC, Region.CN, Region.EU, Region.KR, Region.SEA, Region.TW, Region.US, ) @property def battlenet_region(self): # Check by URI query parameter first. region = self.request.GET.get("region", "").lower() if region == Region.SEA: # South-East Asia uses the same region as US everywhere return Region.US if region in self.valid_regions: return region # Second, check the provider settings. region = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("battlenet", {}) .get("REGION", "us") ) if region in self.valid_regions: return region return Region.US @property def battlenet_base_url(self): region = self.battlenet_region if region == Region.CN: return "https://www.battlenet.com.cn" return "https://%s.battle.net" % (region) @property def access_token_url(self): return self.battlenet_base_url + "/oauth/token" @property def authorize_url(self): return self.battlenet_base_url + "/oauth/authorize" @property def profile_url(self): return self.battlenet_base_url + "/oauth/userinfo" def complete_login(self, request, app, token, **kwargs): params = {"access_token": token.token} response = requests.get(self.profile_url, params=params) data = _check_errors(response) # Add the region to the data so that we can have it in `extra_data`. data["region"] = self.battlenet_region return self.get_provider().sociallogin_from_response(request, data) def get_callback_url(self, request, app): r = super(BattleNetOAuth2Adapter, self).get_callback_url(request, app) region = request.GET.get("region", "").lower() # Pass the region down to the callback URL if we specified it if region and region in self.valid_regions: r += "?region=%s" % (region) return r oauth2_login = OAuth2LoginView.adapter_view(BattleNetOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(BattleNetOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/bitbucket/000077500000000000000000000000001452212273200247525ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/bitbucket/__init__.py000066400000000000000000000000001452212273200270510ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/bitbucket/provider.py000066400000000000000000000017341452212273200271630ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class BitbucketAccount(ProviderAccount): def get_profile_url(self): return "http://bitbucket.org/" + self.account.extra_data["username"] def get_avatar_url(self): return self.account.extra_data.get("avatar") def get_username(self): return self.account.extra_data["username"] def to_str(self): return self.get_username() class BitbucketProvider(OAuthProvider): id = "bitbucket" name = "Bitbucket" account_class = BitbucketAccount def extract_uid(self, data): return data["username"] def extract_common_fields(self, data): return dict( email=data.get("email"), first_name=data.get("first_name"), username=data.get("username"), last_name=data.get("last_name"), ) provider_classes = [BitbucketProvider] django-allauth-0.58.2/allauth/socialaccount/providers/bitbucket/tests.py000066400000000000000000000026601452212273200264720ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import BitbucketProvider class BitbucketTests(OAuthTestsMixin, TestCase): provider_id = BitbucketProvider.id def get_mocked_response(self): # FIXME: Replace with actual/complete Bitbucket response return [ MockedResponse( 200, r""" [{"active": true, "email": "raymond.penners@example.com", "primary": true}, {"active": true, "email": "raymond.penners@example.org", "primary": false} ] """, ), MockedResponse( 200, r""" {"repositories": [], "user": {"avatar": "https://secure.gravatar.com/avatar.jpg", "display_name": "pennersr", "first_name": "", "is_team": false, "last_name": "", "resource_uri": "/1.0/users/pennersr", "username": "pennersr"}} """, ), ] # noqa def test_login(self): account = super(BitbucketTests, self).test_login() bb_account = account.get_provider_account() self.assertEqual(bb_account.get_username(), "pennersr") self.assertEqual( bb_account.get_avatar_url(), "https://secure.gravatar.com/avatar.jpg", ) self.assertEqual(bb_account.get_profile_url(), "http://bitbucket.org/pennersr") django-allauth-0.58.2/allauth/socialaccount/providers/bitbucket/urls.py000066400000000000000000000002531452212273200263110ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import BitbucketProvider urlpatterns = default_urlpatterns(BitbucketProvider) django-allauth-0.58.2/allauth/socialaccount/providers/bitbucket/views.py000066400000000000000000000030221452212273200264560ustar00rootroot00000000000000import json from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import BitbucketProvider class BitbucketAPI(OAuth): emails_url = "https://bitbucket.org/api/1.0/emails/" users_url = "https://bitbucket.org/api/1.0/users/" def get_user_info(self): # TODO: Actually turn these into EmailAddress emails = json.loads(self.query(self.emails_url)) for address in reversed(emails): if address["active"]: email = address["email"] if address["primary"]: break data = json.loads(self.query(self.users_url + email)) user = data["user"] return user class BitbucketOAuthAdapter(OAuthAdapter): provider_id = BitbucketProvider.id request_token_url = "https://bitbucket.org/api/1.0/oauth/request_token" access_token_url = "https://bitbucket.org/api/1.0/oauth/access_token" authorize_url = "https://bitbucket.org/api/1.0/oauth/authenticate" def complete_login(self, request, app, token, response): client = BitbucketAPI( request, app.client_id, app.secret, self.request_token_url ) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(BitbucketOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(BitbucketOAuthAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/bitbucket_oauth2/000077500000000000000000000000001452212273200262345ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/bitbucket_oauth2/__init__.py000066400000000000000000000000001452212273200303330ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/bitbucket_oauth2/provider.py000066400000000000000000000017771452212273200304540ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class BitbucketOAuth2Account(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("links", {}).get("html", {}).get("href") def get_avatar_url(self): return self.account.extra_data.get("links", {}).get("avatar", {}).get("href") def to_str(self): dflt = super(BitbucketOAuth2Account, self).to_str() return self.account.extra_data.get("display_name", dflt) class BitbucketOAuth2Provider(OAuth2Provider): id = "bitbucket_oauth2" name = "Bitbucket" account_class = BitbucketOAuth2Account def extract_uid(self, data): return data["username"] def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), name=data.get("display_name"), ) provider_classes = [BitbucketOAuth2Provider] django-allauth-0.58.2/allauth/socialaccount/providers/bitbucket_oauth2/tests.py000066400000000000000000000132631452212273200277550ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from unittest import mock from unittest.mock import patch from django.test.utils import override_settings from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import BitbucketOAuth2Provider @override_settings(SOCIALACCOUNT_QUERY_EMAIL=True, SOCIALACCOUNT_STORE_TOKENS=True) class BitbucketOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = BitbucketOAuth2Provider.id response_data = """ { "created_on": "2011-12-20T16:34:07.132459+00:00", "display_name": "tutorials account", "links": { "avatar": { "href": "https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2013/Nov/25/tutorials-avatar-1563784409-6_avatar.png" }, "followers": { "href": "https://api.bitbucket.org/2.0/users/tutorials/followers" }, "following": { "href": "https://api.bitbucket.org/2.0/users/tutorials/following" }, "html": { "href": "https://bitbucket.org/tutorials" }, "repositories": { "href": "https://api.bitbucket.org/2.0/repositories/tutorials" }, "self": { "href": "https://api.bitbucket.org/2.0/users/tutorials" } }, "location": "Santa Monica, CA", "type": "user", "username": "tutorials", "uuid": "{c788b2da-b7a2-404c-9e26-d3f077557007}", "website": "https://tutorials.bitbucket.org/" } """ # noqa email_response_data = """ { "page": 1, "pagelen": 10, "size": 1, "values": [ { "email": "tutorials@bitbucket.org", "is_confirmed": true, "is_primary": true, "links": { "self": { "href": "https://api.bitbucket.org/2.0/user/emails/tutorials@bitbucket.org" } }, "type": "email" }, { "email": "tutorials+secondary@bitbucket.org", "is_confirmed": true, "is_primary": true, "links": { "self": { "href": "https://api.bitbucket.org/2.0/user/emails/tutorials+secondary@bitbucket.org" } }, "type": "email" } ] } """ # noqa def setUp(self): super(BitbucketOAuth2Tests, self).setUp() self.mocks = { "requests": patch( "allauth.socialaccount.providers.bitbucket_oauth2.views.requests" ) } self.patches = {name: mocked.start() for (name, mocked) in self.mocks.items()} self.patches["requests"].get.side_effect = [ MockedResponse(200, self.response_data), MockedResponse(200, self.email_response_data), ] def tearDown(self): for _, mocked in self.mocks.items(): mocked.stop() def get_mocked_response(self): return [MockedResponse(200, self.response_data)] def test_account_tokens(self, multiple_login=False): if multiple_login: self.patches["requests"].get.side_effect = [ MockedResponse(200, self.response_data), MockedResponse(200, self.email_response_data), MockedResponse(200, self.response_data), MockedResponse(200, self.email_response_data), ] super(BitbucketOAuth2Tests, self).test_account_tokens(multiple_login) calls = [ mock.call("https://api.bitbucket.org/2.0/user", params=mock.ANY), mock.call("https://api.bitbucket.org/2.0/user/emails", params=mock.ANY), ] if multiple_login: calls.extend( [ mock.call("https://api.bitbucket.org/2.0/user", params=mock.ANY), mock.call( "https://api.bitbucket.org/2.0/user/emails", params=mock.ANY, ), ] ) self.patches["requests"].get.assert_has_calls(calls) def test_provider_account(self): self.login(self.get_mocked_response()) socialaccount = SocialAccount.objects.get(uid="tutorials") self.assertEqual(socialaccount.user.username, "tutorials") self.assertEqual(socialaccount.user.email, "tutorials@bitbucket.org") account = socialaccount.get_provider_account() self.assertEqual(account.to_str(), "tutorials account") self.assertEqual(account.get_profile_url(), "https://bitbucket.org/tutorials") self.assertEqual( account.get_avatar_url(), "https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2013/Nov/25/tutorials-avatar-1563784409-6_avatar.png", # noqa ) self.patches["requests"].get.assert_has_calls( [ mock.call("https://api.bitbucket.org/2.0/user", params=mock.ANY), mock.call( "https://api.bitbucket.org/2.0/user/emails", params=mock.ANY, ), ] ) django-allauth-0.58.2/allauth/socialaccount/providers/bitbucket_oauth2/urls.py000066400000000000000000000002671452212273200276000ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import BitbucketOAuth2Provider urlpatterns = default_urlpatterns(BitbucketOAuth2Provider) django-allauth-0.58.2/allauth/socialaccount/providers/bitbucket_oauth2/views.py000066400000000000000000000031641452212273200277470ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import BitbucketOAuth2Provider class BitbucketOAuth2Adapter(OAuth2Adapter): provider_id = BitbucketOAuth2Provider.id access_token_url = "https://bitbucket.org/site/oauth2/access_token" authorize_url = "https://bitbucket.org/site/oauth2/authorize" profile_url = "https://api.bitbucket.org/2.0/user" emails_url = "https://api.bitbucket.org/2.0/user/emails" def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json() if app_settings.QUERY_EMAIL and not extra_data.get("email"): extra_data["email"] = self.get_email(token) return self.get_provider().sociallogin_from_response(request, extra_data) def get_email(self, token): """Fetches email address from email API endpoint""" resp = requests.get(self.emails_url, params={"access_token": token.token}) emails = resp.json().get("values", []) email = "" try: email = emails[0].get("email") primary_emails = [e for e in emails if e.get("is_primary", False)] email = primary_emails[0].get("email") except (IndexError, TypeError, KeyError): return "" finally: return email oauth_login = OAuth2LoginView.adapter_view(BitbucketOAuth2Adapter) oauth_callback = OAuth2CallbackView.adapter_view(BitbucketOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/bitly/000077500000000000000000000000001452212273200241215ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/bitly/__init__.py000066400000000000000000000000001452212273200262200ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/bitly/provider.py000066400000000000000000000015541452212273200263320ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class BitlyAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("profile_url") def get_avatar_url(self): return self.account.extra_data.get("profile_image") def to_str(self): dflt = super(BitlyAccount, self).to_str() return "%s (%s)" % ( self.account.extra_data.get("full_name", ""), dflt, ) class BitlyProvider(OAuth2Provider): id = "bitly" name = "Bitly" account_class = BitlyAccount def extract_uid(self, data): return str(data["login"]) def extract_common_fields(self, data): return dict(username=data["login"], name=data.get("full_name")) provider_classes = [BitlyProvider] django-allauth-0.58.2/allauth/socialaccount/providers/bitly/tests.py000066400000000000000000000017701452212273200256420ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import BitlyProvider class BitlyTests(OAuth2TestsMixin, TestCase): provider_id = BitlyProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "data": { "apiKey": "R_f6397a37e765574f2e198dba5bb59522", "custom_short_domain": null, "display_name": null, "full_name": "Bitly API Oauth Demo Account", "is_enterprise": false, "login": "bitlyapioauthdemo", "member_since": 1331567982, "profile_image": "http://bitly.com/u/bitlyapioauthdemo.png", "profile_url": "http://bitly.com/u/bitlyapioauthdemo", "share_accounts": [], "tracking_domains": [] }, "status_code": 200, "status_txt": "OK" }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/bitly/urls.py000066400000000000000000000002441452212273200254600ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import BitlyProvider urlpatterns = default_urlpatterns(BitlyProvider) django-allauth-0.58.2/allauth/socialaccount/providers/bitly/views.py000066400000000000000000000015521452212273200256330ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import BitlyProvider class BitlyOAuth2Adapter(OAuth2Adapter): provider_id = BitlyProvider.id access_token_url = "https://api-ssl.bitly.com/oauth/access_token" authorize_url = "https://bitly.com/oauth/authorize" profile_url = "https://api-ssl.bitly.com/v3/user/info" supports_state = False def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json()["data"] return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(BitlyOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(BitlyOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/box/000077500000000000000000000000001452212273200235665ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/box/__init__.py000066400000000000000000000000001452212273200256650ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/box/provider.py000066400000000000000000000010151452212273200257670ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class BoxOAuth2Account(ProviderAccount): pass class BoxOAuth2Provider(OAuth2Provider): id = "box" name = "Box" account_class = BoxOAuth2Account def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict(name=data.get("display_name"), email=data.get("email")) provider_classes = [BoxOAuth2Provider] django-allauth-0.58.2/allauth/socialaccount/providers/box/tests.py000066400000000000000000000020631452212273200253030ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import BoxOAuth2Provider class BoxOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = BoxOAuth2Provider.id def get_mocked_response(self): return [ MockedResponse( 200, """{ "type": "user", "id": "1185237519", "name": "Balls Johnson", "login": "balls@example.com", "created_at": "2017-02-18T21:16:39-08:00", "modified_at": "2017-02-18T21:19:11-08:00", "language": "en", "timezone": "America/Los_Angeles", "space_amount": 10737418240, "space_used": 0, "max_upload_size": 2147483648, "status": "active", "job_title": "", "phone": "123-345-5555", "address": "", "avatar_url": "https://app.box.com/api/avatar/large/1185237519" }""", ) ] django-allauth-0.58.2/allauth/socialaccount/providers/box/urls.py000066400000000000000000000002531452212273200251250ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import BoxOAuth2Provider urlpatterns = default_urlpatterns(BoxOAuth2Provider) django-allauth-0.58.2/allauth/socialaccount/providers/box/views.py000066400000000000000000000017741452212273200253060ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import BoxOAuth2Provider class BoxOAuth2Adapter(OAuth2Adapter): provider_id = BoxOAuth2Provider.id access_token_url = "https://api.box.com/oauth2/token" authorize_url = "https://account.box.com/api/oauth2/authorize" profile_url = "https://api.box.com/2.0/users/me" redirect_uri_protocol = None def complete_login(self, request, app, token, **kwargs): extra_data = requests.get( self.profile_url, params={"access_token": token.token} ) # This only here because of weird response from the test suite if isinstance(extra_data, list): extra_data = extra_data[0] return self.get_provider().sociallogin_from_response(request, extra_data.json()) oauth_login = OAuth2LoginView.adapter_view(BoxOAuth2Adapter) oauth_callback = OAuth2CallbackView.adapter_view(BoxOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/cilogon/000077500000000000000000000000001452212273200244305ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/cilogon/__init__.py000066400000000000000000000000001452212273200265270ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/cilogon/provider.py000066400000000000000000000032341452212273200266360ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.app_settings import QUERY_EMAIL from allauth.socialaccount.providers.base import AuthAction, ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class Scope(object): OPENID = "openid" EMAIL = "email" PROFILE = "profile" USERINFO = "org.cilogon.userinfo" class CILogonAccount(ProviderAccount): def to_str(self): dflt = super(CILogonAccount, self).to_str() return self.account.extra_data.get("name", dflt) class CILogonProvider(OAuth2Provider): id = "cilogon" name = "CILogon" account_class = CILogonAccount def get_default_scope(self): scope = [Scope.PROFILE, Scope.USERINFO, Scope.OPENID] if QUERY_EMAIL: scope.append(Scope.EMAIL) return scope def get_auth_params(self, request, action): ret = super(CILogonProvider, self).get_auth_params(request, action) if action == AuthAction.REAUTHENTICATE: ret["prompt"] = "select_account consent" return ret def extract_uid(self, data): return str(data.get("sub")) def extract_common_fields(self, data): return dict( email=data.get("email"), last_name=data.get("family_name"), first_name=data.get("given_name"), eppn=data.get("eppn"), ) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email and data.get("verified_email"): ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [CILogonProvider] django-allauth-0.58.2/allauth/socialaccount/providers/cilogon/tests.py000066400000000000000000000011641452212273200261460ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import CILogonProvider class CILogonTests(OAuth2TestsMixin, TestCase): provider_id = CILogonProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "email": "johndoe@example.edu", "eppn": "u1234567@example.edu", "firstname": "John", "lastname": "Doe", "idp_name": "Example University", "sub": "http://cilogon.org/serverA/users/1234567" }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/cilogon/urls.py000066400000000000000000000002501452212273200257640ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import CILogonProvider urlpatterns = default_urlpatterns(CILogonProvider) django-allauth-0.58.2/allauth/socialaccount/providers/cilogon/views.py000066400000000000000000000016461452212273200261460ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import CILogonProvider class CILogonOAuth2Adapter(OAuth2Adapter): provider_id = CILogonProvider.id access_token_url = "https://cilogon.org/oauth2/token" authorize_url = "https://cilogon.org/authorize" profile_url = "https://cilogon.org/oauth2/userinfo" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, params={"access_token": token.token, "alt": "json"}, ) resp.raise_for_status() extra_data = resp.json() login = self.get_provider().sociallogin_from_response(request, extra_data) return login oauth2_login = OAuth2LoginView.adapter_view(CILogonOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(CILogonOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/clever/000077500000000000000000000000001452212273200242565ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/clever/__init__.py000066400000000000000000000000001452212273200263550ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/clever/provider.py000066400000000000000000000033001452212273200264560ustar00rootroot00000000000000from allauth.socialaccount import providers from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class CleverAccount(ProviderAccount): def get_avatar_url(self): # return self.account.extra_data.get('user').get('image_192', None) return None def to_str(self): dflt = super(CleverAccount, self).to_str() return "%s (%s)" % ( self.account.extra_data.get("name", ""), dflt, ) class CleverProvider(OAuth2Provider): id = "clever" name = "Clever" account_class = CleverAccount def extract_uid(self, data): return data["data"]["id"] def get_user_type(self, data): return list(data.get("data", {}).get("roles", {}).keys())[0] def extract_common_fields(self, data): return dict( first_name=data.get("data", {}).get("name", {}).get("first", None), last_name=data.get("data", {}).get("name", {}).get("last", None), username=data.get("data", {}) .get("roles", {}) .get(self.get_user_type(data), {}) .get("credentials", {}) .get("district_username", None), email=data.get("data", {}).get("email", None), ) def get_default_scope(self): return [ "read:district_admins", "read:districts", "read:resources", "read:school_admins", "read:schools", "read:sections", "read:student_contacts", "read:students", "read:teachers", "read:user_id", ] providers.registry.register(CleverProvider) django-allauth-0.58.2/allauth/socialaccount/providers/clever/tests.py000066400000000000000000000025301452212273200257720ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import CleverProvider class CleverOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = CleverProvider.id def get_mocked_response(self): return [ MockedResponse( 200, """{ "type": "user", "data": { "id": "62027798269867124d10259e", "district": "6202763c8243d2100123dae5", "type": "user", "authorized_by": "district" }, "links": [ { "rel": "self", "uri": "/me" }, { "rel": "canonical", "uri": "/v3.0/users/62027798269867124d10259e" }, { "rel": "district", "uri": "/v3.0/districts/6202763c8243d2100123dae5" } ] }""", ), MockedResponse( 200, """{ "data": { "id": "62027798269867124d10259e", "roles": { "district_admin": {}, "contact": {} } } }""", ), ] django-allauth-0.58.2/allauth/socialaccount/providers/clever/urls.py000066400000000000000000000002461452212273200256170ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import CleverProvider urlpatterns = default_urlpatterns(CleverProvider) django-allauth-0.58.2/allauth/socialaccount/providers/clever/views.py000066400000000000000000000027541452212273200257750ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import CleverProvider class CleverOAuth2Adapter(OAuth2Adapter): provider_id = CleverProvider.id access_token_url = "https://clever.com/oauth/tokens" authorize_url = "https://clever.com/oauth/authorize" identity_url = "https://api.clever.com/v3.0/me" user_details_url = "https://api.clever.com/v3.0/users" supports_state = True def complete_login(self, request, app, token, **kwargs): extra_data = self.get_data(token.token) return self.get_provider().sociallogin_from_response(request, extra_data) def get_data(self, token): # Verify the user first resp = requests.get( self.identity_url, headers={"Authorization": "Bearer {}".format(token)} ) if resp.status_code != 200: raise OAuth2Error() resp = resp.json() user_id = resp["data"]["id"] user_details = requests.get( "{}/{}".format(self.user_details_url, user_id), headers={"Authorization": "Bearer {}".format(token)}, ) user_details.raise_for_status() user_details = user_details.json() return user_details oauth2_login = OAuth2LoginView.adapter_view(CleverOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(CleverOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/coinbase/000077500000000000000000000000001452212273200245615ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/coinbase/__init__.py000066400000000000000000000000001452212273200266600ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/coinbase/provider.py000066400000000000000000000015461452212273200267730ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class CoinbaseAccount(ProviderAccount): def get_avatar_url(self): return None def to_str(self): return self.account.extra_data.get( "name", super(CoinbaseAccount, self).to_str() ) class CoinbaseProvider(OAuth2Provider): id = "coinbase" name = "Coinbase" account_class = CoinbaseAccount def get_default_scope(self): # See: https://coinbase.com/docs/api/permissions return ["wallet:user:email"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): # See: https://coinbase.com/api/doc/1.0/users/index.html return dict(email=data["email"]) provider_classes = [CoinbaseProvider] django-allauth-0.58.2/allauth/socialaccount/providers/coinbase/tests.py000066400000000000000000000015351452212273200263010ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import CoinbaseProvider class CoinbaseTests(OAuth2TestsMixin, TestCase): provider_id = CoinbaseProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "id": "9da7a204-544e-5fd1-9a12-61176c5d4cd8", "name": "User One", "username": "user1", "email": "user1@example.com", "profile_location": null, "profile_bio": null, "profile_url": "https://coinbase.com/user1", "avatar_url": "https://images.coinbase.com/avatar?h=vR%2FY8igBoPwuwGren5JMwvDNGpURAY%2F0nRIOgH%2FY2Qh%2BQ6nomR3qusA%2Bh6o2%0Af9rH&s=128", "resource": "user", "resource_path": "/v2/user" }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/coinbase/urls.py000066400000000000000000000002521452212273200261170ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import CoinbaseProvider urlpatterns = default_urlpatterns(CoinbaseProvider) django-allauth-0.58.2/allauth/socialaccount/providers/coinbase/views.py000066400000000000000000000017061452212273200262740ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import CoinbaseProvider class CoinbaseOAuth2Adapter(OAuth2Adapter): provider_id = CoinbaseProvider.id @property def authorize_url(self): return "https://www.coinbase.com/oauth/authorize" @property def access_token_url(self): return "https://www.coinbase.com/oauth/token" @property def profile_url(self): return "https://api.coinbase.com/v2/user" def complete_login(self, request, app, token, **kwargs): response = requests.get(self.profile_url, params={"access_token": token}) extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(CoinbaseOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(CoinbaseOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/dataporten/000077500000000000000000000000001452212273200251375ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/dataporten/__init__.py000066400000000000000000000000001452212273200272360ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/dataporten/models.py000066400000000000000000000000001452212273200267620ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/dataporten/provider.py000066400000000000000000000064051452212273200273500ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DataportenAccount(ProviderAccount): def get_avatar_url(self): """ Returns a valid URL to an 128x128 .png photo of the user """ # Documentation for user profile photos can be found here: # https://docs.dataporten.no/docs/oauth-authentication/ base_url = "https://api.dataporten.no/userinfo/v1/user/media/" return base_url + self.account.extra_data["profilephoto"] def to_str(self): """ Returns string representation of a social account. Includes the name of the user. """ dflt = super(DataportenAccount, self).to_str() return "%s (%s)" % ( self.account.extra_data.get("name", ""), dflt, ) class DataportenProvider(OAuth2Provider): id = "dataporten" name = "Dataporten" account_class = DataportenAccount def extract_uid(self, data): """ Returns the primary user identifier, an UUID string See: https://docs.dataporten.no/docs/userid/ """ return data["userid"] def extract_extra_data(self, data): """ Extracts fields from `data` that will be stored in `SocialAccount`'s `extra_data` JSONField. All the necessary data extraction has already been done in the complete_login()-view, so we can just return the data. PS: This is default behaviour, so we did not really need to define this function, but it is included for documentation purposes. Typical return dict: { "userid": "76a7a061-3c55-430d-8ee0-6f82ec42501f", "userid_sec": ["feide:andreas@uninett.no"], "name": "Andreas \u00c5kre Solberg", "email": "andreas.solberg@uninett.no", "profilephoto": "p:a3019954-902f-45a3-b4ee-bca7b48ab507", } """ return data def extract_common_fields(self, data): """ This function extracts information from the /userinfo endpoint which will be consumed by allauth.socialaccount.adapter.populate_user(). Look there to find which key-value pairs that should be saved in the returned dict. Typical return dict: { "userid": "76a7a061-3c55-430d-8ee0-6f82ec42501f", "userid_sec": ["feide:andreas@uninett.no"], "name": "Andreas \u00c5kre Solberg", "email": "andreas.solberg@uninett.no", "profilephoto": "p:a3019954-902f-45a3-b4ee-bca7b48ab507", "username": "andreas", } """ # Make shallow copy to prevent possible mutability issues data = dict(data) # If a Feide username is available, use it. If not, use the "username" # of the email-address for userid in data.get("userid_sec"): usertype, username = userid.split(":") if usertype == "feide": data["username"] = username.split("@")[0] break else: # Only entered if break is not executed above data["username"] = data.get("email").split("@")[0] return data provider_classes = [DataportenProvider] django-allauth-0.58.2/allauth/socialaccount/providers/dataporten/tests.py000066400000000000000000000052071452212273200266570ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DataportenProvider class DataportenTest(OAuth2TestsMixin, TestCase): provider_id = DataportenProvider.id def setUp(self): super(DataportenTest, self).setUp() self.mock_data = { "userid": "76a7a061-3c55-430d-8ee0-6f82ec42501f", "userid_sec": ["feide:andreas@uninett.no"], "name": "Andreas \u00c5kre Solberg", "email": "andreas.solberg@uninett.no", "profilephoto": "p:a3019954-902f-45a3-b4ee-bca7b48ab507", "groups": [{}], } def get_login_response_json(self, with_refresh_token=True): rt = "" if with_refresh_token: rt = ',"refresh_token": "testrf"' return ( """{ "access_token":"testac", "expires_in":3600, "scope": "userid profile groups" %s }""" % rt ) def get_mocked_response(self): return MockedResponse( status_code=200, content="""{ "user": { "userid": "76a7a061-3c55-430d-8ee0-6f82ec42501f", "userid_sec": ["feide:andreas@uninett.no"], "name": "Andreas \u00c5kre Solberg", "email": "andreas.solberg@uninett.no", "profilephoto": "p:a3019954-902f-45a3-b4ee-bca7b48ab507" }, "audience": "app123id" }""", headers={"content-type": "application/json"}, ) def test_extract_uid(self): uid = self.provider.extract_uid(self.mock_data) self.assertEqual(uid, self.mock_data["userid"]) def test_extract_extra_data(self): # All the processing is done in the complete_login view, and thus # the data should be returned unaltered extra_data = self.provider.extract_extra_data(self.mock_data) self.assertEqual(extra_data, self.mock_data) def test_extract_common_fields(self): # The main task of this function is to parse the data in order to # find the Feide username, and if not, use the email common_fields = self.provider.extract_common_fields(self.mock_data) self.assertEqual(common_fields["username"], "andreas") # Test correct behaviour when Feide username is unavailable new_mock_data = dict(self.mock_data) new_mock_data["userid_sec"] = [] new_common_fields = self.provider.extract_common_fields(new_mock_data) self.assertEqual(new_common_fields["username"], "andreas.solberg") django-allauth-0.58.2/allauth/socialaccount/providers/dataporten/urls.py000066400000000000000000000002561452212273200265010ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DataportenProvider urlpatterns = default_urlpatterns(DataportenProvider) django-allauth-0.58.2/allauth/socialaccount/providers/dataporten/views.py000066400000000000000000000046511452212273200266540ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.base import ProviderException from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DataportenProvider class DataportenAdapter(OAuth2Adapter): provider_id = DataportenProvider.id access_token_url = "https://auth.dataporten.no/oauth/token" authorize_url = "https://auth.dataporten.no/oauth/authorization" profile_url = "https://auth.dataporten.no/userinfo" groups_url = "https://groups-api.dataporten.no/groups/" def complete_login(self, request, app, token, **kwargs): """ Arguments: request - The get request to the callback URL /accounts/dataporten/login/callback. app - The corresponding SocialApp model instance token - A token object with access token given in token.token Returns: Should return a dict with user information intended for parsing by the methods of the DataportenProvider view, i.e. extract_uid(), extract_extra_data(), and extract_common_fields() """ # The authentication header headers = {"Authorization": "Bearer " + token.token} # Userinfo endpoint, for documentation see: # https://docs.dataporten.no/docs/oauth-authentication/ userinfo_response = requests.get( self.profile_url, headers=headers, ) # Raise exception for 4xx and 5xx response codes userinfo_response.raise_for_status() # The endpoint returns json-data and it needs to be decoded extra_data = userinfo_response.json()["user"] # Finally test that the audience property matches the client id # for validification reasons, as instructed by the Dataporten docs # if the userinfo-response is used for authentication if userinfo_response.json()["audience"] != app.client_id: raise ProviderException( "Dataporten returned a user with an audience field \ which does not correspond to the client id of the \ application." ) return self.get_provider().sociallogin_from_response( request, extra_data, ) oauth2_login = OAuth2LoginView.adapter_view(DataportenAdapter) oauth2_callback = OAuth2CallbackView.adapter_view(DataportenAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/daum/000077500000000000000000000000001452212273200237245ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/daum/__init__.py000066400000000000000000000000001452212273200260230ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/daum/models.py000066400000000000000000000000001452212273200255470ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/daum/provider.py000066400000000000000000000010741452212273200261320ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DaumAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("bigImagePath") def to_str(self): return self.account.extra_data.get("nickname", self.account.uid) class DaumProvider(OAuth2Provider): id = "Daum" name = "Daum" account_class = DaumAccount def extract_uid(self, data): return str(data.get("id")) provider_classes = [DaumProvider] django-allauth-0.58.2/allauth/socialaccount/providers/daum/tests.py000066400000000000000000000012641452212273200254430ustar00rootroot00000000000000import json from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DaumProvider class DaumTests(OAuth2TestsMixin, TestCase): provider_id = DaumProvider.id def get_mocked_response(self): result = {} result["userid"] = "38DTh" result["id"] = 46287445 result["nickname"] = "xncbf" result["bigImagePath"] = "https://img1.daumcdn.net/thumb/" result["openProfile"] = "https://img1.daumcdn.net/thumb/" body = {} body["code"] = 200 body["message"] = "OK" body["result"] = result return MockedResponse(200, json.dumps(body)) django-allauth-0.58.2/allauth/socialaccount/providers/daum/urls.py000066400000000000000000000002421452212273200252610ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DaumProvider urlpatterns = default_urlpatterns(DaumProvider) django-allauth-0.58.2/allauth/socialaccount/providers/daum/views.py000066400000000000000000000015141452212273200254340ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DaumProvider class DaumOAuth2Adapter(OAuth2Adapter): provider_id = DaumProvider.id access_token_url = "https://apis.daum.net/oauth2/token" authorize_url = "https://apis.daum.net/oauth2/authorize" profile_url = "https://apis.daum.net/user/v1/show.json" def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json().get("result") return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(DaumOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DaumOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/digitalocean/000077500000000000000000000000001452212273200254215ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/digitalocean/__init__.py000066400000000000000000000000001452212273200275200ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/digitalocean/provider.py000066400000000000000000000010451452212273200276250ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DigitalOceanAccount(ProviderAccount): pass class DigitalOceanProvider(OAuth2Provider): id = "digitalocean" name = "DigitalOcean" account_class = DigitalOceanAccount def extract_uid(self, data): return str(data["account"]["uuid"]) def extract_common_fields(self, data): return dict(email=data["account"]["email"]) provider_classes = [DigitalOceanProvider] django-allauth-0.58.2/allauth/socialaccount/providers/digitalocean/tests.py000066400000000000000000000022151452212273200271350ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DigitalOceanProvider class DigitalOceanTests(OAuth2TestsMixin, TestCase): provider_id = DigitalOceanProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "account": { "droplet_limit": 25, "floating_ip_limit": 5, "email": "sammy@example.com", "uuid": "b6fr89dbf6d9156cace5f3c78dc9851d957381ef", "email_verified": true, "status": "active", "status_message": "" } } """, ) def get_login_response_json(self, with_refresh_token=True): return """ { "access_token": "testac", "token_type": "bearer", "expires_in": 2592000, "refresh_token": "00a3aae641658d", "scope": "read write", "info": { "name": "Sammy the Shark", "email":"sammy@example.com", "uuid":"b6fr89dbf6d9156cace5f3c78dc9851d957381ef" } }""" django-allauth-0.58.2/allauth/socialaccount/providers/digitalocean/urls.py000066400000000000000000000002621452212273200267600ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DigitalOceanProvider urlpatterns = default_urlpatterns(DigitalOceanProvider) django-allauth-0.58.2/allauth/socialaccount/providers/digitalocean/views.py000066400000000000000000000016551452212273200271370ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DigitalOceanProvider class DigitalOceanOAuth2Adapter(OAuth2Adapter): provider_id = DigitalOceanProvider.id access_token_url = "https://cloud.digitalocean.com/v1/oauth/token" authorize_url = "https://cloud.digitalocean.com/v1/oauth/authorize" profile_url = "https://api.digitalocean.com/v2/account" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(DigitalOceanOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DigitalOceanOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/dingtalk/000077500000000000000000000000001452212273200245735ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/dingtalk/__init__.py000066400000000000000000000000001452212273200266720ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/dingtalk/client.py000066400000000000000000000023221452212273200264220ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.client import ( OAuth2Client, OAuth2Error, ) class DingTalkOAuth2Client(OAuth2Client): def get_access_token(self, code, pkce_code_verifier=None): data = { "clientId": self.consumer_key, "clientSecret": self.consumer_secret, "code": code, "grantType": "authorization_code", } params = None if pkce_code_verifier: data["code_verifier"] = pkce_code_verifier self._strip_empty_keys(data) url = self.access_token_url if self.access_token_method == "GET": params = data data = None resp = requests.request(self.access_token_method, url, params=params, json=data) resp.raise_for_status() access_token = resp.json() if not access_token or "accessToken" not in access_token: raise OAuth2Error("Error retrieving access token: %s" % resp.content) access_token["access_token"] = access_token.pop("accessToken") access_token["refresh_token"] = access_token.pop("refreshToken") access_token["expires_in"] = access_token.pop("expireIn") return access_token django-allauth-0.58.2/allauth/socialaccount/providers/dingtalk/provider.py000066400000000000000000000014531452212273200270020ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DingTalkAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("avatarUrl") def to_str(self): return self.account.extra_data.get( "nick", super(DingTalkAccount, self).to_str() ) class DingTalkProvider(OAuth2Provider): id = "dingtalk" name = "DingTalk" account_class = DingTalkAccount def extract_uid(self, data): return data["openId"] def get_default_scope(self): return ["openid", "corpid"] def extract_common_fields(self, data): return dict(username=data.get("nick"), name=data.get("nick")) provider_classes = [DingTalkProvider] django-allauth-0.58.2/allauth/socialaccount/providers/dingtalk/tests.py000066400000000000000000000014131452212273200263060ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DingTalkProvider class DingTalkTests(OAuth2TestsMixin, TestCase): provider_id = DingTalkProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "nick": "aiden", "unionId": "hTaCSb1nM4RXii6jaQvHZqQiEiE", "avatarUrl": "https://static-legacy.dingtalk.com/media/lADPDg7mViaksW3NBJPNBJI_1170_1171.jpg", "openId": "ELdCPlk0V2LodZHx3n0p5AiEiE" }""", ) def get_login_response_json(self, with_refresh_token=True): return """{ "accessToken": "testac", "expireIn": "3600", "refreshToken": "testrf" }""" django-allauth-0.58.2/allauth/socialaccount/providers/dingtalk/urls.py000066400000000000000000000002521452212273200261310ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DingTalkProvider urlpatterns = default_urlpatterns(DingTalkProvider) django-allauth-0.58.2/allauth/socialaccount/providers/dingtalk/views.py000066400000000000000000000025331452212273200263050ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .client import DingTalkOAuth2Client from .provider import DingTalkProvider class DingTalkOAuth2Adapter(OAuth2Adapter): provider_id = DingTalkProvider.id access_token_url = "https://api.dingtalk.com/v1.0/oauth2/userAccessToken" authorize_url = "https://login.dingtalk.com/oauth2/auth" profile_url = "https://api.dingtalk.com/v1.0/contact/users/me" client_class = DingTalkOAuth2Client def __init__(self, request): # dingtalk set "authCode" instead of "code" in callback url if "authCode" in request.GET: request.GET._mutable = True request.GET["code"] = request.GET["authCode"] request.GET._mutable = False super(DingTalkOAuth2Adapter, self).__init__(request) def complete_login(self, request, app, token, **kwargs): headers = {"x-acs-dingtalk-access-token": token.token} resp = requests.get(self.profile_url, headers=headers) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(DingTalkOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DingTalkOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/discord/000077500000000000000000000000001452212273200244255ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/discord/__init__.py000066400000000000000000000000001452212273200265240ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/discord/provider.py000066400000000000000000000065051452212273200266370ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DiscordAccount(ProviderAccount): def validate_descriminator(self, discriminator): if not isinstance(discriminator, str): return False # As of 2023-06-22, Discord returns string literal '0' for users # with no discriminator return len(discriminator) == 4 if discriminator.isdigit() else False def is_new_username_system(self): if not isinstance(self.account.extra_data, dict): return None discriminator = self.account.extra_data.get("discriminator") if self.validate_descriminator(discriminator): return False if self.account.extra_data.get("global_name") is not None: return True return None def to_str(self): fallback = super(DiscordAccount, self).to_str() # If the extra_data is malformed, exit early if not isinstance(self.account.extra_data, dict): return fallback is_new_system = self.is_new_username_system() if is_new_system is None: # We couldn't determine if the username is new or old # so we'll just return the username on it's own. display_name = self.account.extra_data.get("username") elif is_new_system: # global_name can be None or even undefined # so we'll use the username as a fallback global_name = self.account.extra_data.get("global_name") username = self.account.extra_data.get("username") display_name = global_name or username else: # Looks like it's the old username system # so we'll just use the username and discriminator display_name = "{username}#{discriminator}".format( username=self.account.extra_data.get("username"), discriminator=self.account.extra_data.get("discriminator"), ) # It's very unlikely but still possible that the display_name is None # so we'll return or'd against the fallback just incase. We don't want # to return None as users of the library expect this to be str. return display_name or fallback def get_avatar_url(self): if ( "id" in self.account.extra_data.keys() and "avatar" in self.account.extra_data.keys() ): return "https://cdn.discordapp.com/avatars/{id}/{avatar}.png".format( **self.account.extra_data ) class DiscordProvider(OAuth2Provider): id = "discord" name = "Discord" account_class = DiscordAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), name=data.get("username"), ) def get_default_scope(self): return ["email", "identify"] def extract_email_addresses(self, data): ret = [] email = data.get("email") if email and data.get("verified"): ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [DiscordProvider] django-allauth-0.58.2/allauth/socialaccount/providers/discord/tests.py000066400000000000000000000064331452212273200261470ustar00rootroot00000000000000from django.contrib.auth import get_user_model from allauth.account.models import EmailAddress from allauth.account.utils import user_email, user_username from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.providers.discord.provider import DiscordProvider from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class DiscordTests(OAuth2TestsMixin, TestCase): provider_id = DiscordProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "id": "80351110224678912", "username": "nelly", "discriminator": "0", "global_name": "Nelly", "avatar": "8342729096ea3675442027381ff50dfe", "verified": true, "email": "nelly@example.com" }""", ) def test_display_name(self, multiple_login=False): email = "user@example.com" user = get_user_model()(is_active=True) user_email(user, email) user_username(user, "user") user.set_password("test") user.save() EmailAddress.objects.create(user=user, email=email, primary=True, verified=True) self.client.login(username=user.username, password="test") self.login(self.get_mocked_response(), process="connect") if multiple_login: self.login( self.get_mocked_response(), with_refresh_token=False, process="connect", ) # get account sa = SocialAccount.objects.filter(user=user, provider=self.provider.id).get() # The following lines don't actually test that much, but at least # we make sure that the code is hit. provider_account = sa.get_provider_account() self.assertEqual(provider_account.to_str(), "Nelly") class OldDiscordTests(DiscordTests, TestCase): provider_id = DiscordProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "id": "80351110224678912", "username": "Nelly", "discriminator": "1337", "avatar": "8342729096ea3675442027381ff50dfe", "verified": true, "email": "nelly@example.com" }""", ) def test_display_name(self, multiple_login=False): email = "user@example.com" user = get_user_model()(is_active=True) user_email(user, email) user_username(user, "user") user.set_password("test") user.save() EmailAddress.objects.create(user=user, email=email, primary=True, verified=True) self.client.login(username=user.username, password="test") self.login(self.get_mocked_response(), process="connect") if multiple_login: self.login( self.get_mocked_response(), with_refresh_token=False, process="connect", ) # get account sa = SocialAccount.objects.filter(user=user, provider=self.provider.id).get() # The following lines don't actually test that much, but at least # we make sure that the code is hit. provider_account = sa.get_provider_account() self.assertEqual(provider_account.to_str(), "Nelly#1337") django-allauth-0.58.2/allauth/socialaccount/providers/discord/urls.py000066400000000000000000000003161452212273200257640ustar00rootroot00000000000000from allauth.socialaccount.providers.discord.provider import DiscordProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(DiscordProvider) django-allauth-0.58.2/allauth/socialaccount/providers/discord/views.py000066400000000000000000000017261452212273200261420ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.discord.provider import DiscordProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class DiscordOAuth2Adapter(OAuth2Adapter): provider_id = DiscordProvider.id access_token_url = "https://discord.com/api/oauth2/token" authorize_url = "https://discord.com/api/oauth2/authorize" profile_url = "https://discord.com/api/users/@me" def complete_login(self, request, app, token, **kwargs): headers = { "Authorization": "Bearer {0}".format(token.token), "Content-Type": "application/json", } extra_data = requests.get(self.profile_url, headers=headers) return self.get_provider().sociallogin_from_response(request, extra_data.json()) oauth2_login = OAuth2LoginView.adapter_view(DiscordOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DiscordOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/disqus/000077500000000000000000000000001452212273200243065ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/disqus/__init__.py000066400000000000000000000000001452212273200264050ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/disqus/provider.py000066400000000000000000000025311452212273200265130ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.app_settings import QUERY_EMAIL from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DisqusAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("profileUrl") def get_avatar_url(self): return self.account.extra_data.get("avatar", {}).get("permalink") def to_str(self): dflt = super(DisqusAccount, self).to_str() return self.account.extra_data.get("name", dflt) class DisqusProvider(OAuth2Provider): id = "disqus" name = "Disqus" account_class = DisqusAccount def get_default_scope(self): scope = ["read"] if QUERY_EMAIL: scope += ["email"] return scope def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return { "username": data.get("username"), "email": data.get("email"), "name": data.get("name"), } def extract_email_addresses(self, data): ret = [] email = data.get("email") if email: ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [DisqusProvider] django-allauth-0.58.2/allauth/socialaccount/providers/disqus/tests.py000066400000000000000000000040121452212273200260170ustar00rootroot00000000000000# -*- coding: utf-8 -*- from django.contrib.auth.models import User from django.test.utils import override_settings from allauth.account import app_settings as account_settings from allauth.account.models import EmailAddress from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DisqusProvider @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=True, ACCOUNT_SIGNUP_FORM_CLASS=None, ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.MANDATORY, ) class DisqusTests(OAuth2TestsMixin, TestCase): provider_id = DisqusProvider.id def get_mocked_response( self, name="Raymond Penners", email="raymond.penners@example.com" ): return MockedResponse( 200, """ {"response": {"name": "%s", "avatar": { "permalink": "https://lh5.googleusercontent.com/photo.jpg" }, "email": "%s", "profileUrl": "https://plus.google.com/108204268033311374519", "id": "108204268033311374519" }} """ % (name, email), ) def test_account_connect(self): email = "user@example.com" user = User.objects.create(username="user", is_active=True, email=email) user.set_password("test") user.save() EmailAddress.objects.create(user=user, email=email, primary=True, verified=True) self.client.login(username=user.username, password="test") self.login(self.get_mocked_response(), process="connect") # Check if we connected... self.assertTrue( SocialAccount.objects.filter(user=user, provider=DisqusProvider.id).exists() ) # For now, we do not pick up any new email addresses on connect self.assertEqual(EmailAddress.objects.filter(user=user).count(), 1) self.assertEqual(EmailAddress.objects.filter(user=user, email=email).count(), 1) django-allauth-0.58.2/allauth/socialaccount/providers/disqus/urls.py000066400000000000000000000002461452212273200256470ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DisqusProvider urlpatterns = default_urlpatterns(DisqusProvider) django-allauth-0.58.2/allauth/socialaccount/providers/disqus/views.py000066400000000000000000000021271452212273200260170ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DisqusProvider class DisqusOAuth2Adapter(OAuth2Adapter): provider_id = DisqusProvider.id access_token_url = "https://disqus.com/api/oauth/2.0/access_token/" authorize_url = "https://disqus.com/api/oauth/2.0/authorize/" profile_url = "https://disqus.com/api/3.0/users/details.json" scope_delimiter = "," def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, params={ "access_token": token.token, "api_key": app.client_id, "api_secret": app.secret, }, ) resp.raise_for_status() extra_data = resp.json().get("response") login = self.get_provider().sociallogin_from_response(request, extra_data) return login oauth2_login = OAuth2LoginView.adapter_view(DisqusOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DisqusOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/douban/000077500000000000000000000000001452212273200242465ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/douban/__init__.py000077500000000000000000000000001452212273200263500ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/douban/provider.py000077500000000000000000000024331452212273200264570ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DoubanAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("alt") def get_avatar_url(self): return self.account.extra_data.get("large_avatar") def to_str(self): dflt = super(DoubanAccount, self).to_str() return self.account.extra_data.get("name", dflt) class DoubanProvider(OAuth2Provider): id = "douban" name = "Douban" account_class = DoubanAccount def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): """ Extract data from profile json to populate user instance. In Douban profile API: - id: a digital string, will never change - uid: defaults to id, but can be changed once, used in profile url, like slug - name: display name, can be changed every 30 days So we should use `id` as username here, other than `uid`. Also use `name` as `first_name` for displaying purpose. """ return { "username": data["id"], "first_name": data.get("name", ""), } provider_classes = [DoubanProvider] django-allauth-0.58.2/allauth/socialaccount/providers/douban/tests.py000077500000000000000000000015511452212273200257670ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DoubanProvider class DoubanTests(OAuth2TestsMixin, TestCase): provider_id = DoubanProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"name": "guoqiao", "created": "2009-02-18 01:07:52", "is_suicide": false, "alt": "http://www.douban.com/people/qguo/", "avatar": "http://img3.douban.com/icon/u3659811-3.jpg", "signature": "", "uid": "qguo", "is_banned": false, "desc": "\u4e0d\u662f\u5f88\u7231\u8bfb\u4e66", "type": "user", "id": "3659811", "large_avatar": "http://img3.douban.com/icon/up3659811-3.jpg"} """, ) django-allauth-0.58.2/allauth/socialaccount/providers/douban/urls.py000077500000000000000000000002461452212273200256120ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DoubanProvider urlpatterns = default_urlpatterns(DoubanProvider) django-allauth-0.58.2/allauth/socialaccount/providers/douban/views.py000077500000000000000000000025011452212273200257560ustar00rootroot00000000000000import requests from django.utils.translation import gettext_lazy as _ from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from ..base import ProviderException from .provider import DoubanProvider class DoubanOAuth2Adapter(OAuth2Adapter): provider_id = DoubanProvider.id access_token_url = "https://www.douban.com/service/auth2/token" authorize_url = "https://www.douban.com/service/auth2/auth" profile_url = "https://api.douban.com/v2/user/~me" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer %s" % token.token} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() """ Douban may return data like this: { 'code': 128, 'request': 'GET /v2/user/~me', 'msg': 'user_is_locked:53358092' } """ if "id" not in extra_data: msg = extra_data.get("msg", _("Invalid profile data")) raise ProviderException(msg) return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(DoubanOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DoubanOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/doximity/000077500000000000000000000000001452212273200246445ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/doximity/__init__.py000066400000000000000000000000001452212273200267430ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/doximity/provider.py000066400000000000000000000020501452212273200270450ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DoximityAccount(ProviderAccount): def get_profile_url(self): return None def get_avatar_url(self): return self.account.extra_data.get("profile_photo") def to_str(self): dflt = super(DoximityAccount, self).to_str() return self.account.extra_data.get("full_name", dflt) class DoximityProvider(OAuth2Provider): id = "doximity" name = "Doximity" account_class = DoximityAccount def extract_uid(self, data): return str(data["id"]) # the Doximity id is long def extract_common_fields(self, data): return dict( username=data.get("email"), first_name=data.get("firstname"), last_name=data.get("lastname"), email=data.get("email"), name=data.get("full_name"), ) def get_default_scope(self): return ["basic", "email"] provider_classes = [DoximityProvider] django-allauth-0.58.2/allauth/socialaccount/providers/doximity/tests.py000066400000000000000000000041651452212273200263660ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DoximityProvider class DoximityTests(OAuth2TestsMixin, TestCase): provider_id = DoximityProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "id": 41993552342, "npi": 1952635229, "firstname": "John", "middlename": "Henry", "maiden_name": null, "lastname": "Smith", "full_name": "Ahmed S Belal, MD", "gender": "M", "city": "San Francisco", "state": "CA", "zip": "94107", "phone": "(650) 200-3901", "fax": "888-416-8572", "email": "abelalmd@example.com", "address_1": "500 3rd St.", "address_2": "Suite 510", "lat": 42.3663926, "lon": -71.051395, "additional_locations": [{ "address_1": "12 Main st", "address_2": null, "city": "Cambridge", "state": "MA", "phone": "555-555-5555", "fax": null, "zip": "02138" }], "credentials": "MD", "verified": true, "description": "Chief of Cardiology", "medical_school": "UCSF School of Medicine", "residencies": ["Stanford Medical Center", "Mt Sinai Hospital"], "specialty": "Cardiology", "specialty_details": { "abbr": "Cards", "code": "CA00", "credential_id": 4, "name": "Cardiology", "id": "CA00" }, "hospitals": [{ "name": "Mills-Peninsula Health Services", "aha_id": "6930315" }], "subspecialties": ["General Cardiology", "Cardiac Disease"], "profile_photo": "https://s3.amazonaws.com/doximity_prod_uploads\ /profile_photos/7969/normal/profile.png", "colleague_count": 142 } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/doximity/urls.py000066400000000000000000000002521452212273200262020ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DoximityProvider urlpatterns = default_urlpatterns(DoximityProvider) django-allauth-0.58.2/allauth/socialaccount/providers/doximity/views.py000066400000000000000000000016101452212273200263510ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DoximityProvider class DoximityOAuth2Adapter(OAuth2Adapter): provider_id = DoximityProvider.id access_token_url = "https://auth.doximity.com/oauth/token" authorize_url = "https://auth.doximity.com/oauth/authorize" profile_url = "https://www.doximity.com/api/v1/users/current" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer %s" % token.token} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(DoximityOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DoximityOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/draugiem/000077500000000000000000000000001452212273200245735ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/draugiem/__init__.py000066400000000000000000000000001452212273200266720ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/draugiem/provider.py000066400000000000000000000034061452212273200270020ustar00rootroot00000000000000from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.providers.base import Provider, ProviderAccount class DraugiemAccount(ProviderAccount): def get_avatar_url(self): ret = None pic_small_url = self.account.extra_data.get("img") pic_icon_url = self.account.extra_data.get("imgi") pic_medium_url = self.account.extra_data.get("imgm") pic_large_url = self.account.extra_data.get("imgl") if pic_large_url: return pic_large_url elif pic_medium_url: return pic_medium_url elif pic_icon_url: return pic_icon_url elif pic_small_url: return pic_small_url else: return ret def to_str(self): default = super(DraugiemAccount, self).to_str() name = self.account.extra_data.get("name") surname = self.account.extra_data.get("surnname") if name and surname: return "%s %s" % (name, surname) return default class DraugiemProvider(Provider): id = "draugiem" name = "Draugiem" account_class = DraugiemAccount def get_login_url(self, request, **kwargs): url = reverse(self.id + "_login") if kwargs: url = url + "?" + urlencode(kwargs) return url def extract_uid(self, data): return str(data["uid"]) def extract_common_fields(self, data): uid = self.extract_uid(data) user_data = data["users"][uid] return dict( first_name=user_data.get("name"), last_name=user_data.get("surname"), ) def extract_extra_data(self, data): uid = self.extract_uid(data) return data["users"][uid] provider_classes = [DraugiemProvider] django-allauth-0.58.2/allauth/socialaccount/providers/draugiem/tests.py000066400000000000000000000123201452212273200263050ustar00rootroot00000000000000from hashlib import md5 from unittest.mock import Mock, patch from django.contrib.auth.models import User from django.test import RequestFactory from django.urls import reverse from django.utils.http import urlencode from allauth import app_settings from allauth.socialaccount.models import SocialAccount, SocialApp, SocialToken from allauth.tests import TestCase from . import views from .provider import DraugiemProvider class DraugiemTests(TestCase): def setUp(self): # workaround to create a session. see: # https://code.djangoproject.com/ticket/11475 User.objects.create_user( "anakin", "skywalker@deathstar.example.com", "s1thrul3s" ) self.client.login(username="anakin", password="s1thrul3s") app = SocialApp.objects.create( provider=DraugiemProvider.id, name=DraugiemProvider.id, client_id="app123id", key=DraugiemProvider.id, secret="dummy", ) request = RequestFactory().get("/") self.provider = app.get_provider(request) if app_settings.SITES_ENABLED: from django.contrib.sites.models import Site app.sites.add(Site.objects.get_current()) self.app = app def get_draugiem_login_response(self): """ Sample Draugiem.lv response """ return { "apikey": "12345", "uid": "42", "users": { "42": { "age": "266", "imgl": "http://cdn.memegenerator.net/instances/500x/23395689.jpg", "surname": "Skywalker", "url": "/user/42/", "imgi": "http://cdn.memegenerator.net/instances/500x/23395689.jpg", "nick": "Sky Guy", "created": "09.11.1812 11:26:15", "deleted": "false", "imgm": "http://cdn.memegenerator.net/instances/500x/23395689.jpg", "sex": "M", "type": "User_Default", "uid": "42", "place": "London", "emailHash": "3f198f21434gfd2f2b4rs05939shk93f3815bc6aa", "name": "Anakin", "adult": "1", "birthday": "1750-09-13", "img": "http://cdn.memegenerator.net/instances/500x/23395689.jpg", } }, } def get_socialaccount(self, response, token): """ Returns SocialLogin based on the data from the request """ request = Mock() login = self.provider.sociallogin_from_response(request, response) login.token = token return login def mock_socialaccount_state(self): """ SocialLogin depends on Session state - a tuple of request params and a random string """ session = self.client.session session["socialaccount_state"] = ( {"process": "login", "scope": "", "auth_params": ""}, "12345", ) session.save() def test_login_redirect(self): response = self.client.get(reverse(views.login)) redirect_url = reverse(views.callback) full_redirect_url = "http://testserver" + redirect_url secret = self.app.secret + full_redirect_url redirect_url_hash = md5(secret.encode("utf-8")).hexdigest() params = { "app": self.app.client_id, "hash": redirect_url_hash, "redirect": full_redirect_url, } self.assertRedirects( response, "%s?%s" % (views.AUTHORIZE_URL, urlencode(params)), fetch_redirect_response=False, ) def test_callback_no_auth_status(self): response = self.client.get(reverse(views.callback)) self.assertTemplateUsed(response, "socialaccount/authentication_error.html") def test_callback_invalid_auth_status(self): response = self.client.get(reverse(views.callback), {"dr_auth_status": "fail"}) self.assertTemplateUsed(response, "socialaccount/authentication_error.html") def test_callback(self): with patch( "allauth.socialaccount.providers.draugiem.views.draugiem_complete_login" ) as draugiem_complete_login: self.mock_socialaccount_state() response_json = self.get_draugiem_login_response() token = SocialToken(app=self.app, token=response_json["apikey"]) login = self.get_socialaccount(response_json, token) draugiem_complete_login.return_value = login response = self.client.get( reverse(views.callback), {"dr_auth_status": "ok", "dr_auth_code": "42"}, ) self.assertRedirects( response, "/accounts/profile/", fetch_redirect_response=False ) socialaccount = SocialAccount.objects.filter( provider=DraugiemProvider.id ).last() pacc = socialaccount.get_provider_account() assert ( pacc.get_avatar_url() == "http://cdn.memegenerator.net/instances/500x/23395689.jpg" ) assert pacc.to_str() == "Draugiem" django-allauth-0.58.2/allauth/socialaccount/providers/draugiem/urls.py000066400000000000000000000003211452212273200261260ustar00rootroot00000000000000from django.urls import path from . import views urlpatterns = [ path("draugiem/login/", views.login, name="draugiem_login"), path("draugiem/callback/", views.callback, name="draugiem_callback"), ] django-allauth-0.58.2/allauth/socialaccount/providers/draugiem/views.py000066400000000000000000000053511452212273200263060ustar00rootroot00000000000000import requests from hashlib import md5 from django.http import HttpResponseRedirect from django.urls import reverse from django.utils.http import urlencode from django.views.decorators.csrf import csrf_exempt from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.helpers import ( complete_social_login, render_authentication_error, ) from allauth.socialaccount.models import SocialLogin, SocialToken from ..base import AuthError from .provider import DraugiemProvider class DraugiemApiError(Exception): pass ACCESS_TOKEN_URL = "http://api.draugiem.lv/json" AUTHORIZE_URL = "http://api.draugiem.lv/authorize" def login(request): app = get_adapter().get_app(request, DraugiemProvider.id) redirect_url = request.build_absolute_uri(reverse(callback)) redirect_url_hash = md5((app.secret + redirect_url).encode("utf-8")).hexdigest() params = { "app": app.client_id, "hash": redirect_url_hash, "redirect": redirect_url, } SocialLogin.stash_state(request) return HttpResponseRedirect("%s?%s" % (AUTHORIZE_URL, urlencode(params))) @csrf_exempt def callback(request): if "dr_auth_status" not in request.GET: return render_authentication_error( request, DraugiemProvider.id, error=AuthError.UNKNOWN ) if request.GET["dr_auth_status"] != "ok": return render_authentication_error( request, DraugiemProvider.id, error=AuthError.DENIED ) if "dr_auth_code" not in request.GET: return render_authentication_error( request, DraugiemProvider.id, error=AuthError.UNKNOWN ) ret = None auth_exception = None try: app = get_adapter().get_app(request, DraugiemProvider.id) login = draugiem_complete_login(request, app, request.GET["dr_auth_code"]) login.state = SocialLogin.unstash_state(request) ret = complete_social_login(request, login) except (requests.RequestException, DraugiemApiError) as e: auth_exception = e if not ret: ret = render_authentication_error( request, DraugiemProvider.id, exception=auth_exception ) return ret def draugiem_complete_login(request, app, code): provider = get_adapter().get_provider(request, DraugiemProvider.id) response = requests.get( ACCESS_TOKEN_URL, {"action": "authorize", "app": app.secret, "code": code}, ) response.raise_for_status() response_json = response.json() if "error" in response_json: raise DraugiemApiError(response_json["error"]) token = SocialToken(app=app, token=response_json["apikey"]) login = provider.sociallogin_from_response(request, response_json) login.token = token return login django-allauth-0.58.2/allauth/socialaccount/providers/drip/000077500000000000000000000000001452212273200237345ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/drip/__init__.py000066400000000000000000000000001452212273200260330ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/drip/provider.py000066400000000000000000000015351452212273200261440ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DripAccount(ProviderAccount): pass class DripProvider(OAuth2Provider): id = "drip" name = "Drip" account_class = DripAccount def extract_uid(self, data): # no uid available, we generate one by hashing the email uid = hash(data.get("email")) return str(uid) def extract_common_fields(self, data): return dict(email=data.get("email"), name=data.get("name")) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email: ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [DripProvider] django-allauth-0.58.2/allauth/socialaccount/providers/drip/tests.py000066400000000000000000000010051452212273200254440ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DripProvider class DripTests(OAuth2TestsMixin, TestCase): provider_id = DripProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "users":[{ "email": "john@acme.com", "name": "John Doe", "time_zone": "America/Los_Angeles" }] }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/drip/urls.py000066400000000000000000000002421452212273200252710ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DripProvider urlpatterns = default_urlpatterns(DripProvider) django-allauth-0.58.2/allauth/socialaccount/providers/drip/views.py000066400000000000000000000020441452212273200254430ustar00rootroot00000000000000"""Views for Drip API.""" import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DripProvider class DripOAuth2Adapter(OAuth2Adapter): """OAuth2Adapter for Drip API v3.""" provider_id = DripProvider.id authorize_url = "https://www.getdrip.com/oauth/authorize" access_token_url = "https://www.getdrip.com/oauth/token" profile_url = "https://api.getdrip.com/v2/user" def complete_login(self, request, app, token, **kwargs): """Complete login, ensuring correct OAuth header.""" headers = {"Authorization": "Bearer {0}".format(token.token)} response = requests.get(self.profile_url, headers=headers) response.raise_for_status() extra_data = response.json()["users"][0] return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(DripOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DripOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/dropbox/000077500000000000000000000000001452212273200244535ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/dropbox/__init__.py000066400000000000000000000000001452212273200265520ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/dropbox/provider.py000066400000000000000000000011411452212273200266540ustar00rootroot00000000000000from allauth.socialaccount import providers from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DropboxOAuth2Account(ProviderAccount): pass class DropboxOAuth2Provider(OAuth2Provider): id = "dropbox" name = "Dropbox" account_class = DropboxOAuth2Account def extract_uid(self, data): return data["account_id"] def extract_common_fields(self, data): return dict(name=data["name"]["display_name"], email=data["email"]) providers.registry.register(DropboxOAuth2Provider) django-allauth-0.58.2/allauth/socialaccount/providers/dropbox/tests.py000066400000000000000000000023571452212273200261760ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals import json from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DropboxOAuth2Provider class DropboxOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = DropboxOAuth2Provider.id def get_mocked_response(self): payload = { "account_id": "dbid:ASDFasd3ASdfasdFAsd1AS2ASDF1aS-DfAs", "account_type": {".tag": "basic"}, "country": "US", "disabled": False, "email": "allauth@example.com", "email_verified": True, "is_paired": True, "locale": "en", "name": { "abbreviated_name": "AA", "display_name": "All Auth", "familiar_name": "All", "given_name": "All", "surname": "Auth", }, "profile_photo_url": ( "https://dl-web.dropbox.com/account_photo" "/get/dbid%ASDFasd3ASdfasdFAsd1AS2ASDF1aS" "-DfAs?size=128x128" ), "referral_link": "https://db.tt/ASDfAsDf", } return MockedResponse(200, json.dumps(payload)) django-allauth-0.58.2/allauth/socialaccount/providers/dropbox/urls.py000066400000000000000000000002631452212273200260130ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import DropboxOAuth2Provider urlpatterns = default_urlpatterns(DropboxOAuth2Provider) django-allauth-0.58.2/allauth/socialaccount/providers/dropbox/views.py000066400000000000000000000016521452212273200261660ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DropboxOAuth2Provider class DropboxOAuth2Adapter(OAuth2Adapter): provider_id = DropboxOAuth2Provider.id access_token_url = "https://api.dropbox.com/oauth2/token" authorize_url = "https://www.dropbox.com/oauth2/authorize" profile_url = "https://api.dropbox.com/2/users/get_current_account" def complete_login(self, request, app, token, **kwargs): response = requests.post( self.profile_url, headers={"Authorization": "Bearer %s" % (token.token,)}, ) response.raise_for_status() return self.get_provider().sociallogin_from_response(request, response.json()) oauth_login = OAuth2LoginView.adapter_view(DropboxOAuth2Adapter) oauth_callback = OAuth2CallbackView.adapter_view(DropboxOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/dwolla/000077500000000000000000000000001452212273200242605ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/dwolla/__init__.py000066400000000000000000000000001452212273200263570ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/dwolla/models.py000066400000000000000000000000001452212273200261030ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/dwolla/provider.py000066400000000000000000000011401452212273200264600ustar00rootroot00000000000000"""Provider for Dwolla""" from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class DwollaAccount(ProviderAccount): """Dwolla Account""" pass class DwollaProvider(OAuth2Provider): """Provider for Dwolla""" id = "dwolla" name = "Dwolla" account_class = DwollaAccount def extract_uid(self, data): return str(data.get("id", None)) def extract_common_fields(self, data): return dict( name=data.get("name"), ) provider_classes = [DwollaProvider] django-allauth-0.58.2/allauth/socialaccount/providers/dwolla/tests.py000066400000000000000000000015051452212273200257750ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import DwollaProvider class DwollaTests(OAuth2TestsMixin, TestCase): provider_id = DwollaProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "id": "123", "_links":{"account":{"href":"http://localhost"}}, "name":"John Doe" }""", ) def get_login_response_json(self, with_refresh_token=True): rt = "" if with_refresh_token: rt = ',"refresh_token": "testrf"' return ( """{ "uid":"weibo", "access_token":"testac", "_links":{"account":{"href":"http://localhost"}} %s }""" % rt ) django-allauth-0.58.2/allauth/socialaccount/providers/dwolla/urls.py000066400000000000000000000002461452212273200256210ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import DwollaProvider urlpatterns = default_urlpatterns(DwollaProvider) django-allauth-0.58.2/allauth/socialaccount/providers/dwolla/views.py000066400000000000000000000027771452212273200260040ustar00rootroot00000000000000import requests from django.conf import settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import DwollaProvider ENVIRONMENTS = { "production": { "auth_url": "https://www.dwolla.com/oauth/v2/authenticate", "token_url": "https://www.dwolla.com/oauth/v2/token", }, "sandbox": { "auth_url": "https://uat.dwolla.com/oauth/v2/authenticate", "token_url": "https://uat.dwolla.com/oauth/v2/token", }, } ENV = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("dwolla", {}) .get("ENVIRONMENT", "production") ) AUTH_URL = ENVIRONMENTS[ENV]["auth_url"] TOKEN_URL = ENVIRONMENTS[ENV]["token_url"] class DwollaOAuth2Adapter(OAuth2Adapter): """Dwolla Views Adapter""" scope_delimiter = "|" provider_id = DwollaProvider.id access_token_url = TOKEN_URL authorize_url = AUTH_URL def complete_login(self, request, app, token, response, **kwargs): resp = requests.get( response["_links"]["account"]["href"], headers={ "authorization": "Bearer %s" % token.token, "accept": "application/vnd.dwolla.v1.hal+json", }, ) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(DwollaOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(DwollaOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/edmodo/000077500000000000000000000000001452212273200242455ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/edmodo/__init__.py000066400000000000000000000000001452212273200263440ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/edmodo/provider.py000066400000000000000000000020311452212273200264450ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class EdmodoAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("profile_url") def get_avatar_url(self): return self.account.extra_data.get("avatar_url") class EdmodoProvider(OAuth2Provider): id = "edmodo" name = "Edmodo" account_class = EdmodoAccount def get_default_scope(self): return ["basic"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( first_name=data.get("first_name"), last_name=data.get("last_name"), email=data.get("email", ""), ) def extract_extra_data(self, data): return dict( user_type=data.get("type"), profile_url=data.get("url"), avatar_url=data.get("avatars").get("large"), ) provider_classes = [EdmodoProvider] django-allauth-0.58.2/allauth/socialaccount/providers/edmodo/tests.py000066400000000000000000000022361452212273200257640ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import EdmodoProvider class EdmodoTests(OAuth2TestsMixin, TestCase): provider_id = EdmodoProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "url": "https://api.edmodo.com/users/74721257", "id": 74721257, "type": "teacher", "username": "getacclaim-teacher1", "user_title": null, "first_name": "Edmodo Test", "last_name": "Teacher", "time_zone": "America/New_York", "utc_offset": -18000, "locale": "en", "gender": null, "start_level": null, "end_level": null, "about": null, "premium": false, "school": {"url": "https://api.edmodo.com/schools/559253", "id": 559253}, "verified_institution_member": true, "coppa_verified": false, "subjects": null, "avatars": { "small": "https://api.edmodo.com/users/74721257/avatar?type=small&u=670329ncqnf8fxv7tya24byn5", "large": "https://api.edmodo.com/users/74721257/avatar?type=large&u=670329ncqnf8fxv7tya24byn5" }, "email":"test@example.com", "sync_enabled": false } """, ) # noqa django-allauth-0.58.2/allauth/socialaccount/providers/edmodo/urls.py000066400000000000000000000002461452212273200256060ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import EdmodoProvider urlpatterns = default_urlpatterns(EdmodoProvider) django-allauth-0.58.2/allauth/socialaccount/providers/edmodo/views.py000066400000000000000000000015001452212273200257500ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import EdmodoProvider class EdmodoOAuth2Adapter(OAuth2Adapter): provider_id = EdmodoProvider.id access_token_url = "https://api.edmodo.com/oauth/token" authorize_url = "https://api.edmodo.com/oauth/authorize" profile_url = "https://api.edmodo.com/users/me" def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(EdmodoOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(EdmodoOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/edx/000077500000000000000000000000001452212273200235565ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/edx/__init__.py000066400000000000000000000000001452212273200256550ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/edx/provider.py000066400000000000000000000015711452212273200257660ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class EdxAccount(ProviderAccount): def get_profile_url(self): if self.account.extra_data["profile_image"]["has_image"]: return self.account.extra_data["image_url_full"] class EdxProvider(OAuth2Provider): id = "edx" name = "Edx" account_class = EdxAccount def get_default_scope(self): return ["profile"] def extract_uid(self, data): """Extract uid ('id') and ensure it's a str.""" return str(data["username"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), name=data.get("name"), user_id=data.get("user_id"), ) provider_classes = [EdxProvider] django-allauth-0.58.2/allauth/socialaccount/providers/edx/tests.py000066400000000000000000000022451452212273200252750ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import EdxProvider class EdxTests(OAuth2TestsMixin, TestCase): provider_id = EdxProvider.id def get_mocked_response(self): print(self) return MockedResponse( 200, """{ "username":"krzysztof", "bio":null, "requires_parental_consent":true, "language_proficiencies":[ ], "name":"Krzysztof Hoffmann", "country":null, "social_links":[ ], "is_active":true, "profile_image":{ "image_url_small":"http://draft.navoica.pl/static/images/profiles/default_30.png", "image_url_full":"http://draft.navoica.pl/static/images/profiles/default_500.png", "image_url_large":"http://draft.navoica.pl/static/images/profiles/default_120.png", "image_url_medium":"http://draft.navoica.pl/static/images/profiles/default_50.png", "has_image":false }, "extended_profile":[ ], "year_of_birth":null, "level_of_education":null, "goals":"", "accomplishments_shared":false, "gender":null, "date_joined":"2019-09-21T07:48:31Z", "mailing_address":"", "email":"krzysztof.hoffmann@opi.org.pl", "account_privacy":"private" }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/edx/urls.py000066400000000000000000000002401452212273200251110ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import EdxProvider urlpatterns = default_urlpatterns(EdxProvider) django-allauth-0.58.2/allauth/socialaccount/providers/edx/views.py000066400000000000000000000027501452212273200252710ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import EdxProvider class EdxOAuth2Adapter(OAuth2Adapter): provider_id = EdxProvider.id provider_default_url = "https://edx.org" settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("EDX_URL", provider_default_url) access_token_url = "{0}/oauth2/access_token".format(provider_base_url) authorize_url = "{0}/oauth2/authorize/".format(provider_base_url) profile_url = "{0}/api/user/v1/me".format(provider_base_url) account_url = "{0}/api/user/v1/accounts/{1}" supports_state = False redirect_uri_protocol = "https" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} response = requests.get(self.profile_url, headers=headers) extra_data = response.json() if extra_data.get("email", None) is None: response = requests.get( self.account_url.format(self.provider_base_url, extra_data["username"]), headers=headers, ) extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(EdxOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(EdxOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/eventbrite/000077500000000000000000000000001452212273200251455ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/eventbrite/__init__.py000066400000000000000000000000001452212273200272440ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/eventbrite/provider.py000066400000000000000000000034741452212273200273610ustar00rootroot00000000000000"""Customise Provider classes for Eventbrite API v3.""" from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class EventbriteAccount(ProviderAccount): """ProviderAccount subclass for Eventbrite.""" def get_avatar_url(self): """Return avatar url.""" return self.account.extra_data["image_id"] class EventbriteProvider(OAuth2Provider): """OAuth2Provider subclass for Eventbrite.""" id = "eventbrite" name = "Eventbrite" account_class = EventbriteAccount def extract_uid(self, data): """Extract uid ('id') and ensure it's a str.""" return str(data["id"]) def get_default_scope(self): """Ensure scope is null to fit their API.""" return [""] def extract_common_fields(self, data): """Extract fields from a basic user query.""" email = None for curr_email in data.get("emails", []): email = email or curr_email.get("email") if curr_email.get("verified", False) and curr_email.get("primary", False): email = curr_email.get("email") return dict( email=email, id=data.get("id"), name=data.get("name"), first_name=data.get("first_name"), last_name=data.get("last_name"), image_url=data.get("image_url"), ) def extract_email_addresses(self, data): addresses = [] for email in data.get("emails", []): addresses.append( EmailAddress( email=email.get("email"), verified=email.get("verified"), ) ) return addresses provider_classes = [EventbriteProvider] django-allauth-0.58.2/allauth/socialaccount/providers/eventbrite/tests.py000066400000000000000000000014501452212273200266610ustar00rootroot00000000000000"""Test Eventbrite OAuth2 v3 Flow.""" from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import EventbriteProvider class EventbriteTests(OAuth2TestsMixin, TestCase): """Test Class for Eventbrite OAuth2 v3.""" provider_id = EventbriteProvider.id def get_mocked_response(self): """Test authentication with an non-null image_id""" return MockedResponse( 200, """{ "emails": [{ "email": "test@example.com", "verified": true }], "id": "999999999", "name": "Andrew Godwin", "first_name": "Andrew", "last_name": "Godwin", "image_id": "99999999" }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/eventbrite/urls.py000066400000000000000000000003311452212273200265010ustar00rootroot00000000000000"""Register urls for EventbriteProvider""" from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import EventbriteProvider urlpatterns = default_urlpatterns(EventbriteProvider) django-allauth-0.58.2/allauth/socialaccount/providers/eventbrite/views.py000066400000000000000000000017231452212273200266570ustar00rootroot00000000000000"""Views for Eventbrite API v3.""" import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import EventbriteProvider class EventbriteOAuth2Adapter(OAuth2Adapter): """OAuth2Adapter for Eventbrite API v3.""" provider_id = EventbriteProvider.id authorize_url = "https://www.eventbrite.com/oauth/authorize" access_token_url = "https://www.eventbrite.com/oauth/token" profile_url = "https://www.eventbriteapi.com/v3/users/me/" def complete_login(self, request, app, token, **kwargs): """Complete login.""" resp = requests.get(self.profile_url, params={"token": token.token}) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(EventbriteOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(EventbriteOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/eveonline/000077500000000000000000000000001452212273200247625ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/eveonline/__init__.py000066400000000000000000000000001452212273200270610ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/eveonline/provider.py000066400000000000000000000026551452212273200271760ustar00rootroot00000000000000from allauth.socialaccount.app_settings import STORE_TOKENS from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class EveOnlineAccount(ProviderAccount): def get_profile_url(self): return "https://gate.eveonline.com/Profile/{char_name}".format( char_name=self.account.extra_data.get("CharacterName") ) def get_avatar_url(self): return ("https://image.eveonline.com/Character/{char_id}_128.jpg").format( char_id=self.account.extra_data.get("CharacterID", 1) ) def to_str(self): dflt = super(EveOnlineAccount, self).to_str() return next( value for value in ( self.account.extra_data.get("CharacterName", None), self.account.extra_data.get("CharacterID", None), dflt, ) if value is not None ) class EveOnlineProvider(OAuth2Provider): id = "eveonline" name = "EVE Online" account_class = EveOnlineAccount def get_default_scope(self): scopes = [] if STORE_TOKENS: scopes.append("publicData") return scopes def extract_uid(self, data): return str(data["CharacterOwnerHash"]) def extract_common_fields(self, data): return dict(name=data.get("CharacterName")) provider_classes = [EveOnlineProvider] django-allauth-0.58.2/allauth/socialaccount/providers/eveonline/tests.py000066400000000000000000000011631452212273200264770ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import EveOnlineProvider class EveOnlineTests(OAuth2TestsMixin, TestCase): provider_id = EveOnlineProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "CharacterID": 273042051, "CharacterName": "CCP illurkall", "ExpiresOn": "2014-05-23T15:01:15.182864Z", "Scopes": " ", "TokenType": "Character", "CharacterOwnerHash": "XM4D...FoY=" }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/eveonline/urls.py000066400000000000000000000002541452212273200263220ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import EveOnlineProvider urlpatterns = default_urlpatterns(EveOnlineProvider) django-allauth-0.58.2/allauth/socialaccount/providers/eveonline/views.py000066400000000000000000000016231452212273200264730ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import EveOnlineProvider class EveOnlineOAuth2Adapter(OAuth2Adapter): provider_id = EveOnlineProvider.id access_token_url = "https://login.eveonline.com/oauth/token" authorize_url = "https://login.eveonline.com/oauth/authorize" profile_url = "https://login.eveonline.com/oauth/verify" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer " + token.token}, ) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(EveOnlineOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(EveOnlineOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/evernote/000077500000000000000000000000001452212273200246255ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/evernote/__init__.py000066400000000000000000000000001452212273200267240ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/evernote/provider.py000066400000000000000000000011031452212273200270240ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class EvernoteAccount(ProviderAccount): def get_profile_url(self): return None def get_avatar_url(self): return None class EvernoteProvider(OAuthProvider): id = "evernote" name = "Evernote" account_class = EvernoteAccount def extract_uid(self, data): return str(data["edam_userId"]) def extract_common_fields(self, data): return data provider_classes = [EvernoteProvider] django-allauth-0.58.2/allauth/socialaccount/providers/evernote/tests.py000066400000000000000000000015701452212273200263440ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import EvernoteProvider class EvernoteTests(OAuthTestsMixin, TestCase): provider_id = EvernoteProvider.id def get_mocked_response(self): return [] def get_access_token_response(self): return MockedResponse( 200, "oauth_token=S%3Ds1%3AU%3D9876%3AE%3D999999b0c50%3AC%3D14c1f89dd18%3AP%3D81%3AA%3Dpennersr%3AV%3D2%3AH%3Ddeadf00dd2d6aba7b519923987b4bf77&oauth_token_secret=&edam_shard=s1&edam_userId=591969&edam_expires=1457994271824&edam_noteStoreUrl=https%3A%2F%2Fsandbox.evernote.com%2Fshard%2Fs1%2Fnotestore&edam_webApiUrlPrefix=https%3A%2F%2Fsandbox.evernote.com%2Fshard%2Fs1%2F", # noqa {"content-type": "text/plain"}, ) django-allauth-0.58.2/allauth/socialaccount/providers/evernote/urls.py000066400000000000000000000002511452212273200261620ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import EvernoteProvider urlpatterns = default_urlpatterns(EvernoteProvider) django-allauth-0.58.2/allauth/socialaccount/providers/evernote/views.py000066400000000000000000000022111452212273200263300ustar00rootroot00000000000000from datetime import datetime from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import EvernoteProvider class EvernoteOAuthAdapter(OAuthAdapter): provider_id = EvernoteProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) request_token_url = "https://%s/oauth" % ( settings.get("EVERNOTE_HOSTNAME", "sandbox.evernote.com") ) access_token_url = "https://%s/oauth" % ( settings.get("EVERNOTE_HOSTNAME", "sandbox.evernote.com") ) authorize_url = "https://%s/OAuth.action" % ( settings.get("EVERNOTE_HOSTNAME", "sandbox.evernote.com") ) def complete_login(self, request, app, token, response): token.expires_at = datetime.fromtimestamp( int(response["edam_expires"]) / 1000.0 ) extra_data = response return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(EvernoteOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(EvernoteOAuthAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/exist/000077500000000000000000000000001452212273200241325ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/exist/__init__.py000066400000000000000000000000001452212273200262310ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/exist/provider.py000066400000000000000000000022771452212273200263460ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class ExistAccount(ProviderAccount): def get_profile_url(self): return "https://exist.io/api/2/accounts/profile/" def get_avatar_url(self): return self.account.extra_data.get("avatar") def to_str(self): name = super().to_str() return self.account.extra_data.get("name", name) class ExistProvider(OAuth2Provider): id = "exist" name = "Exist.io" account_class = ExistAccount def extract_uid(self, data): return data.get("username") def extract_common_fields(self, data): extra_common = super().extract_common_fields(data) extra_common.update( username=data.get("username"), first_name=data.get("first_name"), last_name=data.get("last_name"), avatar=data.get("avatar"), timezone=data.get("timezone"), local_time=data.get("local_time"), ) return extra_common def get_default_scope(self): return ["mood_read", "health_read", "productivity_read"] provider_classes = [ExistProvider] django-allauth-0.58.2/allauth/socialaccount/providers/exist/tests.py000066400000000000000000000022561452212273200256530ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.exist.provider import ExistProvider from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class ExistTests(OAuth2TestsMixin, TestCase): provider_id = ExistProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "id": 1, "username": "josh", "first_name": "Josh", "last_name": "Sharp", "bio": "I made this thing you're using.", "url": "http://hellocode.co/", "avatar": "https://exist.io/static/media/avatars/josh_2.png", "timezone": "Australia/Melbourne", "local_time": "2020-07-31T22:33:49.359+10:00", "private": false, "imperial_units": false, "imperial_distance": false, "imperial_weight": false, "imperial_energy": false, "imperial_liquid": false, "imperial_temperature": false, "attributes": [] } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/exist/urls.py000066400000000000000000000002441452212273200254710ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import ExistProvider urlpatterns = default_urlpatterns(ExistProvider) django-allauth-0.58.2/allauth/socialaccount/providers/exist/views.py000066400000000000000000000015621452212273200256450ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import ExistProvider class ExistOAuth2Adapter(OAuth2Adapter): provider_id = ExistProvider.id access_token_url = "https://exist.io/oauth2/access_token" authorize_url = "https://exist.io/oauth2/authorize" profile_url = "https://exist.io/api/2/accounts/profile/" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(ExistOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(ExistOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/facebook/000077500000000000000000000000001452212273200245475ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/facebook/__init__.py000066400000000000000000000000001452212273200266460ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/facebook/data/000077500000000000000000000000001452212273200254605ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/facebook/data/FacebookLocales.xml000066400000000000000000000311061452212273200312170ustar00rootroot00000000000000 Afrikaans FB af_ZA Arabic FB ar_AR Azerbaijani FB az_AZ Belarusian FB be_BY Bulgarian FB bg_BG Bengali FB bn_IN Bosnian FB bs_BA Catalan FB ca_ES Czech FB cs_CZ Welsh FB cy_GB Danish FB da_DK German FB de_DE Greek FB el_GR English (UK) FB en_GB English (Pirate) FB en_PI English (Upside Down) FB en_UD English (US) FB en_US Esperanto FB eo_EO Spanish (Spain) FB es_ES Spanish FB es_LA Estonian FB et_EE Basque FB eu_ES Persian FB fa_IR Leet Speak FB fb_LT Finnish FB fi_FI Faroese FB fo_FO French (Canada) FB fr_CA French (France) FB fr_FR Frisian FB fy_NL Irish FB ga_IE Galician FB gl_ES Hebrew FB he_IL Hindi FB hi_IN Croatian FB hr_HR Hungarian FB hu_HU Armenian FB hy_AM Indonesian FB id_ID Icelandic FB is_IS Italian FB it_IT Japanese FB ja_JP Georgian FB ka_GE Khmer FB km_KH Korean FB ko_KR Kurdish FB ku_TR Latin FB la_VA Lithuanian FB lt_LT Latvian FB lv_LV Macedonian FB mk_MK Malayalam FB ml_IN Malay FB ms_MY Norwegian (bokmal) FB nb_NO Nepali FB ne_NP Dutch FB nl_NL Norwegian (nynorsk) FB nn_NO Punjabi FB pa_IN Polish FB pl_PL Pashto FB ps_AF Portuguese (Brazil) FB pt_BR Portuguese (Portugal) FB pt_PT Romanian FB ro_RO Russian FB ru_RU Slovak FB sk_SK Slovenian FB sl_SI Albanian FB sq_AL Serbian FB sr_RS Swedish FB sv_SE Swahili FB sw_KE Tamil FB ta_IN Telugu FB te_IN Thai FB th_TH Filipino FB tl_PH Turkish FB tr_TR Ukrainian FB uk_UA Vietnamese FB vi_VN Simplified Chinese (China) FB zh_CN Traditional Chinese (Hong Kong) FB zh_HK Traditional Chinese (Taiwan) FB zh_TW django-allauth-0.58.2/allauth/socialaccount/providers/facebook/forms.py000066400000000000000000000001641452212273200262500ustar00rootroot00000000000000from django import forms class FacebookConnectForm(forms.Form): access_token = forms.CharField(required=True) django-allauth-0.58.2/allauth/socialaccount/providers/facebook/locale.py000066400000000000000000000045361452212273200263700ustar00rootroot00000000000000# Default locale mapping for the Facebook JS SDK # The list of supported locales is at # https://www.facebook.com/translations/FacebookLocales.xml import os from django.utils.translation import get_language, to_locale def _build_locale_table(filename_or_file): """ Parses the FacebookLocales.xml file and builds a dict relating every available language ('en, 'es, 'zh', ...) with a list of available regions for that language ('en' -> 'US', 'EN') and an (arbitrary) default region. """ # Require the XML parser module only if we want the default mapping from xml.dom.minidom import parse dom = parse(filename_or_file) reps = dom.getElementsByTagName("representation") locs = map(lambda r: r.childNodes[0].data, reps) locale_map = {} for loc in locs: lang, _, reg = loc.partition("_") lang_map = locale_map.setdefault(lang, {"regs": [], "default": reg}) lang_map["regs"].append(reg) # Default region overrides (arbitrary) locale_map["en"]["default"] = "US" # Special case: Use es_ES for Spain and es_LA for everything else locale_map["es"]["default"] = "LA" locale_map["zh"]["default"] = "CN" locale_map["fr"]["default"] = "FR" locale_map["pt"]["default"] = "PT" return locale_map def get_default_locale_callable(): """ Wrapper function so that the default mapping is only built when needed """ exec_dir = os.path.dirname(os.path.realpath(__file__)) xml_path = os.path.join(exec_dir, "data", "FacebookLocales.xml") fb_locales = _build_locale_table(xml_path) def default_locale(request): """ Guess an appropriate FB locale based on the active Django locale. If the active locale is available, it is returned. Otherwise, it tries to return another locale with the same language. If there isn't one available, 'en_US' is returned. """ chosen = "en_US" language = get_language() if language: locale = to_locale(language) lang, _, reg = locale.partition("_") lang_map = fb_locales.get(lang) if lang_map is not None: if reg in lang_map["regs"]: chosen = lang + "_" + reg else: chosen = lang + "_" + lang_map["default"] return chosen return default_locale django-allauth-0.58.2/allauth/socialaccount/providers/facebook/provider.py000066400000000000000000000161751452212273200267650ustar00rootroot00000000000000import json import string from urllib.parse import quote from django.conf import settings from django.middleware.csrf import get_token from django.template.loader import render_to_string from django.urls import reverse from django.utils.crypto import get_random_string from django.utils.html import escapejs, mark_safe from allauth.account.models import EmailAddress from allauth.socialaccount.app_settings import QUERY_EMAIL from allauth.socialaccount.providers.base import ( AuthAction, AuthProcess, ProviderAccount, ) from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider from allauth.utils import import_callable from .locale import get_default_locale_callable GRAPH_API_VERSION = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("facebook", {}) .get("VERSION", "v13.0") ) GRAPH_API_URL = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("facebook", {}) .get("GRAPH_API_URL", "https://graph.facebook.com/{}".format(GRAPH_API_VERSION)) ) NONCE_SESSION_KEY = "allauth_facebook_nonce" NONCE_LENGTH = 32 class FacebookAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("link") def get_avatar_url(self): uid = self.account.uid # ask for a 600x600 pixel image. We might get smaller but # image will always be highest res possible and square return ( GRAPH_API_URL + "/%s/picture?type=square&height=600&width=600&return_ssl_resources=1" % uid ) # noqa def to_str(self): dflt = super(FacebookAccount, self).to_str() return self.account.extra_data.get("name", dflt) class FacebookProvider(OAuth2Provider): id = "facebook" name = "Facebook" account_class = FacebookAccount def __init__(self, *args, **kwargs): self._locale_callable_cache = None super().__init__(*args, **kwargs) def get_method(self): return self.get_settings().get("METHOD", "oauth2") def get_login_url(self, request, **kwargs): method = kwargs.pop("method", self.get_method()) if method == "js_sdk": next = "'%s'" % escapejs(kwargs.get("next") or "") process = "'%s'" % escapejs(kwargs.get("process") or AuthProcess.LOGIN) action = "'%s'" % escapejs(kwargs.get("action") or AuthAction.AUTHENTICATE) scope = "'%s'" % escapejs(kwargs.get("scope", "")) js = "allauth.facebook.login(%s, %s, %s, %s)" % ( next, action, process, scope, ) ret = "javascript:%s" % (quote(js),) elif method == "oauth2": ret = super(FacebookProvider, self).get_login_url(request, **kwargs) else: raise RuntimeError("Invalid method specified: %s" % method) return ret def _get_locale_callable(self): settings = self.get_settings() func = settings.get("LOCALE_FUNC") return import_callable(func) if func else get_default_locale_callable() def get_locale_for_request(self, request): if not self._locale_callable_cache: self._locale_callable_cache = self._get_locale_callable() return self._locale_callable_cache(request) def get_default_scope(self): scope = [] if QUERY_EMAIL: scope.append("email") return scope def get_fields(self): settings = self.get_settings() default_fields = [ "id", "email", "name", "first_name", "last_name", "verified", "locale", "timezone", "link", "gender", "updated_time", ] return settings.get("FIELDS", default_fields) def get_auth_params(self, request, action): ret = super(FacebookProvider, self).get_auth_params(request, action) if action == AuthAction.REAUTHENTICATE: ret["auth_type"] = "reauthenticate" elif action == AuthAction.REREQUEST: ret["auth_type"] = "rerequest" return ret def get_init_params(self, request, app): init_params = {"appId": app.client_id, "version": GRAPH_API_VERSION} settings = self.get_settings() init_params.update(settings.get("INIT_PARAMS", {})) return init_params def get_fb_login_options(self, request): ret = self.get_auth_params(request, "authenticate") ret["scope"] = ",".join(self.get_scope(request)) if ret.get("auth_type") == "reauthenticate": ret["auth_nonce"] = self.get_nonce(request, or_create=True) return ret def get_sdk_url(self, request): settings = self.get_settings() sdk_url = settings.get("SDK_URL", "//connect.facebook.net/{locale}/sdk.js") field_names = [ tup[1] for tup in string.Formatter().parse(sdk_url) if tup[1] is not None ] if "locale" in field_names: locale = self.get_locale_for_request(request) sdk_url = sdk_url.format(locale=locale) return sdk_url def media_js(self, request): if self.get_method() != "js_sdk": return "" def abs_uri(name): return request.build_absolute_uri(reverse(name)) fb_data = { "appId": self.app.client_id, "version": GRAPH_API_VERSION, "sdkUrl": self.get_sdk_url(request), "initParams": self.get_init_params(request, self.app), "loginOptions": self.get_fb_login_options(request), "loginByTokenUrl": abs_uri("facebook_login_by_token"), "cancelUrl": abs_uri("socialaccount_login_cancelled"), "logoutUrl": abs_uri("account_logout"), "loginUrl": request.build_absolute_uri( self.get_login_url(request, method="oauth2") ), "errorUrl": abs_uri("socialaccount_login_error"), "csrfToken": get_token(request), } ctx = {"fb_data": mark_safe(json.dumps(fb_data))} return render_to_string("facebook/fbconnect.html", ctx, request=request) def get_nonce(self, request, or_create=False, pop=False): if pop: nonce = request.session.pop(NONCE_SESSION_KEY, None) else: nonce = request.session.get(NONCE_SESSION_KEY) if not nonce and or_create: nonce = get_random_string(NONCE_LENGTH) request.session[NONCE_SESSION_KEY] = nonce return nonce def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), first_name=data.get("first_name"), last_name=data.get("last_name"), name=data.get("name"), ) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email: # data['verified'] does not imply the email address is # verified. ret.append(EmailAddress(email=email, verified=False, primary=True)) return ret provider_classes = [FacebookProvider] django-allauth-0.58.2/allauth/socialaccount/providers/facebook/static/000077500000000000000000000000001452212273200260365ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/facebook/static/facebook/000077500000000000000000000000001452212273200276075ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/facebook/static/facebook/js/000077500000000000000000000000001452212273200302235ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/facebook/static/facebook/js/fbconnect.js000066400000000000000000000064401452212273200325260ustar00rootroot00000000000000/* global document, window, FB */ (function () { 'use strict' function postForm (action, data) { var f = document.createElement('form') f.method = 'POST' f.action = action for (var key in data) { var d = document.createElement('input') d.type = 'hidden' d.name = key d.value = data[key] f.appendChild(d) } document.body.appendChild(f) f.submit() } function setLocationHref (url) { if (typeof (url) === 'function') { // Deprecated -- instead, override // allauth.facebook.onLoginError et al directly. url() } else { window.location.href = url } } var allauth = window.allauth = window.allauth || {} var fbSettings = JSON.parse(document.getElementById('allauth-facebook-settings').innerHTML) var fbInitialized = false allauth.facebook = { init: function (opts) { this.opts = opts window.fbAsyncInit = function () { FB.init(opts.initParams) fbInitialized = true allauth.facebook.onInit() }; (function (d) { var js var id = 'facebook-jssdk' if (d.getElementById(id)) { return } js = d.createElement('script'); js.id = id; js.async = true js.src = opts.sdkUrl d.getElementsByTagName('head')[0].appendChild(js) }(document)) }, onInit: function () { }, login: function (nextUrl, action, process, scope) { var self = this if (!fbInitialized) { var url = this.opts.loginUrl + '?next=' + encodeURIComponent(nextUrl) + '&action=' + encodeURIComponent(action) + '&process=' + encodeURIComponent(process) + '&scope=' + encodeURIComponent(scope) setLocationHref(url) return } if (action === 'reauthenticate' || action === 'rerequest') { this.opts.loginOptions.auth_type = action } if (scope !== '') { this.opts.loginOptions.scope = scope } FB.login(function (response) { if (response.authResponse) { self.onLoginSuccess(response, nextUrl, process) } else if (response && response.status && ['not_authorized', 'unknown'].indexOf(response.status) > -1) { self.onLoginCanceled(response) } else { self.onLoginError(response) } }, self.opts.loginOptions) }, onLoginCanceled: function (/* response */) { setLocationHref(this.opts.cancelUrl) }, onLoginError: function (/* response */) { setLocationHref(this.opts.errorUrl) }, onLoginSuccess: function (response, nextUrl, process) { var data = { next: nextUrl || '', process: process, access_token: response.authResponse.accessToken, expires_in: response.authResponse.expiresIn, csrfmiddlewaretoken: this.opts.csrfToken } postForm(this.opts.loginByTokenUrl, data) }, logout: function (nextUrl) { var self = this if (!fbInitialized) { return } FB.logout(function (response) { self.onLogoutSuccess(response, nextUrl) }) }, onLogoutSuccess: function (response, nextUrl) { var data = { next: nextUrl || '', csrfmiddlewaretoken: this.opts.csrfToken } postForm(this.opts.logoutUrl, data) } } allauth.facebook.init(fbSettings) })() django-allauth-0.58.2/allauth/socialaccount/providers/facebook/templates/000077500000000000000000000000001452212273200265455ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/facebook/templates/facebook/000077500000000000000000000000001452212273200303165ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/facebook/templates/facebook/fbconnect.html000066400000000000000000000003301452212273200331410ustar00rootroot00000000000000{% load static %}
django-allauth-0.58.2/allauth/socialaccount/providers/facebook/tests.py000066400000000000000000000130341452212273200262640ustar00rootroot00000000000000import json from unittest.mock import patch from django.contrib.auth import get_user_model from django.test.client import RequestFactory from django.test.utils import override_settings from django.urls import reverse from allauth.account import app_settings as account_settings from allauth.account.models import EmailAddress from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FacebookProvider @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=True, ACCOUNT_SIGNUP_FORM_CLASS=None, LOGIN_REDIRECT_URL="/accounts/profile/", ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.NONE, SOCIALACCOUNT_PROVIDERS={"facebook": {"AUTH_PARAMS": {}, "VERIFIED_EMAIL": False}}, ) class FacebookTests(OAuth2TestsMixin, TestCase): provider_id = FacebookProvider.id facebook_data = """ { "id": "630595557", "name": "Raymond Penners", "first_name": "Raymond", "last_name": "Penners", "email": "raymond.penners@example.com", "link": "https://www.facebook.com/raymond.penners", "username": "raymond.penners", "birthday": "07/17/1973", "work": [ { "employer": { "id": "204953799537777", "name": "IntenCT" } } ], "timezone": 1, "locale": "nl_NL", "verified": true, "updated_time": "2012-11-30T20:40:33+0000" }""" def get_mocked_response(self, data=None): if data is None: data = self.facebook_data return MockedResponse(200, data) def test_username_conflict(self): User = get_user_model() User.objects.create(username="raymond.penners") self.login(self.get_mocked_response()) socialaccount = SocialAccount.objects.get(uid="630595557") self.assertEqual(socialaccount.user.username, "raymond") def test_username_based_on_provider(self): self.login(self.get_mocked_response()) socialaccount = SocialAccount.objects.get(uid="630595557") self.assertEqual(socialaccount.user.username, "raymond.penners") def test_username_based_on_provider_with_simple_name(self): data = '{"id": "1234567", "name": "Harvey McGillicuddy"}' self.login(self.get_mocked_response(data=data)) socialaccount = SocialAccount.objects.get(uid="1234567") self.assertEqual(socialaccount.user.username, "harvey") @override_settings( SOCIALACCOUNT_PROVIDERS={ "facebook": { "METHOD": "js_sdk", } }, ) def test_media_js(self): request = RequestFactory().get(reverse("account_login")) request.session = {} script = self.provider.media_js(request) self.assertTrue('"appId": "app123id"' in script) def test_login_by_token(self): resp = self.client.get(reverse("account_login")) with patch( "allauth.socialaccount.providers.facebook.views.requests" ) as requests_mock: mocks = [ {"access_token": "app_token"}, { "data": { "app_id": "app123id", "is_valid": True, } }, self.get_mocked_response().json(), ] requests_mock.get.return_value.json = lambda: mocks.pop(0) resp = self.client.post( reverse("facebook_login_by_token"), data={"access_token": "dummy"}, ) self.assertRedirects( resp, "/accounts/profile/", fetch_redirect_response=False ) @override_settings( SOCIALACCOUNT_PROVIDERS={ "facebook": { "METHOD": "js_sdk", "AUTH_PARAMS": {"auth_type": "reauthenticate"}, "VERIFIED_EMAIL": False, } } ) def test_login_by_token_reauthenticate(self): resp = self.client.get(reverse("account_login")) nonce = json.loads(resp.context["fb_data"])["loginOptions"]["auth_nonce"] with patch( "allauth.socialaccount.providers.facebook.views.requests" ) as requests_mock: mocks = [ {"access_token": "app_token"}, { "data": { "app_id": "app123id", "is_valid": True, } }, {"auth_nonce": nonce}, self.get_mocked_response().json(), ] requests_mock.get.return_value.json = lambda: mocks.pop(0) resp = self.client.post( reverse("facebook_login_by_token"), data={"access_token": "dummy"}, ) self.assertRedirects( resp, "/accounts/profile/", fetch_redirect_response=False ) @override_settings(SOCIALACCOUNT_PROVIDERS={"facebook": {"VERIFIED_EMAIL": True}}) def test_login_verified(self): emailaddress = self._login_verified() self.assertTrue(emailaddress.verified) def test_login_unverified(self): emailaddress = self._login_verified() self.assertFalse(emailaddress.verified) def _login_verified(self): self.login(self.get_mocked_response()) return EmailAddress.objects.get(email="raymond.penners@example.com") django-allauth-0.58.2/allauth/socialaccount/providers/facebook/urls.py000066400000000000000000000005501452212273200261060ustar00rootroot00000000000000from django.urls import path from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from . import views from .provider import FacebookProvider urlpatterns = default_urlpatterns(FacebookProvider) urlpatterns += [ path( "facebook/login/token/", views.login_by_token, name="facebook_login_by_token", ), ] django-allauth-0.58.2/allauth/socialaccount/providers/facebook/views.py000066400000000000000000000142661452212273200262670ustar00rootroot00000000000000import hashlib import hmac import logging import requests from datetime import timedelta from django import forms from django.core.cache import cache from django.core.exceptions import PermissionDenied from django.utils import timezone from django.views.generic import View from allauth.socialaccount import app_settings from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.helpers import ( complete_social_login, render_authentication_error, ) from allauth.socialaccount.models import SocialLogin, SocialToken from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .forms import FacebookConnectForm from .provider import GRAPH_API_URL, GRAPH_API_VERSION, FacebookProvider logger = logging.getLogger(__name__) def compute_appsecret_proof(app, token): # Generate an appsecret_proof parameter to secure the Graph API call # see https://developers.facebook.com/docs/graph-api/securing-requests msg = token.token.encode("utf-8") key = app.secret.encode("utf-8") appsecret_proof = hmac.new(key, msg, digestmod=hashlib.sha256).hexdigest() return appsecret_proof def fb_complete_login(request, app, token): provider = app.get_provider(request) resp = requests.get( GRAPH_API_URL + "/me", params={ "fields": ",".join(provider.get_fields()), "access_token": token.token, "appsecret_proof": compute_appsecret_proof(app, token), }, ) resp.raise_for_status() extra_data = resp.json() login = provider.sociallogin_from_response(request, extra_data) return login class FacebookOAuth2Adapter(OAuth2Adapter): provider_id = FacebookProvider.id provider_default_auth_url = "https://www.facebook.com/{}/dialog/oauth".format( GRAPH_API_VERSION ) settings = app_settings.PROVIDERS.get(provider_id, {}) scope_delimiter = "," authorize_url = settings.get("AUTHORIZE_URL", provider_default_auth_url) access_token_url = GRAPH_API_URL + "/oauth/access_token" access_token_method = "GET" expires_in_key = "expires_in" def complete_login(self, request, app, access_token, **kwargs): return fb_complete_login(request, app, access_token) oauth2_login = OAuth2LoginView.adapter_view(FacebookOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(FacebookOAuth2Adapter) class LoginByTokenView(View): def dispatch(self, request): try: return super().dispatch(request) except ( requests.RequestException, forms.ValidationError, PermissionDenied, ) as exc: return render_authentication_error( request, FacebookProvider.id, exception=exc ) def get(self, request): # If we leave out get().get() it will return a response with a 405, but # we really want to show an authentication error. raise PermissionDenied("405") def post(self, request): form = FacebookConnectForm(request.POST) if not form.is_valid(): raise forms.ValidationError() adapter = get_adapter() provider = adapter.get_provider(request, FacebookProvider.id) login_options = provider.get_fb_login_options(request) app = provider.app access_token = form.cleaned_data["access_token"] self.inspect_token(provider, access_token) expires_at = None if login_options.get("auth_type") == "reauthenticate": info = requests.get( GRAPH_API_URL + "/oauth/access_token_info", params={ "client_id": app.client_id, "access_token": access_token, }, ).json() nonce = provider.get_nonce(request, pop=True) ok = nonce and nonce == info.get("auth_nonce") else: ok = True if ok and provider.get_settings().get("EXCHANGE_TOKEN"): resp = requests.get( GRAPH_API_URL + "/oauth/access_token", params={ "grant_type": "fb_exchange_token", "client_id": app.client_id, "client_secret": app.secret, "fb_exchange_token": access_token, }, ).json() access_token = resp["access_token"] expires_in = resp.get("expires_in") if expires_in: expires_at = timezone.now() + timedelta(seconds=int(expires_in)) if ok: token = SocialToken(app=app, token=access_token, expires_at=expires_at) login = fb_complete_login(request, app, token) login.token = token login.state = SocialLogin.state_from_request(request) ret = complete_social_login(request, login) return ret def get_app_token(self, provider): app = provider.app cache_key = f"allauth.facebook.app_token[{app.client_id}]" app_token = cache.get(cache_key) if not app_token: resp = requests.get( GRAPH_API_URL + "/oauth/access_token", params={ "client_id": app.client_id, "client_secret": app.secret, "grant_type": "client_credentials", }, ) resp.raise_for_status() data = resp.json() app_token = data["access_token"] timeout = provider.get_settings().get("APP_TOKEN_CACHE_TIMEOUT", 300) cache.set(cache_key, app_token, timeout=timeout) return app_token def inspect_token(self, provider, input_token): app_token = self.get_app_token(provider) resp = requests.get( GRAPH_API_URL + "/debug_token", params={"input_token": input_token, "access_token": app_token}, ) resp.raise_for_status() data = resp.json()["data"] if not data["is_valid"]: raise PermissionDenied("token is not valid") if data["app_id"] != provider.app.client_id or not data["is_valid"]: raise PermissionDenied("token app_id mismatch") login_by_token = LoginByTokenView.as_view() django-allauth-0.58.2/allauth/socialaccount/providers/feedly/000077500000000000000000000000001452212273200242465ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/feedly/__init__.py000066400000000000000000000000001452212273200263450ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/feedly/provider.py000066400000000000000000000021261452212273200264530ustar00rootroot00000000000000from __future__ import unicode_literals from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class FeedlyAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("picture") def to_str(self): name = "{0} {1}".format( self.account.extra_data.get("givenName", ""), self.account.extra_data.get("familyName", ""), ) if name.strip() != "": return name return super(FeedlyAccount, self).to_str() class FeedlyProvider(OAuth2Provider): id = str("feedly") name = "Feedly" account_class = FeedlyAccount def get_default_scope(self): return ["https://cloud.feedly.com/subscriptions"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), last_name=data.get("familyName"), first_name=data.get("givenName"), ) provider_classes = [FeedlyProvider] django-allauth-0.58.2/allauth/socialaccount/providers/feedly/tests.py000066400000000000000000000013251452212273200257630ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FeedlyProvider class FeedlyTests(OAuth2TestsMixin, TestCase): provider_id = FeedlyProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "id": "c805fcbf-3acf-4302-a97e-d82f9d7c897f", "email": "jim.smith@example.com", "givenName": "Jim", "familyName": "Smith", "picture": "https://www.google.com/profile_images/1771656873/bigger.jpg", "gender": "male", "locale": "en", "reader": "9080770707070700", "google": "115562565652656565656", "twitter": "jimsmith", "facebook": "", "wave": "2013.7" }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/feedly/urls.py000066400000000000000000000002461452212273200256070ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import FeedlyProvider urlpatterns = default_urlpatterns(FeedlyProvider) django-allauth-0.58.2/allauth/socialaccount/providers/feedly/views.py000066400000000000000000000020211452212273200257500ustar00rootroot00000000000000from __future__ import unicode_literals import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import FeedlyProvider class FeedlyOAuth2Adapter(OAuth2Adapter): provider_id = FeedlyProvider.id host = app_settings.PROVIDERS.get(provider_id, {}).get("HOST", "cloud.feedly.com") access_token_url = "https://%s/v3/auth/token" % host authorize_url = "https://%s/v3/auth/auth" % host profile_url = "https://%s/v3/profile" % host def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "OAuth {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(FeedlyOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(FeedlyOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/feishu/000077500000000000000000000000001452212273200242615ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/feishu/__init__.py000066400000000000000000000000301452212273200263630ustar00rootroot00000000000000# -*- coding: utf-8 -*- django-allauth-0.58.2/allauth/socialaccount/providers/feishu/client.py000066400000000000000000000051131452212273200261110ustar00rootroot00000000000000# -*- coding: utf-8 -*- import json import requests from collections import OrderedDict from django.utils.http import urlencode from allauth.socialaccount.providers.oauth2.client import ( OAuth2Client, OAuth2Error, ) class FeishuOAuth2Client(OAuth2Client): app_access_token_url = ( "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal/" ) def get_redirect_url(self, authorization_url, extra_params): params = { "app_id": self.consumer_key, "redirect_uri": self.callback_url, "scope": self.scope, "response_type": "code", } if self.state: params["state"] = self.state params.update(extra_params) sorted_params = OrderedDict() for param in sorted(params): sorted_params[param] = params[param] return "%s?%s" % (authorization_url, urlencode(sorted_params)) def app_access_token(self): data = { "app_id": self.consumer_key, "app_secret": self.consumer_secret, } self._strip_empty_keys(data) url = self.app_access_token_url # TODO: Proper exception handling resp = requests.request("POST", url, data=data) resp.raise_for_status() access_token = resp.json() if not access_token or "app_access_token" not in access_token: raise OAuth2Error("Error retrieving app access token: %s" % resp.content) return access_token["app_access_token"] def get_access_token(self, code, pkce_code_verifier=None): data = { "grant_type": "authorization_code", "code": code, "app_access_token": self.app_access_token(), } params = None self._strip_empty_keys(data) url = self.access_token_url if self.access_token_method == "GET": params = data data = None if data and pkce_code_verifier: data["code_verifier"] = pkce_code_verifier # TODO: Proper exception handling resp = requests.request( self.access_token_method, url, params=params, data=json.dumps(data), headers={"Content-Type": "application/json"}, ) resp.raise_for_status() access_token = resp.json() if ( not access_token or "data" not in access_token or "access_token" not in access_token["data"] ): raise OAuth2Error("Error retrieving access token: %s" % resp.content) return access_token["data"] django-allauth-0.58.2/allauth/socialaccount/providers/feishu/provider.py000066400000000000000000000013341452212273200264660ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class FeishuAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("avatar_big") def to_str(self): return self.account.extra_data.get("name", super(FeishuAccount, self).to_str()) class FeishuProvider(OAuth2Provider): id = "feishu" name = "feishu" account_class = FeishuAccount def extract_uid(self, data): return data["open_id"] def extract_common_fields(self, data): return dict(username=data.get("name"), name=data.get("name")) provider_classes = [FeishuProvider] django-allauth-0.58.2/allauth/socialaccount/providers/feishu/tests.py000066400000000000000000000031761452212273200260040ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FeishuProvider class FeishuTests(OAuth2TestsMixin, TestCase): provider_id = FeishuProvider.id def get_mocked_response(self): return [ MockedResponse( 0, """ {"data": {"access_token": "testac"}} """, ), MockedResponse( 0, """ { "code": 0, "data": { "access_token": "u-6U1SbDiM6XIH2DcTCPyeub", "avatar_url": "www.feishu.cn/avatar/icon", "avatar_thumb": "www.feishu.cn/avatar/icon_thumb", "avatar_middle": "www.feishu.cn/avatar/icon_middle", "avatar_big": "www.feishu.cn/avatar/icon_big", "expires_in": 7140, "name": "zhangsan", "en_name": "Three Zhang", "open_id": "ou-caecc734c2e3328a62489fe0648c4b98779515d3", "tenant_key": "736588c92lxf175d", "refresh_expires_in": 2591940, "refresh_token": "ur-t9HHgRCjMqGqIU9v05Zhos", "token_type": "Bearer" } } """, ), ] def get_login_response_json(self, with_refresh_token=True): return """{"app_access_token":"testac"}""" django-allauth-0.58.2/allauth/socialaccount/providers/feishu/urls.py000066400000000000000000000002771452212273200256260ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import FeishuProvider urlpatterns = default_urlpatterns(FeishuProvider) django-allauth-0.58.2/allauth/socialaccount/providers/feishu/views.py000066400000000000000000000051431452212273200257730ustar00rootroot00000000000000# -*- coding: utf-8 -*- import requests from django.urls import reverse from allauth.account import app_settings from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from allauth.utils import build_absolute_uri from .client import FeishuOAuth2Client from .provider import FeishuProvider class FeishuOAuth2Adapter(OAuth2Adapter): provider_id = FeishuProvider.id authorization_url = "https://open.feishu.cn/open-apis/authen/v1/index" access_token_url = "https://open.feishu.cn/open-apis/authen/v1/access_token" app_access_token_url = ( "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal/" ) user_info_url = "https://open.feishu.cn/open-apis/authen/v1/user_info" @property def authorize_url(self): settings = self.get_provider().get_settings() url = settings.get("AUTHORIZE_URL", self.authorization_url) return url def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.user_info_url, headers={ "Content-Type": "application/json", "Authorization": "Bearer " + token.token, }, ) resp.raise_for_status() extra_data = resp.json() if extra_data["code"] != 0: raise OAuth2Error("Error retrieving code: %s" % resp.content) extra_data = extra_data["data"] return self.get_provider().sociallogin_from_response(request, extra_data) class FeishuOAuth2ClientMixin(object): def get_client(self, request, app): callback_url = reverse(self.adapter.provider_id + "_callback") protocol = ( self.adapter.redirect_uri_protocol or app_settings.DEFAULT_HTTP_PROTOCOL ) callback_url = build_absolute_uri(request, callback_url, protocol=protocol) provider = self.adapter.get_provider() scope = provider.get_scope(request) client = FeishuOAuth2Client( request, app.client_id, app.secret, self.adapter.access_token_method, self.adapter.access_token_url, callback_url, scope, ) return client class FeishuOAuth2LoginView(FeishuOAuth2ClientMixin, OAuth2LoginView): pass class FeishuOAuth2CallbackView(FeishuOAuth2ClientMixin, OAuth2CallbackView): pass oauth2_login = FeishuOAuth2LoginView.adapter_view(FeishuOAuth2Adapter) oauth2_callback = FeishuOAuth2CallbackView.adapter_view(FeishuOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/figma/000077500000000000000000000000001452212273200240615ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/figma/__init__.py000066400000000000000000000000001452212273200261600ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/figma/provider.py000066400000000000000000000017601452212273200262710ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount import providers from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class FigmaAccount(ProviderAccount): def to_str(self): return self.account.extra_data.get("handle", "") def get_avatar_url(self): return self.account.extra_data.get("img_url", "") class FigmaProvider(OAuth2Provider): id = "figma" name = "Figma" account_class = FigmaAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return { "email": data.get("email"), "name": data.get("handle"), } def extract_email_addresses(self, data): email = EmailAddress( email=data.get("email"), primary=True, verified=False, ) return [email] providers.registry.register(FigmaProvider) django-allauth-0.58.2/allauth/socialaccount/providers/figma/tests.py000066400000000000000000000011021452212273200255670ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FigmaProvider class FigmaTests(OAuth2TestsMixin, TestCase): provider_id = FigmaProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "id": "2600", "email": "johndoe@example.com", "handle": "John Doe", "img_url": "https://www.example.com/image.png" } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/figma/urls.py000066400000000000000000000002441452212273200254200ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import FigmaProvider urlpatterns = default_urlpatterns(FigmaProvider) django-allauth-0.58.2/allauth/socialaccount/providers/figma/views.py000066400000000000000000000016141452212273200255720ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import FigmaProvider class FigmaOAuth2Adapter(OAuth2Adapter): provider_id = FigmaProvider.id authorize_url = "https://www.figma.com/oauth" access_token_url = "https://www.figma.com/api/oauth/token" userinfo_url = "https://api.figma.com/v1/me" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.userinfo_url, headers={"Authorization": "Bearer {0}".format(token.token)}, ) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(FigmaOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(FigmaOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/fivehundredpx/000077500000000000000000000000001452212273200256515ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/fivehundredpx/__init__.py000066400000000000000000000000001452212273200277500ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/fivehundredpx/models.py000066400000000000000000000000001452212273200274740ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/fivehundredpx/provider.py000066400000000000000000000021631452212273200300570ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class FiveHundredPxAccount(ProviderAccount): def get_profile_url(self): return "https://500px.com/%s" % self.account.extra_data.get("username") def get_avatar_url(self): return self.account.extra_data.get("userpic_url") def to_str(self): dflt = super(FiveHundredPxAccount, self).to_str() name = self.account.extra_data.get("fullname", dflt) return name class FiveHundredPxProvider(OAuthProvider): id = "500px" name = "500px" package = "allauth.socialaccount.providers.fivehundredpx" account_class = FiveHundredPxAccount def get_default_scope(self): return [] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( username=data.get("username"), email=data.get("email"), first_name=data.get("firstname"), last_name=data.get("lastname"), ) provider_classes = [FiveHundredPxProvider] django-allauth-0.58.2/allauth/socialaccount/providers/fivehundredpx/tests.py000066400000000000000000000063641452212273200273760ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FiveHundredPxProvider class FiveHundredPxTests(OAuthTestsMixin, TestCase): provider_id = FiveHundredPxProvider.id def get_mocked_response(self): return [ MockedResponse( 200, """{ "user": { "id": 5751454, "username": "testuser", "firstname": "Test", "lastname": "User", "birthday": null, "sex": 0, "city": "San Francisco", "state": "California", "country": "United States", "registration_date": "2015-12-12T03:20:31-05:00", "about": "About me.", "usertype": 0, "fotomoto_on": true, "locale": "en", "show_nude": false, "allow_sale_requests": 1, "fullname": "Test User", "userpic_url": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1", "userpic_https_url": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1", "cover_url": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/cover_2048.jpg?7", "upgrade_status": 2, "store_on": true, "photos_count": 68, "galleries_count": 2, "affection": 1888, "in_favorites_count": 340, "friends_count": 181, "followers_count": 150, "analytics_code": null, "invite_pending": false, "invite_accepted": false, "email": "test@example.com", "shadow_email": "test@example.com", "upload_limit": null, "upload_limit_expiry": "2016-12-01T13:33:55-05:00", "upgrade_type": 2, "upgrade_status_expiry": "2017-05-27", "auth": { "facebook": 0, "twitter": 0, "google_oauth2": 0 }, "presubmit_for_licensing": null, "avatars": { "default": { "http": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1", "https": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1" }, "large": { "http": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/2.jpg?1", "https": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/2.jpg?1" }, "small": { "http": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1", "https": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1" }, "tiny": { "http": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/4.jpg?1", "https": "https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/4.jpg?1" } } } }""", ) ] # noqa django-allauth-0.58.2/allauth/socialaccount/providers/fivehundredpx/urls.py000066400000000000000000000002631452212273200272110ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import FiveHundredPxProvider urlpatterns = default_urlpatterns(FiveHundredPxProvider) django-allauth-0.58.2/allauth/socialaccount/providers/fivehundredpx/views.py000066400000000000000000000022421452212273200273600ustar00rootroot00000000000000import json from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import FiveHundredPxProvider API_BASE = "https://api.500px.com/v1" class FiveHundredPxAPI(OAuth): """ Verifying 500px credentials """ url = API_BASE + "/users" def get_user_info(self): return json.loads(self.query(self.url))["user"] class FiveHundredPxOAuthAdapter(OAuthAdapter): provider_id = FiveHundredPxProvider.id request_token_url = API_BASE + "/oauth/request_token" access_token_url = API_BASE + "/oauth/access_token" authorize_url = API_BASE + "/oauth/authorize" def complete_login(self, request, app, token, response): client = FiveHundredPxAPI( request, app.client_id, app.secret, self.request_token_url ) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(FiveHundredPxOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(FiveHundredPxOAuthAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/flickr/000077500000000000000000000000001452212273200242505ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/flickr/__init__.py000066400000000000000000000000001452212273200263470ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/flickr/provider.py000066400000000000000000000037371452212273200264660ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class FlickrAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("person").get("profileurl").get("_content") def get_avatar_url(self): return self.account.extra_data.get("picture-url") def to_str(self): dflt = super(FlickrAccount, self).to_str() # Try to use name if it exists. If there is no name, the Flickr API # returns an empty string. name = ( self.account.extra_data.get("person").get("realname").get("_content", None) ) if name: return name # Default to username if name does not exist. return ( self.account.extra_data.get("person").get("username").get("_content", dflt) ) class FlickrProvider(OAuthProvider): id = "flickr" name = "Flickr" account_class = FlickrAccount def get_default_scope(self): scope = [] return scope def get_auth_params(self, request, action): ret = super(FlickrProvider, self).get_auth_params(request, action) if "perms" not in ret: ret["perms"] = "read" return ret def get_profile_fields(self): default_fields = [ "id", "first-name", "last-name", "email-address", "picture-url", "public-profile-url", ] fields = self.get_settings().get("PROFILE_FIELDS", default_fields) return fields def extract_uid(self, data): return data["person"]["nsid"] def extract_common_fields(self, data): person = data.get("person", {}) name = person.get("realname", {}).get("_content") username = person.get("username", {}).get("_content") return dict(email=data.get("email-address"), name=name, username=username) provider_classes = [FlickrProvider] django-allauth-0.58.2/allauth/socialaccount/providers/flickr/tests.py000066400000000000000000000066771452212273200260040ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FlickrProvider class FlickrTests(OAuthTestsMixin, TestCase): provider_id = FlickrProvider.id def get_mocked_response(self): # return [ MockedResponse( 200, r""" {"stat": "ok", "user": { "username": { "_content": "pennersr"}, "id": "12345678@N00"}} """, ), # noqa MockedResponse( 200, r""" {"person": {"username": {"_content": "pennersr"}, "photosurl": {"_content": "http://www.flickr.com/photos/12345678@N00/"}, "nsid": "12345678@N00", "path_alias": null, "photos": {"count": {"_content": 0}, "firstdatetaken": {"_content": null}, "views": {"_content": "28"}, "firstdate": {"_content": null}}, "iconserver": "0", "description": {"_content": ""}, "mobileurl": {"_content": "http://m.flickr.com/photostream.gne?id=6294613"}, "profileurl": { "_content": "http://www.flickr.com/people/12345678@N00/"}, "mbox_sha1sum": {"_content": "5e5b359c123e54f95236209c8808d607a5cdd21e"}, "ispro": 0, "location": {"_content": ""}, "id": "12345678@N00", "realname": {"_content": "raymond penners"}, "iconfarm": 0}, "stat": "ok"} """, ), ] # noqa def test_login(self): account = super(FlickrTests, self).test_login() f_account = account.get_provider_account() self.assertEqual(account.user.first_name, "raymond") self.assertEqual(account.user.last_name, "penners") self.assertEqual( f_account.get_profile_url(), "http://www.flickr.com/people/12345678@N00/", ) self.assertEqual(f_account.to_str(), "raymond penners") class FlickrWithoutRealNameTests(OAuthTestsMixin, TestCase): """Separate test for Flickr accounts without real names""" provider_id = FlickrProvider.id def get_mocked_response(self): # return [ MockedResponse( 200, r""" {"stat": "ok", "user": { "username": { "_content": "pennersr"}, "id": "12345678@N00"}} """, ), # noqa MockedResponse( 200, r""" {"person": {"username": {"_content": "pennersr"}, "photosurl": {"_content": "http://www.flickr.com/photos/12345678@N00/"}, "nsid": "12345678@N00", "path_alias": null, "photos": {"count": {"_content": 0}, "firstdatetaken": {"_content": null}, "views": {"_content": "28"}, "firstdate": {"_content": null}}, "iconserver": "0", "description": {"_content": ""}, "mobileurl": {"_content": "http://m.flickr.com/photostream.gne?id=6294613"}, "profileurl": { "_content": "http://www.flickr.com/people/12345678@N00/"}, "mbox_sha1sum": {"_content": "5e5b359c123e54f95236209c8808d607a5cdd21e"}, "ispro": 0, "location": {"_content": ""}, "id": "12345678@N00", "realname": {"_content": ""}, "iconfarm": 0}, "stat": "ok"} """, ), ] # noqa def test_login(self): account = super(FlickrWithoutRealNameTests, self).test_login() f_account = account.get_provider_account() self.assertEqual(account.user.first_name, "") self.assertEqual(account.user.last_name, "") self.assertEqual( f_account.get_profile_url(), "http://www.flickr.com/people/12345678@N00/", ) self.assertEqual(f_account.to_str(), "pennersr") django-allauth-0.58.2/allauth/socialaccount/providers/flickr/urls.py000066400000000000000000000002451452212273200256100ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import FlickrProvider urlpatterns = default_urlpatterns(FlickrProvider) django-allauth-0.58.2/allauth/socialaccount/providers/flickr/views.py000066400000000000000000000027651452212273200257710ustar00rootroot00000000000000import json from django.utils.http import urlencode from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import FlickrProvider class FlickrAPI(OAuth): api_url = "https://api.flickr.com/services/rest" def get_user_info(self): default_params = {"nojsoncallback": "1", "format": "json"} p = dict({"method": "flickr.test.login"}, **default_params) u = json.loads(self.query(self.api_url + "?" + urlencode(p))) p = dict( {"method": "flickr.people.getInfo", "user_id": u["user"]["id"]}, **default_params, ) user = json.loads(self.query(self.api_url + "?" + urlencode(p))) return user class FlickrOAuthAdapter(OAuthAdapter): provider_id = FlickrProvider.id request_token_url = "http://www.flickr.com/services/oauth/request_token" access_token_url = "http://www.flickr.com/services/oauth/access_token" authorize_url = "http://www.flickr.com/services/oauth/authorize" def complete_login(self, request, app, token, response): client = FlickrAPI(request, app.client_id, app.secret, self.request_token_url) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(FlickrOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(FlickrOAuthAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/foursquare/000077500000000000000000000000001452212273200251725ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/foursquare/__init__.py000066400000000000000000000000001452212273200272710ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/foursquare/provider.py000066400000000000000000000017071452212273200274030ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class FoursquareAccount(ProviderAccount): def get_profile_url(self): return "https://foursquare.com/user/" + self.account.extra_data.get("id") def get_avatar_url(self): return self.account.extra_data.get("photo") def to_str(self): dflt = super(FoursquareAccount, self).to_str() return self.account.extra_data.get("name", dflt) class FoursquareProvider(OAuth2Provider): id = "foursquare" name = "Foursquare" account_class = FoursquareAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( first_name=data.get("firstname"), last_name=data.get("lastname"), email=data.get("contact").get("email"), ) provider_classes = [FoursquareProvider] django-allauth-0.58.2/allauth/socialaccount/providers/foursquare/tests.py000066400000000000000000000047401452212273200267130ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FoursquareProvider class FoursquareTests(OAuth2TestsMixin, TestCase): provider_id = FoursquareProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"notifications": [{"item": {"unreadCount": 0}, "type": "notificationTray"}], "meta": {"code": 200}, "response": { "user": { "photo": { "prefix": "https://irs0.4sqi.net/img/user/", "suffix": "/blank_boy.png"}, "pings": false, "homeCity": "Athens, ESYE31", "id": "76077726", "badges": {"count": 0, "items": []}, "referralId": "u-76077726", "friends": { "count": 0, "groups": [{"count": 0, "items": [], "type": "friends", "name": "Mutual friends"}, {"count": 0, "items": [], "type": "others", "name": "Other friends"}] }, "createdAt": 1389624445, "tips": {"count": 0}, "type": "user", "bio": "", "relationship": "self", "lists": { "count": 1, "groups": [{"count": 1, "items": [{"description": "", "collaborative": false, "url": "/user/76077726/list/todos", "editable": false, "listItems": {"count": 0}, "id": "76077726/todos", "followers": {"count": 0}, "user": {"gender": "male", "firstName": "\u03a1\u03c9\u03bc\u03b1\u03bd\u03cc\u03c2", "relationship": "self", "photo": {"prefix": "https://irs0.4sqi.net/img/user/", "suffix": "/blank_boy.png"}, "lastName": "\u03a4\u03c3\u03bf\u03c5\u03c1\u03bf\u03c0\u03bb\u03ae\u03c2", "id": "76077726"}, "public": false, "canonicalUrl": "https://foursquare.com/user/76077726/list/todos", "name": "My to-do list"}], "type": "created"}, {"count": 0, "items": [], "type": "followed"}] }, "photos": {"count": 0, "items": []}, "checkinPings": "off", "scores": {"max": 0, "checkinsCount": 0, "goal": 50, "recent": 0}, "checkins": {"count": 0, "items": []}, "firstName": "\u03a1\u03c9\u03bc\u03b1\u03bd\u03cc\u03c2", "gender": "male", "contact": {"email": "romdimtsouroplis@example.com"}, "lastName": "\u03a4\u03c3\u03bf\u03c5\u03c1\u03bf\u03c0\u03bb\u03ae\u03c2", "following": {"count": 0, "groups": [{"count": 0, "items": [], "type": "following", "name": "Mutual following"}, {"count": 0, "items": [], "type": "others", "name": "Other following"}]}, "requests": {"count": 0}, "mayorships": {"count": 0, "items": []}} } } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/foursquare/urls.py000066400000000000000000000002561452212273200265340ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import FoursquareProvider urlpatterns = default_urlpatterns(FoursquareProvider) django-allauth-0.58.2/allauth/socialaccount/providers/foursquare/views.py000066400000000000000000000023171452212273200267040ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import FoursquareProvider class FoursquareOAuth2Adapter(OAuth2Adapter): provider_id = FoursquareProvider.id access_token_url = "https://foursquare.com/oauth2/access_token" # Issue ?? -- this one authenticates over and over again... # authorize_url = 'https://foursquare.com/oauth2/authorize' authorize_url = "https://foursquare.com/oauth2/authenticate" profile_url = "https://api.foursquare.com/v2/users/self" def complete_login(self, request, app, token, **kwargs): # Foursquare needs a version number for their API requests as # documented here # https://developer.foursquare.com/overview/versioning resp = requests.get( self.profile_url, params={"oauth_token": token.token, "v": "20140116"}, ) extra_data = resp.json()["response"]["user"] return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(FoursquareOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(FoursquareOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/frontier/000077500000000000000000000000001452212273200246265ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/frontier/__init__.py000066400000000000000000000000001452212273200267250ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/frontier/provider.py000066400000000000000000000031441452212273200270340ustar00rootroot00000000000000import hashlib from urllib.parse import urlencode from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class FrontierAccount(ProviderAccount): def get_profile_url(self): return None def get_avatar_url(self): return "https://www.gravatar.com/avatar/%s?%s" % ( hashlib.md5( self.account.extra_data.get("email").lower().encode("utf-8") ).hexdigest(), urlencode({"d": "mp"}), ) def to_str(self): dflt = super(FrontierAccount, self).to_str() full_name = "%s %s" % ( self.account.extra_data.get("firstname", dflt), self.account.extra_data.get("lastname", dflt), ) return full_name class FrontierProvider(OAuth2Provider): id = "frontier" name = "Frontier" account_class = FrontierAccount def get_default_scope(self): scope = ["auth", "capi"] return scope def extract_uid(self, data): return str(data["customer_id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("email"), last_name=data.get("lastname"), first_name=data.get("firstname"), ) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email: ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [FrontierProvider] django-allauth-0.58.2/allauth/socialaccount/providers/frontier/tests.py000066400000000000000000000043131452212273200263430ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FrontierProvider class FrontierTests(OAuth2TestsMixin, TestCase): provider_id = FrontierProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "email": "johndoe@example.com", "customer_id": "1234567", "firstname": "John", "developer": false, "lastname": "Doe", "allowedDownloads": ["FORC-FDEV-D-1010", "FORC-FDEV-D-1012", "COMBAT_TUTORIAL_DEMO", "FORC-FDEV-D-1013", "PUBLIC_TEST_SERVER", "FORC_FDEV_V_ADDER_LRPO", "FORC_FDEV_V_CHALLENGER_LRPO", "FORC_FDEV_V_CHIEFTAIN_LRPO", "FORC_FDEV_V_CRUSADER_LRPO", "FORC_FDEV_V_ANACONDA_LRPO", "FORC_FDEV_V_ASP_LRPO", "FORC_FDEV_V_ASP_SCOUT_LRPO", "FORC_FDEV_V_BELUGA_LRPO", "FORC_FDEV_V_COBRA_MKIII_LRPO", "FORC_FDEV_V_DIAMOND_EXPLORER_LRPO", "FORC_FDEV_V_COBRA_MKIV_LRPO", "FORC_FDEV_V_DIAMOND_SCOUT_LRPO", "FORC_FDEV_V_DOLPHIN_LRPO", "FORC_FDEV_V_EAGLE_LRPO", "FORC_FDEV_V_FEDERAL_ASSAULT_LRPO", "FORC_FDEV_V_FEDERAL_CORVETTE_LRPO", "FORC_FDEV_V_FEDDROP_LRPO", "FORC_FDEV_V_FEDERAL_FIGHTER_LRPO", "FORC_FDEV_V_FEDERAL_GUNSHIP_LRPO", "FORC_FDEV_V_FERDELANCE_LRPO", "FORC_FDEV_V_HAULER_LRPO", "FORC_FDEV_V_CLIPPER_LRPO", "FORC_FDEV_V_IMPERIAL_COURIER_LRPO", "FORC_FDEV_V_IMPERIAL_CUTTER_LRPO", "FORC_FDEV_V_IMPERIAL_EAGLE_LRPO", "FORC_FDEV_V_IMPERIAL_FIGHTER_LRPO", "FORC_FDEV_V_KEELBACK_LRPO", "FORC_FDEV_V_KRAIT_LRPO", "FORC_FDEV_V_KRAIT_LITE_LRPO", "FORC_FDEV_V_MAMBA_LRPO", "FORC_FDEV_V_ORCA_LRPO", "FORC_FDEV_V_PYTHON_LRPO", "FORC_FDEV_V_SIDEWINDER_LRPO", "FORC_FDEV_V_TAIPAN_LRPO", "FORC_FDEV_V_MAMMOTH_LRPO", "FORC_FDEV_V_TYPE6_LRPO", "FORC_FDEV_V_TYPE7_LRPO", "FORC_FDEV_V_TYPE9_LRPO", "FORC_FDEV_V_VIPER_MKIII_LRPO", "FORC_FDEV_V_VIPER_MKIV_LRPO", "FORC_FDEV_V_VULTURE_LRPO", "FORC-FDEV-D-1022", "FORC_FDEV_V_DECAL_1091", "FORC_FDEV_V_DECAL_1100", "FORC_FDEV_V_DECAL_1149", "FORC_FDEV_V_DECAL_1150", "FORC_FDEV_V_DECAL_1151", "FORC_FDEV_V_DECAL_1176", "FORC_FDEV_V_DECAL_1177", "FORC-FDEV-DO-1000", "FORC-FDEV-DO-1003", "FORC-FDEV-DO-1006", "PUBLIC_TEST_SERVER_OD"], "platform": "frontier" }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/frontier/urls.py000066400000000000000000000002521452212273200261640ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import FrontierProvider urlpatterns = default_urlpatterns(FrontierProvider) django-allauth-0.58.2/allauth/socialaccount/providers/frontier/views.py000066400000000000000000000016231452212273200263370ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import FrontierProvider class FrontierOAuth2Adapter(OAuth2Adapter): provider_id = FrontierProvider.id AUTH_API = "https://auth.frontierstore.net" access_token_url = AUTH_API + "/token" authorize_url = AUTH_API + "/auth" profile_url = AUTH_API + "/me" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer " + token.token}, ) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(FrontierOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(FrontierOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/fxa/000077500000000000000000000000001452212273200235545ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/fxa/__init__.py000066400000000000000000000000001452212273200256530ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/fxa/models.py000066400000000000000000000000001452212273200253770ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/fxa/provider.py000066400000000000000000000017151452212273200257640ustar00rootroot00000000000000from django.conf import settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider _FXA_SETTINGS = getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}).get("fxa", {}) FXA_OAUTH_ENDPOINT = _FXA_SETTINGS.get( "OAUTH_ENDPOINT", "https://oauth.accounts.firefox.com/v1" ) FXA_PROFILE_ENDPOINT = _FXA_SETTINGS.get( "PROFILE_ENDPOINT", "https://profile.accounts.firefox.com/v1" ) class FirefoxAccountsAccount(ProviderAccount): def to_str(self): return self.account.uid class FirefoxAccountsProvider(OAuth2Provider): id = "fxa" name = "Firefox Accounts" account_class = FirefoxAccountsAccount def get_default_scope(self): return ["profile"] def extract_uid(self, data): return str(data["uid"]) def extract_common_fields(self, data): return dict(email=data.get("email")) provider_classes = [FirefoxAccountsProvider] django-allauth-0.58.2/allauth/socialaccount/providers/fxa/tests.py000066400000000000000000000007451452212273200252760ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import FirefoxAccountsProvider class FirefoxAccountsTests(OAuth2TestsMixin, TestCase): provider_id = FirefoxAccountsProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "uid":"6d940dd41e636cc156074109b8092f96", "email":"user@example.com" }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/fxa/urls.py000066400000000000000000000002701452212273200251120ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import FirefoxAccountsProvider urlpatterns = default_urlpatterns(FirefoxAccountsProvider) django-allauth-0.58.2/allauth/socialaccount/providers/fxa/views.py000066400000000000000000000017171452212273200252710ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import ( FXA_OAUTH_ENDPOINT, FXA_PROFILE_ENDPOINT, FirefoxAccountsProvider, ) class FirefoxAccountsOAuth2Adapter(OAuth2Adapter): provider_id = FirefoxAccountsProvider.id access_token_url = FXA_OAUTH_ENDPOINT + "/token" authorize_url = FXA_OAUTH_ENDPOINT + "/authorization" profile_url = FXA_PROFILE_ENDPOINT + "/profile" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(FirefoxAccountsOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(FirefoxAccountsOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/gitea/000077500000000000000000000000001452212273200240675ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/gitea/__init__.py000066400000000000000000000000001452212273200261660ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/gitea/provider.py000066400000000000000000000022151452212273200262730ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class GiteaAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("html_url") def get_avatar_url(self): return self.account.extra_data.get("avatar_url") def to_str(self): dflt = super(GiteaAccount, self).to_str() return next( value for value in ( self.account.extra_data.get("username", None), self.account.extra_data.get("login", None), dflt, ) if value is not None ) class GiteaProvider(OAuth2Provider): id = "gitea" name = "Gitea" account_class = GiteaAccount def get_default_scope(self): scope = [] return scope def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("login"), name=data.get("name"), ) provider_classes = [GiteaProvider] django-allauth-0.58.2/allauth/socialaccount/providers/gitea/tests.py000066400000000000000000000034011452212273200256010ustar00rootroot00000000000000from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import GiteaProvider class GiteaTests(OAuth2TestsMixin, TestCase): provider_id = GiteaProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "id": 4940, "login": "giteauser", "full_name": "", "email": "giteauser@example.com", "avatar_url": "https://gitea.com/user/avatar/giteauser/-1", "language": "en-US", "is_admin": true, "last_login": "2021-08-20T20:07:39Z", "created": "2018-05-03T16:04:34Z", "restricted": false, "active": true, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 0, "username": "giteauser" }""", ) def test_account_name_null(self): """String conversion when Gitea responds with empty username""" data = """{ "id": 4940, "login": "giteauser", "username": null }""" self.login(MockedResponse(200, data)) socialaccount = SocialAccount.objects.get(uid="4940") self.assertIsNone(socialaccount.extra_data.get("name")) account = socialaccount.get_provider_account() self.assertIsNotNone(account.to_str()) self.assertEqual(account.to_str(), "giteauser") django-allauth-0.58.2/allauth/socialaccount/providers/gitea/urls.py000066400000000000000000000002441452212273200254260ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import GiteaProvider urlpatterns = default_urlpatterns(GiteaProvider) django-allauth-0.58.2/allauth/socialaccount/providers/gitea/views.py000066400000000000000000000023231452212273200255760ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.gitea.provider import GiteaProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class GiteaOAuth2Adapter(OAuth2Adapter): provider_id = GiteaProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) if "GITEA_URL" in settings: web_url = settings.get("GITEA_URL").rstrip("/") else: web_url = "https://gitea.com" api_url = "{0}/api/v1".format(web_url) access_token_url = "{0}/login/oauth/access_token".format(web_url) authorize_url = "{0}/login/oauth/authorize".format(web_url) profile_url = "{0}/user".format(api_url) def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "token {}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(GiteaOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(GiteaOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/github/000077500000000000000000000000001452212273200242605ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/github/__init__.py000066400000000000000000000000001452212273200263570ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/github/provider.py000066400000000000000000000024131452212273200264640ustar00rootroot00000000000000from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class GitHubAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("html_url") def get_avatar_url(self): return self.account.extra_data.get("avatar_url") def to_str(self): dflt = super(GitHubAccount, self).to_str() return next( value for value in ( self.account.extra_data.get("name", None), self.account.extra_data.get("login", None), dflt, ) if value is not None ) class GitHubProvider(OAuth2Provider): id = "github" name = "GitHub" account_class = GitHubAccount def get_default_scope(self): scope = [] if app_settings.QUERY_EMAIL: scope.append("user:email") return scope def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("login"), name=data.get("name"), ) provider_classes = [GitHubProvider] django-allauth-0.58.2/allauth/socialaccount/providers/github/tests.py000066400000000000000000000064521452212273200260030ustar00rootroot00000000000000from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import GitHubProvider class GitHubTests(OAuth2TestsMixin, TestCase): provider_id = GitHubProvider.id def get_mocked_response(self): return [ MockedResponse( 200, """ { "type":"User", "organizations_url":"https://api.github.com/users/pennersr/orgs", "gists_url":"https://api.github.com/users/pennersr/gists{/gist_id}", "received_events_url":"https://api.github.com/users/pennersr/received_events", "gravatar_id":"8639768262b8484f6a3380f8db2efa5b", "followers":16, "blog":"http://www.intenct.info", "avatar_url":"https://secure.gravatar.com/avatar/8639768262b8484f6a3380f8db2efa5b?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png", "login":"pennersr", "created_at":"2010-02-10T12:50:51Z", "company":"IntenCT", "subscriptions_url":"https://api.github.com/users/pennersr/subscriptions", "public_repos":14, "hireable":false, "url":"https://api.github.com/users/pennersr", "public_gists":0, "starred_url":"https://api.github.com/users/pennersr/starred{/owner}{/repo}", "html_url":"https://github.com/pennersr", "location":"The Netherlands", "bio":null, "name":"Raymond Penners", "repos_url":"https://api.github.com/users/pennersr/repos", "followers_url":"https://api.github.com/users/pennersr/followers", "id":201022, "following":0, "email":"raymond.penners@intenct.nl", "events_url":"https://api.github.com/users/pennersr/events{/privacy}", "following_url":"https://api.github.com/users/pennersr/following" }""", ), MockedResponse( 200, """ { "email": "octocat@github.com", "verified": true, "primary": true, "visibility": "public" } """, ), ] def test_account_name_null(self): """String conversion when GitHub responds with empty name""" mocks = [ MockedResponse( 200, """ { "type": "User", "id": 201022, "login": "pennersr", "name": null } """, ), MockedResponse( 200, """ [ { "email": "octocat@github.com", "verified": true, "primary": true, "visibility": "public" } ] """, ), ] self.login(mocks) socialaccount = SocialAccount.objects.get(uid="201022") self.assertIsNone(socialaccount.extra_data.get("name")) account = socialaccount.get_provider_account() self.assertIsNotNone(account.to_str()) self.assertEqual(account.to_str(), "pennersr") self.assertEqual(socialaccount.user.email, "octocat@github.com") django-allauth-0.58.2/allauth/socialaccount/providers/github/urls.py000066400000000000000000000002461452212273200256210ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import GitHubProvider urlpatterns = default_urlpatterns(GitHubProvider) django-allauth-0.58.2/allauth/socialaccount/providers/github/views.py000066400000000000000000000037601452212273200257750ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.github.provider import GitHubProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class GitHubOAuth2Adapter(OAuth2Adapter): provider_id = GitHubProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) if "GITHUB_URL" in settings: web_url = settings.get("GITHUB_URL").rstrip("/") api_url = "{0}/api/v3".format(web_url) else: web_url = "https://github.com" api_url = "https://api.github.com" access_token_url = "{0}/login/oauth/access_token".format(web_url) authorize_url = "{0}/login/oauth/authorize".format(web_url) profile_url = "{0}/user".format(api_url) emails_url = "{0}/user/emails".format(api_url) def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "token {}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) resp.raise_for_status() extra_data = resp.json() if app_settings.QUERY_EMAIL and not extra_data.get("email"): extra_data["email"] = self.get_email(headers) return self.get_provider().sociallogin_from_response(request, extra_data) def get_email(self, headers): email = None resp = requests.get(self.emails_url, headers=headers) resp.raise_for_status() emails = resp.json() if resp.status_code == 200 and emails: email = emails[0] primary_emails = [ e for e in emails if not isinstance(e, dict) or e.get("primary") ] if primary_emails: email = primary_emails[0] if isinstance(email, dict): email = email.get("email", "") return email oauth2_login = OAuth2LoginView.adapter_view(GitHubOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(GitHubOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/gitlab/000077500000000000000000000000001452212273200242405ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/gitlab/__init__.py000066400000000000000000000000001452212273200263370ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/gitlab/provider.py000066400000000000000000000017201452212273200264440ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class GitLabAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("web_url") def get_avatar_url(self): return self.account.extra_data.get("avatar_url") def to_str(self): dflt = super(GitLabAccount, self).to_str() return self.account.extra_data.get("name", dflt) class GitLabProvider(OAuth2Provider): id = "gitlab" name = "GitLab" account_class = GitLabAccount def get_default_scope(self): return ["read_user"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), name=data.get("name"), ) provider_classes = [GitLabProvider] django-allauth-0.58.2/allauth/socialaccount/providers/gitlab/tests.py000066400000000000000000000071771452212273200257700ustar00rootroot00000000000000# -*- coding: utf-8 -*- import json from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.providers.gitlab.provider import GitLabProvider from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .views import _check_errors class GitLabTests(OAuth2TestsMixin, TestCase): provider_id = GitLabProvider.id _uid = 2 def get_mocked_response(self): return MockedResponse( 200, """ { "avatar_url": "https://secure.gravatar.com/avatar/123", "bio": null, "can_create_group": true, "can_create_project": true, "color_scheme_id": 5, "confirmed_at": "2015-03-02T16:53:58.370Z", "created_at": "2015-03-02T16:53:58.885Z", "current_sign_in_at": "2018-06-12T18:44:49.985Z", "email": "mr.bob@gitlab.example.com", "external": false, "id": 2, "identities": [], "last_activity_on": "2018-06-11", "last_sign_in_at": "2018-05-31T14:59:44.527Z", "linkedin": "", "location": null, "name": "Mr Bob", "organization": null, "projects_limit": 10, "shared_runners_minutes_limit": 2000, "skype": "", "state": "active", "theme_id": 6, "twitter": "mrbob", "two_factor_enabled": true, "username": "mr.bob", "web_url": "https://gitlab.example.com/u/mr.bob", "website_url": "" } """, ) def test_valid_response(self): data = {"id": 12345} response = MockedResponse(200, json.dumps(data)) self.assertEqual(_check_errors(response), data) def test_invalid_data(self): response = MockedResponse(200, json.dumps({})) with self.assertRaises(OAuth2Error): # No id, raises _check_errors(response) def test_account_invalid_response(self): body = ( "403 Forbidden - You (@domain.com) must accept the Terms of " "Service in order to perform this action. Please access GitLab " "from a web browser to accept these terms." ) response = MockedResponse(403, body) # GitLab allow users to login with their API and provides # an error requiring the user to accept the Terms of Service. # see: https://gitlab.com/gitlab-org/gitlab-foss/-/issues/45849 with self.assertRaises(OAuth2Error): # no id, 4xx code, raises _check_errors(response) def test_error_response(self): body = "403 Forbidden" response = MockedResponse(403, body) with self.assertRaises(OAuth2Error): # no id, 4xx code, raises _check_errors(response) def test_invalid_response(self): response = MockedResponse(200, json.dumps({})) with self.assertRaises(OAuth2Error): # No id, raises _check_errors(response) def test_bad_response(self): response = MockedResponse(400, json.dumps({})) with self.assertRaises(OAuth2Error): # bad json, raises _check_errors(response) def test_extra_data(self): self.login(self.get_mocked_response()) account = SocialAccount.objects.get(uid=str(self._uid)) self.assertEqual(account.extra_data["id"], self._uid) django-allauth-0.58.2/allauth/socialaccount/providers/gitlab/urls.py000066400000000000000000000003431452212273200255770ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.gitlab.provider import GitLabProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(GitLabProvider) django-allauth-0.58.2/allauth/socialaccount/providers/gitlab/views.py000066400000000000000000000045731452212273200257600ustar00rootroot00000000000000# -*- coding: utf-8 -*- import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.gitlab.provider import GitLabProvider from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) def _check_errors(response): # 403 error's are presented as user-facing errors if response.status_code == 403: msg = response.content raise OAuth2Error("Invalid data from GitLab API: %r" % (msg)) try: data = response.json() except ValueError: # JSONDecodeError on py3 raise OAuth2Error("Invalid JSON from GitLab API: %r" % (response.text)) if response.status_code >= 400 or "error" in data: # For errors, we expect the following format: # {"error": "error_name", "error_description": "Oops!"} # For example, if the token is not valid, we will get: # {"message": "status_code - message"} error = data.get("error", "") or response.status_code desc = data.get("error_description", "") or data.get("message", "") raise OAuth2Error("GitLab error: %s (%s)" % (error, desc)) # The expected output from the API follows this format: # {"id": 12345, ...} if "id" not in data: # If the id is not present, the output is not usable (no UID) raise OAuth2Error("Invalid data from GitLab API: %r" % (data)) return data class GitLabOAuth2Adapter(OAuth2Adapter): provider_id = GitLabProvider.id provider_default_url = "https://gitlab.com" provider_api_version = "v4" settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("GITLAB_URL", provider_default_url) access_token_url = "{0}/oauth/token".format(provider_base_url) authorize_url = "{0}/oauth/authorize".format(provider_base_url) profile_url = "{0}/api/{1}/user".format(provider_base_url, provider_api_version) def complete_login(self, request, app, token, response): response = requests.get(self.profile_url, params={"access_token": token.token}) data = _check_errors(response) return self.get_provider().sociallogin_from_response(request, data) oauth2_login = OAuth2LoginView.adapter_view(GitLabOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(GitLabOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/globus/000077500000000000000000000000001452212273200242715ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/globus/__init__.py000066400000000000000000000000001452212273200263700ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/globus/provider.py000066400000000000000000000023671452212273200265050ustar00rootroot00000000000000from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ( ProviderAccount, ProviderException, ) from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class GlobusAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("web_url", "dflt") def get_avatar_url(self): return self.account.extra_data.get("avatar_url", "dflt") def to_str(self): dflt = super(GlobusAccount, self).to_str() return self.account.extra_data.get("name", dflt) class GlobusProvider(OAuth2Provider): id = "globus" name = "Globus" account_class = GlobusAccount def extract_uid(self, data): if "sub" not in data: raise ProviderException("Globus OAuth error", data) return str(data["sub"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("preferred_username"), name=data.get("name"), ) def get_default_scope(self): scope = ["openid", "profile", "offline_access"] if app_settings.QUERY_EMAIL: scope.append("email") return scope provider_classes = [GlobusProvider] django-allauth-0.58.2/allauth/socialaccount/providers/globus/tests.py000066400000000000000000000015421452212273200260070ustar00rootroot00000000000000from django.test.utils import override_settings from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import GlobusProvider class GlobusTests(OAuth2TestsMixin, TestCase): provider_id = GlobusProvider.id @override_settings(SOCIALACCOUNT_QUERY_EMAIL=True) def get_mocked_response(self): return MockedResponse( 200, """ { "identity_provider_display_name": "University of Gozorpazorp", "sub": "a6fc81e-4a6c1-97ac-b4c6-84ff6a8ce662", "preferred_username": "morty@ugz.edu", "identity_provider": "9a4c8312f-9432-9a7c-1654-6a987c6531fa", "organization": "University of Gozorpazorp", "email": "morty@ugz.edu", "name": "Morty Smith" } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/globus/urls.py000066400000000000000000000003131452212273200256250ustar00rootroot00000000000000from allauth.socialaccount.providers.globus.provider import GlobusProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(GlobusProvider) django-allauth-0.58.2/allauth/socialaccount/providers/globus/views.py000066400000000000000000000021101452212273200257720ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.globus.provider import GlobusProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class GlobusAdapter(OAuth2Adapter): provider_id = GlobusProvider.id provider_default_url = "https://auth.globus.org/v2/oauth2" provider_base_url = "https://auth.globus.org/v2/oauth2" access_token_url = "{0}/token".format(provider_base_url) authorize_url = "{0}/authorize".format(provider_base_url) profile_url = "{0}/userinfo".format(provider_base_url) def complete_login(self, request, app, token, response): extra_data = requests.get( self.profile_url, params={"access_token": token.token}, headers={ "Authorization": "Bearer " + token.token, }, ) return self.get_provider().sociallogin_from_response(request, extra_data.json()) oauth2_login = OAuth2LoginView.adapter_view(GlobusAdapter) oauth2_callback = OAuth2CallbackView.adapter_view(GlobusAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/google/000077500000000000000000000000001452212273200242525ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/google/__init__.py000066400000000000000000000000001452212273200263510ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/google/provider.py000066400000000000000000000032661452212273200264650ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.app_settings import QUERY_EMAIL from allauth.socialaccount.providers.base import AuthAction, ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class Scope(object): EMAIL = "email" PROFILE = "profile" class GoogleAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("link") def get_avatar_url(self): return self.account.extra_data.get("picture") def to_str(self): dflt = super(GoogleAccount, self).to_str() return self.account.extra_data.get("name", dflt) class GoogleProvider(OAuth2Provider): id = "google" name = "Google" account_class = GoogleAccount def get_default_scope(self): scope = [Scope.PROFILE] if QUERY_EMAIL: scope.append(Scope.EMAIL) return scope def get_auth_params(self, request, action): ret = super(GoogleProvider, self).get_auth_params(request, action) if action == AuthAction.REAUTHENTICATE: ret["prompt"] = "select_account consent" return ret def extract_uid(self, data): return data["sub"] def extract_common_fields(self, data): return dict( email=data.get("email"), last_name=data.get("family_name"), first_name=data.get("given_name"), ) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email and data.get("email_verified"): ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [GoogleProvider] django-allauth-0.58.2/allauth/socialaccount/providers/google/tests.py000066400000000000000000000201161452212273200257660ustar00rootroot00000000000000import json from datetime import datetime, timedelta from importlib import import_module from django.conf import settings from django.contrib.auth.models import User from django.core import mail from django.test.client import RequestFactory from django.test.utils import override_settings from django.urls import reverse from allauth.account import app_settings as account_settings from allauth.account.adapter import get_adapter from allauth.account.models import EmailAddress, EmailConfirmation from allauth.account.signals import user_signed_up from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.providers.apple.client import jwt_encode from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import TestCase from .provider import GoogleProvider @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=True, ACCOUNT_SIGNUP_FORM_CLASS=None, ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.MANDATORY, ) class GoogleTests(OAuth2TestsMixin, TestCase): provider_id = GoogleProvider.id def setUp(self): super().setUp() self.email = "raymond.penners@example.com" self.identity_overwrites = {} def get_google_id_token_payload(self): now = datetime.utcnow() client_id = "app123id" # Matches `setup_app` payload = { "iss": "https://accounts.google.com", "azp": client_id, "aud": client_id, "sub": "108204268033311374519", "hd": "example.com", "email": self.email, "email_verified": True, "at_hash": "HK6E_P6Dh8Y93mRNtsDB1Q", "name": "Raymond Penners", "picture": "https://lh5.googleusercontent.com/photo.jpg", "given_name": "Raymond", "family_name": "Penners", "locale": "en", "iat": now, "exp": now + timedelta(hours=1), } payload.update(self.identity_overwrites) return payload def get_login_response_json(self, with_refresh_token=True): data = { "access_token": "testac", "expires_in": 3600, "scope": "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile openid", "token_type": "Bearer", "id_token": jwt_encode(self.get_google_id_token_payload(), "secret"), } return json.dumps(data) @override_settings(SOCIALACCOUNT_AUTO_SIGNUP=False) def test_login(self): resp = self.login(resp_mock=None) self.assertRedirects(resp, reverse("socialaccount_signup")) def test_wrong_id_token_claim_values(self): wrong_claim_values = { "iss": "not-google", "exp": datetime.utcnow() - timedelta(seconds=1), "aud": "foo", } for key, value in wrong_claim_values.items(): with self.subTest(key): self.identity_overwrites = {key: value} resp = self.login(resp_mock=None) self.assertTemplateUsed( resp, "socialaccount/authentication_error.%s" % getattr(settings, "ACCOUNT_TEMPLATE_EXTENSION", "html"), ) def test_username_based_on_email(self): self.identity_overwrites = {"given_name": "明", "family_name": "小"} self.login(resp_mock=None) user = User.objects.get(email=self.email) self.assertEqual(user.username, "raymond.penners") def test_email_verified(self): self.identity_overwrites = {"email_verified": True} self.login(resp_mock=None) email_address = EmailAddress.objects.get(email=self.email, verified=True) self.assertFalse( EmailConfirmation.objects.filter(email_address__email=self.email).exists() ) account = email_address.user.socialaccount_set.all()[0] self.assertEqual(account.extra_data["given_name"], "Raymond") def test_user_signed_up_signal(self): sent_signals = [] def on_signed_up(sender, request, user, **kwargs): sociallogin = kwargs["sociallogin"] self.assertEqual(sociallogin.account.provider, GoogleProvider.id) self.assertEqual(sociallogin.account.user, user) sent_signals.append(sender) user_signed_up.connect(on_signed_up) self.login(resp_mock=None) self.assertTrue(len(sent_signals) > 0) @override_settings(ACCOUNT_EMAIL_CONFIRMATION_HMAC=False) def test_email_unverified(self): self.identity_overwrites = {"email_verified": False} resp = self.login(resp_mock=None) email_address = EmailAddress.objects.get(email=self.email) self.assertFalse(email_address.verified) self.assertTrue( EmailConfirmation.objects.filter(email_address__email=self.email).exists() ) self.assertTemplateUsed( resp, "account/email/email_confirmation_signup_subject.txt" ) def test_email_verified_stashed(self): # http://slacy.com/blog/2012/01/how-to-set-session-variables-in-django-unit-tests/ engine = import_module(settings.SESSION_ENGINE) store = engine.SessionStore() store.save() self.client.cookies[settings.SESSION_COOKIE_NAME] = store.session_key request = RequestFactory().get("/") request.session = self.client.session adapter = get_adapter() adapter.stash_verified_email(request, self.email) request.session.save() self.identity_overwrites = {"email_verified": False} self.login(resp_mock=None) email_address = EmailAddress.objects.get(email=self.email) self.assertTrue(email_address.verified) self.assertFalse( EmailConfirmation.objects.filter(email_address__email=self.email).exists() ) def test_account_connect(self): email = "user@example.com" user = User.objects.create(username="user", is_active=True, email=email) user.set_password("test") user.save() EmailAddress.objects.create(user=user, email=email, primary=True, verified=True) self.client.login(username=user.username, password="test") self.identity_overwrites = {"email": email, "email_verified": True} self.login(resp_mock=None, process="connect") # Check if we connected... self.assertTrue( SocialAccount.objects.filter(user=user, provider=GoogleProvider.id).exists() ) # For now, we do not pick up any new email addresses on connect self.assertEqual(EmailAddress.objects.filter(user=user).count(), 1) self.assertEqual(EmailAddress.objects.filter(user=user, email=email).count(), 1) @override_settings( ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.MANDATORY, SOCIALACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.NONE, ) def test_social_email_verification_skipped(self): self.identity_overwrites = {"email_verified": False} self.login(resp_mock=None) email_address = EmailAddress.objects.get(email=self.email) self.assertFalse(email_address.verified) self.assertFalse( EmailConfirmation.objects.filter(email_address__email=self.email).exists() ) @override_settings( ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.OPTIONAL, SOCIALACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.OPTIONAL, ) def test_social_email_verification_optional(self): self.identity_overwrites = {"email_verified": False} self.login(resp_mock=None) self.assertEqual(len(mail.outbox), 1) self.login(resp_mock=None) self.assertEqual(len(mail.outbox), 1) @override_settings( SOCIALACCOUNT_PROVIDERS={ "google": { "APP": { "client_id": "app123id", "key": "google", "secret": "dummy", } } } ) class AppInSettingsTests(GoogleTests): """ Run the same set of tests but without having a SocialApp entry. """ pass django-allauth-0.58.2/allauth/socialaccount/providers/google/urls.py000066400000000000000000000002461452212273200256130ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import GoogleProvider urlpatterns = default_urlpatterns(GoogleProvider) django-allauth-0.58.2/allauth/socialaccount/providers/google/views.py000066400000000000000000000041741452212273200257670ustar00rootroot00000000000000from django.conf import settings import jwt from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import GoogleProvider ACCESS_TOKEN_URL = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("google", {}) .get("ACCESS_TOKEN_URL", "https://oauth2.googleapis.com/token") ) AUTHORIZE_URL = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("google", {}) .get("AUTHORIZE_URL", "https://accounts.google.com/o/oauth2/v2/auth") ) ID_TOKEN_ISSUER = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("google", {}) .get("ID_TOKEN_ISSUER", "https://accounts.google.com") ) class GoogleOAuth2Adapter(OAuth2Adapter): provider_id = GoogleProvider.id access_token_url = ACCESS_TOKEN_URL authorize_url = AUTHORIZE_URL id_token_issuer = ID_TOKEN_ISSUER def complete_login(self, request, app, token, response, **kwargs): try: identity_data = jwt.decode( response["id_token"], # Since the token was received by direct communication # protected by TLS between this library and Google, we # are allowed to skip checking the token signature # according to the OpenID Connect Core 1.0 # specification. # https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation options={ "verify_signature": False, "verify_iss": True, "verify_aud": True, "verify_exp": True, }, issuer=self.id_token_issuer, audience=app.client_id, ) except jwt.PyJWTError as e: raise OAuth2Error("Invalid id_token") from e login = self.get_provider().sociallogin_from_response(request, identity_data) return login oauth2_login = OAuth2LoginView.adapter_view(GoogleOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(GoogleOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/gumroad/000077500000000000000000000000001452212273200244345ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/gumroad/__init__.py000066400000000000000000000000001452212273200265330ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/gumroad/provider.py000066400000000000000000000021641452212273200266430ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class GumroadAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("url") def to_str(self): dflt = super(GumroadAccount, self).to_str() return self.account.extra_data.get("name", dflt) class GumroadProvider(OAuth2Provider): id = "gumroad" name = "Gumroad" account_class = GumroadAccount def get_default_scope(self): return ["edit_products"] def extract_uid(self, data): return str(data["user_id"]) def extract_common_fields(self, data): try: username = data["url"].split("https://gumroad.com/")[1] except (KeyError, IndexError, AttributeError): username = None return dict( username=username, email=data.get("email"), name=data.get("name"), twitter_handle=data.get("twitter_handle"), url=data.get("url"), ) provider_classes = [GumroadProvider] django-allauth-0.58.2/allauth/socialaccount/providers/gumroad/tests.py000066400000000000000000000014521452212273200261520ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.gumroad.provider import GumroadProvider from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class GumroadTests(OAuth2TestsMixin, TestCase): provider_id = GumroadProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "success": true, "user": { "bio": "a sailor, a tailor", "name": "John Smith", "twitter_handle": null, "user_id": "G_-mnBf9b1j9A7a4ub4nFQ==", "email": "johnsmith@gumroad.com", "url": "https://gumroad.com/sailorjohn" } }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/gumroad/urls.py000066400000000000000000000003461452212273200257760ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.gumroad.provider import GumroadProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(GumroadProvider) django-allauth-0.58.2/allauth/socialaccount/providers/gumroad/views.py000066400000000000000000000022111452212273200261370ustar00rootroot00000000000000# -*- coding: utf-8 -*- import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.gumroad.provider import GumroadProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class GumroadOauth2Adapter(OAuth2Adapter): provider_id = GumroadProvider.id supports_state = True settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("GUMROAD_URL") access_token_url = "{0}/oauth/token".format(provider_base_url) authorize_url = "{0}/oauth/authorize".format(provider_base_url) profile_url = "https://api.gumroad.com/v2/user" def complete_login(self, request, app, token, response): resp = requests.get(self.profile_url, params={"access_token": token.token}) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response( request, extra_data["user"] ) oauth2_login = OAuth2LoginView.adapter_view(GumroadOauth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(GumroadOauth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/hubic/000077500000000000000000000000001452212273200240705ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/hubic/__init__.py000066400000000000000000000000001452212273200261670ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/hubic/provider.py000066400000000000000000000012561452212273200263000ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class HubicAccount(ProviderAccount): pass class HubicProvider(OAuth2Provider): id = "hubic" name = "Hubic" account_class = HubicAccount def extract_uid(self, data): return str(data["email"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("firstname").lower() + data.get("lastname").lower(), first_name=data.get("firstname"), last_name=data.get("lastname"), ) provider_classes = [HubicProvider] django-allauth-0.58.2/allauth/socialaccount/providers/hubic/tests.py000066400000000000000000000013771452212273200256140ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import HubicProvider class HubicTests(OAuth2TestsMixin, TestCase): provider_id = HubicProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "email": "user@example.com", "firstname": "Test", "activated": true, "creationDate": "2014-04-17T17:04:01+02:00", "language": "en", "status": "ok", "offer": "25g", "lastname": "User" } """, ) def get_login_response_json(self, with_refresh_token=True): return '{\ "access_token": "testac",\ "expires_in": "3600",\ "refresh_token": "testrf",\ "token_type": "Bearer"\ }' django-allauth-0.58.2/allauth/socialaccount/providers/hubic/urls.py000066400000000000000000000002441452212273200254270ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import HubicProvider urlpatterns = default_urlpatterns(HubicProvider) django-allauth-0.58.2/allauth/socialaccount/providers/hubic/views.py000066400000000000000000000017151452212273200256030ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import HubicProvider class HubicOAuth2Adapter(OAuth2Adapter): provider_id = HubicProvider.id access_token_url = "https://api.hubic.com/oauth/token" authorize_url = "https://api.hubic.com/oauth/auth" profile_url = "https://api.hubic.com/1.0/account" redirect_uri_protocol = "https" def complete_login(self, request, app, token, **kwargs): token_type = kwargs["response"]["token_type"] resp = requests.get( self.profile_url, headers={"Authorization": "%s %s" % (token_type, token.token)}, ) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(HubicOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(HubicOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/hubspot/000077500000000000000000000000001452212273200244625ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/hubspot/__init__.py000066400000000000000000000000001452212273200265610ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/hubspot/provider.py000066400000000000000000000014661452212273200266750ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class HubspotAccount(ProviderAccount): pass class HubspotProvider(OAuth2Provider): id = "hubspot" name = "Hubspot" account_class = HubspotAccount def get_default_scope(self): return ["oauth"] def extract_uid(self, data): return str(data["user_id"]) def extract_common_fields(self, data): return dict(email=data.get("user")) def extract_email_addresses(self, data): ret = [] email = data.get("user") if email: ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [HubspotProvider] django-allauth-0.58.2/allauth/socialaccount/providers/hubspot/tests.py000066400000000000000000000017451452212273200262050ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import HubspotProvider class HubspotTests(OAuth2TestsMixin, TestCase): provider_id = HubspotProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "token": "CNye4dqFMBICAAEYhOKlDZZ_z6IVKI_xMjIUgmFsNQzgBjNE9YBmhAhNOtfN0ak6BAAAAEFCFIIwn2EVRLpvJI9hP4tbIeKHw7ZXSgNldTFSAFoA", "user": "m@acme.com", "hub_domain": "acme.com", "scopes": ["oauth"], "scope_to_scope_group_pks": [25, 31], "trial_scopes": [], "trial_scope_to_scope_group_pks": [], "hub_id": 211580, "app_id": 833572, "expires_in": 1799, "user_id": 42607123, "token_type": "access" }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/hubspot/urls.py000066400000000000000000000002501452212273200260160ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import HubspotProvider urlpatterns = default_urlpatterns(HubspotProvider) django-allauth-0.58.2/allauth/socialaccount/providers/hubspot/views.py000066400000000000000000000020451452212273200261720ustar00rootroot00000000000000"""Views for Hubspot API.""" import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import HubspotProvider class HubspotOAuth2Adapter(OAuth2Adapter): """OAuth2Adapter for Hubspot API v3.""" provider_id = HubspotProvider.id authorize_url = "https://app.hubspot.com/oauth/authorize" access_token_url = "https://api.hubapi.com/oauth/v1/token" profile_url = "https://api.hubapi.com/oauth/v1/access-tokens" def complete_login(self, request, app, token, **kwargs): headers = {"Content-Type": "application/json"} response = requests.get( "{0}/{1}".format(self.profile_url, token.token), headers=headers ) response.raise_for_status() extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(HubspotOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(HubspotOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/instagram/000077500000000000000000000000001452212273200247635ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/instagram/__init__.py000066400000000000000000000000001452212273200270620ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/instagram/provider.py000066400000000000000000000016311452212273200271700ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class InstagramAccount(ProviderAccount): PROFILE_URL = "http://instagram.com/" def get_profile_url(self): return self.PROFILE_URL + self.account.extra_data.get("username") def to_str(self): dflt = super(InstagramAccount, self).to_str() return self.account.extra_data.get("username", dflt) class InstagramProvider(OAuth2Provider): id = "instagram" name = "Instagram" account_class = InstagramAccount def extract_extra_data(self, data): return data def get_default_scope(self): return ["user_profile"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict(username=data.get("username")) provider_classes = [InstagramProvider] django-allauth-0.58.2/allauth/socialaccount/providers/instagram/tests.py000066400000000000000000000014331452212273200265000ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import InstagramProvider class InstagramTests(OAuth2TestsMixin, TestCase): provider_id = InstagramProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "username": "georgewhewell", "bio": "", "website": "", "profile_picture": "http://images.ak.instagram.com/profiles/profile_11428116_75sq_1339547159.jpg", "full_name": "georgewhewell", "counts": { "media": 74, "followed_by": 91, "follows": 104 }, "id": "11428116" }""", ) # noqa django-allauth-0.58.2/allauth/socialaccount/providers/instagram/urls.py000066400000000000000000000002541452212273200263230ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import InstagramProvider urlpatterns = default_urlpatterns(InstagramProvider) django-allauth-0.58.2/allauth/socialaccount/providers/instagram/views.py000066400000000000000000000016741452212273200265020ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import InstagramProvider class InstagramOAuth2Adapter(OAuth2Adapter): provider_id = InstagramProvider.id access_token_url = "https://api.instagram.com/oauth/access_token" authorize_url = "https://api.instagram.com/oauth/authorize" profile_url = "https://graph.instagram.com/me" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, params={"access_token": token.token, "fields": ["id", "username"]}, ) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(InstagramOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(InstagramOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/jupyterhub/000077500000000000000000000000001452212273200251775ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/jupyterhub/__init__.py000066400000000000000000000000001452212273200272760ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/jupyterhub/provider.py000066400000000000000000000012121452212273200273770ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class JupyterHubAccount(ProviderAccount): def to_str(self): dflt = super(JupyterHubAccount, self).to_str() return self.account.extra_data.get("name", dflt) class JupyterHubProvider(OAuth2Provider): id = "jupyterhub" name = "JupyterHub" account_class = JupyterHubAccount def extract_uid(self, data): return str(data.get("name")) def extract_common_fields(self, data): return dict(name=data.get("name", "")) provider_classes = [JupyterHubProvider] django-allauth-0.58.2/allauth/socialaccount/providers/jupyterhub/tests.py000066400000000000000000000012111452212273200267060ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import JupyterHubProvider class JupyterHubTests(OAuth2TestsMixin, TestCase): provider_id = JupyterHubProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "kind": "user", "name": "abc", "admin": false, "groups": [], "server": null, "pending": null, "created": "2016-12-06T18:30:50.297567Z", "last_activity": "2017-02-07T17:29:36.470236Z", "servers": null} """, ) django-allauth-0.58.2/allauth/socialaccount/providers/jupyterhub/urls.py000066400000000000000000000003401452212273200265330ustar00rootroot00000000000000from allauth.socialaccount.providers.jupyterhub.provider import ( JupyterHubProvider, ) from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(JupyterHubProvider) django-allauth-0.58.2/allauth/socialaccount/providers/jupyterhub/views.py000066400000000000000000000022131452212273200267040ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.jupyterhub.provider import ( JupyterHubProvider, ) from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class JupyterHubAdapter(OAuth2Adapter): provider_id = JupyterHubProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("API_URL", "") access_token_url = "{0}/hub/api/oauth2/token".format(provider_base_url) authorize_url = "{0}/hub/api/oauth2/authorize".format(provider_base_url) profile_url = "{0}/hub/api/user".format(provider_base_url) def complete_login(self, request, app, access_token, **kwargs): headers = {"Authorization": "Bearer {0}".format(access_token)} extra_data = requests.get(self.profile_url, headers=headers) user_profile = extra_data.json() return self.get_provider().sociallogin_from_response(request, user_profile) oauth2_login = OAuth2LoginView.adapter_view(JupyterHubAdapter) oauth2_callback = OAuth2CallbackView.adapter_view(JupyterHubAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/kakao/000077500000000000000000000000001452212273200240645ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/kakao/__init__.py000066400000000000000000000000001452212273200261630ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/kakao/models.py000066400000000000000000000000001452212273200257070ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/kakao/provider.py000066400000000000000000000025271452212273200262760ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class KakaoAccount(ProviderAccount): @property def properties(self): return self.account.extra_data.get("properties") def get_avatar_url(self): return self.properties.get("profile_image") def to_str(self): dflt = super(KakaoAccount, self).to_str() return self.properties.get("nickname", dflt) class KakaoProvider(OAuth2Provider): id = "kakao" name = "Kakao" account_class = KakaoAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): email = data.get("kakao_account", {}).get("email") nickname = data.get("properties", {}).get("nickname") return dict(email=email, username=nickname) def extract_email_addresses(self, data): ret = [] data = data.get("kakao_account", {}) email = data.get("email") if email: verified = data.get("is_email_verified") # data['is_email_verified'] imply the email address is # verified ret.append(EmailAddress(email=email, verified=verified, primary=True)) return ret provider_classes = [KakaoProvider] django-allauth-0.58.2/allauth/socialaccount/providers/kakao/tests.py000066400000000000000000000021341452212273200256000ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import KakaoProvider class KakaoTests(OAuth2TestsMixin, TestCase): provider_id = KakaoProvider.id kakao_data = """ { "id": 123456789, "properties": { "nickname": "\uc9c0\uc724", "thumbnail_image": "http://xxx.kakao.co.kr/.../aaa.jpg", "profile_image": "http://xxx.kakao.co.kr/.../bbb.jpg" }, "kakao_account": { "has_email": true, "is_email_valid": true, "is_email_verified": true, "email": "xxxxxxx@xxxxx.com", "has_age_range": true, "age_range": "20~29", "has_birthday": true, "birthday": "1130", "has_gender": true, "gender": "female" } } """ def get_mocked_response(self, data=None): if data is None: data = self.kakao_data return MockedResponse(200, data) django-allauth-0.58.2/allauth/socialaccount/providers/kakao/urls.py000066400000000000000000000002441452212273200254230ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import KakaoProvider urlpatterns = default_urlpatterns(KakaoProvider) django-allauth-0.58.2/allauth/socialaccount/providers/kakao/views.py000066400000000000000000000016201452212273200255720ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import KakaoProvider class KakaoOAuth2Adapter(OAuth2Adapter): provider_id = KakaoProvider.id access_token_url = "https://kauth.kakao.com/oauth/token" authorize_url = "https://kauth.kakao.com/oauth/authorize" profile_url = "https://kapi.kakao.com/v2/user/me" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(KakaoOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(KakaoOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/lemonldap/000077500000000000000000000000001452212273200247515ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/lemonldap/__init__.py000066400000000000000000000000001452212273200270500ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/lemonldap/provider.py000066400000000000000000000017241452212273200271610ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class LemonLDAPAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("picture") def to_str(self): dflt = super(LemonLDAPAccount, self).to_str() return self.account.extra_data.get("name", dflt) class LemonLDAPProvider(OAuth2Provider): id = "lemonldap" name = "LemonLDAP::NG" account_class = LemonLDAPAccount def get_default_scope(self): return ["openid", "profile", "email"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("preferred_username"), name=data.get("name"), picture=data.get("picture"), ) provider_classes = [LemonLDAPProvider] django-allauth-0.58.2/allauth/socialaccount/providers/lemonldap/tests.py000066400000000000000000000011571452212273200264710ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.lemonldap.provider import ( LemonLDAPProvider, ) from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class LemonLDAPTests(OAuth2TestsMixin, TestCase): provider_id = LemonLDAPProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "email": "dwho@example.com", "sub": "dwho", "preferred_username": "dwho", "name": "Doctor Who" } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/lemonldap/urls.py000066400000000000000000000003651452212273200263140ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.lemonldap.provider import ( LemonLDAPProvider, ) from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(LemonLDAPProvider) django-allauth-0.58.2/allauth/socialaccount/providers/lemonldap/views.py000066400000000000000000000024161452212273200264630ustar00rootroot00000000000000# -*- coding: utf-8 -*- import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.lemonldap.provider import ( LemonLDAPProvider, ) from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class LemonLDAPOAuth2Adapter(OAuth2Adapter): provider_id = LemonLDAPProvider.id supports_state = True settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("LEMONLDAP_URL") access_token_url = "{0}/oauth2/token".format(provider_base_url) authorize_url = "{0}/oauth2/authorize".format(provider_base_url) profile_url = "{0}/oauth2/userinfo".format(provider_base_url) def complete_login(self, request, app, token, response): response = requests.post( self.profile_url, headers={"Authorization": "Bearer " + str(token)} ) response.raise_for_status() extra_data = response.json() extra_data["id"] = extra_data["sub"] del extra_data["sub"] return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(LemonLDAPOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(LemonLDAPOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/line/000077500000000000000000000000001452212273200237255ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/line/__init__.py000066400000000000000000000000001452212273200260240ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/line/models.py000066400000000000000000000000001452212273200255500ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/line/provider.py000066400000000000000000000017711452212273200261370ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class LineAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("pictureUrl") or self.account.extra_data.get( "picture" ) def to_str(self): return self.account.extra_data.get("displayName", self.account.uid) class LineProvider(OAuth2Provider): id = "line" name = "Line" account_class = LineAccount def get_default_scope(self): return [] def extract_uid(self, data): return str(data.get("userId") or data.get("sub")) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("email") or self.extract_uid(data), first_name=data.get("first_name"), last_name=data.get("last_name"), name=data.get("name"), ) provider_classes = [LineProvider] django-allauth-0.58.2/allauth/socialaccount/providers/line/tests.py000066400000000000000000000010111452212273200254320ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import LineProvider class LineTests(OAuth2TestsMixin, TestCase): provider_id = LineProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "userId": "u7d47d26a6bab09b95695ff02d1a36e38", "displayName": "\uc774\uc0c1\ud601", "pictureUrl": "http://dl.profile.line-cdn.net/0m055ab14d725138288331268c45ac5286a35482fb794a" }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/line/urls.py000066400000000000000000000002421452212273200252620ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import LineProvider urlpatterns = default_urlpatterns(LineProvider) django-allauth-0.58.2/allauth/socialaccount/providers/line/views.py000066400000000000000000000041451452212273200254400ustar00rootroot00000000000000import requests from datetime import timedelta from django.utils import timezone from allauth.socialaccount import app_settings from allauth.socialaccount.models import SocialToken from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import LineProvider class LineOAuth2Adapter(OAuth2Adapter): provider_id = LineProvider.id access_token_url = "https://api.line.me/oauth2/v2.1/token" authorize_url = "https://access.line.me/oauth2/v2.1/authorize" profile_url = "https://api.line.me/v2/profile" # https://developers.line.biz/en/reference/line-login/#get-user-profile id_token_url = "https://api.line.me/oauth2/v2.1/verify" # https://developers.line.biz/en/reference/line-login/#verify-id-token def parse_token(self, data): """ data: access_token data from line """ settings = app_settings.PROVIDERS.get(self.provider_id, {}) if "email" in settings.get("SCOPE", ""): token = SocialToken(token=data["id_token"]) else: token = SocialToken(token=data["access_token"]) token.token_secret = data.get("refresh_token", "") expires_in = data.get(self.expires_in_key, None) if expires_in: token.expires_at = timezone.now() + timedelta(seconds=int(expires_in)) return token def complete_login(self, request, app, token, **kwargs): settings = app_settings.PROVIDERS.get(self.provider_id, {}) if "email" in settings.get("SCOPE", ""): payload = {"client_id": app.client_id, "id_token": token.token} resp = requests.post(self.id_token_url, payload) else: headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(LineOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(LineOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/linkedin/000077500000000000000000000000001452212273200245735ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/linkedin/__init__.py000066400000000000000000000000001452212273200266720ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/linkedin/provider.py000066400000000000000000000042661452212273200270070ustar00rootroot00000000000000from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class LinkedInAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("public-profile-url") def get_avatar_url(self): # try to return the higher res picture-urls::(original) first try: if self.account.extra_data.get("picture-urls", {}).get("picture-url"): return self.account.extra_data.get("picture-urls", {}).get( "picture-url" ) except Exception: # if we can't get higher res for any reason, we'll just return the # low res pass return self.account.extra_data.get("picture-url") def to_str(self): dflt = super(LinkedInAccount, self).to_str() name = self.account.extra_data.get("name", dflt) first_name = self.account.extra_data.get("first-name", None) last_name = self.account.extra_data.get("last-name", None) if first_name and last_name: name = first_name + " " + last_name return name class LinkedInProvider(OAuthProvider): id = "linkedin" name = "LinkedIn" account_class = LinkedInAccount def get_default_scope(self): scope = [] if app_settings.QUERY_EMAIL: scope.append("r_emailaddress") return scope def get_profile_fields(self): default_fields = [ "id", "first-name", "last-name", "email-address", "picture-url", "picture-urls::(original)", # picture-urls::(original) is higher res "public-profile-url", ] fields = self.get_settings().get("PROFILE_FIELDS", default_fields) return fields def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict( email=data.get("email-address"), first_name=data.get("first-name"), last_name=data.get("last-name"), ) provider_classes = [LinkedInProvider] django-allauth-0.58.2/allauth/socialaccount/providers/linkedin/tests.py000066400000000000000000000016041452212273200263100ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import LinkedInProvider class LinkedInTests(OAuthTestsMixin, TestCase): provider_id = LinkedInProvider.id def get_mocked_response(self): return [ MockedResponse( 200, """ oKmTqN2ffc R@ymØnd Pènnèrs raymond.penners@example.com http://m.c.lnkd.licdn.com/mpr/mprx/0_e0hbvSLc8QWo3ggPeVKqvaFR860d342Pogq4vakwx8IJOyR1XJrwRmr5mIx9C0DxWpGMsW9Lb8EQ http://www.linkedin.com/in/intenct """, ) ] django-allauth-0.58.2/allauth/socialaccount/providers/linkedin/urls.py000066400000000000000000000002511452212273200261300ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import LinkedInProvider urlpatterns = default_urlpatterns(LinkedInProvider) django-allauth-0.58.2/allauth/socialaccount/providers/linkedin/views.py000066400000000000000000000042441452212273200263060ustar00rootroot00000000000000from xml.etree import ElementTree from xml.parsers.expat import ExpatError from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import LinkedInProvider class LinkedInAPI(OAuth): url = "https://api.linkedin.com/v1/people/~" def get_user_info(self): adapter = get_adapter(self.request) provider = adapter.get_provider(self.request, LinkedInProvider.id) fields = provider.get_profile_fields() url = self.url + ":(%s)" % ",".join(fields) raw_xml = self.query(url) try: return self.to_dict(ElementTree.fromstring(raw_xml)) except (ExpatError, KeyError, IndexError): return None def to_dict(self, xml): """ Convert XML structure to dict recursively, repeated keys entries are returned as in list containers. """ children = list(xml) if not children: return xml.text else: out = {} for node in list(xml): if node.tag in out: if not isinstance(out[node.tag], list): out[node.tag] = [out[node.tag]] out[node.tag].append(self.to_dict(node)) else: out[node.tag] = self.to_dict(node) return out class LinkedInOAuthAdapter(OAuthAdapter): provider_id = LinkedInProvider.id request_token_url = "https://api.linkedin.com/uas/oauth/requestToken" access_token_url = "https://api.linkedin.com/uas/oauth/accessToken" authorize_url = "https://www.linkedin.com/uas/oauth/authenticate" def complete_login(self, request, app, token, response): client = LinkedInAPI(request, app.client_id, app.secret, self.request_token_url) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(LinkedInOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(LinkedInOAuthAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/linkedin_oauth2/000077500000000000000000000000001452212273200260555ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/linkedin_oauth2/__init__.py000066400000000000000000000000001452212273200301540ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/linkedin_oauth2/provider.py000066400000000000000000000123641452212273200302670ustar00rootroot00000000000000from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ( ProviderAccount, ProviderException, ) from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider def _extract_name_field(data, field_name): ret = "" v = data.get(field_name, {}) if v: if isinstance(v, str): # Old V1 data ret = v else: localized = v.get("localized", {}) preferred_locale = v.get( "preferredLocale", {"country": "US", "language": "en"} ) locale_key = "_".join( [preferred_locale["language"], preferred_locale["country"]] ) if locale_key in localized: ret = localized.get(locale_key) elif localized: ret = next(iter(localized.values())) return ret def _extract_email(data): """ {'elements': [{'handle': 'urn:li:emailAddress:319371470', 'handle~': {'emailAddress': 'raymond.penners@intenct.nl'}}]} """ ret = "" elements = data.get("elements", []) if len(elements) > 0: ret = elements[0].get("handle~", {}).get("emailAddress", "") return ret class LinkedInOAuth2Account(ProviderAccount): def to_str(self): ret = super(LinkedInOAuth2Account, self).to_str() first_name = _extract_name_field(self.account.extra_data, "firstName") last_name = _extract_name_field(self.account.extra_data, "lastName") if first_name or last_name: ret = " ".join([first_name, last_name]).strip() return ret def get_avatar_url(self): """ Attempts the load the avatar associated to the avatar. Requires the `profilePicture(displayImage~:playableStreams)` profile field configured in settings.py :return: """ provider_configuration = self.account.get_provider().get_settings() configured_profile_fields = provider_configuration.get("PROFILE_FIELDS", []) # Can't get the avatar when this field is not specified picture_field = "profilePicture(displayImage~:playableStreams)" if picture_field not in configured_profile_fields: return super(LinkedInOAuth2Account, self).get_avatar_url() # Iterate over the fields and attempt to get it by configured size profile_picture_config = provider_configuration.get("PROFILEPICTURE", {}) req_size = profile_picture_config.get("display_size_w_h", (100.0, 100.0)) req_auth_method = profile_picture_config.get("authorization_method", "PUBLIC") # Iterate over the data returned by the provider profile_elements = ( self.account.extra_data.get("profilePicture", {}) .get("displayImage~", {}) .get("elements", []) ) for single_element in profile_elements: if not req_auth_method == single_element["authorizationMethod"]: continue # Get the dimensions from the payload image_data = ( single_element.get("data", {}) .get("com.linkedin.digitalmedia.mediaartifact.StillImage", {}) .get("displaySize", {}) ) if not image_data: continue width, height = image_data["width"], image_data["height"] if not width or not height: continue if not width == req_size[0] or not height == req_size[1]: continue # Get the uri since actual size matches the requested size. to_return = single_element.get( "identifiers", [ {}, ], )[ 0 ].get("identifier") if to_return: return to_return return super(LinkedInOAuth2Account, self).get_avatar_url() class LinkedInOAuth2Provider(OAuth2Provider): id = "linkedin_oauth2" # Name is displayed to ordinary users -- don't include protocol name = "LinkedIn" account_class = LinkedInOAuth2Account def extract_uid(self, data): if "id" not in data: raise ProviderException( "LinkedIn encountered an internal error while logging in. \ Please try again." ) return str(data["id"]) def get_profile_fields(self): default_fields = [ "id", "firstName", "lastName", # This would be needed to in case you need access to the image # URL. Not enabling this by default due to the amount of data # returned. # # 'profilePicture(displayImage~:playableStreams)' ] fields = self.get_settings().get("PROFILE_FIELDS", default_fields) return fields def get_default_scope(self): scope = ["r_liteprofile"] if app_settings.QUERY_EMAIL: scope.append("r_emailaddress") return scope def extract_common_fields(self, data): return dict( first_name=_extract_name_field(data, "firstName"), last_name=_extract_name_field(data, "lastName"), email=_extract_email(data), ) provider_classes = [LinkedInOAuth2Provider] django-allauth-0.58.2/allauth/socialaccount/providers/linkedin_oauth2/tests.py000066400000000000000000000331741452212273200276010ustar00rootroot00000000000000# -*- coding: utf-8 -*- from json import loads from django.test.utils import override_settings from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.providers.base import ProviderException from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import LinkedInOAuth2Provider class LinkedInOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = LinkedInOAuth2Provider.id def get_mocked_response(self): return [ MockedResponse( 200, """ {} """, ), MockedResponse( 200, """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "id": "1234567", "lastName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Penners" } }, "firstName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Raymond" } } } """, ), ] def test_data_to_str(self): data = { "emailAddress": "john@doe.org", "firstName": "John", "id": "a1b2c3d4e", "lastName": "Doe", "pictureUrl": "https://media.licdn.com/mpr/foo", "pictureUrls": { "_total": 1, "values": ["https://media.licdn.com/foo"], }, "publicProfileUrl": "https://www.linkedin.com/in/johndoe", } acc = SocialAccount(extra_data=data, provider="linkedin_oauth2") self.assertEqual(acc.get_provider_account().to_str(), "John Doe") def test_get_avatar_url_no_picture_setting(self): extra_data = """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "id": "1234567", "lastName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Penners" } }, "firstName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Raymond" } } } """ acc = SocialAccount( extra_data=loads(extra_data), provider="linkedin_oauth2", ) self.assertIsNone(acc.get_avatar_url()) @override_settings( SOCIALACCOUNT_PROVIDERS={ "linkedin_oauth2": { "PROFILE_FIELDS": [ "id", "firstName", "lastName", "profilePicture(displayImage~:playableStreams)", ], "PROFILEPICTURE": { "display_size_w_h": (400, 400.0), }, }, } ) def test_get_avatar_url_with_setting(self): extra_data = """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "id": "1234567", "lastName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Penners" } }, "firstName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Raymond" } } } """ acc = SocialAccount( extra_data=loads(extra_data), provider="linkedin_oauth2", ) self.assertIsNone(acc.get_avatar_url()) @override_settings( SOCIALACCOUNT_PROVIDERS={ "linkedin_oauth2": { "PROFILE_FIELDS": [ "id", "firstName", "lastName", "profilePicture(displayImage~:playableStreams)", ], "PROFILEPICTURE": { "display_size_w_h": (100, 100.0), }, }, } ) def test_get_avatar_url_with_picture(self): extra_data = """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "id": "1234567", "lastName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Penners" } }, "firstName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Raymond" } }, "profilePicture": { "displayImage~": { "elements": [ { "authorizationMethod": "PUBLIC", "data": { "com.linkedin.digitalmedia.mediaartifact.StillImage": { "storageSize": { "height": 100, "width": 100 }, "storageAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "displaySize": { "height": 100.0, "width": 100.0, "uom": "PX" }, "rawCodecSpec": { "name": "jpeg", "type": "image" }, "displayAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "mediaType": "image/jpeg" } }, "artifact": "urn:li:digitalmediaMediaArtifact:avatar", "identifiers": [ { "identifierExpiresInSeconds": 4, "file": "urn:li:digitalmediaFile:this-is-the-link", "index": 0, "identifier": "this-is-the-link", "mediaType": "image/jpeg", "identifierType": "EXTERNAL_URL" } ] } ] } } } """ acc = SocialAccount( extra_data=loads(extra_data), provider="linkedin_oauth2", ) self.assertEqual("this-is-the-link", acc.get_avatar_url()) @override_settings( SOCIALACCOUNT_PROVIDERS={ "linkedin_oauth2": { "PROFILE_FIELDS": [ "id", "firstName", "lastName", "profilePicture(displayImage~:playableStreams)", ], "PROFILEPICTURE": { "display_size_w_h": (400, 400.0), }, }, } ) def test_get_avatar_url_size_mismatch(self): extra_data = """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "id": "1234567", "lastName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Penners" } }, "firstName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Raymond" } }, "profilePicture": { "displayImage~": { "elements": [ { "authorizationMethod": "PUBLIC", "data": { "com.linkedin.digitalmedia.mediaartifact.StillImage": { "storageSize": { "height": 100, "width": 100 }, "storageAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "displaySize": { "height": 100.0, "width": 100.0, "uom": "PX" }, "rawCodecSpec": { "name": "jpeg", "type": "image" }, "displayAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "mediaType": "image/jpeg" } }, "artifact": "urn:li:digitalmediaMediaArtifact:avatar", "identifiers": [ { "identifierExpiresInSeconds": 4, "file": "urn:li:digitalmediaFile:this-is-the-link", "index": 0, "identifier": "this-is-the-link", "mediaType": "image/jpeg", "identifierType": "EXTERNAL_URL" } ] } ] } } } """ acc = SocialAccount( extra_data=loads(extra_data), provider="linkedin_oauth2", ) self.assertIsNone(acc.get_avatar_url()) @override_settings( SOCIALACCOUNT_PROVIDERS={ "linkedin_oauth2": { "PROFILE_FIELDS": [ "id", "firstName", "lastName", "profilePicture(displayImage~:playableStreams)", ], "PROFILEPICTURE": { "display_size_w_h": (400, 400.0), }, }, } ) def test_get_avatar_url_auth_mismatch(self): extra_data = """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "id": "1234567", "lastName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Penners" } }, "firstName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Raymond" } }, "profilePicture": { "displayImage~": { "elements": [ { "authorizationMethod": "PRIVATE", "data": { "com.linkedin.digitalmedia.mediaartifact.StillImage": { "storageSize": { "height": 100, "width": 100 }, "storageAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "displaySize": { "height": 100.0, "width": 100.0, "uom": "PX" }, "rawCodecSpec": { "name": "jpeg", "type": "image" }, "displayAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "mediaType": "image/jpeg" } }, "artifact": "urn:li:digitalmediaMediaArtifact:avatar", "identifiers": [ { "identifierExpiresInSeconds": 4, "file": "urn:li:digitalmediaFile:this-is-the-link", "index": 0, "identifier": "this-is-the-link", "mediaType": "image/jpeg", "identifierType": "EXTERNAL_URL" } ] } ] } } } """ acc = SocialAccount( extra_data=loads(extra_data), provider="linkedin_oauth2", ) self.assertIsNone(acc.get_avatar_url()) @override_settings( SOCIALACCOUNT_PROVIDERS={ "linkedin_oauth2": { "PROFILE_FIELDS": [ "id", "firstName", "lastName", "profilePicture(displayImage~:playableStreams)", ], "PROFILEPICTURE": { "display_size_w_h": (100, 100), }, }, } ) def test_get_avatar_url_float_vs_int(self): extra_data = """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "id": "1234567", "lastName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Penners" } }, "firstName": { "preferredLocale": { "language": "en", "country": "US" }, "localized": { "en_US": "Raymond" } }, "profilePicture": { "displayImage~": { "elements": [ { "authorizationMethod": "PUBLIC", "data": { "com.linkedin.digitalmedia.mediaartifact.StillImage": { "storageSize": { "height": 100, "width": 100 }, "storageAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "displaySize": { "height": 100.0, "width": 100.0, "uom": "PX" }, "rawCodecSpec": { "name": "jpeg", "type": "image" }, "displayAspectRatio": { "heightAspect": 1.0, "formatted": "1.00:1.00", "widthAspect": 1.0 }, "mediaType": "image/jpeg" } }, "artifact": "urn:li:digitalmediaMediaArtifact:avatar", "identifiers": [ { "identifierExpiresInSeconds": 4, "file": "urn:li:digitalmediaFile:this-is-the-link", "index": 0, "identifier": "this-is-the-link", "mediaType": "image/jpeg", "identifierType": "EXTERNAL_URL" } ] } ] } } } """ acc = SocialAccount( extra_data=loads(extra_data), provider="linkedin_oauth2", ) self.assertEqual("this-is-the-link", acc.get_avatar_url()) def test_id_missing(self): extra_data = """ { "profilePicture": { "displayImage": "urn:li:digitalmediaAsset:12345abcdefgh-12abcd" }, "Id": "1234567" } """ self.assertRaises( ProviderException, self.provider.extract_uid, loads(extra_data) ) django-allauth-0.58.2/allauth/socialaccount/providers/linkedin_oauth2/urls.py000066400000000000000000000002661452212273200274200ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import LinkedInOAuth2Provider urlpatterns = default_urlpatterns(LinkedInOAuth2Provider) django-allauth-0.58.2/allauth/socialaccount/providers/linkedin_oauth2/views.py000066400000000000000000000035411452212273200275670ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import LinkedInOAuth2Provider class LinkedInOAuth2Adapter(OAuth2Adapter): provider_id = LinkedInOAuth2Provider.id access_token_url = "https://www.linkedin.com/oauth/v2/accessToken" authorize_url = "https://www.linkedin.com/oauth/v2/authorization" profile_url = "https://api.linkedin.com/v2/me" email_url = "https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))" # noqa # See: # http://developer.linkedin.com/forum/unauthorized-invalid-or-expired-token-immediately-after-receiving-oauth2-token?page=1 # noqa access_token_method = "GET" def complete_login(self, request, app, token, **kwargs): extra_data = self.get_user_info(token) return self.get_provider().sociallogin_from_response(request, extra_data) def get_user_info(self, token): fields = self.get_provider().get_profile_fields() headers = {} headers.update(self.get_provider().get_settings().get("HEADERS", {})) headers["Authorization"] = " ".join(["Bearer", token.token]) info = {} if app_settings.QUERY_EMAIL: resp = requests.get(self.email_url, headers=headers) # If this response goes wrong, that is not a blocker in order to # continue. if resp.ok: info = resp.json() url = self.profile_url + "?projection=(%s)" % ",".join(fields) resp = requests.get(url, headers=headers) resp.raise_for_status() info.update(resp.json()) return info oauth2_login = OAuth2LoginView.adapter_view(LinkedInOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(LinkedInOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/mailchimp/000077500000000000000000000000001452212273200247415ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/mailchimp/__init__.py000066400000000000000000000000001452212273200270400ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/mailchimp/provider.py000066400000000000000000000026031452212273200271460ustar00rootroot00000000000000"""Customise Provider classes for MailChimp API v3.""" from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class MailChimpAccount(ProviderAccount): """ProviderAccount subclass for MailChimp.""" def get_profile_url(self): """Return base profile url.""" return self.account.extra_data["api_endpoint"] def get_avatar_url(self): """Return avatar url.""" return self.account.extra_data["login"]["avatar"] class MailChimpProvider(OAuth2Provider): """OAuth2Provider subclass for MailChimp v3.""" id = "mailchimp" name = "MailChimp" account_class = MailChimpAccount def extract_uid(self, data): """Extract uid ('user_id') and ensure it's a str.""" return str(data["user_id"]) def get_default_scope(self): """Ensure scope is null to fit their API.""" return [""] def extract_common_fields(self, data): """Extract fields from a metadata query.""" return dict( dc=data.get("dc"), role=data.get("role"), account_name=data.get("accountname"), user_id=data.get("user_id"), login=data.get("login"), login_url=data.get("login_url"), api_endpoint=data.get("api_endpoint"), ) provider_classes = [MailChimpProvider] django-allauth-0.58.2/allauth/socialaccount/providers/mailchimp/tests.py000066400000000000000000000020531452212273200264550ustar00rootroot00000000000000"""Test MailChimp OAuth2 v3 Flow.""" from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import MailChimpProvider class MailChimpTests(OAuth2TestsMixin, TestCase): """Test Class for MailChimp OAuth2 v3.""" provider_id = MailChimpProvider.id def get_mocked_response(self): """Test authentication with an non-null avatar.""" return MockedResponse( 200, """{ "dc": "usX", "role": "owner", "accountname": "Name can have spaces", "user_id": "99999999", "login": { "email": "test@example.com", "avatar": "http://gallery.mailchimp.com/1a1a/avatar/2a2a.png", "login_id": "88888888", "login_name": "test@example.com", "login_email": "test@example.com" }, "login_url": "https://login.mailchimp.com", "api_endpoint": "https://usX.api.mailchimp.com" }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/mailchimp/urls.py000066400000000000000000000003261452212273200263010ustar00rootroot00000000000000"""Register urls for MailChimpProvider""" from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import MailChimpProvider urlpatterns = default_urlpatterns(MailChimpProvider) django-allauth-0.58.2/allauth/socialaccount/providers/mailchimp/views.py000066400000000000000000000020571452212273200264540ustar00rootroot00000000000000"""Views for MailChimp API v3.""" import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import MailChimpProvider class MailChimpOAuth2Adapter(OAuth2Adapter): """OAuth2Adapter for MailChimp API v3.""" provider_id = MailChimpProvider.id authorize_url = "https://login.mailchimp.com/oauth2/authorize" access_token_url = "https://login.mailchimp.com/oauth2/token" profile_url = "https://login.mailchimp.com/oauth2/metadata" def complete_login(self, request, app, token, **kwargs): """Complete login, ensuring correct OAuth header.""" headers = {"Authorization": "OAuth {0}".format(token.token)} metadata = requests.get(self.profile_url, headers=headers) extra_data = metadata.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(MailChimpOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(MailChimpOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/mailru/000077500000000000000000000000001452212273200242675ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/mailru/__init__.py000066400000000000000000000000001452212273200263660ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/mailru/provider.py000066400000000000000000000023441452212273200264760ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class MailRuAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("link") def get_avatar_url(self): ret = None if self.account.extra_data.get("has_pic"): pic_big_url = self.account.extra_data.get("pic_big") pic_small_url = self.account.extra_data.get("pic_small") if pic_big_url: return pic_big_url elif pic_small_url: return pic_small_url else: return ret def to_str(self): dflt = super(MailRuAccount, self).to_str() return self.account.extra_data.get("name", dflt) class MailRuProvider(OAuth2Provider): id = "mailru" name = "Mail.RU" account_class = MailRuAccount def extract_uid(self, data): return data["uid"] def extract_common_fields(self, data): return dict( email=data.get("email"), last_name=data.get("last_name"), username=data.get("nick"), first_name=data.get("first_name"), ) provider_classes = [MailRuProvider] django-allauth-0.58.2/allauth/socialaccount/providers/mailru/tests.py000066400000000000000000000026541452212273200260120ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import MailRuProvider class MailRuTests(OAuth2TestsMixin, TestCase): provider_id = MailRuProvider.id def get_mocked_response(self, verified_email=True): return MockedResponse( 200, """ [ { "uid": "15410773191172635989", "first_name": "Евгений", "last_name": "Маслов", "nick": "maslov", "email": "emaslov@mail.ru", "sex": 0, "birthday": "15.02.1980", "has_pic": 1, "pic": "http://avt.appsmail.ru/mail/emaslov/_avatar", "pic_small": "http://avt.appsmail.ru/mail/emaslov/_avatarsmall", "pic_big": "http://avt.appsmail.ru/mail/emaslov/_avatarbig", "link": "http://my.mail.ru/mail/emaslov/", "referer_type": "", "referer_id": "", "is_online": 1, "friends_count": 145, "is_verified": 1, "vip" : 0, "app_installed": 1, "location": { "country": { "name": "Россия", "id": "24" }, "city": { "name": "Москва", "id": "25" }, "region": { "name": "Москва", "id": "999999" } } }]""", ) # noqa def get_login_response_json(self, with_refresh_token=True): # FIXME: This is not an actual response. I added this in order # to get the test suite going but did not verify to check the # exact response being returned. return '{"access_token": "testac", "uid": "weibo", "refresh_token": "testrf", "x_mailru_vid": "1"}' # noqa django-allauth-0.58.2/allauth/socialaccount/providers/mailru/urls.py000066400000000000000000000002461452212273200256300ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import MailRuProvider urlpatterns = default_urlpatterns(MailRuProvider) django-allauth-0.58.2/allauth/socialaccount/providers/mailru/views.py000066400000000000000000000023241452212273200257770ustar00rootroot00000000000000import requests from hashlib import md5 from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import MailRuProvider class MailRuOAuth2Adapter(OAuth2Adapter): provider_id = MailRuProvider.id access_token_url = "https://connect.mail.ru/oauth/token" authorize_url = "https://connect.mail.ru/oauth/authorize" profile_url = "http://www.appsmail.ru/platform/api" def complete_login(self, request, app, token, **kwargs): uid = kwargs["response"]["x_mailru_vid"] data = { "method": "users.getInfo", "app_id": app.client_id, "secure": "1", "uids": uid, } param_list = sorted([item + "=" + data[item] for item in data]) data["sig"] = md5( ("".join(param_list) + app.secret).encode("utf-8") ).hexdigest() response = requests.get(self.profile_url, params=data) extra_data = response.json()[0] return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(MailRuOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(MailRuOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/mediawiki/000077500000000000000000000000001452212273200247415ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/mediawiki/__init__.py000066400000000000000000000000001452212273200270400ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/mediawiki/provider.py000066400000000000000000000032331452212273200271460ustar00rootroot00000000000000from typing import Optional from django.conf import settings from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider settings = getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}).get("mediawiki", {}) class MediaWikiAccount(ProviderAccount): def get_profile_url(self): userpage = settings.get( "USERPAGE_TEMPLATE", "https://meta.wikimedia.org/wiki/User:{username}" ) username = self.account.extra_data.get("username") if not username: return None return userpage.format(username=username.replace(" ", "_")) def to_str(self): dflt = super(MediaWikiAccount, self).to_str() return self.account.extra_data.get("username", dflt) class MediaWikiProvider(OAuth2Provider): id = "mediawiki" name = "MediaWiki" account_class = MediaWikiAccount @staticmethod def _get_email(data: dict) -> Optional[str]: if data.get("confirmed_email"): return data.get("email") return None def extract_uid(self, data): return str(data["sub"]) def extract_extra_data(self, data): return dict( username=data.get("username"), ) def extract_common_fields(self, data): return dict( email=self._get_email(data), username=data.get("username"), name=data.get("realname"), ) def extract_email_addresses(self, data): return [EmailAddress(email=self._get_email(data), verified=True, primary=True)] provider_classes = [MediaWikiProvider] django-allauth-0.58.2/allauth/socialaccount/providers/mediawiki/tests.py000066400000000000000000000020141452212273200264520ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import MediaWikiProvider class MediaWikiTests(OAuth2TestsMixin, TestCase): provider_id = MediaWikiProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "iss": "https://meta.wikimedia.org", "sub": 12345, "aud": "1234567890abcdef", "exp": 946681300, "iat": 946681200, "username": "John Doe", "editcount": 123, "confirmed_email": true, "blocked": false, "registered": "20000101000000", "groups": ["*", "user", "autoconfirmed"], "rights": ["read", "edit"], "grants": ["basic"], "email": "johndoe@example.com" } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/mediawiki/urls.py000066400000000000000000000002541452212273200263010ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import MediaWikiProvider urlpatterns = default_urlpatterns(MediaWikiProvider) django-allauth-0.58.2/allauth/socialaccount/providers/mediawiki/views.py000066400000000000000000000021601452212273200264470ustar00rootroot00000000000000import requests from django.conf import settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import MediaWikiProvider settings = getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}).get("mediawiki", {}) class MediaWikiOAuth2Adapter(OAuth2Adapter): provider_id = MediaWikiProvider.id REST_API = settings.get("REST_API", "https://meta.wikimedia.org/w/rest.php") access_token_url = REST_API + "/oauth2/access_token" authorize_url = REST_API + "/oauth2/authorize" profile_url = REST_API + "/oauth2/resource/profile" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer {token}".format(token=token.token)}, ) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(MediaWikiOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(MediaWikiOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/meetup/000077500000000000000000000000001452212273200242755ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/meetup/__init__.py000066400000000000000000000000001452212273200263740ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/meetup/models.py000066400000000000000000000000001452212273200261200ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/meetup/provider.py000066400000000000000000000010041452212273200264740ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class MeetupAccount(ProviderAccount): pass class MeetupProvider(OAuth2Provider): id = "meetup" name = "Meetup" account_class = MeetupAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict(email=data.get("email"), name=data.get("name")) provider_classes = [MeetupProvider] django-allauth-0.58.2/allauth/socialaccount/providers/meetup/tests.py000066400000000000000000000026741452212273200260220ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import MeetupProvider class MeetupTests(OAuth2TestsMixin, TestCase): provider_id = MeetupProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"id": 1, "lang": "en_US", "city": "Bhubaneswar", "photo": { "thumb_link":"", "photo_id": 240057062, "highres_link":"", "base_url": "http://photos2.meetupstatic.com", "type": "member", "name": "Abhishek Jaiswal", "other_services": {}, "country": "in", "topics": [{"name": "Open Source", "urlkey": "opensource", "id": 563}, {"name": "Python", "urlkey": "python", "id": 1064}, {"name": "Software Development", "urlkey": "softwaredev", "id": 3833}, {"name": "Computer programming", "urlkey": "computer-programming", "id": 48471}, {"name": "Python Web Development", "urlkey": "python-web-development", "id": 917242}, {"name": "Data Science using Python", "urlkey": "data-science-using-python", "id": 1481522}], "lon": 85.83999633789062, "joined": 1411642310000, "id": 173662372, "status": "active", "link": "http://www.meetup.com/members/173662372", "hometown": "Kolkata", "lat": 20.270000457763672, "visited": 1488829924000, "self": {"common": {}}}}""", ) django-allauth-0.58.2/allauth/socialaccount/providers/meetup/urls.py000066400000000000000000000002461452212273200256360ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import MeetupProvider urlpatterns = default_urlpatterns(MeetupProvider) django-allauth-0.58.2/allauth/socialaccount/providers/meetup/views.py000066400000000000000000000015161452212273200260070ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import MeetupProvider class MeetupOAuth2Adapter(OAuth2Adapter): provider_id = MeetupProvider.id access_token_url = "https://secure.meetup.com/oauth2/access" authorize_url = "https://secure.meetup.com/oauth2/authorize" profile_url = "https://api.meetup.com/2/member/self" def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"access_token": token.token}) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(MeetupOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(MeetupOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/microsoft/000077500000000000000000000000001452212273200250035ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/microsoft/__init__.py000066400000000000000000000000001452212273200271020ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/microsoft/provider.py000066400000000000000000000027321452212273200272130ustar00rootroot00000000000000from __future__ import unicode_literals from allauth.socialaccount.providers.base import AuthAction, ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class MicrosoftGraphAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("photo") def to_str(self): dflt = super(MicrosoftGraphAccount, self).to_str() return self.account.extra_data.get("displayName", dflt) class MicrosoftGraphProvider(OAuth2Provider): id = str("microsoft") name = "Microsoft Graph" account_class = MicrosoftGraphAccount def get_default_scope(self): """ Docs on Scopes and Permissions: https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-permissions-and-consent#scopes-and-permissions """ return ["User.Read"] def get_auth_params(self, request, action): ret = super(MicrosoftGraphProvider, self).get_auth_params(request, action) if action == AuthAction.REAUTHENTICATE: ret["prompt"] = "select_account" return ret def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("mail") or data.get("userPrincipalName"), username=data.get("mailNickname"), last_name=data.get("surname"), first_name=data.get("givenName"), ) provider_classes = [MicrosoftGraphProvider] django-allauth-0.58.2/allauth/socialaccount/providers/microsoft/tests.py000066400000000000000000000037011452212273200265200ustar00rootroot00000000000000import json from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import MicrosoftGraphProvider from .views import _check_errors class MicrosoftGraphTests(OAuth2TestsMixin, TestCase): provider_id = MicrosoftGraphProvider.id def get_mocked_response(self): response_data = """ { "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity", "id": "16f5a7b6-5a15-4568-aa5a-31bb117e9967", "businessPhones": [], "displayName": "Anne Weiler", "givenName": "Anne", "jobTitle": "Manufacturing Lead", "mail": "annew@CIE493742.onmicrosoft.com", "mobilePhone": "+1 3528700812", "officeLocation": null, "preferredLanguage": "en-US", "surname": "Weiler", "userPrincipalName": "annew@CIE493742.onmicrosoft.com", "mailNickname": "annew" } """ # noqa return MockedResponse(200, response_data) def test_invalid_data(self): response = MockedResponse(200, json.dumps({})) with self.assertRaises(OAuth2Error): # No id, raises _check_errors(response) def test_profile_invalid_response(self): data = { "error": { "code": "InvalidAuthenticationToken", "message": "Access token validation failure. Invalid audience.", } } response = MockedResponse(401, json.dumps(data)) with self.assertRaises(OAuth2Error): # no id, 4xx code, raises with message _check_errors(response) def test_invalid_response(self): response = MockedResponse(200, "invalid json data") with self.assertRaises(OAuth2Error): # bad json, raises _check_errors(response) django-allauth-0.58.2/allauth/socialaccount/providers/microsoft/urls.py000066400000000000000000000002661452212273200263460ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import MicrosoftGraphProvider urlpatterns = default_urlpatterns(MicrosoftGraphProvider) django-allauth-0.58.2/allauth/socialaccount/providers/microsoft/views.py000066400000000000000000000053611452212273200265170ustar00rootroot00000000000000from __future__ import unicode_literals import json import requests from allauth.core import context from allauth.socialaccount import app_settings from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import MicrosoftGraphProvider def _check_errors(response): try: data = response.json() except json.decoder.JSONDecodeError: raise OAuth2Error( "Invalid JSON from Microsoft Graph API: {}".format(response.text) ) if "id" not in data: error_message = "Error retrieving Microsoft profile" microsoft_error_message = data.get("error", {}).get("message") if microsoft_error_message: error_message = ": ".join((error_message, microsoft_error_message)) raise OAuth2Error(error_message) return data class MicrosoftGraphOAuth2Adapter(OAuth2Adapter): provider_id = MicrosoftGraphProvider.id def _build_tenant_url(self, path): settings = app_settings.PROVIDERS.get(self.provider_id, {}) # Lower case "tenant" for backwards compatibility tenant = settings.get("TENANT", settings.get("tenant", "common")) # Prefer app based tenant setting. app = get_adapter().get_app(context.request, provider=self.provider_id) tenant = app.settings.get("tenant", tenant) return f"https://login.microsoftonline.com/{tenant}{path}" @property def access_token_url(self): return self._build_tenant_url("/oauth2/v2.0/token") @property def authorize_url(self): return self._build_tenant_url("/oauth2/v2.0/authorize") profile_url = "https://graph.microsoft.com/v1.0/me" user_properties = ( "businessPhones", "displayName", "givenName", "id", "jobTitle", "mail", "mobilePhone", "officeLocation", "preferredLanguage", "surname", "userPrincipalName", "mailNickname", "companyName", ) profile_url_params = {"$select": ",".join(user_properties)} def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} response = requests.get( self.profile_url, params=self.profile_url_params, headers=headers, ) extra_data = _check_errors(response) return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(MicrosoftGraphOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(MicrosoftGraphOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/miro/000077500000000000000000000000001452212273200237445ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/miro/__init__.py000066400000000000000000000000001452212273200260430ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/miro/provider.py000066400000000000000000000015461452212273200261560ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class MiroAccount(ProviderAccount): pass class MiroProvider(OAuth2Provider): id = "miro" name = "Miro" account_class = MiroAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict(email=data.get("email"), name=data.get("name")) def get_default_scope(self): return ["identity:read"] def extract_email_addresses(self, data): ret = [] email = data.get("email") if email and data.get("state") == "registered": ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [MiroProvider] django-allauth-0.58.2/allauth/socialaccount/providers/miro/tests.py000066400000000000000000000016061452212273200254630ustar00rootroot00000000000000from allauth.socialaccount.providers.miro.provider import MiroProvider from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class MiroTests(OAuth2TestsMixin, TestCase): provider_id = MiroProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "type" : "user", "id" : "5298357290348572584", "name" : "Pavel Oborin", "createdAt" : "2017-03-23T09:41:01Z", "role" : "developer", "email" : "oborin.p@gmail.com", "state" : "registered", "picture" : { "type" : "picture", "id" : "Optional[5289752983457238457]", "imageUrl" : "https://r.miro.com/some/image" } }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/miro/urls.py000066400000000000000000000003051452212273200253010ustar00rootroot00000000000000from allauth.socialaccount.providers.miro.provider import MiroProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(MiroProvider) django-allauth-0.58.2/allauth/socialaccount/providers/miro/views.py000066400000000000000000000017261452212273200254610ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.miro.provider import MiroProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class MiroOAuth2Adapter(OAuth2Adapter): provider_id = MiroProvider.id access_token_url = "https://api.miro.com/v1/oauth/token" authorize_url = "https://miro.com/oauth/authorize" profile_url = "https://api.miro.com/v1/users/me" def complete_login(self, request, app, token, response): headers = { "Authorization": f"Bearer {token.token}", "Content-Type": "application/json", } extra_data = requests.get(self.profile_url, headers=headers) extra_data.raise_for_status() return self.get_provider().sociallogin_from_response(request, extra_data.json()) oauth2_login = OAuth2LoginView.adapter_view(MiroOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(MiroOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/naver/000077500000000000000000000000001452212273200241115ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/naver/__init__.py000066400000000000000000000000001452212273200262100ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/naver/models.py000066400000000000000000000000001452212273200257340ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/naver/provider.py000066400000000000000000000016631452212273200263230ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class NaverAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("profile_image") def to_str(self): return self.account.extra_data.get("nickname", self.account.uid) class NaverProvider(OAuth2Provider): id = "naver" name = "Naver" account_class = NaverAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): email = data.get("email") return dict(email=email) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email: ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [NaverProvider] django-allauth-0.58.2/allauth/socialaccount/providers/naver/tests.py000066400000000000000000000013251452212273200256260ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import NaverProvider class NaverTests(OAuth2TestsMixin, TestCase): provider_id = NaverProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "response": { "enc_id": "46111c25f969116de4e545f13a415bb5383db2a79782da8851db72b2cced3180", "nickname": "\ubc31\ud638", "profile_image": "https://ssl.pstatic.net/static/pwe/address/nodata_33x33.gif", "gender": "M", "id": "7163491", "age": "20-29", "birthday": "03-22", "email": "shlee940322@example.com", "name": "\uc774\uc0c1\ud601" }, "message": "success", "resultcode": "00" } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/naver/urls.py000066400000000000000000000002441452212273200254500ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import NaverProvider urlpatterns = default_urlpatterns(NaverProvider) django-allauth-0.58.2/allauth/socialaccount/providers/naver/views.py000066400000000000000000000016441452212273200256250ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import NaverProvider class NaverOAuth2Adapter(OAuth2Adapter): provider_id = NaverProvider.id access_token_url = "https://nid.naver.com/oauth2.0/token" authorize_url = "https://nid.naver.com/oauth2.0/authorize" profile_url = "https://openapi.naver.com/v1/nid/me" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) resp.raise_for_status() extra_data = resp.json().get("response") return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(NaverOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(NaverOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/netiq/000077500000000000000000000000001452212273200241165ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/netiq/__init__.py000066400000000000000000000000001452212273200262150ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/netiq/provider.py000066400000000000000000000015751452212273200263320ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class NetIQAccount(ProviderAccount): def to_str(self): dflt = super(NetIQAccount, self).to_str() return self.account.extra_data.get("name", dflt) class NetIQProvider(OAuth2Provider): id = "netiq" name = "NetIQ" account_class = NetIQAccount def get_default_scope(self): return ["openid", "profile", "email"] def extract_uid(self, data): return str(data["preferred_username"]) def extract_extra_data(self, data): return data def extract_common_fields(self, data): return dict( email=data["email"], last_name=data["family_name"], first_name=data["given_name"], ) provider_classes = [NetIQProvider] django-allauth-0.58.2/allauth/socialaccount/providers/netiq/tests.py000066400000000000000000000015041452212273200256320ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.netiq.provider import NetIQProvider from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class NetIQTests(OAuth2TestsMixin, TestCase): provider_id = NetIQProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "sub": "d4c094dd899ab0408fb9d4c094dd899a", "acr": "secure/name/password/uri", "preferred_username": "Mocktest", "email": "mocktest@your.netiq.server.example.com", "nickname": "Mocktest", "family_name": "test", "given_name": "Mock", "website": "https://www.exanple.com" } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/netiq/urls.py000066400000000000000000000003401452212273200254520ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.netiq.provider import NetIQProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(NetIQProvider) django-allauth-0.58.2/allauth/socialaccount/providers/netiq/views.py000066400000000000000000000031261452212273200256270ustar00rootroot00000000000000# -*- coding: utf-8 -*- import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.netiq.provider import NetIQProvider from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) class NetIQOAuth2Adapter(OAuth2Adapter): provider_id = NetIQProvider.id supports_state = True settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("NETIQ_URL") @property def access_token_url(self): return "{}/nidp/oauth/nam/token".format(self.provider_base_url) @property def authorize_url(self): return "{}/nidp/oauth/nam/authz".format(self.provider_base_url) @property def userinfo_url(self): return "{}/nidp/oauth/nam/userinfo".format(self.provider_base_url) def complete_login(self, request, app, token, **kwargs): """ Get the user info from userinfo endpoint and return a A populated instance of the `SocialLogin` model (unsaved) :param request: :param app: :param token: :param kwargs: :return: """ resp = requests.get( self.userinfo_url, headers={"Authorization": "Bearer {}".format(token.token)}, ) resp.raise_for_status() extra_data = resp.json() login = self.get_provider().sociallogin_from_response(request, extra_data) return login oauth2_login = OAuth2LoginView.adapter_view(NetIQOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(NetIQOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/nextcloud/000077500000000000000000000000001452212273200250035ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/nextcloud/__init__.py000066400000000000000000000000001452212273200271020ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/nextcloud/provider.py000066400000000000000000000012141452212273200272050ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class NextCloudAccount(ProviderAccount): pass class NextCloudProvider(OAuth2Provider): id = "nextcloud" name = "NextCloud" account_class = NextCloudAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( username=data["displayname"], email=data["email"], ) def get_default_scope(self): scope = ["read"] return scope provider_classes = [NextCloudProvider] django-allauth-0.58.2/allauth/socialaccount/providers/nextcloud/tests.py000066400000000000000000000033211452212273200265160ustar00rootroot00000000000000from django.test.utils import override_settings from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import NextCloudProvider @override_settings( SOCIALACCOUNT_PROVIDERS={"nextcloud": {"SERVER": "https://nextcloud.example.org"}} ) class NextCloudTests(OAuth2TestsMixin, TestCase): provider_id = NextCloudProvider.id def get_login_response_json(self, with_refresh_token=True): return ( super(NextCloudTests, self) .get_login_response_json(with_refresh_token=with_refresh_token) .replace("uid", "user_id") ) def get_mocked_response(self): return MockedResponse( 200, """ ok 100 OK 1 batman /var/www/html/data/batman 1553946472000 Database 1455417655296 467191265 1455884846561 0.03 -3 batman@wayne.com batman 7351857301
BatCave, Gotham City
https://batman.org @the_batman admin fr fr_FR 1 1
""", ) django-allauth-0.58.2/allauth/socialaccount/providers/nextcloud/urls.py000066400000000000000000000002541452212273200263430ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import NextCloudProvider urlpatterns = default_urlpatterns(NextCloudProvider) django-allauth-0.58.2/allauth/socialaccount/providers/nextcloud/views.py000066400000000000000000000025271452212273200265200ustar00rootroot00000000000000import requests import xml.etree.ElementTree as ET from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import NextCloudProvider class NextCloudAdapter(OAuth2Adapter): provider_id = NextCloudProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) server = settings.get("SERVER", "https://nextcloud.example.org") access_token_url = "{0}/apps/oauth2/api/v1/token".format(server) authorize_url = "{0}/apps/oauth2/authorize".format(server) profile_url = "{0}/ocs/v1.php/cloud/users/".format(server) def complete_login(self, request, app, token, **kwargs): extra_data = self.get_user_info(token, kwargs["response"]["user_id"]) return self.get_provider().sociallogin_from_response(request, extra_data) def get_user_info(self, token, user_id): headers = {"Authorization": "Bearer {0}".format(token)} resp = requests.get(self.profile_url + user_id, headers=headers) resp.raise_for_status() data = ET.fromstring(resp.content.decode())[1] return {d.tag: d.text.strip() for d in data if d.text is not None} oauth2_login = OAuth2LoginView.adapter_view(NextCloudAdapter) oauth2_callback = OAuth2CallbackView.adapter_view(NextCloudAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/notion/000077500000000000000000000000001452212273200243045ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/notion/__init__.py000066400000000000000000000000001452212273200264030ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/notion/client.py000066400000000000000000000025561452212273200261440ustar00rootroot00000000000000import requests from requests.auth import HTTPBasicAuth from urllib.parse import parse_qsl from django.utils.http import urlencode from allauth.socialaccount.providers.oauth2.client import ( OAuth2Client, OAuth2Error, ) class NotionOAuth2Client(OAuth2Client): def get_redirect_url(self, authorization_url, extra_params): params = { "client_id": self.consumer_key, "scope": self.scope, "response_type": "code", "owner": "user", } if self.state: params["state"] = self.state return "%s?%s" % (authorization_url, urlencode(params)) def get_access_token(self, code, pkce_code_verifier=None): resp = requests.request( self.access_token_method, self.access_token_url, auth=HTTPBasicAuth(self.consumer_key, self.consumer_secret), json={"code": code, "grant_type": "authorization_code"}, headers=self.headers, ) access_token = None if resp.status_code in [200, 201]: try: access_token = resp.json() except ValueError: access_token = dict(parse_qsl(resp.text)) if not access_token or "access_token" not in access_token: raise OAuth2Error("Error retrieving access token: %s" % resp.content) return access_token django-allauth-0.58.2/allauth/socialaccount/providers/notion/provider.py000066400000000000000000000031261452212273200265120ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class NotionAccount(ProviderAccount): def get_user(self): return self.account.extra_data["owner"]["user"] def get_name(self): return self.get_user()["name"] def get_avatar_url(self): return self.get_user()["avatar_url"] def get_workspace_name(self): return self.account.extra_data["workspace_name"] def get_workspace_icon(self): return self.account.extra_data["workspace_icon"] def to_str(self): name = self.get_name() workspace = self.get_workspace_name() return f"{name} ({workspace})" class NotionProvider(OAuth2Provider): id = "notion" name = "Notion" account_class = NotionAccount def extract_uid(self, data): """ The unique identifier for Notion is a combination of the User ID and the Workspace ID they have authorized the application with. """ user_id = data["owner"]["user"]["id"] workspace_id = data["workspace_id"] return "user-%s_workspace-%s" % (user_id, workspace_id) def extract_common_fields(self, data): user = data["owner"]["user"] user["email"] = user["person"]["email"] return user def extract_email_addresses(self, data): user = data["owner"]["user"] email = user["person"]["email"] return [EmailAddress(email=email, verified=True, primary=True)] provider_classes = [NotionProvider] django-allauth-0.58.2/allauth/socialaccount/providers/notion/tests.py000066400000000000000000000053271452212273200260270ustar00rootroot00000000000000from urllib.parse import parse_qs, urlparse from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase, mocked_response from .provider import NotionProvider class NotionTests(OAuth2TestsMixin, TestCase): provider_id = NotionProvider.id pkce_enabled_default = False # Notion does not support PKCE. def get_mocked_response(self): return MockedResponse( 200, """ { "workspace_id": "workspace-abc", "owner": { "user": { "id": "test123", "name": "John Doe", "avatar_url": "", "person": {"email": "john@example.com"}, } }, } """, ) # noqa def get_login_response_json(self, with_refresh_token=False): """ Docs here: https://developers.notion.com/docs/authorization#step-4-notion-responds-with-an-access_token-and-additional-information """ return """ { "access_token": "testac", "bot_id": "bot-abc", "duplicated_template_id": "template-abc", "owner": { "workspace_id": "workspace-abc", "user": { "id": "test123", "name": "John Doe", "avatar_url": "", "person": { "email": "john@example.com" } } }, "workspace_icon": "https://example.com/icon.png", "workspace_id": "workspace-abc", "workspace_name": "My Workspace" } """ def login(self, resp_mock=None, process="login", with_refresh_token=True): resp = self.client.post( reverse(self.provider.id + "_login") + "?" + urlencode(dict(process=process)) ) p = urlparse(resp["location"]) q = parse_qs(p.query) complete_url = reverse(self.provider.id + "_callback") response_json = self.get_login_response_json( with_refresh_token=with_refresh_token ) if isinstance(resp_mock, list): resp_mocks = resp_mock elif resp_mock is None: resp_mocks = [] else: resp_mocks = [resp_mock] with mocked_response( MockedResponse(200, response_json, {"content-type": "application/json"}), *resp_mocks, ): resp = self.client.get(complete_url, self.get_complete_parameters(q)) return resp django-allauth-0.58.2/allauth/socialaccount/providers/notion/urls.py000066400000000000000000000003131452212273200256400ustar00rootroot00000000000000from allauth.socialaccount.providers.notion.provider import NotionProvider from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns urlpatterns = default_urlpatterns(NotionProvider) django-allauth-0.58.2/allauth/socialaccount/providers/notion/views.py000066400000000000000000000014161452212273200260150ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .client import NotionOAuth2Client from .provider import NotionProvider class NotionOAuth2Adapter(OAuth2Adapter): provider_id = NotionProvider.id basic_auth = True client_class = NotionOAuth2Client authorize_url = "https://api.notion.com/v1/oauth/authorize" access_token_url = "https://api.notion.com/v1/oauth/token" def complete_login(self, request, app, token, **kwargs): return self.get_provider().sociallogin_from_response( request, kwargs["response"] ) oauth2_login = OAuth2LoginView.adapter_view(NotionOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(NotionOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/oauth/000077500000000000000000000000001452212273200241165ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/oauth/__init__.py000066400000000000000000000000001452212273200262150ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/oauth/client.py000066400000000000000000000164661452212273200257630ustar00rootroot00000000000000""" Parts derived from socialregistration and authorized by: alen, pinda Inspired by: http://github.com/leah/python-oauth/blob/master/oauth/example/client.py http://github.com/facebook/tornado/blob/master/tornado/auth.py """ import requests from urllib.parse import parse_qsl, urlparse from django.http import HttpResponseRedirect from django.utils.http import urlencode from django.utils.translation import gettext as _ from requests_oauthlib import OAuth1 from allauth.utils import build_absolute_uri, get_request_param def get_token_prefix(url): """ Returns a prefix for the token to store in the session so we can hold more than one single oauth provider's access key in the session. Example: The request token url ``http://twitter.com/oauth/request_token`` returns ``twitter.com`` """ return urlparse(url).netloc class OAuthError(Exception): pass class OAuthClient(object): def __init__( self, request, consumer_key, consumer_secret, request_token_url, access_token_url, callback_url, parameters=None, provider=None, ): self.request = request self.request_token_url = request_token_url self.access_token_url = access_token_url self.consumer_key = consumer_key self.consumer_secret = consumer_secret self.parameters = parameters self.callback_url = callback_url self.provider = provider self.errors = [] self.request_token = None self.access_token = None def _get_request_token(self): """ Obtain a temporary request token to authorize an access token and to sign the request to obtain the access token """ if self.request_token is None: get_params = {} if self.parameters: get_params.update(self.parameters) get_params["oauth_callback"] = build_absolute_uri( self.request, self.callback_url ) rt_url = self.request_token_url + "?" + urlencode(get_params) oauth = OAuth1(self.consumer_key, client_secret=self.consumer_secret) response = requests.post(url=rt_url, auth=oauth) if response.status_code not in [200, 201]: raise OAuthError( _( "Invalid response while obtaining request token" ' from "%s". Response was: %s.' ) % (get_token_prefix(self.request_token_url), response.text) ) self.request_token = dict(parse_qsl(response.text)) self.request.session[ "oauth_%s_request_token" % get_token_prefix(self.request_token_url) ] = self.request_token return self.request_token def get_access_token(self): """ Obtain the access token to access private resources at the API endpoint. """ if self.access_token is None: request_token = self._get_rt_from_session() oauth = OAuth1( self.consumer_key, client_secret=self.consumer_secret, resource_owner_key=request_token["oauth_token"], resource_owner_secret=request_token["oauth_token_secret"], ) at_url = self.access_token_url # Passing along oauth_verifier is required according to: # http://groups.google.com/group/twitter-development-talk/browse_frm/thread/472500cfe9e7cdb9# # Though, the custom oauth_callback seems to work without it? oauth_verifier = get_request_param(self.request, "oauth_verifier") if oauth_verifier: at_url = at_url + "?" + urlencode({"oauth_verifier": oauth_verifier}) response = requests.post(url=at_url, auth=oauth) if response.status_code not in [200, 201]: raise OAuthError( _("Invalid response while obtaining access token" ' from "%s".') % get_token_prefix(self.request_token_url) ) self.access_token = dict(parse_qsl(response.text)) self.request.session[ "oauth_%s_access_token" % get_token_prefix(self.request_token_url) ] = self.access_token return self.access_token def _get_rt_from_session(self): """ Returns the request token cached in the session by ``_get_request_token`` """ try: return self.request.session[ "oauth_%s_request_token" % get_token_prefix(self.request_token_url) ] except KeyError: raise OAuthError( _('No request token saved for "%s".') % get_token_prefix(self.request_token_url) ) def is_valid(self): try: self._get_rt_from_session() self.get_access_token() except OAuthError as e: self.errors.append(e.args[0]) return False return True def get_redirect(self, authorization_url, extra_params): """ Returns a ``HttpResponseRedirect`` object to redirect the user to the URL the OAuth provider handles authorization. """ request_token = self._get_request_token() params = { "oauth_token": request_token["oauth_token"], "oauth_callback": self.request.build_absolute_uri(self.callback_url), } params.update(extra_params) url = authorization_url + "?" + urlencode(params) return HttpResponseRedirect(url) class OAuth(object): """ Base class to perform oauth signed requests from access keys saved in a user's session. See the ``OAuthTwitter`` class below for an example. """ def __init__(self, request, consumer_key, secret_key, request_token_url): self.request = request self.consumer_key = consumer_key self.secret_key = secret_key self.request_token_url = request_token_url def _get_at_from_session(self): """ Get the saved access token for private resources from the session. """ try: return self.request.session[ "oauth_%s_access_token" % get_token_prefix(self.request_token_url) ] except KeyError: raise OAuthError( _('No access token saved for "%s".') % get_token_prefix(self.request_token_url) ) def query(self, url, method="GET", params=None, headers=None): """ Request a API endpoint at ``url`` with ``params`` being either the POST or GET data. """ access_token = self._get_at_from_session() oauth = OAuth1( self.consumer_key, client_secret=self.secret_key, resource_owner_key=access_token["oauth_token"], resource_owner_secret=access_token["oauth_token_secret"], ) response = getattr(requests, method.lower())( url, auth=oauth, headers=headers, params=params ) if response.status_code != 200: raise OAuthError( _('No access to private resources at "%s".') % get_token_prefix(self.request_token_url) ) return response.text django-allauth-0.58.2/allauth/socialaccount/providers/oauth/provider.py000066400000000000000000000022531452212273200263240ustar00rootroot00000000000000from urllib.parse import parse_qsl from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.providers.base import Provider class OAuthProvider(Provider): def get_login_url(self, request, **kwargs): url = reverse(self.id + "_login") if kwargs: url = url + "?" + urlencode(kwargs) return url def get_auth_params(self, request, action): settings = self.get_settings() ret = dict(settings.get("AUTH_PARAMS", {})) dynamic_auth_params = request.GET.get("auth_params", None) if dynamic_auth_params: ret.update(dict(parse_qsl(dynamic_auth_params))) return ret def get_auth_url(self, request, action): # TODO: This is ugly. Move authorization_url away from the # adapter into the provider. Hmpf, the line between # adapter/provider is a bit too thin here. return None def get_scope(self, request): settings = self.get_settings() scope = settings.get("SCOPE") if scope is None: scope = self.get_default_scope() return scope def get_default_scope(self): return [] django-allauth-0.58.2/allauth/socialaccount/providers/oauth/urls.py000066400000000000000000000010171452212273200254540ustar00rootroot00000000000000from django.urls import include, path from allauth.utils import import_attribute def default_urlpatterns(provider): login_view = import_attribute(provider.get_package() + ".views.oauth_login") callback_view = import_attribute(provider.get_package() + ".views.oauth_callback") urlpatterns = [ path("login/", login_view, name=provider.id + "_login"), path("login/callback/", callback_view, name=provider.id + "_callback"), ] return [path(provider.get_slug() + "/", include(urlpatterns))] django-allauth-0.58.2/allauth/socialaccount/providers/oauth/views.py000066400000000000000000000103441452212273200256270ustar00rootroot00000000000000import logging from django.urls import reverse from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.helpers import ( complete_social_login, render_authentication_error, ) from allauth.socialaccount.models import SocialLogin, SocialToken from allauth.socialaccount.providers.base.constants import ( AuthAction, AuthError, ) from allauth.socialaccount.providers.base.mixins import OAuthLoginMixin from allauth.socialaccount.providers.oauth.client import ( OAuthClient, OAuthError, ) logger = logging.getLogger(__name__) class OAuthAdapter(object): def __init__(self, request): self.request = request def complete_login(self, request, app): """ Returns a SocialLogin instance """ raise NotImplementedError def get_provider(self): adapter = get_adapter(self.request) app = adapter.get_app(self.request, provider=self.provider_id) return app.get_provider(self.request) class OAuthView(object): @classmethod def adapter_view(cls, adapter): def view(request, *args, **kwargs): self = cls() self.request = request self.adapter = adapter(request) return self.dispatch(request, *args, **kwargs) return view def _get_client(self, request, callback_url): provider = self.adapter.get_provider() app = provider.app scope = " ".join(provider.get_scope(request)) parameters = {} if scope: parameters["scope"] = scope client = OAuthClient( request, app.client_id, app.secret, self.adapter.request_token_url, self.adapter.access_token_url, callback_url, parameters=parameters, provider=provider, ) return client class OAuthLoginView(OAuthLoginMixin, OAuthView): def login(self, request, *args, **kwargs): callback_url = reverse(self.adapter.provider_id + "_callback") SocialLogin.stash_state(request) action = request.GET.get("action", AuthAction.AUTHENTICATE) provider = self.adapter.get_provider() auth_url = provider.get_auth_url(request, action) or self.adapter.authorize_url auth_params = provider.get_auth_params(request, action) client = self._get_client(request, callback_url) try: return client.get_redirect(auth_url, auth_params) except OAuthError as e: logger.error("OAuth authentication error", exc_info=True) return render_authentication_error( request, self.adapter.provider_id, exception=e ) class OAuthCallbackView(OAuthView): def dispatch(self, request): """ View to handle final steps of OAuth based authentication where the user gets redirected back to from the service provider """ login_done_url = reverse(self.adapter.provider_id + "_callback") client = self._get_client(request, login_done_url) if not client.is_valid(): if "denied" in request.GET: error = AuthError.CANCELLED else: error = AuthError.UNKNOWN extra_context = dict(oauth_client=client) return render_authentication_error( request, self.adapter.provider_id, error=error, extra_context=extra_context, ) app = self.adapter.get_provider().app try: access_token = client.get_access_token() token = SocialToken( app=app, token=access_token["oauth_token"], # .get() -- e.g. Evernote does not feature a secret token_secret=access_token.get("oauth_token_secret", ""), ) login = self.adapter.complete_login( request, app, token, response=access_token ) login.token = token login.state = SocialLogin.unstash_state(request) return complete_social_login(request, login) except OAuthError as e: return render_authentication_error( request, self.adapter.provider_id, exception=e ) django-allauth-0.58.2/allauth/socialaccount/providers/oauth2/000077500000000000000000000000001452212273200242005ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/oauth2/__init__.py000066400000000000000000000000001452212273200262770ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/oauth2/client.py000066400000000000000000000062131452212273200260320ustar00rootroot00000000000000import requests from urllib.parse import parse_qsl from django.utils.http import urlencode class OAuth2Error(Exception): pass class OAuth2Client(object): def __init__( self, request, consumer_key, consumer_secret, access_token_method, access_token_url, callback_url, scope, scope_delimiter=" ", headers=None, basic_auth=False, ): self.request = request self.access_token_method = access_token_method self.access_token_url = access_token_url self.callback_url = callback_url self.consumer_key = consumer_key self.consumer_secret = consumer_secret self.scope = scope_delimiter.join(set(scope)) self.state = None self.headers = headers self.basic_auth = basic_auth def get_redirect_url(self, authorization_url, extra_params): params = { "client_id": self.consumer_key, "redirect_uri": self.callback_url, "scope": self.scope, "response_type": "code", } if self.state: params["state"] = self.state params.update(extra_params) return "%s?%s" % (authorization_url, urlencode(params)) def get_access_token(self, code, pkce_code_verifier=None): data = { "redirect_uri": self.callback_url, "grant_type": "authorization_code", "code": code, } if self.basic_auth: auth = requests.auth.HTTPBasicAuth(self.consumer_key, self.consumer_secret) else: auth = None data.update( { "client_id": self.consumer_key, "client_secret": self.consumer_secret, } ) params = None self._strip_empty_keys(data) url = self.access_token_url if self.access_token_method == "GET": params = data data = None if data and pkce_code_verifier: data["code_verifier"] = pkce_code_verifier # TODO: Proper exception handling resp = requests.request( self.access_token_method, url, params=params, data=data, headers=self.headers, auth=auth, ) access_token = None if resp.status_code in [200, 201]: # Weibo sends json via 'text/plain;charset=UTF-8' if ( resp.headers["content-type"].split(";")[0] == "application/json" or resp.text[:2] == '{"' ): access_token = resp.json() else: access_token = dict(parse_qsl(resp.text)) if not access_token or "access_token" not in access_token: raise OAuth2Error("Error retrieving access token: %s" % resp.content) return access_token def _strip_empty_keys(self, params): """Added because the Dropbox OAuth2 flow doesn't work when scope is passed in, which is empty. """ keys = [k for k, v in params.items() if v == ""] for key in keys: del params[key] django-allauth-0.58.2/allauth/socialaccount/providers/oauth2/provider.py000066400000000000000000000026621452212273200264120ustar00rootroot00000000000000from urllib.parse import parse_qsl from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.providers.base import Provider from .utils import generate_code_challenge class OAuth2Provider(Provider): pkce_enabled_default = False def get_login_url(self, request, **kwargs): url = reverse(self.id + "_login") if kwargs: url = url + "?" + urlencode(kwargs) return url def get_callback_url(self): return reverse(self.id + "_callback") def get_pkce_params(self): settings = self.get_settings() if settings.get("OAUTH_PKCE_ENABLED", self.pkce_enabled_default): pkce_code_params = generate_code_challenge() return pkce_code_params return {} def get_auth_params(self, request, action): settings = self.get_settings() ret = dict(settings.get("AUTH_PARAMS", {})) dynamic_auth_params = request.GET.get("auth_params", None) if dynamic_auth_params: ret.update(dict(parse_qsl(dynamic_auth_params))) return ret def get_scope(self, request): settings = self.get_settings() scope = list(settings.get("SCOPE", self.get_default_scope())) dynamic_scope = request.GET.get("scope", None) if dynamic_scope: scope.extend(dynamic_scope.split(",")) return scope def get_default_scope(self): return [] django-allauth-0.58.2/allauth/socialaccount/providers/oauth2/urls.py000066400000000000000000000010211452212273200255310ustar00rootroot00000000000000from django.urls import include, path from allauth.utils import import_attribute def default_urlpatterns(provider): login_view = import_attribute(provider.get_package() + ".views.oauth2_login") callback_view = import_attribute(provider.get_package() + ".views.oauth2_callback") urlpatterns = [ path("login/", login_view, name=provider.id + "_login"), path("login/callback/", callback_view, name=provider.id + "_callback"), ] return [path(provider.get_slug() + "/", include(urlpatterns))] django-allauth-0.58.2/allauth/socialaccount/providers/oauth2/utils.py000066400000000000000000000010561452212273200257140ustar00rootroot00000000000000import base64 import hashlib from secrets import token_urlsafe def generate_code_challenge(): # Create a code verifier with a length of 128 characters code_verifier = token_urlsafe(96) hashed_verifier = hashlib.sha256(code_verifier.encode("ascii")) code_challenge = base64.urlsafe_b64encode(hashed_verifier.digest()) code_challenge_without_padding = code_challenge.rstrip(b"=") return { "code_verifier": code_verifier, "code_challenge_method": "S256", "code_challenge": code_challenge_without_padding, } django-allauth-0.58.2/allauth/socialaccount/providers/oauth2/views.py000066400000000000000000000137531452212273200257200ustar00rootroot00000000000000from datetime import timedelta from requests import RequestException from django.core.exceptions import PermissionDenied from django.http import HttpResponseRedirect from django.urls import reverse from django.utils import timezone from allauth.core.exceptions import ImmediateHttpResponse from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.helpers import ( complete_social_login, render_authentication_error, ) from allauth.socialaccount.models import SocialLogin, SocialToken from allauth.socialaccount.providers.base import ProviderException from allauth.socialaccount.providers.base.constants import ( AuthAction, AuthError, ) from allauth.socialaccount.providers.base.mixins import OAuthLoginMixin from allauth.socialaccount.providers.oauth2.client import ( OAuth2Client, OAuth2Error, ) from allauth.utils import build_absolute_uri, get_request_param class OAuth2Adapter(object): expires_in_key = "expires_in" client_class = OAuth2Client supports_state = True redirect_uri_protocol = None access_token_method = "POST" login_cancelled_error = "access_denied" scope_delimiter = " " basic_auth = False headers = None def __init__(self, request): self.request = request def get_provider(self): return get_adapter(self.request).get_provider( self.request, provider=self.provider_id ) def complete_login(self, request, app, access_token, **kwargs): """ Returns a SocialLogin instance """ raise NotImplementedError def get_callback_url(self, request, app): callback_url = reverse(self.provider_id + "_callback") protocol = self.redirect_uri_protocol return build_absolute_uri(request, callback_url, protocol) def parse_token(self, data): token = SocialToken(token=data["access_token"]) token.token_secret = data.get("refresh_token", "") expires_in = data.get(self.expires_in_key, None) if expires_in: token.expires_at = timezone.now() + timedelta(seconds=int(expires_in)) return token def get_access_token_data(self, request, app, client): code = get_request_param(self.request, "code") pkce_code_verifier = request.session.pop("pkce_code_verifier", None) return client.get_access_token(code, pkce_code_verifier=pkce_code_verifier) class OAuth2View(object): @classmethod def adapter_view(cls, adapter): def view(request, *args, **kwargs): self = cls() self.request = request if not isinstance(adapter, OAuth2Adapter): self.adapter = adapter(request) else: self.adapter = adapter try: return self.dispatch(request, *args, **kwargs) except ImmediateHttpResponse as e: return e.response return view def get_client(self, request, app): callback_url = self.adapter.get_callback_url(request, app) provider = self.adapter.get_provider() scope = provider.get_scope(request) client = self.adapter.client_class( self.request, app.client_id, app.secret, self.adapter.access_token_method, self.adapter.access_token_url, callback_url, scope, scope_delimiter=self.adapter.scope_delimiter, headers=self.adapter.headers, basic_auth=self.adapter.basic_auth, ) return client class OAuth2LoginView(OAuthLoginMixin, OAuth2View): def login(self, request, *args, **kwargs): provider = self.adapter.get_provider() app = provider.app client = self.get_client(request, app) action = request.GET.get("action", AuthAction.AUTHENTICATE) auth_url = self.adapter.authorize_url auth_params = provider.get_auth_params(request, action) pkce_params = provider.get_pkce_params() code_verifier = pkce_params.pop("code_verifier", None) auth_params.update(pkce_params) if code_verifier: request.session["pkce_code_verifier"] = code_verifier client.state = SocialLogin.stash_state(request) try: return HttpResponseRedirect(client.get_redirect_url(auth_url, auth_params)) except OAuth2Error as e: return render_authentication_error(request, provider.id, exception=e) class OAuth2CallbackView(OAuth2View): def dispatch(self, request, *args, **kwargs): if "error" in request.GET or "code" not in request.GET: # Distinguish cancel from error auth_error = request.GET.get("error", None) if auth_error == self.adapter.login_cancelled_error: error = AuthError.CANCELLED else: error = AuthError.UNKNOWN return render_authentication_error( request, self.adapter.provider_id, error=error ) app = self.adapter.get_provider().app client = self.get_client(self.request, app) try: access_token = self.adapter.get_access_token_data(request, app, client) token = self.adapter.parse_token(access_token) if app.pk: token.app = app login = self.adapter.complete_login( request, app, token, response=access_token ) login.token = token if self.adapter.supports_state: login.state = SocialLogin.verify_and_unstash_state( request, get_request_param(request, "state") ) else: login.state = SocialLogin.unstash_state(request) return complete_social_login(request, login) except ( PermissionDenied, OAuth2Error, RequestException, ProviderException, ) as e: return render_authentication_error( request, self.adapter.provider_id, exception=e ) django-allauth-0.58.2/allauth/socialaccount/providers/odnoklassniki/000077500000000000000000000000001452212273200256465ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/odnoklassniki/__init__.py000066400000000000000000000000001452212273200277450ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/odnoklassniki/provider.py000066400000000000000000000024771452212273200300640ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class OdnoklassnikiAccount(ProviderAccount): def get_profile_url(self): return "https://ok.ru/profile/" + self.account.extra_data["uid"] def get_avatar_url(self): ret = None pic_big_url = self.account.extra_data.get("pic1024x768") pic_medium_url = self.account.extra_data.get("pic640x480") pic_small_url = self.account.extra_data.get("pic190x190") if pic_big_url: return pic_big_url elif pic_medium_url: return pic_medium_url elif pic_small_url: return pic_small_url else: return ret def to_str(self): dflt = super(OdnoklassnikiAccount, self).to_str() return self.account.extra_data.get("name", dflt) class OdnoklassnikiProvider(OAuth2Provider): id = "odnoklassniki" name = "Odnoklassniki" account_class = OdnoklassnikiAccount def extract_uid(self, data): return data["uid"] def extract_common_fields(self, data): return dict( last_name=data.get("last_name"), first_name=data.get("first_name"), email=data.get("email"), ) provider_classes = [OdnoklassnikiProvider] django-allauth-0.58.2/allauth/socialaccount/providers/odnoklassniki/tests.py000066400000000000000000000015751452212273200273720ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import OdnoklassnikiProvider class OdnoklassnikiTests(OAuth2TestsMixin, TestCase): provider_id = OdnoklassnikiProvider.id def get_mocked_response(self, verified_email=True): return MockedResponse( 200, """ {"uid":"561999209121","birthday":"1999-09-09","age":33,"first_name":"Ivan", "last_name":"Petrov","name":"Ivan Petrov","locale":"en","gender":"male", "has_email":true,"location":{"city":"Moscow","country":"RUSSIAN_FEDERATION", "countryCode":"RU","countryName":"Russia"},"online":"web","pic_1": "http://i500.mycdn.me/res/stub_50x50.gif", "pic_2":"http://usd1.mycdn.me/res/stub_128x96.gif"} """, ) def get_login_response_json(self, with_refresh_token=True): return '{"access_token": "testac"}' # noqa django-allauth-0.58.2/allauth/socialaccount/providers/odnoklassniki/urls.py000066400000000000000000000002641452212273200272070ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import OdnoklassnikiProvider urlpatterns = default_urlpatterns(OdnoklassnikiProvider) django-allauth-0.58.2/allauth/socialaccount/providers/odnoklassniki/views.py000066400000000000000000000035761452212273200273700ustar00rootroot00000000000000import requests from hashlib import md5 from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import OdnoklassnikiProvider USER_FIELDS = [ "age", "birthday", "current_status", "current_status_date", "current_status_id", "email", "first_name", "gender", "has_email", "last_name", "locale", "location", "name", "online", "photo_id", "pic1024x768", # big "pic190x190", # small "pic640x480", # medium "pic_1", # aka pic50x50 "pic_2", # aka pic128max "uid", ] class OdnoklassnikiOAuth2Adapter(OAuth2Adapter): provider_id = OdnoklassnikiProvider.id access_token_url = "https://api.odnoklassniki.ru/oauth/token.do" authorize_url = "https://www.odnoklassniki.ru/oauth/authorize" profile_url = "https://api.odnoklassniki.ru/fb.do" access_token_method = "POST" def complete_login(self, request, app, token, **kwargs): data = { "method": "users.getCurrentUser", "access_token": token.token, "fields": ",".join(USER_FIELDS), "format": "JSON", "application_key": app.key, } suffix = md5( "{0:s}{1:s}".format(data["access_token"], app.secret).encode("utf-8") ).hexdigest() check_list = sorted( ["{0:s}={1:s}".format(k, v) for k, v in data.items() if k != "access_token"] ) data["sig"] = md5(("".join(check_list) + suffix).encode("utf-8")).hexdigest() response = requests.get(self.profile_url, params=data) extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(OdnoklassnikiOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(OdnoklassnikiOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/okta/000077500000000000000000000000001452212273200237345ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/okta/__init__.py000066400000000000000000000000001452212273200260330ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/okta/provider.py000066400000000000000000000021521452212273200261400ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class OktaAccount(ProviderAccount): def to_str(self): dflt = super(OktaAccount, self).to_str() return self.account.extra_data.get("name", dflt) class OktaProvider(OAuth2Provider): id = "okta" name = "Okta" account_class = OktaAccount def get_default_scope(self): return ["openid", "profile", "email", "offline_access"] def extract_uid(self, data): return str(data["preferred_username"]) def extract_extra_data(self, data): return data def extract_email_addresses(self, data): return [ EmailAddress( email=data["email"], verified=bool(data["email_verified"]), primary=True ) ] def extract_common_fields(self, data): return dict( email=data["email"], last_name=data["family_name"], first_name=data["given_name"], ) provider_classes = [OktaProvider] django-allauth-0.58.2/allauth/socialaccount/providers/okta/tests.py000066400000000000000000000015211452212273200254470ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import OktaProvider class OktaTests(OAuth2TestsMixin, TestCase): provider_id = OktaProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "sub": "00u33ow83pjQpCQJr1j8", "name": "Jon Smith", "locale": "AE", "email": "jsmith@example.com", "nickname": "Jon Smith", "preferred_username": "jsmith@example.com", "given_name": "Jon", "family_name": "Smith", "zoneinfo": "America/Los_Angeles", "updated_at": 1601285210, "email_verified": true } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/okta/urls.py000066400000000000000000000002421452212273200252710ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import OktaProvider urlpatterns = default_urlpatterns(OktaProvider) django-allauth-0.58.2/allauth/socialaccount/providers/okta/views.py000066400000000000000000000031051452212273200254420ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import OktaProvider class OktaOAuth2Adapter(OAuth2Adapter): provider_id = OktaProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) okta_base_url = settings.get("OKTA_BASE_URL") @property def access_token_url(self): return "https://{}/oauth2/v1/token".format(self.okta_base_url) @property def authorize_url(self): return "https://{}/oauth2/v1/authorize".format(self.okta_base_url) @property def userinfo_url(self): return "https://{}/oauth2/v1/userinfo".format(self.okta_base_url) @property def access_token_method(self): return "POST" def complete_login(self, request, app, token, **kwargs): """ Get the user info from userinfo endpoint and return a A populated instance of the `SocialLogin` model (unsaved) :param request: :param app: :param token: :param kwargs: :return: """ resp = requests.get( self.userinfo_url, headers={"Authorization": "Bearer {}".format(token.token)}, ) resp.raise_for_status() extra_data = resp.json() login = self.get_provider().sociallogin_from_response(request, extra_data) return login oauth2_login = OAuth2LoginView.adapter_view(OktaOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(OktaOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/openid/000077500000000000000000000000001452212273200242545ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/openid/__init__.py000066400000000000000000000000001452212273200263530ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/openid/admin.py000066400000000000000000000004411452212273200257150ustar00rootroot00000000000000from django.contrib import admin from .models import OpenIDNonce, OpenIDStore class OpenIDStoreAdmin(admin.ModelAdmin): pass class OpenIDNonceAdmin(admin.ModelAdmin): pass admin.site.register(OpenIDStore, OpenIDStoreAdmin) admin.site.register(OpenIDNonce, OpenIDNonceAdmin) django-allauth-0.58.2/allauth/socialaccount/providers/openid/forms.py000066400000000000000000000006331452212273200257560ustar00rootroot00000000000000from django import forms from django.utils.html import mark_safe class LoginForm(forms.Form): openid = forms.URLField( label=("OpenID"), help_text=mark_safe( 'Get an OpenID' ), ) next = forms.CharField(widget=forms.HiddenInput, required=False) process = forms.CharField(widget=forms.HiddenInput, required=False) django-allauth-0.58.2/allauth/socialaccount/providers/openid/migrations/000077500000000000000000000000001452212273200264305ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/openid/migrations/0001_initial.py000066400000000000000000000032541452212273200310770ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [] operations = [ migrations.CreateModel( name="OpenIDNonce", fields=[ ( "id", models.AutoField( verbose_name="ID", serialize=False, auto_created=True, primary_key=True, ), ), ("server_url", models.CharField(max_length=255)), ("timestamp", models.IntegerField()), ("salt", models.CharField(max_length=255)), ("date_created", models.DateTimeField(auto_now_add=True)), ], options={}, bases=(models.Model,), ), migrations.CreateModel( name="OpenIDStore", fields=[ ( "id", models.AutoField( verbose_name="ID", serialize=False, auto_created=True, primary_key=True, ), ), ("server_url", models.CharField(max_length=255)), ("handle", models.CharField(max_length=255)), ("secret", models.TextField()), ("issued", models.IntegerField()), ("lifetime", models.IntegerField()), ("assoc_type", models.TextField()), ], options={}, bases=(models.Model,), ), ] django-allauth-0.58.2/allauth/socialaccount/providers/openid/migrations/__init__.py000066400000000000000000000000001452212273200305270ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/openid/models.py000066400000000000000000000011741452212273200261140ustar00rootroot00000000000000from django.db import models class OpenIDStore(models.Model): server_url = models.CharField(max_length=255) handle = models.CharField(max_length=255) secret = models.TextField() issued = models.IntegerField() lifetime = models.IntegerField() assoc_type = models.TextField() def __str__(self): return self.server_url class OpenIDNonce(models.Model): server_url = models.CharField(max_length=255) timestamp = models.IntegerField() salt = models.CharField(max_length=255) date_created = models.DateTimeField(auto_now_add=True) def __str__(self): return self.server_url django-allauth-0.58.2/allauth/socialaccount/providers/openid/provider.py000066400000000000000000000066151452212273200264700ustar00rootroot00000000000000from urllib.parse import urlparse from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.providers.base import Provider, ProviderAccount from .utils import ( AXAttribute, OldAXAttribute, SRegField, get_email_from_response, get_value_from_response, ) class OpenIDAccount(ProviderAccount): def get_brand(self): ret = super(OpenIDAccount, self).get_brand() domain = urlparse(self.account.uid).netloc # FIXME: Instead of hardcoding, derive this from the domains # listed in the openid endpoints setting. provider_map = { "yahoo": dict(id="yahoo", name="Yahoo"), "hyves": dict(id="hyves", name="Hyves"), "google": dict(id="google", name="Google"), } for d, p in provider_map.items(): if domain.lower().find(d) >= 0: ret = p break return ret def to_str(self): return self.account.uid class OpenIDProvider(Provider): id = "openid" name = "OpenID" account_class = OpenIDAccount uses_apps = False def get_login_url(self, request, **kwargs): url = reverse("openid_login") if kwargs: url += "?" + urlencode(kwargs) return url def get_brands(self): # These defaults are a bit too arbitrary... default_servers = [ dict(id="yahoo", name="Yahoo", openid_url="http://me.yahoo.com"), dict(id="hyves", name="Hyves", openid_url="http://hyves.nl"), ] return self.get_settings().get("SERVERS", default_servers) def get_server_settings(self, endpoint): servers = self.get_settings().get("SERVERS", []) for server in servers: if endpoint is not None and endpoint.startswith(server.get("openid_url")): return server return {} def extract_extra_data(self, response): extra_data = {} server_settings = self.get_server_settings(response.endpoint.server_url) extra_attributes = server_settings.get("extra_attributes", []) for attribute_id, name, _ in extra_attributes: extra_data[attribute_id] = get_value_from_response( response, ax_names=[name] ) return extra_data def extract_uid(self, response): return response.identity_url def extract_common_fields(self, response): first_name = ( get_value_from_response( response, ax_names=[ AXAttribute.PERSON_FIRST_NAME, OldAXAttribute.PERSON_FIRST_NAME, ], ) or "" ) last_name = ( get_value_from_response( response, ax_names=[ AXAttribute.PERSON_LAST_NAME, OldAXAttribute.PERSON_LAST_NAME, ], ) or "" ) name = ( get_value_from_response( response, sreg_names=[SRegField.NAME], ax_names=[AXAttribute.PERSON_NAME, OldAXAttribute.PERSON_NAME], ) or "" ) return dict( email=get_email_from_response(response), first_name=first_name, last_name=last_name, name=name, ) provider_classes = [OpenIDProvider] django-allauth-0.58.2/allauth/socialaccount/providers/openid/tests.py000066400000000000000000000123641452212273200257760ustar00rootroot00000000000000from unittest.mock import Mock, patch from django.contrib.auth import get_user_model from django.test import override_settings from django.urls import reverse from openid.consumer import consumer from allauth.socialaccount.models import SocialAccount from allauth.tests import TestCase from . import views from .utils import AXAttribute class OpenIDTests(TestCase): def test_discovery_failure(self): """ This used to generate a server 500: DiscoveryFailure: No usable OpenID services found for http://www.google.com/ """ resp = self.client.post( reverse("openid_login"), dict(openid="http://www.google.com") ) self.assertTrue("openid" in resp.context["form"].errors) def test_login(self): # Location: https://s.yimg.com/wm/mbr/html/openid-eol-0.0.1.html resp = self.client.post( reverse(views.login), dict(openid="https://steamcommunity.com/openid") ) assert "steamcommunity.com/openid/login" in resp["location"] with patch( "allauth.socialaccount.providers.openid.views._openid_consumer" ) as consumer_mock: client = Mock() complete = Mock() consumer_mock.return_value = client client.complete = complete complete_response = Mock() complete.return_value = complete_response complete_response.status = consumer.SUCCESS complete_response.identity_url = "http://dummy/john/" with patch( "allauth.socialaccount.providers.openid.utils.SRegResponse" ) as sr_mock: with patch( "allauth.socialaccount.providers.openid.utils.FetchResponse" ) as fr_mock: sreg_mock = Mock() ax_mock = Mock() sr_mock.fromSuccessResponse = sreg_mock fr_mock.fromSuccessResponse = ax_mock sreg_mock.return_value = {} ax_mock.return_value = {AXAttribute.PERSON_FIRST_NAME: ["raymond"]} resp = self.client.post(reverse("openid_callback")) self.assertRedirects( resp, "/accounts/profile/", fetch_redirect_response=False, ) get_user_model().objects.get(first_name="raymond") @override_settings( SOCIALACCOUNT_PROVIDERS={ "openid": { "SERVERS": [ dict( id="yahoo", name="Yahoo", openid_url="http://me.yahoo.com", extra_attributes=[ ( "phone", "http://axschema.org/contact/phone/default", True, ) ], ) ] } } ) def test_login_with_extra_attributes(self): with patch("allauth.socialaccount.providers.openid.views.QUERY_EMAIL", True): resp = self.client.post( reverse(views.login), dict(openid="https://steamcommunity.com/openid") ) assert "steamcommunity.com/openid/login" in resp["location"] with patch( "allauth.socialaccount.providers.openid.views._openid_consumer" ) as consumer_mock: client = Mock() complete = Mock() endpoint = Mock() consumer_mock.return_value = client client.complete = complete complete_response = Mock() complete.return_value = complete_response complete_response.endpoint = endpoint complete_response.endpoint.server_url = "http://me.yahoo.com" complete_response.status = consumer.SUCCESS complete_response.identity_url = "http://dummy/john/" with patch( "allauth.socialaccount.providers.openid.utils.SRegResponse" ) as sr_mock: with patch( "allauth.socialaccount.providers.openid.utils.FetchResponse" ) as fr_mock: sreg_mock = Mock() ax_mock = Mock() sr_mock.fromSuccessResponse = sreg_mock fr_mock.fromSuccessResponse = ax_mock sreg_mock.return_value = {} ax_mock.return_value = { AXAttribute.CONTACT_EMAIL: ["raymond@example.com"], AXAttribute.PERSON_FIRST_NAME: ["raymond"], "http://axschema.org/contact/phone/default": ["123456789"], } resp = self.client.post(reverse("openid_callback")) self.assertRedirects( resp, "/accounts/profile/", fetch_redirect_response=False, ) socialaccount = SocialAccount.objects.get( user__first_name="raymond" ) self.assertEqual(socialaccount.extra_data.get("phone"), "123456789") django-allauth-0.58.2/allauth/socialaccount/providers/openid/urls.py000066400000000000000000000003111452212273200256060ustar00rootroot00000000000000from django.urls import path from . import views urlpatterns = [ path("openid/login/", views.login, name="openid_login"), path("openid/callback/", views.callback, name="openid_callback"), ] django-allauth-0.58.2/allauth/socialaccount/providers/openid/utils.py000066400000000000000000000124401452212273200257670ustar00rootroot00000000000000import base64 import pickle from collections import UserDict from openid.association import Association as OIDAssociation from openid.extensions.ax import FetchResponse from openid.extensions.sreg import SRegResponse from openid.store.interface import OpenIDStore as OIDStore from allauth.utils import valid_email_or_none from .models import OpenIDNonce, OpenIDStore class JSONSafeSession(UserDict): """ openid puts e.g. class OpenIDServiceEndpoint in the session. Django 1.6 no longer pickles stuff, so we'll need to do some hacking here... """ def __init__(self, session): UserDict.__init__(self) self.data = session def __setitem__(self, key, value): data = base64.b64encode(pickle.dumps(value)).decode("ascii") return UserDict.__setitem__(self, key, data) def __getitem__(self, key): data = UserDict.__getitem__(self, key) return pickle.loads(base64.b64decode(data.encode("ascii"))) class OldAXAttribute: PERSON_NAME = "http://openid.net/schema/namePerson" PERSON_FIRST_NAME = "http://openid.net/schema/namePerson/first" PERSON_LAST_NAME = "http://openid.net/schema/namePerson/last" class AXAttribute: CONTACT_EMAIL = "http://axschema.org/contact/email" PERSON_NAME = "http://axschema.org/namePerson" PERSON_FIRST_NAME = "http://axschema.org/namePerson/first" PERSON_LAST_NAME = "http://axschema.org/namePerson/last" AXAttributes = [ AXAttribute.CONTACT_EMAIL, AXAttribute.PERSON_NAME, AXAttribute.PERSON_FIRST_NAME, AXAttribute.PERSON_LAST_NAME, OldAXAttribute.PERSON_NAME, OldAXAttribute.PERSON_FIRST_NAME, OldAXAttribute.PERSON_LAST_NAME, ] class SRegField: EMAIL = "email" NAME = "fullname" SRegFields = [ SRegField.EMAIL, SRegField.NAME, ] class DBOpenIDStore(OIDStore): max_nonce_age = 6 * 60 * 60 def storeAssociation(self, server_url, assoc=None): try: secret = base64.encodebytes(assoc.secret) except AttributeError: # Python 2.x compat secret = base64.encodestring(assoc.secret) else: secret = secret.decode() OpenIDStore.objects.create( server_url=server_url, handle=assoc.handle, secret=secret, issued=assoc.issued, lifetime=assoc.lifetime, assoc_type=assoc.assoc_type, ) def getAssociation(self, server_url, handle=None): stored_assocs = OpenIDStore.objects.filter(server_url=server_url) if handle: stored_assocs = stored_assocs.filter(handle=handle) stored_assocs.order_by("-issued") if not stored_assocs.exists(): return None return_val = None for stored_assoc in stored_assocs: assoc = OIDAssociation( stored_assoc.handle, base64.decodebytes(stored_assoc.secret.encode("utf-8")), stored_assoc.issued, stored_assoc.lifetime, stored_assoc.assoc_type, ) # See: # necaris/python3-openid@1abb155c8fc7b508241cbe9d2cae24f18e4a379b if hasattr(assoc, "getExpiresIn"): expires_in = assoc.getExpiresIn() else: expires_in = assoc.expiresIn if expires_in == 0: stored_assoc.delete() else: if return_val is None: return_val = assoc return return_val def removeAssociation(self, server_url, handle): stored_assocs = OpenIDStore.objects.filter(server_url=server_url) if handle: stored_assocs = stored_assocs.filter(handle=handle) stored_assocs.delete() def useNonce(self, server_url, timestamp, salt): try: OpenIDNonce.objects.get( server_url=server_url, timestamp=timestamp, salt=salt ) except OpenIDNonce.DoesNotExist: OpenIDNonce.objects.create( server_url=server_url, timestamp=timestamp, salt=salt ) return True return False def get_email_from_response(response): email = None sreg = SRegResponse.fromSuccessResponse(response) if sreg: email = valid_email_or_none(sreg.get(SRegField.EMAIL)) if not email: ax = FetchResponse.fromSuccessResponse(response) if ax: try: values = ax.get(AXAttribute.CONTACT_EMAIL) if values: email = valid_email_or_none(values[0]) except KeyError: pass return email def get_value_from_response(response, sreg_names=None, ax_names=None): value = None if sreg_names: sreg = SRegResponse.fromSuccessResponse(response) if sreg: for name in sreg_names: value = sreg.get(name) if value: break if not value and ax_names: ax = FetchResponse.fromSuccessResponse(response) if ax: for name in ax_names: try: values = ax.get(name) if values: value = values[0] except KeyError: pass if value: break return value django-allauth-0.58.2/allauth/socialaccount/providers/openid/views.py000066400000000000000000000130611452212273200257640ustar00rootroot00000000000000from django.http import HttpResponseRedirect from django.shortcuts import render from django.urls import reverse from django.views import View from django.views.decorators.csrf import csrf_exempt from openid.consumer import consumer from openid.consumer.discover import DiscoveryFailure from openid.extensions.ax import AttrInfo, FetchRequest from openid.extensions.sreg import SRegRequest from allauth.socialaccount.app_settings import QUERY_EMAIL from allauth.socialaccount.helpers import ( complete_social_login, render_authentication_error, ) from allauth.socialaccount.models import SocialLogin from ..base import AuthError from .forms import LoginForm from .provider import OpenIDProvider from .utils import AXAttributes, DBOpenIDStore, JSONSafeSession, SRegFields def _openid_consumer(request, provider, endpoint): server_settings = provider.get_server_settings(endpoint) stateless = server_settings.get("stateless", False) store = None if stateless else DBOpenIDStore() client = consumer.Consumer(JSONSafeSession(request.session), store) return client class OpenIDLoginView(View): template_name = "openid/login.html" form_class = LoginForm provider = OpenIDProvider def get(self, request): form = self.get_form() if not form.is_valid(): return render(request, self.template_name, {"form": form}) try: return self.perform_openid_auth(form) except (UnicodeDecodeError, DiscoveryFailure) as e: # UnicodeDecodeError: necaris/python3-openid#1 return render_authentication_error(request, self.provider.id, exception=e) def post(self, request): form = self.get_form() if form.is_valid(): try: return self.perform_openid_auth(form) except (UnicodeDecodeError, DiscoveryFailure) as e: form._errors["openid"] = form.error_class([e]) return render(request, self.template_name, {"form": form}) def get_form(self): if self.request.method == "GET" and "openid" not in self.request.GET: return self.form_class( initial={ "next": self.request.GET.get("next"), "process": self.request.GET.get("process"), } ) return self.form_class( dict(list(self.request.GET.items()) + list(self.request.POST.items())) ) def get_client(self, provider, endpoint): return _openid_consumer(self.request, provider, endpoint) def get_realm(self, provider): return provider.get_settings().get( "REALM", self.request.build_absolute_uri("/") ) def get_callback_url(self): return reverse(callback) def perform_openid_auth(self, form): if not form.is_valid(): return form request = self.request provider = self.provider(request) endpoint = form.cleaned_data["openid"] client = self.get_client(provider, endpoint) realm = self.get_realm(provider) auth_request = client.begin(endpoint) if QUERY_EMAIL: sreg = SRegRequest() for name in SRegFields: sreg.requestField(field_name=name, required=True) auth_request.addExtension(sreg) ax = FetchRequest() for name in AXAttributes: ax.add(AttrInfo(name, required=True)) provider = OpenIDProvider(request) server_settings = provider.get_server_settings(request.GET.get("openid")) extra_attributes = server_settings.get("extra_attributes", []) for _, name, required in extra_attributes: ax.add(AttrInfo(name, required=required)) auth_request.addExtension(ax) SocialLogin.stash_state(request) # Fix for issues 1523 and 2072 (github django-allauth) if "next" in form.cleaned_data and form.cleaned_data["next"]: auth_request.return_to_args["next"] = form.cleaned_data["next"] redirect_url = auth_request.redirectURL( realm, request.build_absolute_uri(self.get_callback_url()) ) return HttpResponseRedirect(redirect_url) login = OpenIDLoginView.as_view() class OpenIDCallbackView(View): provider = OpenIDProvider def get(self, request): provider = self.provider(request) endpoint = request.GET.get("openid.op_endpoint", "") client = self.get_client(provider, endpoint) response = self.get_openid_response(client) if response.status == consumer.SUCCESS: login = provider.sociallogin_from_response(request, response) login.state = SocialLogin.unstash_state(request) return self.complete_login(login) else: if response.status == consumer.CANCEL: error = AuthError.CANCELLED else: error = AuthError.UNKNOWN return self.render_error(error) post = get def complete_login(self, login): return complete_social_login(self.request, login) def render_error(self, error): return render_authentication_error(self.request, self.provider.id, error=error) def get_client(self, provider, endpoint): return _openid_consumer(self.request, provider, endpoint) def get_openid_response(self, client): return client.complete( dict(list(self.request.GET.items()) + list(self.request.POST.items())), self.request.build_absolute_uri(self.request.path), ) callback = csrf_exempt(OpenIDCallbackView.as_view()) django-allauth-0.58.2/allauth/socialaccount/providers/openid_connect/000077500000000000000000000000001452212273200257655ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/openid_connect/__init__.py000066400000000000000000000000001452212273200300640ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/openid_connect/provider.py000066400000000000000000000045661452212273200302040ustar00rootroot00000000000000from django.urls import reverse from django.utils.http import urlencode from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class OpenIDConnectProviderAccount(ProviderAccount): def to_str(self): dflt = super(OpenIDConnectProviderAccount, self).to_str() return self.account.extra_data.get("name", dflt) class OpenIDConnectProvider(OAuth2Provider): id = "openid_connect" name = "OpenID Connect" account_class = OpenIDConnectProviderAccount def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.name = self.app.name @property def server_url(self): url = self.app.settings["server_url"] return self.wk_server_url(url) def wk_server_url(self, url): well_known_uri = "/.well-known/openid-configuration" if not url.endswith(well_known_uri): url += well_known_uri return url def get_login_url(self, request, **kwargs): url = reverse( self.app.provider + "_login", kwargs={"provider_id": self.app.provider_id} ) if kwargs: url = url + "?" + urlencode(kwargs) return url def get_callback_url(self): return reverse( self.app.provider + "_callback", kwargs={"provider_id": self.app.provider_id}, ) @property def token_auth_method(self): return self.app.settings.get("token_auth_method") def get_default_scope(self): return ["openid", "profile", "email"] def extract_uid(self, data): return str(data["sub"]) def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("preferred_username"), name=data.get("name"), user_id=data.get("user_id"), picture=data.get("picture"), ) def extract_email_addresses(self, data): addresses = [] email = data.get("email") if email: addresses.append( EmailAddress( email=email, verified=data.get("email_verified", False), primary=True, ) ) return addresses provider_classes = [OpenIDConnectProvider] django-allauth-0.58.2/allauth/socialaccount/providers/openid_connect/tests.py000066400000000000000000000004331452212273200275010ustar00rootroot00000000000000from allauth.socialaccount.tests import OpenIDConnectTests from allauth.tests import TestCase class OpenIDConnectTests(OpenIDConnectTests, TestCase): provider_id = "unittest-server" class OtherOpenIDConnectTests(OpenIDConnectTests, TestCase): provider_id = "ther-server" django-allauth-0.58.2/allauth/socialaccount/providers/openid_connect/urls.py000066400000000000000000000010111452212273200273150ustar00rootroot00000000000000from django.urls import include, path, re_path from . import views urlpatterns = [ re_path( r"^(?P[^/]+)/", include( [ path( "login/", views.login, name="openid_connect_login", ), path( "login/callback/", views.callback, name="openid_connect_callback", ), ] ), ) ] django-allauth-0.58.2/allauth/socialaccount/providers/openid_connect/views.py000066400000000000000000000043551452212273200275030ustar00rootroot00000000000000import requests from django.urls import reverse from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from allauth.utils import build_absolute_uri class OpenIDConnectAdapter(OAuth2Adapter): supports_state = True def __init__(self, request, provider_id): self.provider_id = provider_id super().__init__(request) @property def openid_config(self): if not hasattr(self, "_openid_config"): server_url = self.get_provider().server_url resp = requests.get(server_url) resp.raise_for_status() self._openid_config = resp.json() return self._openid_config @property def basic_auth(self): token_auth_method = self.get_provider().app.settings.get("token_auth_method") if token_auth_method: return token_auth_method == "client_secret_basic" return "client_secret_basic" in self.openid_config.get( "token_endpoint_auth_methods_supported", [] ) @property def access_token_url(self): return self.openid_config["token_endpoint"] @property def authorize_url(self): return self.openid_config["authorization_endpoint"] @property def profile_url(self): return self.openid_config["userinfo_endpoint"] def complete_login(self, request, app, token, response): response = requests.get( self.profile_url, headers={"Authorization": "Bearer " + str(token)} ) response.raise_for_status() extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) def get_callback_url(self, request, app): callback_url = reverse( "openid_connect_callback", kwargs={"provider_id": self.provider_id} ) protocol = self.redirect_uri_protocol return build_absolute_uri(request, callback_url, protocol) def login(request, provider_id): view = OAuth2LoginView.adapter_view(OpenIDConnectAdapter(request, provider_id)) return view(request) def callback(request, provider_id): view = OAuth2CallbackView.adapter_view(OpenIDConnectAdapter(request, provider_id)) return view(request) django-allauth-0.58.2/allauth/socialaccount/providers/openstreetmap/000077500000000000000000000000001452212273200256645ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/openstreetmap/__init__.py000066400000000000000000000000001452212273200277630ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/openstreetmap/provider.py000066400000000000000000000016201452212273200300670ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class OpenStreetMapAccount(ProviderAccount): def get_profile_url(self): return ( "https://www.openstreetmap.org/user/" + self.account.extra_data["display_name"] ) def get_avatar_url(self): return self.account.extra_data.get("avatar") def get_username(self): return self.account.extra_data["display_name"] def to_str(self): return self.get_username() class OpenStreetMapProvider(OAuthProvider): id = "openstreetmap" name = "OpenStreetMap" account_class = OpenStreetMapAccount def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict(username=data["display_name"]) provider_classes = [OpenStreetMapProvider] django-allauth-0.58.2/allauth/socialaccount/providers/openstreetmap/tests.py000066400000000000000000000027241452212273200274050ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import OpenStreetMapProvider class OpenStreetMapTests(OAuthTestsMixin, TestCase): provider_id = OpenStreetMapProvider.id def get_mocked_response(self): return [ MockedResponse( 200, r""" """, ) ] # noqa def test_login(self): account = super(OpenStreetMapTests, self).test_login() osm_account = account.get_provider_account() self.assertEqual(osm_account.get_username(), "Steve") self.assertEqual( osm_account.get_avatar_url(), "https://secure.gravatar.com/avatar.jpg", ) self.assertEqual( osm_account.get_profile_url(), "https://www.openstreetmap.org/user/Steve", ) django-allauth-0.58.2/allauth/socialaccount/providers/openstreetmap/urls.py000066400000000000000000000002631452212273200272240ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import OpenStreetMapProvider urlpatterns = default_urlpatterns(OpenStreetMapProvider) django-allauth-0.58.2/allauth/socialaccount/providers/openstreetmap/views.py000066400000000000000000000031371452212273200273770ustar00rootroot00000000000000from xml.etree import ElementTree from xml.parsers.expat import ExpatError from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import OpenStreetMapProvider class OpenStreetMapAPI(OAuth): url = "https://api.openstreetmap.org/api/0.6/user/details" def get_user_info(self): raw_xml = self.query(self.url) try: user_element = ElementTree.fromstring(raw_xml).find("user") user_info = user_element.attrib user_avatar = user_element.find("img") if user_avatar is not None: user_info.update({"avatar": user_avatar.attrib.get("href")}) return user_info except (ExpatError, KeyError, IndexError): return None class OpenStreetMapOAuthAdapter(OAuthAdapter): provider_id = OpenStreetMapProvider.id request_token_url = "https://www.openstreetmap.org/oauth/request_token" access_token_url = "https://www.openstreetmap.org/oauth/access_token" authorize_url = "https://www.openstreetmap.org/oauth/authorize" def complete_login(self, request, app, token, response): client = OpenStreetMapAPI( request, app.client_id, app.secret, self.request_token_url ) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(OpenStreetMapOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(OpenStreetMapOAuthAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/orcid/000077500000000000000000000000001452212273200240765ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/orcid/__init__.py000066400000000000000000000000001452212273200261750ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/orcid/provider.py000066400000000000000000000030341452212273200263020ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class Scope(object): USERINFO_PROFILE = "/authenticate" class OrcidAccount(ProviderAccount): def get_profile_url(self): return extract_from_dict(self.account.extra_data, ["orcid-identifier", "uri"]) def to_str(self): return self.account.uid class OrcidProvider(OAuth2Provider): id = "orcid" name = "Orcid.org" account_class = OrcidAccount def get_default_scope(self): return [Scope.USERINFO_PROFILE] def extract_uid(self, data): return extract_from_dict(data, ["orcid-identifier", "path"]) def extract_common_fields(self, data): common_fields = dict( email=extract_from_dict(data, ["person", "emails", "email", 0, "email"]), last_name=extract_from_dict( data, ["person", "name", "family-name", "value"] ), first_name=extract_from_dict( data, ["person", "name", "given-names", "value"] ), ) return dict((key, value) for (key, value) in common_fields.items() if value) provider_classes = [OrcidProvider] def extract_from_dict(data, path): """ Navigate `data`, a multidimensional array (list or dictionary), and returns the object at `path`. """ value = data try: for key in path: value = value[key] return value except (KeyError, IndexError, TypeError): return "" django-allauth-0.58.2/allauth/socialaccount/providers/orcid/tests.py000066400000000000000000000265031452212273200256200ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import OrcidProvider class OrcidTests(OAuth2TestsMixin, TestCase): provider_id = OrcidProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "orcid-identifier": { "uri": "https://sandbox.orcid.org/0000-0001-6796-198X", "path": "0000-0001-6796-198X", "host": "sandbox.orcid.org" }, "preferences": { "locale": "EN" }, "history": { "creation-method": "MEMBER_REFERRED", "completion-date": null, "submission-date": { "value": 1456951327337 }, "last-modified-date": { "value": 1519493486728 }, "claimed": true, "source": null, "deactivation-date": null, "verified-email": true, "verified-primary-email": true }, "person": { "last-modified-date": { "value": 1519493469738 }, "name": { "created-date": { "value": 1460669254582 }, "last-modified-date": { "value": 1460669254582 }, "given-names": { "value": "Patricia" }, "family-name": { "value": "Lawrence" }, "credit-name": null, "source": null, "visibility": "PUBLIC", "path": "0000-0001-6796-198X" }, "other-names": { "last-modified-date": null, "other-name": [], "path": "/0000-0001-6796-198X/other-names" }, "biography": { "created-date": { "value": 1460669254583 }, "last-modified-date": { "value": 1460669254583 }, "content": null, "visibility": "PUBLIC", "path": "/0000-0001-6796-198X/biography" }, "researcher-urls": { "last-modified-date": null, "researcher-url": [], "path": "/0000-0001-6796-198X/researcher-urls" }, "emails": { "last-modified-date": { "value": 1519493469738 }, "email": [ { "created-date": { "value": 1456951327661 }, "last-modified-date": { "value": 1519493469738 }, "source": { "source-orcid": { "uri": "https://sandbox.orcid.org/0000-0001-6796-198X", "path": "0000-0001-6796-198X", "host": "sandbox.orcid.org" }, "source-client-id": null, "source-name": { "value": "Patricia Lawrence" } }, "email": "lawrencepatricia@mailinator.com", "path": null, "visibility": "PUBLIC", "verified": true, "primary": true, "put-code": null } ], "path": "/0000-0001-6796-198X/email" }, "addresses": { "last-modified-date": null, "address": [], "path": "/0000-0001-6796-198X/address" }, "keywords": { "last-modified-date": null, "keyword": [], "path": "/0000-0001-6796-198X/keywords" }, "external-identifiers": { "last-modified-date": null, "external-identifier": [], "path": "/0000-0001-6796-198X/external-identifiers" }, "path": "/0000-0001-6796-198X/person" }, "activities-summary": { "last-modified-date": { "value": 1513777479628 }, "educations": { "last-modified-date": { "value": 1459957293365 }, "education-summary": [ { "created-date": { "value": 1459957293365 }, "last-modified-date": { "value": 1459957293365 }, "source": { "source-orcid": { "uri": "https://sandbox.orcid.org/0000-0001-6796-198X", "path": "0000-0001-6796-198X", "host": "sandbox.orcid.org" }, "source-client-id": null, "source-name": { "value": "Patricia Lawrence" } }, "department-name": null, "role-title": null, "start-date": null, "end-date": null, "organization": { "name": "Polytech'Rambouillet", "address": { "city": "Rambouillet", "region": null, "country": "FR" }, "disambiguated-organization": null }, "visibility": "PUBLIC", "put-code": 19996, "path": "/0000-0001-6796-198X/education/19996" } ], "path": "/0000-0001-6796-198X/educations" }, "employments": { "last-modified-date": { "value": 1513777479628 }, "employment-summary": [ { "created-date": { "value": 1510399314937 }, "last-modified-date": { "value": 1513777479628 }, "source": { "source-orcid": { "uri": "https://sandbox.orcid.org/0000-0001-6796-198X", "path": "0000-0001-6796-198X", "host": "sandbox.orcid.org" }, "source-client-id": null, "source-name": { "value": "Patricia Lawrence" } }, "department-name": null, "role-title": null, "start-date": { "year": { "value": "2015" }, "month": { "value": "03" }, "day": { "value": "02" } }, "end-date": null, "organization": { "name": "École nationale supérieure de céramique industrielle", "address": { "city": "Limoges", "region": null, "country": "FR" }, "disambiguated-organization": { "disambiguated-organization-identifier": "105362", "disambiguation-source": "RINGGOLD" } }, "visibility": "PUBLIC", "put-code": 29138, "path": "/0000-0001-6796-198X/employment/29138" }, { "created-date": { "value": 1502366640610 }, "last-modified-date": { "value": 1513777467282 }, "source": { "source-orcid": { "uri": "https://sandbox.orcid.org/0000-0001-6796-198X", "path": "0000-0001-6796-198X", "host": "sandbox.orcid.org" }, "source-client-id": null, "source-name": { "value": "Patricia Lawrence" } }, "department-name": null, "role-title": null, "start-date": { "year": { "value": "2002" }, "month": { "value": "02" }, "day": { "value": "16" } }, "end-date": { "year": { "value": "2015" }, "month": { "value": "08" }, "day": { "value": "12" } }, "organization": { "name": "University of Cambridge", "address": { "city": "Cambridge", "region": "Cambridgeshire", "country": "GB" }, "disambiguated-organization": { "disambiguated-organization-identifier": "2152", "disambiguation-source": "RINGGOLD" } }, "visibility": "PUBLIC", "put-code": 27562, "path": "/0000-0001-6796-198X/employment/27562" } ], "path": "/0000-0001-6796-198X/employments" }, "fundings": { "last-modified-date": null, "group": [], "path": "/0000-0001-6796-198X/fundings" }, "peer-reviews": { "last-modified-date": null, "group": [], "path": "/0000-0001-6796-198X/peer-reviews" }, "works": { "last-modified-date": { "value": 1459957753077 }, "group": [ { "last-modified-date": { "value": 1459957753077 }, "external-ids": { "external-id": [] }, "work-summary": [ { "put-code": 583440, "created-date": { "value": 1459957753047 }, "last-modified-date": { "value": 1459957753077 }, "source": { "source-orcid": { "uri": "https://sandbox.orcid.org/0000-0001-6796-198X", "path": "0000-0001-6796-198X", "host": "sandbox.orcid.org" }, "source-client-id": null, "source-name": { "value": "Patricia Lawrence" } }, "title": { "title": { "value": "Standard & Poor's fiscal methodology reviewed" }, "subtitle": null, "translated-title": null }, "external-ids": { "external-id": [] }, "type": "JOURNAL_ARTICLE", "publication-date": { "year": { "value": "2001" }, "month": { "value": "07" }, "day": { "value": "14" }, "media-type": null }, "visibility": "PUBLIC", "path": "/0000-0001-6796-198X/work/583440", "display-index": "0" } ] } ], "path": "/0000-0001-6796-198X/works" }, "path": "/0000-0001-6796-198X/activities" }, "path": "/0000-0001-6796-198X" } """, ) def get_login_response_json(self, with_refresh_token=True): # FIXME: This is not an actual response. I added this in order # to get the test suite going but did not verify to check the # exact response being returned. return """ { "access_token": "testac", "expires_in": 631138026, "token_type": "bearer", "orcid": "0000-0001-6796-198X", "scope": "/orcid-profile/read-limited", "refresh_token": "testrf" }""" django-allauth-0.58.2/allauth/socialaccount/providers/orcid/urls.py000066400000000000000000000002441452212273200254350ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import OrcidProvider urlpatterns = default_urlpatterns(OrcidProvider) django-allauth-0.58.2/allauth/socialaccount/providers/orcid/views.py000066400000000000000000000030061452212273200256040ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import OrcidProvider class OrcidOAuth2Adapter(OAuth2Adapter): provider_id = OrcidProvider.id # http://support.orcid.org/knowledgebase/articles/335483-the-public- # client-orcid-api member_api_default = False base_domain_default = "orcid.org" settings = app_settings.PROVIDERS.get(provider_id, {}) base_domain = settings.get("BASE_DOMAIN", base_domain_default) member_api = settings.get("MEMBER_API", member_api_default) api_domain = "{0}.{1}".format("api" if member_api else "pub", base_domain) authorize_url = "https://{0}/oauth/authorize".format(base_domain) access_token_url = "https://{0}/oauth/token".format(api_domain) profile_url = "https://{0}/v2.1/%s/record".format(api_domain) def complete_login(self, request, app, token, **kwargs): params = {} if self.member_api: params["access_token"] = token.token resp = requests.get( self.profile_url % kwargs["response"]["orcid"], params=params, headers={"accept": "application/orcid+json"}, ) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(OrcidOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(OrcidOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/patreon/000077500000000000000000000000001452212273200244465ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/patreon/__init__.py000066400000000000000000000000001452212273200265450ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/patreon/models.py000066400000000000000000000000001452212273200262710ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/patreon/provider.py000066400000000000000000000026071452212273200266570ustar00rootroot00000000000000""" Provider for Patreon """ from django.conf import settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider API_VERSION = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("patreon", {}) .get("VERSION", "v1") ) USE_API_V2 = True if API_VERSION == "v2" else False API_URL = "https://www.patreon.com/api/oauth2/" + (API_VERSION if USE_API_V2 else "api") class PatreonAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("attributes").get("thumb_url") class PatreonProvider(OAuth2Provider): id = "patreon" name = "Patreon" account_class = PatreonAccount def get_default_scope(self): if USE_API_V2: return [ "identity", "identity[email]", "campaigns", "campaigns.members", ] return ["pledges-to-me", "users", "my-campaign"] def extract_uid(self, data): return data.get("id") def extract_common_fields(self, data): details = data["attributes"] return { "email": details.get("email"), "fullname": details.get("full_name"), "first_name": details.get("first_name"), "last_name": details.get("last_name"), } provider_classes = [PatreonProvider] django-allauth-0.58.2/allauth/socialaccount/providers/patreon/tests.py000066400000000000000000000036111452212273200261630ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import PatreonProvider class PatreonTests(OAuth2TestsMixin, TestCase): provider_id = PatreonProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "data": { "relationships": { "pledges": { "data": [{ "type": "pledge", "id": "123456" }] } }, "attributes": { "last_name": "Interwebs", "is_suspended": false, "has_password": true, "full_name": "John Interwebs", "is_nuked": false, "first_name": "John", "social_connections": { "spotify": null, "discord": null, "twitter": null, "youtube": null, "facebook": null, "deviantart": null, "twitch": null }, "twitter": null, "is_email_verified": true, "facebook_id": null, "email": "john@example.com", "facebook": null, "thumb_url": "https://c8.patreon.com/100/123456", "vanity": null, "about": null, "is_deleted": false, "created": "2017-05-05T05:16:34+00:00", "url": "https://www.patreon.com/user?u=123456", "gender": 0, "youtube": null, "discord_id": null, "image_url": "https://c8.patreon.com/400/123456", "twitch": null }, "type": "user", "id": "123456" } }""", ) # noqa django-allauth-0.58.2/allauth/socialaccount/providers/patreon/urls.py000066400000000000000000000003111452212273200260000ustar00rootroot00000000000000"""URLs for Patreon Provider""" from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import PatreonProvider urlpatterns = default_urlpatterns(PatreonProvider) django-allauth-0.58.2/allauth/socialaccount/providers/patreon/views.py000066400000000000000000000037771452212273200261730ustar00rootroot00000000000000""" Views for PatreonProvider https://www.patreon.com/platform/documentation/oauth """ import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import API_URL, USE_API_V2, PatreonProvider class PatreonOAuth2Adapter(OAuth2Adapter): provider_id = PatreonProvider.id access_token_url = "https://www.patreon.com/api/oauth2/token" authorize_url = "https://www.patreon.com/oauth2/authorize" profile_url = "{0}/{1}".format( API_URL, "identity?include=memberships&fields%5Buser%5D=email,first_name," "full_name,image_url,last_name,social_connections," "thumb_url,url,vanity" if USE_API_V2 else "current_user", ) def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer " + token.token}, ) extra_data = resp.json().get("data") if USE_API_V2: # Extract tier/pledge level for Patreon API v2: try: member_id = extra_data["relationships"]["memberships"]["data"][0]["id"] member_url = ( "{0}/members/{1}?include=" "currently_entitled_tiers&fields%5Btier%5D=title" ).format(API_URL, member_id) resp_member = requests.get( member_url, headers={"Authorization": "Bearer " + token.token}, ) pledge_title = resp_member.json()["included"][0]["attributes"]["title"] extra_data["pledge_level"] = pledge_title except (KeyError, IndexError): extra_data["pledge_level"] = None pass return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(PatreonOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(PatreonOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/paypal/000077500000000000000000000000001452212273200242645ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/paypal/__init__.py000066400000000000000000000000001452212273200263630ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/paypal/provider.py000066400000000000000000000020321452212273200264650ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class PaypalAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("picture") def to_str(self): return self.account.extra_data.get("name", super(PaypalAccount, self).to_str()) class PaypalProvider(OAuth2Provider): id = "paypal" name = "Paypal" account_class = PaypalAccount def get_default_scope(self): # See: https://developer.paypal.com/docs/integration/direct/identity/attributes/ # noqa return ["openid", "email"] def extract_uid(self, data): return str(data["user_id"]) def extract_common_fields(self, data): # See: https://developer.paypal.com/docs/api/#get-user-information return dict( first_name=data.get("given_name", ""), last_name=data.get("family_name", ""), email=data.get("email"), ) provider_classes = [PaypalProvider] django-allauth-0.58.2/allauth/socialaccount/providers/paypal/tests.py000066400000000000000000000011451452212273200260010ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import PaypalProvider class PaypalTests(OAuth2TestsMixin, TestCase): provider_id = PaypalProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "user_id": "https://www.paypal.com/webapps/auth/server/64ghr894040044", "name": "Jane Doe", "given_name": "Jane", "family_name": "Doe", "email": "janedoe@example.com" } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/paypal/urls.py000066400000000000000000000002461452212273200256250ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import PaypalProvider urlpatterns = default_urlpatterns(PaypalProvider) django-allauth-0.58.2/allauth/socialaccount/providers/paypal/views.py000066400000000000000000000027101452212273200257730ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import PaypalProvider class PaypalOAuth2Adapter(OAuth2Adapter): provider_id = PaypalProvider.id supports_state = False @property def authorize_url(self): path = "webapps/auth/protocol/openidconnect/v1/authorize" return "https://www.{0}/{1}".format(self._get_endpoint(), path) @property def access_token_url(self): path = "v1/identity/openidconnect/tokenservice" return "https://api.{0}/{1}".format(self._get_endpoint(), path) @property def profile_url(self): path = "v1/identity/openidconnect/userinfo" return "https://api.{0}/{1}".format(self._get_endpoint(), path) def _get_endpoint(self): settings = self.get_provider().get_settings() if settings.get("MODE") == "live": return "paypal.com" else: return "sandbox.paypal.com" def complete_login(self, request, app, token, **kwargs): response = requests.post( self.profile_url, params={"schema": "openid", "access_token": token}, ) extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(PaypalOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(PaypalOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/pinterest/000077500000000000000000000000001452212273200250135ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/pinterest/__init__.py000066400000000000000000000000001452212273200271120ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/pinterest/provider.py000066400000000000000000000036421452212273200272240ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class PinterestAccount(ProviderAccount): def get_username(self): return self.account.extra_data.get("username") def get_profile_url(self): # v5 extra_data not same as v1 username = self.get_username() if username: return "https://www.pinterest.com/{}/".format(username) return self.account.extra_data.get("url") def get_avatar_url(self): return self.account.extra_data.get("profile_image") def to_str(self): dflt = super(PinterestAccount, self).to_str() return self.account.extra_data.get("username", dflt) class PinterestProvider(OAuth2Provider): id = "pinterest" name = "Pinterest" account_class = PinterestAccount @property def api_version(self): return self.get_settings().get("API_VERSION", "v1") def get_default_scope(self): # See: https://developers.pinterest.com/docs/api/overview/#scopes if self.api_version == "v5": # See: https://developers.pinterest.com/docs/getting-started/scopes/ return ["user_accounts:read"] elif self.api_version == "v3": return ["read_users"] return ["read_public"] def extract_extra_data(self, data): if self.api_version == "v5": return data return data.get("data", {}) def extract_uid(self, data): if self.api_version == "v5": return data["username"] return str(data["data"]["id"]) def extract_common_fields(self, data): if self.api_version == "v5": return dict(username=data["username"]) return dict( first_name=data.get("data", {}).get("first_name"), last_name=data.get("data", {}).get("last_name"), ) provider_classes = [PinterestProvider] django-allauth-0.58.2/allauth/socialaccount/providers/pinterest/tests.py000066400000000000000000000026621452212273200265350ustar00rootroot00000000000000from django.test.utils import override_settings from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import PinterestProvider class PinterestTests(OAuth2TestsMixin, TestCase): provider_id = PinterestProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "data": { "url": "https://www.pinterest.com/muravskiyyarosl/", "first_name": "Jane", "last_name": "Doe", "id": "351247977031674143" } } """, ) @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=False, SOCIALACCOUNT_PROVIDERS={ "pinterest": { "API_VERSION": "v5", } }, ) def test_login_v5(self): self.provider_id = PinterestProvider.id resp = self.login( MockedResponse( 200, """ { "account_type": "BUSINESS", "profile_image": "https://i.pinimg.com/280x280_RS/5c/88/2f/5c882f4b02468fcd6cda2ce569c2c166.jpg", "website_url": "https://sns-sdks.github.io/", "username": "enjoylifebot" } """, ), ) assert resp.status_code == 302 django-allauth-0.58.2/allauth/socialaccount/providers/pinterest/urls.py000066400000000000000000000002541452212273200263530ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import PinterestProvider urlpatterns = default_urlpatterns(PinterestProvider) django-allauth-0.58.2/allauth/socialaccount/providers/pinterest/views.py000066400000000000000000000033671452212273200265330ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import PinterestProvider class PinterestOAuth2Adapter(OAuth2Adapter): provider_id = PinterestProvider.id provider_default_url = "api.pinterest.com" provider_default_api_version = "v1" settings = app_settings.PROVIDERS.get(provider_id, {}) provider_base_url = settings.get("PINTEREST_URL", provider_default_url) provider_api_version = settings.get("API_VERSION", provider_default_api_version) authorize_url = "https://www.pinterest.com/oauth/" access_token_url = "https://{0}/{1}/oauth/token".format( provider_base_url, provider_api_version ) basic_auth = True if provider_api_version == "v5": profile_url = "https://{0}/{1}/user_account".format( provider_base_url, provider_api_version ) elif provider_api_version == "v3": profile_url = "https://{0}/{1}/users/me".format( provider_base_url, provider_api_version ) else: profile_url = "https://{0}/{1}/me".format( provider_base_url, provider_api_version ) if provider_api_version == "v3": access_token_method = "PUT" def complete_login(self, request, app, token, **kwargs): response = requests.get( self.profile_url, headers={"Authorization": "Bearer " + token.token} ) extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(PinterestOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(PinterestOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/pocket/000077500000000000000000000000001452212273200242635ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/pocket/__init__.py000066400000000000000000000000001452212273200263620ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/pocket/client.py000066400000000000000000000063111452212273200261140ustar00rootroot00000000000000import requests from urllib.parse import urlencode from django.http import HttpResponseRedirect from django.utils.translation import gettext as _ from allauth.socialaccount.providers.oauth.client import ( OAuthClient, OAuthError, get_token_prefix, ) from allauth.utils import build_absolute_uri class PocketOAuthClient(OAuthClient): def _get_request_token(self): """ Obtain a temporary request token to authorize an access token and to sign the request to obtain the access token """ if self.request_token is None: redirect_url = build_absolute_uri(self.request, self.callback_url) headers = { "X-Accept": "application/json", } data = { "consumer_key": self.consumer_key, "redirect_uri": redirect_url, } response = requests.post( url=self.request_token_url, json=data, headers=headers, ) if response.status_code != 200: raise OAuthError( _("Invalid response while obtaining request token" ' from "%s".') % get_token_prefix(self.request_token_url) ) self.request_token = response.json()["code"] self.request.session[ "oauth_%s_request_token" % get_token_prefix(self.request_token_url) ] = self.request_token return self.request_token def get_redirect(self, authorization_url, extra_params): """ Returns a ``HttpResponseRedirect`` object to redirect the user to the Pocket authorization URL. """ request_token = self._get_request_token() params = { "request_token": request_token, "redirect_uri": self.request.build_absolute_uri(self.callback_url), } params.update(extra_params) url = authorization_url + "?" + urlencode(params) return HttpResponseRedirect(url) def get_access_token(self): """ Obtain the access token to access private resources at the API endpoint. """ if self.access_token is None: request_token = self._get_rt_from_session() url = self.access_token_url headers = { "X-Accept": "application/json", } data = { "consumer_key": self.consumer_key, "code": request_token, } response = requests.post(url=url, headers=headers, json=data) if response.status_code != 200: raise OAuthError( _("Invalid response while obtaining access token" ' from "%s".') % get_token_prefix(self.request_token_url) ) r = response.json() self.access_token = { "oauth_token": request_token, "oauth_token_secret": r["access_token"], "username": r["username"], } self.request.session[ "oauth_%s_access_token" % get_token_prefix(self.request_token_url) ] = self.access_token return self.access_token django-allauth-0.58.2/allauth/socialaccount/providers/pocket/models.py000066400000000000000000000000001452212273200261060ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/pocket/provider.py000066400000000000000000000016101452212273200264650ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class PocketAccount(ProviderAccount): def to_str(self): dflt = super(PocketAccount, self).to_str() return self.account.extra_data.get("Display_Name", dflt) class PocketProvider(OAuthProvider): id = "pocket" name = "Pocket" account_class = PocketAccount def extract_uid(self, data): return data["username"] def extract_common_fields(self, data): return dict( email=data["username"], ) def extract_email_addresses(self, data): return [ EmailAddress( email=data["username"], verified=True, primary=True, ) ] provider_classes = [PocketProvider] django-allauth-0.58.2/allauth/socialaccount/providers/pocket/tests.py000066400000000000000000000026571452212273200260110ustar00rootroot00000000000000from urllib.parse import parse_qs, urlencode, urlparse from django.urls import reverse from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase, mocked_response from .provider import PocketProvider class PocketOAuthTests(OAuthTestsMixin, TestCase): provider_id = PocketProvider.id def get_mocked_response(self): return [] def get_access_token_response(self): return MockedResponse( 200, """ {"access_token":"5678defg-5678-defg-5678-defg56", "username":"name@example.com"} """, ) def login(self, resp_mocks, process="login"): with mocked_response( MockedResponse( 200, """ {"code": "dcba4321-dcba-4321-dcba-4321dc"} """, {"content-type": "application/json"}, ) ): resp = self.client.post( reverse(self.provider.id + "_login") + "?" + urlencode(dict(process=process)) ) p = urlparse(resp["location"]) q = parse_qs(p.query) complete_url = reverse(self.provider.id + "_callback") self.assertGreater(q["redirect_uri"][0].find(complete_url), 0) with mocked_response(self.get_access_token_response(), *resp_mocks): resp = self.client.get(complete_url) return resp django-allauth-0.58.2/allauth/socialaccount/providers/pocket/urls.py000066400000000000000000000002451452212273200256230ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import PocketProvider urlpatterns = default_urlpatterns(PocketProvider) django-allauth-0.58.2/allauth/socialaccount/providers/pocket/views.py000066400000000000000000000036471452212273200260040ustar00rootroot00000000000000from ..oauth.views import OAuthAdapter, OAuthCallbackView, OAuthLoginView from .client import PocketOAuthClient from .provider import PocketProvider class PocketOAuthAdapter(OAuthAdapter): provider_id = PocketProvider.id request_token_url = "https://getpocket.com/v3/oauth/request" access_token_url = "https://getpocket.com/v3/oauth/authorize" authorize_url = "https://getpocket.com/auth/authorize" def complete_login(self, request, app, token, response): return self.get_provider().sociallogin_from_response(request, response) class PocketOAuthLoginView(OAuthLoginView): def _get_client(self, request, callback_url): provider = self.adapter.get_provider() app = provider.app scope = " ".join(provider.get_scope(request)) parameters = {} if scope: parameters["scope"] = scope client = PocketOAuthClient( request, app.client_id, app.secret, self.adapter.request_token_url, self.adapter.access_token_url, callback_url, parameters=parameters, provider=provider, ) return client class PocketOAuthCallbackView(OAuthCallbackView): def _get_client(self, request, callback_url): provider = self.adapter.get_provider() app = provider.app scope = " ".join(provider.get_scope(request)) parameters = {} if scope: parameters["scope"] = scope client = PocketOAuthClient( request, app.client_id, app.secret, self.adapter.request_token_url, self.adapter.access_token_url, callback_url, parameters=parameters, provider=provider, ) return client oauth_login = PocketOAuthLoginView.adapter_view(PocketOAuthAdapter) oauth_callback = PocketOAuthCallbackView.adapter_view(PocketOAuthAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/questrade/000077500000000000000000000000001452212273200247735ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/questrade/__init__.py000066400000000000000000000000001452212273200270720ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/questrade/provider.py000066400000000000000000000006521452212273200272020ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class QuestradeAccount(ProviderAccount): pass class QuestradeProvider(OAuth2Provider): id = "questrade" name = "Questrade" account_class = QuestradeAccount def extract_uid(self, data): return str(data["userId"]) provider_classes = [QuestradeProvider] django-allauth-0.58.2/allauth/socialaccount/providers/questrade/tests.py000066400000000000000000000005761452212273200265170ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import QuestradeProvider class QuestradeTests(OAuth2TestsMixin, TestCase): provider_id = QuestradeProvider.id def get_mocked_response(self): return MockedResponse( 200, """{"userId":400,"accounts":[]}""", ) django-allauth-0.58.2/allauth/socialaccount/providers/questrade/urls.py000066400000000000000000000002541452212273200263330ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import QuestradeProvider urlpatterns = default_urlpatterns(QuestradeProvider) django-allauth-0.58.2/allauth/socialaccount/providers/questrade/views.py000066400000000000000000000020701452212273200265010ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import QuestradeProvider class QuestradeOAuth2Adapter(OAuth2Adapter): provider_id = QuestradeProvider.id access_token_url = "https://login.questrade.com/oauth2/token" authorize_url = "https://login.questrade.com/oauth2/authorize" supports_state = False def complete_login(self, request, app, token, **kwargs): api_server = kwargs.get("response", {}).get( "api_server", "https://api01.iq.questrade.com/" ) resp = requests.get( "{}v1/accounts".format(api_server), headers={"Authorization": "Bearer {}".format(token.token)}, ) resp.raise_for_status() data = resp.json() data.update(kwargs) return self.get_provider().sociallogin_from_response(request, data) oauth2_login = OAuth2LoginView.adapter_view(QuestradeOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(QuestradeOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/quickbooks/000077500000000000000000000000001452212273200251505ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/quickbooks/__init__.py000066400000000000000000000000001452212273200272470ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/quickbooks/models.py000066400000000000000000000000001452212273200267730ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/quickbooks/provider.py000066400000000000000000000037531452212273200273640ustar00rootroot00000000000000from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ( ProviderAccount, ProviderException, ) from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class QuickBooksAccount(ProviderAccount): def to_str(self): dflt = super(QuickBooksAccount, self).to_str() name = self.account.extra_data.get("name", dflt) first_name = self.account.extra_data.get("givenName", None) last_name = self.account.extra_data.get("familyName", None) if first_name and last_name: name = first_name + " " + last_name return name class QuickBooksOAuth2Provider(OAuth2Provider): id = "quickbooks" # Name is displayed to ordinary users -- don't include protocol name = "QuickBooks" account_class = QuickBooksAccount def extract_uid(self, data): if "sub" not in data: raise ProviderException("QBO error", data) return str(data["sub"]) def get_profile_fields(self): default_fields = [ "address", "sub", "phoneNumber", "givenName", "familyName", "email", "emailVerified", ] fields = self.get_settings().get("PROFILE_FIELDS", default_fields) return fields def get_default_scope(self): scope = [ "openid", "com.intuit.quickbooks.accounting", "profile", "phone", ] if app_settings.QUERY_EMAIL: scope.append("email") return scope def extract_common_fields(self, data): return dict( email=data.get("email"), address=data.get("address"), sub=data.get("sub"), givenName=data.get("givenName"), familynName=data.get("familyName"), emailVerified=data.get("emailVerified"), phoneNumber=data.get("phoneNumber"), ) provider_classes = [QuickBooksOAuth2Provider] django-allauth-0.58.2/allauth/socialaccount/providers/quickbooks/tests.py000066400000000000000000000012051452212273200266620ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import QuickBooksOAuth2Provider class QuickBooksOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = QuickBooksOAuth2Provider.id def get_mocked_response(self): return MockedResponse( 200, """ { "sub": "d8752092-0f2b-4b6e-86ef-6b72f2457a00", "emailVerified": true, "familyName": "Mckeeman", "phoneNumber": "+1 4156694355", "givenName": "Darren", "phoneNumberVerified": true, "email": "darren@blocklight.io"} """, ) django-allauth-0.58.2/allauth/socialaccount/providers/quickbooks/urls.py000066400000000000000000000002721452212273200265100ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import QuickBooksOAuth2Provider urlpatterns = default_urlpatterns(QuickBooksOAuth2Provider) django-allauth-0.58.2/allauth/socialaccount/providers/quickbooks/views.py000066400000000000000000000031311452212273200266550ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import QuickBooksOAuth2Provider class QuickBooksOAuth2Adapter(OAuth2Adapter): provider_id = QuickBooksOAuth2Provider.id access_token_url = "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer" authorize_url = "https://appcenter.intuit.com/connect/oauth2" profile_test = "https://sandbox-accounts.platform.intuit.com/v1/openid_connect/userinfo" # NOQA profile_url = "https://accounts.platform.intuit.com/v1/openid_connect/userinfo" profile_url_method = "GET" access_token_method = "POST" def complete_login(self, request, app, token, **kwargs): realm_id = request.GET.get("realmId") extra_data = self.get_user_info(token) if realm_id: extra_data["realmId"] = realm_id return self.get_provider().sociallogin_from_response(request, extra_data) def get_user_info(self, token): auth_header = "Bearer " + token.token headers = { "Accept": "application/json", "Authorization": auth_header, "accept": "application/json", } is_sandbox = self.get_provider().get_settings().get("SANDBOX", False) url = self.profile_test if is_sandbox else self.profile_url resp = requests.get(url, headers=headers) resp.raise_for_status() return resp.json() oauth2_login = OAuth2LoginView.adapter_view(QuickBooksOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(QuickBooksOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/reddit/000077500000000000000000000000001452212273200242515ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/reddit/__init__.py000066400000000000000000000000001452212273200263500ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/reddit/provider.py000077500000000000000000000013151452212273200264600ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class RedditAccount(ProviderAccount): def to_str(self): dflt = super(RedditAccount, self).to_str() name = self.account.extra_data.get("name", dflt) return name class RedditProvider(OAuth2Provider): id = "reddit" name = "Reddit" account_class = RedditAccount def extract_uid(self, data): return data["name"] def extract_common_fields(self, data): return dict(username=data.get("name")) def get_default_scope(self): scope = ["identity"] return scope provider_classes = [RedditProvider] django-allauth-0.58.2/allauth/socialaccount/providers/reddit/tests.py000077500000000000000000000006341452212273200257730ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import RedditProvider class RedditTests(OAuth2TestsMixin, TestCase): provider_id = RedditProvider.id def get_mocked_response(self): return [ MockedResponse( 200, """{ "name": "wayward710"}""", ) ] django-allauth-0.58.2/allauth/socialaccount/providers/reddit/urls.py000077500000000000000000000002461452212273200256150ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import RedditProvider urlpatterns = default_urlpatterns(RedditProvider) django-allauth-0.58.2/allauth/socialaccount/providers/reddit/views.py000077500000000000000000000024361452212273200257700ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import RedditProvider class RedditAdapter(OAuth2Adapter): provider_id = RedditProvider.id access_token_url = "https://www.reddit.com/api/v1/access_token" authorize_url = "https://www.reddit.com/api/v1/authorize" profile_url = "https://oauth.reddit.com/api/v1/me" basic_auth = True settings = app_settings.PROVIDERS.get(provider_id, {}) # Allow custom User Agent to comply with reddit API limits headers = {"User-Agent": settings.get("USER_AGENT", "django-allauth-header")} def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "bearer " + token.token} headers.update(self.headers) extra_data = requests.get(self.profile_url, headers=headers) # This only here because of weird response from the test suite if isinstance(extra_data, list): extra_data = extra_data[0] return self.get_provider().sociallogin_from_response(request, extra_data.json()) oauth2_login = OAuth2LoginView.adapter_view(RedditAdapter) oauth2_callback = OAuth2CallbackView.adapter_view(RedditAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/robinhood/000077500000000000000000000000001452212273200247615ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/robinhood/__init__.py000066400000000000000000000000001452212273200270600ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/robinhood/provider.py000066400000000000000000000013571452212273200271730ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class RobinhoodAccount(ProviderAccount): def get_avatar_url(self): return None def to_str(self): return self.account.extra_data.get( "username", super(RobinhoodAccount, self).to_str() ) class RobinhoodProvider(OAuth2Provider): id = "robinhood" name = "Robinhood" account_class = RobinhoodAccount def get_default_scope(self): return ["read"] def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict(username=data.get("username")) provider_classes = [RobinhoodProvider] django-allauth-0.58.2/allauth/socialaccount/providers/robinhood/tests.py000066400000000000000000000006461452212273200265030ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import RobinhoodProvider class RobinhoodTests(OAuth2TestsMixin, TestCase): provider_id = RobinhoodProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "username": "test_username", "id": "1234-5678-910" } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/robinhood/urls.py000066400000000000000000000002541452212273200263210ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import RobinhoodProvider urlpatterns = default_urlpatterns(RobinhoodProvider) django-allauth-0.58.2/allauth/socialaccount/providers/robinhood/views.py000066400000000000000000000020141452212273200264650ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import RobinhoodProvider class RobinhoodOAuth2Adapter(OAuth2Adapter): provider_id = RobinhoodProvider.id @property def authorize_url(self): return "https://www.robinhood.com/oauth2/authorize/" @property def access_token_url(self): return "https://api.robinhood.com/oauth2/token/" @property def profile_url(self): return "https://api.robinhood.com/user/id/" def complete_login(self, request, app, token, **kwargs): response = requests.get( self.profile_url, headers={"Authorization": "Bearer %s" % token.token}, ) extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(RobinhoodOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(RobinhoodOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/salesforce/000077500000000000000000000000001452212273200251245ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/salesforce/__init__.py000066400000000000000000000000001452212273200272230ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/salesforce/provider.py000066400000000000000000000033401452212273200273300ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount import providers from allauth.socialaccount.providers.base import AuthAction, ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class SalesforceAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("link") def get_avatar_url(self): return self.account.extra_data.get("picture") def to_str(self): dflt = super(SalesforceAccount, self).to_str() return self.account.extra_data.get("name", dflt) class SalesforceProvider(OAuth2Provider): id = "salesforce" name = "Salesforce" package = "allauth.socialaccount.providers.salesforce" account_class = SalesforceAccount def get_default_scope(self): return ["id", "openid"] def get_auth_params(self, request, action): ret = super(SalesforceProvider, self).get_auth_params(request, action) if action == AuthAction.REAUTHENTICATE: ret["approval_prompt"] = "force" return ret def extract_uid(self, data): return str(data["user_id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), last_name=data.get("family_name"), first_name=data.get("given_name"), username=data.get("preferred_username"), ) def extract_email_addresses(self, data): # a salesforce user must have an email, but it might not be verified email = EmailAddress( email=data.get("email"), primary=True, verified=data.get("email_verified"), ) return [email] providers.registry.register(SalesforceProvider) django-allauth-0.58.2/allauth/socialaccount/providers/salesforce/tests.py000066400000000000000000000040161452212273200266410ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import SalesforceProvider class SalesforceTests(OAuth2TestsMixin, TestCase): provider_id = SalesforceProvider.id def get_mocked_response( self, last_name="Penners", first_name="Raymond", name="Raymond Penners", email="raymond.penners@gmail.com", verified_email=True, ): userinfo = USERINFO_RESPONSE.format( org_id="00Dxx00000000000A0", user_id="005xx000000aWwRQAU", vip="https://test.salesforce.com", nickname="test-ooi2xhmjteep", first_name=first_name, last_name=last_name, my_domain="https://fun.cs46.my.salesforce.com", content_domain="https://fun--c.cs46.content.force.com", verified_email=repr(verified_email).lower(), email=email, active="true", is_app_installed="true", ) return MockedResponse(200, userinfo) USERINFO_RESPONSE = """ {{ "sub": "{vip}/id/{org_id}/{user_id}", "user_id": "{user_id}", "organization_id": "{org_id}", "preferred_username": "{nickname}@sample_-_dev_workspace.net", "nickname": "{nickname}", "name": "{first_name} {last_name}", "email": "{email}", "email_verified": {verified_email}, "given_name": "{first_name}", "family_name": "{last_name}", "zoneinfo": "America/Los_Angeles", "photos": {{ "picture": "{content_domain}/profilephoto/005/F", "thumbnail": "{content_domain}/profilephoto/005/T" }}, "profile": "{my_domain}/{user_id}", "picture": "{content_domain}/profilephoto/005/F", "address": {{"country": "US"}}, "urls": {{"custom_domain": "{my_domain}"}}, "active": {active}, "user_type": "STANDARD", "language": "en_US", "locale": "en_US", "utcOffset": -28800000, "updated_at": "2017-10-05T20:39:02.000+0000", "is_app_installed": {is_app_installed} }} """ django-allauth-0.58.2/allauth/socialaccount/providers/salesforce/urls.py000066400000000000000000000002561452212273200264660ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import SalesforceProvider urlpatterns = default_urlpatterns(SalesforceProvider) django-allauth-0.58.2/allauth/socialaccount/providers/salesforce/views.py000066400000000000000000000021401452212273200266300ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import SalesforceProvider class SalesforceOAuth2Adapter(OAuth2Adapter): provider_id = SalesforceProvider.id @property def base_url(self): return self.get_provider().app.key @property def authorize_url(self): return "{}/services/oauth2/authorize".format(self.base_url) @property def access_token_url(self): return "{}/services/oauth2/token".format(self.base_url) @property def userinfo_url(self): return "{}/services/oauth2/userinfo".format(self.base_url) def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.userinfo_url, params={"oauth_token": token}) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(SalesforceOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(SalesforceOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/saml/000077500000000000000000000000001452212273200237325ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/saml/__init__.py000066400000000000000000000000001452212273200260310ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/saml/conftest.py000066400000000000000000000220501452212273200261300ustar00rootroot00000000000000import base64 from unittest.mock import patch from django.test.client import Client import pytest @pytest.fixture def client(): client = Client(HTTP_HOST="example.com") return client @pytest.fixture def saml_settings(settings): settings.SOCIALACCOUNT_PROVIDERS = { "saml": { "APPS": [ { "client_id": "org", "provider_id": "urn:dev-123.us.auth0.com", "settings": { "attribute_mapping": { "uid": "http://schemas.auth0.com/clientID", "email_verified": "http://schemas.auth0.com/email_verified", "email": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress", }, "idp": { "name": "Test IdP", "entity_id": "urn:dev-123.us.auth0.com", "sso_url": "https://dev-123.us.auth0.com/samlp/456", "slo_url": "https://dev-123.us.auth0.com/samlp/456", "x509cert": "", }, "advanced": { "strict": False, }, }, } ] } } @pytest.fixture def acs_saml_response(): xml = """ urn:dev-123.us.auth0.com urn:dev-123.us.auth0.com 123 If7dFg... MIIDHTCC... google-oauth2|108204123456789 https://allauth.org/accounts/org/metadata/ urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified google-oauth2|108204123456789 john.doe@email.org John John john.doe@email.org google-oauth2 google-oauth2 true dummysamluid Wed Jun 28 2023 17:53:49 GMT+0000 (Coordinated Universal Time) true en john.doe https://lh3.googleusercontent.com/a/AAcHTtfZ0fEyL3BKP1Hk2v1bNwpJd6ckIeo6jSExlkVjMXaIpsY=s96-c Sat Jul 08 2023 06:13:07 GMT+0000 (Coordinated Universal Time) view-profile manage-account-links """ return base64.b64encode(xml.encode("utf8")).decode("utf8") @pytest.fixture def sls_saml_request(): xml = "" return base64.b64encode(xml.encode("utf8")).decode("utf8") @pytest.fixture def mocked_signature_validation(): with patch("onelogin.saml2.utils.OneLogin_Saml2_Utils.validate_sign") as mock: mock.return_value = True yield django-allauth-0.58.2/allauth/socialaccount/providers/saml/provider.py000066400000000000000000000055001452212273200261360ustar00rootroot00000000000000from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.providers.base import Provider, ProviderAccount class SAMLAccount(ProviderAccount): def to_str(self): return super().to_str() class SAMLProvider(Provider): id = "saml" name = "SAML" account_class = SAMLAccount default_attribute_mapping = { "uid": [ "http://schemas.auth0.com/clientID", "urn:oasis:names:tc:SAML:attribute:subject-id", ], "email": [ "urn:oid:0.9.2342.19200300.100.1.3", "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress", ], "email_verified": [ "http://schemas.auth0.com/email_verified", ], "first_name": [ "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname", "urn:oid:2.5.4.42", ], "last_name": [ "urn:oid:2.5.4.4", ], "username": [ "http://schemas.auth0.com/nickname", ], } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.name = self.app.name or self.app.client_id or self.name def get_login_url(self, request, **kwargs): url = reverse("saml_login", kwargs={"organization_slug": self.app.client_id}) if kwargs: url = url + "?" + urlencode(kwargs) return url def extract_extra_data(self, data): return data.get_attributes() def extract_uid(self, data): """ The `uid` is not unique across different SAML IdP's. Therefore, we're using a fully qualified ID: @. """ return self._extract(data)["uid"] def extract_common_fields(self, data): ret = self._extract(data) ret.pop("uid", None) return ret def _extract(self, data): provider_config = self.app.settings raw_attributes = data.get_attributes() attributes = {} attribute_mapping = provider_config.get( "attribute_mapping", self.default_attribute_mapping ) # map configured provider attributes for key, provider_keys in attribute_mapping.items(): if isinstance(provider_keys, str): provider_keys = [provider_keys] for provider_key in provider_keys: attribute_list = raw_attributes.get(provider_key, [""]) if len(attribute_list) > 0: attributes[key] = attribute_list[0] break email_verified = attributes.get("email_verified") if email_verified: email_verified = email_verified.lower() in ["true", "1", "t", "y", "yes"] attributes["email_verified"] = email_verified return attributes provider_classes = [SAMLProvider] django-allauth-0.58.2/allauth/socialaccount/providers/saml/tests.py000066400000000000000000000126651452212273200254600ustar00rootroot00000000000000from unittest.mock import patch from urllib.parse import parse_qs, urlparse from django.urls import reverse from django.utils.http import urlencode import pytest from allauth.account.models import EmailAddress from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.providers.saml.utils import build_saml_config @pytest.mark.parametrize( "is_connect,relay_state, expected_url", [ (False, None, "/accounts/profile/"), (False, "/foo", "/foo"), (True, "process=connect", "/social/connections/"), (True, "process=connect&next=/conn", "/conn"), ], ) def test_acs( request, is_connect, db, saml_settings, acs_saml_response, mocked_signature_validation, expected_url, relay_state, ): if is_connect: client = request.getfixturevalue("auth_client") user = request.getfixturevalue("user") else: client = request.getfixturevalue("client") user = None data = {"SAMLResponse": acs_saml_response} if relay_state is not None: data["RelayState"] = relay_state resp = client.post( reverse("saml_acs", kwargs={"organization_slug": "org"}), data=data ) finish_url = reverse("saml_finish_acs", kwargs={"organization_slug": "org"}) assert resp.status_code == 302 assert resp["location"] == finish_url resp = client.get(finish_url) assert resp["location"] == expected_url account = SocialAccount.objects.get( provider="urn:dev-123.us.auth0.com", uid="dummysamluid" ) assert account.extra_data["Role"] == ["view-profile", "manage-account-links"] email = EmailAddress.objects.get(user=account.user) assert email.email == (user.email if is_connect else "john.doe@email.org") def test_acs_error(client, db, saml_settings): data = {"SAMLResponse": "bad-response"} resp = client.post( reverse("saml_acs", kwargs={"organization_slug": "org"}), data=data ) assert resp.status_code == 200 assert "socialaccount/authentication_error.html" in (t.name for t in resp.templates) @pytest.mark.parametrize( "query,expected_relay_state", [ ("", None), ("?process=connect", "process=connect"), ("?process=connect&next=/foo", "process=connect&next=%2Ffoo"), ("?next=/bar", "next=%2Fbar"), ], ) def test_login(client, db, saml_settings, query, expected_relay_state): resp = client.get( reverse("saml_login", kwargs={"organization_slug": "org"}) + query ) assert resp.status_code == 302 location = resp["location"] assert location.startswith("https://dev-123.us.auth0.com/samlp/456?SAMLRequest=") resp_query = parse_qs(urlparse(location).query) if expected_relay_state is None: assert "RelayState" not in resp_query else: assert resp_query.get("RelayState")[0] == expected_relay_state def test_metadata( client, db, saml_settings, ): resp = client.get(reverse("saml_metadata", kwargs={"organization_slug": "org"})) assert resp.status_code == 200 assert resp.content.startswith( b'\n[^/]+)/", include( [ path( "acs/", views.acs, name="saml_acs", ), path( "acs/finish/", views.finish_acs, name="saml_finish_acs", ), path( "sls/", views.sls, name="saml_sls", ), path( "metadata/", views.metadata, name="saml_metadata", ), path( "login/", views.login, name="saml_login", ), ] ), ) ] django-allauth-0.58.2/allauth/socialaccount/providers/saml/utils.py000066400000000000000000000137701452212273200254540ustar00rootroot00000000000000from urllib.parse import parse_qsl, urlparse from django.core.cache import cache from django.core.exceptions import ImproperlyConfigured from django.http import Http404 from django.urls import reverse from django.utils.http import urlencode from onelogin.saml2.constants import OneLogin_Saml2_Constants from onelogin.saml2.idp_metadata_parser import OneLogin_Saml2_IdPMetadataParser from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.models import SocialApp from .provider import SAMLProvider def get_app_or_404(request, organization_slug): adapter = get_adapter() try: return adapter.get_app( request, provider=SAMLProvider.id, client_id=organization_slug ) except SocialApp.DoesNotExist: raise Http404(f"no SocialApp found with client_id={organization_slug}") def prepare_django_request(request): result = { "https": "on" if request.is_secure() else "off", "http_host": request.META["HTTP_HOST"], "script_name": request.META["PATH_INFO"], "get_data": request.GET.copy(), # 'lowercase_urlencoding': True, "post_data": request.POST.copy(), } return result def build_sp_config(request, provider_config, org): acs_url = request.build_absolute_uri(reverse("saml_acs", args=[org])) sls_url = request.build_absolute_uri(reverse("saml_sls", args=[org])) metadata_url = request.build_absolute_uri(reverse("saml_metadata", args=[org])) sp_config = { "entityId": metadata_url, "assertionConsumerService": { "url": acs_url, "binding": OneLogin_Saml2_Constants.BINDING_HTTP_POST, }, "singleLogoutService": { "url": sls_url, "binding": OneLogin_Saml2_Constants.BINDING_HTTP_REDIRECT, }, } avd = provider_config.get("advanced", {}) if avd.get("x509cert") is not None: sp_config["x509cert"] = avd["x509cert"] if avd.get("x509cert_new"): sp_config["x509certNew"] = avd["x509cert_new"] if avd.get("private_key") is not None: sp_config["privateKey"] = avd["private_key"] if avd.get("name_id_format") is not None: sp_config["NameIDFormat"] = avd["name_id_format"] return sp_config def fetch_metadata_url_config(idp_config): metadata_url = idp_config["metadata_url"] entity_id = idp_config["entity_id"] cache_key = f"saml.metadata.{metadata_url}.{entity_id}" saml_config = cache.get(cache_key) if saml_config is None: saml_config = OneLogin_Saml2_IdPMetadataParser.parse_remote( metadata_url, entity_id=entity_id, timeout=idp_config.get("metadata_request_timeout", 10), ) cache.set( cache_key, saml_config, idp_config.get("metadata_cache_timeout", 60 * 60 * 4), ) return saml_config def build_saml_config(request, provider_config, org): avd = provider_config.get("advanced", {}) security_config = { "authnRequestsSigned": avd.get("authn_request_signed", False), "digestAlgorithm": avd.get("digest_algorithm", OneLogin_Saml2_Constants.SHA256), "logoutRequestSigned": avd.get("logout_request_signed", False), "logoutResponseSigned": avd.get("logout_response_signed", False), "requestedAuthnContext": False, "signatureAlgorithm": avd.get( "signature_algorithm", OneLogin_Saml2_Constants.RSA_SHA256 ), "signMetadata": avd.get("metadata_signed", False), "wantAssertionsEncrypted": avd.get("want_assertion_encrypted", False), "wantAssertionsSigned": avd.get("want_assertion_signed", False), "wantMessagesSigned": avd.get("want_message_signed", False), "nameIdEncrypted": avd.get("name_id_encrypted", False), "wantNameIdEncrypted": avd.get("want_name_id_encrypted", False), "allowSingleLabelDomains": avd.get("allow_single_label_domains", False), "rejectDeprecatedAlgorithm": avd.get("reject_deprecated_algorithm", True), "wantNameId": avd.get("want_name_id", False), "wantAttributeStatement": avd.get("want_attribute_statement", True), "allowRepeatAttributeName": avd.get("allow_repeat_attribute_name", True), } saml_config = { "strict": avd.get("strict", True), "security": security_config, } contact_person = provider_config.get("contact_person") if contact_person: saml_config["contactPerson"] = contact_person organization = provider_config.get("organization") if organization: saml_config["organization"] = organization idp = provider_config.get("idp") if idp is None: raise ImproperlyConfigured("`idp` missing") metadata_url = idp.get("metadata_url") if metadata_url: meta_config = fetch_metadata_url_config(idp) saml_config["idp"] = meta_config["idp"] else: saml_config["idp"] = { "entityId": idp["entity_id"], "x509cert": idp["x509cert"], "singleSignOnService": {"url": idp["sso_url"]}, } slo_url = idp.get("slo_url") if slo_url: saml_config["idp"]["singleLogoutService"] = {"url": slo_url} saml_config["sp"] = build_sp_config(request, provider_config, org) return saml_config def encode_relay_state(process=None, next_url=None): params = {} if process: params["process"] = process if next_url: params["next"] = next_url return urlencode(params) def decode_relay_state(relay_state): """According to the spec, RelayState need not be a URL, yet, ``onelogin.saml2` exposes it as ``return_to -- The target URL the user should be redirected to after login``. Also, for an IdP initiated login sometimes a URL is used. """ ret = {} if relay_state: parts = urlparse(relay_state) if parts.scheme or parts.netloc or (parts.path and parts.path.startswith("/")): ret["next"] = relay_state else: ret = dict(parse_qsl(relay_state)) return ret django-allauth-0.58.2/allauth/socialaccount/providers/saml/views.py000066400000000000000000000137241452212273200254500ustar00rootroot00000000000000import binascii import logging from django.http import HttpResponse, HttpResponseRedirect, JsonResponse from django.urls import reverse from django.utils.decorators import method_decorator from django.views import View from django.views.decorators.csrf import csrf_exempt from onelogin.saml2.auth import OneLogin_Saml2_Auth, OneLogin_Saml2_Settings from allauth.account.adapter import get_adapter as get_account_adapter from allauth.account.utils import get_next_redirect_url from allauth.socialaccount.helpers import ( complete_social_login, render_authentication_error, ) from allauth.socialaccount.models import SocialLogin from allauth.socialaccount.providers.base.constants import AuthError from allauth.socialaccount.sessions import LoginSession from .utils import ( build_saml_config, decode_relay_state, encode_relay_state, get_app_or_404, prepare_django_request, ) logger = logging.getLogger(__name__) class SAMLViewMixin: def build_auth(self, provider, organization_slug): req = prepare_django_request(self.request) config = build_saml_config( self.request, provider.app.settings, organization_slug ) auth = OneLogin_Saml2_Auth(req, config) return auth def get_app(self, organization_slug): app = get_app_or_404(self.request, organization_slug) return app def get_provider(self, organization_slug): app = self.get_app(organization_slug) return app.get_provider(self.request) @method_decorator(csrf_exempt, name="dispatch") class ACSView(SAMLViewMixin, View): def dispatch(self, request, organization_slug): provider = self.get_provider(organization_slug) auth = self.build_auth(provider, organization_slug) try: auth.process_response() except binascii.Error: errors = ["invalid_response"] else: errors = auth.get_errors() if errors: # e.g. ['invalid_response'] logger.error( "Error processing SAML response: %s: %s" % (", ".join(errors), auth.get_last_error_reason()) ) return render_authentication_error( request, provider.id, extra_context={ "saml_errors": errors, "saml_last_error_reason": auth.get_last_error_reason(), }, ) if not auth.is_authenticated(): return render_authentication_error( request, provider.id, error=AuthError.CANCELLED ) relay_state = decode_relay_state(request.POST.get("RelayState")) login = provider.sociallogin_from_response(request, auth) for key in ["process", "next"]: value = relay_state.get(key) if value: login.state[key] = value acs_session = LoginSession(request, "saml_acs_session", "saml-acs-session") acs_session.store["login"] = login.serialize() url = reverse( "saml_finish_acs", kwargs={"organization_slug": organization_slug}, ) response = HttpResponseRedirect(url) acs_session.save(response) return response acs = ACSView.as_view() class FinishACSView(SAMLViewMixin, View): def dispatch(self, request, organization_slug): provider = self.get_provider(organization_slug) acs_session = LoginSession(request, "saml_acs_session", "saml-acs-session") serialized_login = acs_session.store.get("login") if not serialized_login: logger.error("Unable to finish login, SAML ACS session missing") return render_authentication_error(request, provider.id) acs_session.delete() login = SocialLogin.deserialize(serialized_login) return complete_social_login(request, login) finish_acs = FinishACSView.as_view() @method_decorator(csrf_exempt, name="dispatch") class SLSView(SAMLViewMixin, View): def dispatch(self, request, organization_slug): provider = self.get_provider(organization_slug) auth = self.build_auth(provider, organization_slug) should_logout = request.user.is_authenticated account_adapter = get_account_adapter(request) def force_logout(): account_adapter.logout(request) redirect_to = auth.process_slo( delete_session_cb=force_logout, keep_local_session=not should_logout ) if not redirect_to: redirect_to = account_adapter.get_logout_redirect_url(request) return HttpResponseRedirect(redirect_to) sls = SLSView.as_view() class MetadataView(SAMLViewMixin, View): def dispatch(self, request, organization_slug): provider = self.get_provider(organization_slug) config = build_saml_config( self.request, provider.app.settings, organization_slug ) saml_settings = OneLogin_Saml2_Settings( settings=config, sp_validation_only=True ) metadata = saml_settings.get_sp_metadata() errors = saml_settings.validate_metadata(metadata) if len(errors) > 0: resp = JsonResponse({"errors": errors}) resp.status_code = 500 return resp return HttpResponse(content=metadata, content_type="text/xml") metadata = MetadataView.as_view() class LoginView(SAMLViewMixin, View): def dispatch(self, request, organization_slug): provider = self.get_provider(organization_slug) auth = self.build_auth(provider, organization_slug) process = self.request.GET.get("process") next_url = get_next_redirect_url(request) relay_state = encode_relay_state(process=process, next_url=next_url) # If we pass `return_to=None` `auth.login` will use the URL of the # current view, which will then end up being used as a redirect URL. redirect = auth.login(return_to=relay_state) return HttpResponseRedirect(redirect) login = LoginView.as_view() django-allauth-0.58.2/allauth/socialaccount/providers/sharefile/000077500000000000000000000000001452212273200247405ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/sharefile/__init__.py000066400000000000000000000000001452212273200270370ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/sharefile/provider.py000066400000000000000000000013701452212273200271450ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class ShareFileAccount(ProviderAccount): def to_str(self): dflt = super(ShareFileAccount, self).to_str() return self.account.extra_data.get("name", dflt) class ShareFileProvider(OAuth2Provider): id = "sharefile" name = "ShareFile" account_class = ShareFileAccount def extract_uid(self, data): return str(data.get("Id", "")) def extract_common_fields(self, data): return dict( email=data.get("Email", ""), username=data.get("Username", ""), name=data.get("FullName", ""), ) provider_classes = [ShareFileProvider] django-allauth-0.58.2/allauth/socialaccount/providers/sharefile/tests.py000066400000000000000000000014731452212273200264610ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import ShareFileProvider class ShareFileTests(OAuth2TestsMixin, TestCase): provider_id = ShareFileProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"access_token": "12345678abcdef", "refresh_token": "12345678abcdef", "token_type": "bearer", "expires_in": 28800, "appcp": "sharefile.com", "apicp": "sharefile.com", "subdomain": "example", "access_files_folders": true, "modify_files_folders": true, "admin_users": true, "admin_accounts": true, "change_my_settings": true, "web_app_login": true} """, ) django-allauth-0.58.2/allauth/socialaccount/providers/sharefile/urls.py000066400000000000000000000002541452212273200263000ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import ShareFileProvider urlpatterns = default_urlpatterns(ShareFileProvider) django-allauth-0.58.2/allauth/socialaccount/providers/sharefile/views.py000066400000000000000000000026301452212273200264500ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import ShareFileProvider class ShareFileOAuth2Adapter(OAuth2Adapter): provider_id = ShareFileProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) subdomain = settings.get("SUBDOMAIN", "secure") apicp = settings.get("APICP", "sharefile.com") provider_default_url = settings.get("DEFAULT_URL", "https://secure.sharefile.com") provider_default_api_url = "https://{}.sf-api.com".format(subdomain) provider_api_version = "v3" access_token_url = "https://{}.{}/oauth/token".format(subdomain, apicp) refresh_token_url = "https://{}.{}/oauth/token".format(subdomain, apicp) authorize_url = "{}/oauth/authorize".format(provider_default_url) profile_url = "{}/sf/{}/Users".format( provider_default_api_url, provider_api_version ) def complete_login(self, request, app, token, response): headers = {"Authorization": "Bearer {}".format(token.token)} extra_data = requests.get(self.profile_url, headers=headers).json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(ShareFileOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(ShareFileOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/shopify/000077500000000000000000000000001452212273200244575ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/shopify/__init__.py000066400000000000000000000000001452212273200265560ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/shopify/provider.py000066400000000000000000000032761452212273200266730ustar00rootroot00000000000000from django.conf import settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class ShopifyAccount(ProviderAccount): pass class ShopifyProvider(OAuth2Provider): id = "shopify" name = "Shopify" account_class = ShopifyAccount @property def is_per_user(self): grant_options = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("shopify", {}) .get("AUTH_PARAMS", {}) .get("grant_options[]", "") ) return grant_options.lower().strip() == "per-user" def get_auth_params(self, request, action): ret = super(ShopifyProvider, self).get_auth_params(request, action) shop = request.GET.get("shop", None) if shop: ret.update({"shop": shop}) return ret def get_default_scope(self): return ["read_orders", "read_products"] def extract_uid(self, data): if self.is_per_user: return str(data["associated_user"]["id"]) else: return str(data["shop"]["id"]) def extract_common_fields(self, data): if self.is_per_user: return dict( email=data["associated_user"]["email"], first_name=data["associated_user"]["first_name"], last_name=data["associated_user"]["last_name"], ) else: # See: https://docs.shopify.com/api/shop # Without online mode, User is only available with Shopify Plus, # email is the only common field return dict(email=data["shop"]["email"]) provider_classes = [ShopifyProvider] django-allauth-0.58.2/allauth/socialaccount/providers/shopify/tests.py000066400000000000000000000126021452212273200261740ustar00rootroot00000000000000import json from urllib.parse import parse_qs, urlparse from django.test.utils import override_settings from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase, mocked_response from .provider import ShopifyProvider class ShopifyTests(OAuth2TestsMixin, TestCase): provider_id = ShopifyProvider.id def _complete_shopify_login(self, q, resp, resp_mock, with_refresh_token): complete_url = reverse(self.provider.id + "_callback") self.assertGreater(q["redirect_uri"][0].find(complete_url), 0) response_json = self.get_login_response_json( with_refresh_token=with_refresh_token ) with mocked_response( MockedResponse(200, response_json, {"content-type": "application/json"}), resp_mock, ): resp = self.client.get( complete_url, { "code": "test", "state": q["state"][0], "shop": "test", }, ) return resp def login(self, resp_mock, process="login", with_refresh_token=True): url = ( reverse(self.provider.id + "_login") + "?" + urlencode({"process": process, "shop": "test"}) ) resp = self.client.post(url) self.assertEqual(resp.status_code, 302) p = urlparse(resp["location"]) q = parse_qs(p.query) resp = self._complete_shopify_login(q, resp, resp_mock, with_refresh_token) return resp def get_mocked_response(self): return MockedResponse( 200, """ { "shop": { "id": "1234566", "name": "Test Shop", "email": "email@example.com" } } """, ) @override_settings(SOCIALACCOUNT_PROVIDERS={"shopify": {"IS_EMBEDDED": True}}) class ShopifyEmbeddedTests(ShopifyTests): """ Shopify embedded apps (that run within an iFrame) require a JS (not server) redirect for starting the oauth2 process. See Also: https://help.shopify.com/api/sdks/embedded-app-sdk/getting-started#oauth """ def login(self, resp_mock, process="login", with_refresh_token=True): resp = self.client.post( reverse(self.provider.id + "_login") + "?" + urlencode({"process": process, "shop": "test"}), ) self.assertEqual(resp.status_code, 200) # No re-direct, JS must do it actual_content = resp.content.decode("utf8") self.assertTrue( "script" in actual_content, "Content missing script tag. [Actual: {}]".format(actual_content), ) self.assertTrue( resp.xframe_options_exempt, "Redirect JS must be allowed to run in Shopify iframe", ) self.assertTrue( "" in actual_content and "" in actual_content, "Expected standard HTML skeleton. [Actual: {}]".format(actual_content), ) p = urlparse( actual_content.split(";")[0].split('location.href = "')[1] ) q = parse_qs(p.query) resp = self._complete_shopify_login(q, resp, resp_mock, with_refresh_token) return resp @override_settings( SOCIALACCOUNT_PROVIDERS={ "shopify": {"AUTH_PARAMS": {"grant_options[]": "per-user"}} } ) class ShopifyPerUserAccessTests(ShopifyTests): """ Shopify has two access modes, offline (the default) and online/per-user. Enabling 'online' access should cause all-auth to tie the logged in Shopify user to the all-auth account (rather than the shop as a whole). See Also: https://help.shopify.com/api/getting-started/authentication/ oauth#api-access-modes """ def get_login_response_json(self, with_refresh_token=True): response_data = { "access_token": "testac", "scope": "write_orders,read_customers", "expires_in": 86399, "associated_user_scope": "write_orders", "associated_user": { "id": 902541635, "first_name": "Jon", "last_name": "Smith", "email": "jon@example.com", "account_owner": True, }, } if with_refresh_token: response_data["refresh_token"] = "testrf" return json.dumps(response_data) @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=True, SOCIALACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_EMAIL_REQUIRED=True, ) def test_associated_user(self): resp_mocks = self.get_mocked_response() resp = self.login(resp_mocks) self.assertRedirects(resp, "/accounts/profile/", fetch_redirect_response=False) social_account = SocialAccount.objects.filter( provider=self.provider.id, uid=902541635, ).first() self.assertIsNotNone(social_account) self.assertTrue("associated_user" in social_account.extra_data) self.assertEqual(social_account.user.email, "jon@example.com") self.assertEqual(social_account.user.first_name, "Jon") self.assertEqual(social_account.user.last_name, "Smith") django-allauth-0.58.2/allauth/socialaccount/providers/shopify/urls.py000066400000000000000000000002501452212273200260130ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import ShopifyProvider urlpatterns = default_urlpatterns(ShopifyProvider) django-allauth-0.58.2/allauth/socialaccount/providers/shopify/views.py000066400000000000000000000067661452212273200262050ustar00rootroot00000000000000import re import requests from django.conf import settings from django.http import HttpResponse, HttpResponseBadRequest from allauth.core.exceptions import ImmediateHttpResponse from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import ShopifyProvider class ShopifyOAuth2Adapter(OAuth2Adapter): provider_id = ShopifyProvider.id supports_state = False scope_delimiter = "," def _shop_domain(self): shop = self.request.GET.get("shop", "") if "." not in shop: shop = "{}.myshopify.com".format(shop) # Ensure the provided hostname parameter is a valid hostname, # ends with myshopify.com, and does not contain characters # other than letters (a-z), numbers (0-9), dots, and hyphens. if not re.match(r"^[a-z0-9-]+\.myshopify\.com$", shop): raise ImmediateHttpResponse( HttpResponseBadRequest("Invalid `shop` parameter") ) return shop def _shop_url(self, path): shop = self._shop_domain() return "https://{}{}".format(shop, path) @property def access_token_url(self): return self._shop_url("/admin/oauth/access_token") @property def authorize_url(self): return self._shop_url("/admin/oauth/authorize") @property def profile_url(self): return self._shop_url("/admin/shop.json") def complete_login(self, request, app, token, **kwargs): headers = {"X-Shopify-Access-Token": "{token}".format(token=token.token)} response = requests.get(self.profile_url, headers=headers) extra_data = response.json() associated_user = kwargs["response"].get("associated_user") if associated_user: extra_data["associated_user"] = associated_user return self.get_provider().sociallogin_from_response(request, extra_data) class ShopifyOAuth2LoginView(OAuth2LoginView): def dispatch(self, request, *args, **kwargs): is_embedded = ( getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}) .get("shopify", {}) .get("IS_EMBEDDED", False) ) if is_embedded: # TODO: This bypasses LOGIN_ON_GET, but: # # The Embedded App SDK (EASDK) and backwards compatibility layer # are being removed from Shopify on January 1, 2022. # # So this needs to be dropped/revisitted anyway. response = super().login(request, *args, **kwargs) """ Shopify embedded apps (that run within an iFrame) require a JS (not server) redirect for starting the oauth2 process. See Also: https://help.shopify.com/api/sdks/embedded-app-sdk/getting-started#oauth """ js = "".join( ( "" '", ) ) response = HttpResponse(content=js) # Because this view will be within shopify's iframe response.xframe_options_exempt = True return response return super().dispatch(request, *args, **kwargs) oauth2_login = ShopifyOAuth2LoginView.adapter_view(ShopifyOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(ShopifyOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/slack/000077500000000000000000000000001452212273200240735ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/slack/__init__.py000066400000000000000000000000001452212273200261720ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/slack/models.py000066400000000000000000000000001452212273200257160ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/slack/provider.py000066400000000000000000000017361452212273200263060ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class SlackAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("user").get("image_192", None) def to_str(self): dflt = super(SlackAccount, self).to_str() return "%s (%s)" % ( self.account.extra_data.get("name", ""), dflt, ) class SlackProvider(OAuth2Provider): id = "slack" name = "Slack" account_class = SlackAccount def extract_uid(self, data): return "%s_%s" % ( str(data.get("team").get("id")), str(data.get("user").get("id")), ) def extract_common_fields(self, data): user = data.get("user", {}) return {"name": user.get("name"), "email": user.get("email", None)} def get_default_scope(self): return ["identify"] provider_classes = [SlackProvider] django-allauth-0.58.2/allauth/socialaccount/providers/slack/tests.py000066400000000000000000000011271452212273200256100ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import SlackProvider class SlackOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = SlackProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "ok": true, "url": "https:\\/\\/myteam.slack.com\\/", "team": {"name": "My Team", "id": "U0G9QF9C6"}, "user": {"id": "T0G9PQBBK"}, "team_id": "T12345", "user_id": "U12345" }""", ) # noqa django-allauth-0.58.2/allauth/socialaccount/providers/slack/urls.py000066400000000000000000000002441452212273200254320ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import SlackProvider urlpatterns = default_urlpatterns(SlackProvider) django-allauth-0.58.2/allauth/socialaccount/providers/slack/views.py000066400000000000000000000021351452212273200256030ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import SlackProvider class SlackOAuth2Adapter(OAuth2Adapter): provider_id = SlackProvider.id access_token_url = "https://slack.com/api/oauth.access" authorize_url = "https://slack.com/oauth/authorize" identity_url = "https://slack.com/api/users.identity" def complete_login(self, request, app, token, **kwargs): extra_data = self.get_data(token.token) return self.get_provider().sociallogin_from_response(request, extra_data) def get_data(self, token): # Verify the user first hed = {"Authorization": "Bearer " + token} resp = requests.get(self.identity_url, headers=hed) resp = resp.json() if not resp.get("ok"): raise OAuth2Error() return resp oauth2_login = OAuth2LoginView.adapter_view(SlackOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(SlackOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/snapchat/000077500000000000000000000000001452212273200245775ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/snapchat/__init__.py000066400000000000000000000000001452212273200266760ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/snapchat/models.py000066400000000000000000000000001452212273200264220ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/snapchat/provider.py000066400000000000000000000021771452212273200270120ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class Scope(object): EXTERNAL_ID = "https://auth.snapchat.com/oauth2/api/user.external_id" DISPLAY_NAME = "https://auth.snapchat.com/oauth2/api/user.display_name" BITMOJI = "https://auth.snapchat.com/oauth2/api/user.bitmoji.avatar" class SnapchatAccount(ProviderAccount): def to_str(self): dflt = super(SnapchatAccount, self).to_str() return "%s (%s)" % ( self.account.extra_data.get("data").get("me").get("displayName", ""), dflt, ) class SnapchatProvider(OAuth2Provider): id = "snapchat" name = "Snapchat" account_class = SnapchatAccount def get_default_scope(self): scope = [Scope.EXTERNAL_ID, Scope.DISPLAY_NAME] return scope def extract_uid(self, data): return str(data.get("data").get("me").get("externalId")) def extract_common_fields(self, data): user = data.get("data", {}).get("me") return {"name": user.get("displayName")} provider_classes = [SnapchatProvider] django-allauth-0.58.2/allauth/socialaccount/providers/snapchat/tests.py000066400000000000000000000017601452212273200263170ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import SnapchatProvider class SnapchatOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = SnapchatProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "data":{ "me":{ "externalId":"CAESIPiRBp0e5gLDq7VVurQ3rVdmdbqxpOJWynjyBL/xlo0w", "displayName":"Karun Shrestha", "bitmoji":{ "avatar":"https://sdk.bitmoji.com/render/panel/336d1e96-9055-4818-81aa-adde45ec030f-3aBXH5B0ZPCr~grPTZScjprXRT2RkU90oSd7X_PjDFFnBe3wuFkD1R-v1.png?transparent=1&palette=1", "id":"3aBXH5B0ZPCr~grPTZScjprXRT2RkU90oSd7X_PjDFFnBe3wuFkD1R" } } }, "errors":[] }""", ) # noqa django-allauth-0.58.2/allauth/socialaccount/providers/snapchat/urls.py000066400000000000000000000002521452212273200261350ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import SnapchatProvider urlpatterns = default_urlpatterns(SnapchatProvider) django-allauth-0.58.2/allauth/socialaccount/providers/snapchat/views.py000066400000000000000000000034471452212273200263160ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import Scope, SnapchatProvider class SnapchatOAuth2Adapter(OAuth2Adapter): provider_id = SnapchatProvider.id access_token_url = "https://accounts.snapchat.com/accounts/oauth2/token" authorize_url = "https://accounts.snapchat.com/accounts/oauth2/auth" identity_url = "https://api.snapkit.com/v1/me" def complete_login(self, request, app, token, **kwargs): extra_data = self.get_data(token.token) return self.get_provider().sociallogin_from_response(request, extra_data) def get_data(self, token): provider_id = SnapchatProvider.id settings = app_settings.PROVIDERS.get(provider_id, {}) provider_scope = settings.get( "SCOPE", "['https://auth.snapchat.com/oauth2/api/user.external_id', 'https://auth.snapchat.com/oauth2/api/user.display_name']", ) hed = { "Authorization": "Bearer " + token, "Content-Type": "application/json;charset=UTF-8", } if Scope.BITMOJI in provider_scope: data = {"query": "{ me { externalId displayName bitmoji { avatar id } } }"} else: data = {"query": "{ me { externalId displayName } }"} resp = requests.post(self.identity_url, headers=hed, json=data) resp.raise_for_status() resp = resp.json() if not resp.get("data"): raise OAuth2Error() return resp oauth2_login = OAuth2LoginView.adapter_view(SnapchatOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(SnapchatOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/soundcloud/000077500000000000000000000000001452212273200251555ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/soundcloud/__init__.py000066400000000000000000000000001452212273200272540ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/soundcloud/provider.py000066400000000000000000000020141452212273200273560ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class SoundCloudAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("permalink_url") def get_avatar_url(self): return self.account.extra_data.get("avatar_url") def to_str(self): dflt = super(SoundCloudAccount, self).to_str() full_name = self.account.extra_data.get("full_name") username = self.account.extra_data.get("username") return full_name or username or dflt class SoundCloudProvider(OAuth2Provider): id = "soundcloud" name = "SoundCloud" account_class = SoundCloudAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( name=data.get("full_name"), username=data.get("username"), email=data.get("email"), ) provider_classes = [SoundCloudProvider] django-allauth-0.58.2/allauth/socialaccount/providers/soundcloud/tests.py000066400000000000000000000025121452212273200266710ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import SoundCloudProvider class SoundCloudTests(OAuth2TestsMixin, TestCase): provider_id = SoundCloudProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "website": null, "myspace_name": null, "public_favorites_count": 0, "followings_count": 1, "full_name": "", "id": 22341947, "city": null, "track_count": 0, "playlist_count": 0, "discogs_name": null, "private_tracks_count": 0, "followers_count": 0, "online": true, "username": "user187631676", "description": null, "kind": "user", "website_title": null, "primary_email_confirmed": false, "permalink_url": "http://soundcloud.com/user187631676", "private_playlists_count": 0, "permalink": "user187631676", "country": null, "uri": "https://api.soundcloud.com/users/22341947", "avatar_url": "https://a1.sndcdn.com/images/default_avatar_large.png?4b4189b", "plan": "Free" }""", ) django-allauth-0.58.2/allauth/socialaccount/providers/soundcloud/urls.py000066400000000000000000000002561452212273200265170ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import SoundCloudProvider urlpatterns = default_urlpatterns(SoundCloudProvider) django-allauth-0.58.2/allauth/socialaccount/providers/soundcloud/views.py000066400000000000000000000015231452212273200266650ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import SoundCloudProvider class SoundCloudOAuth2Adapter(OAuth2Adapter): provider_id = SoundCloudProvider.id access_token_url = "https://api.soundcloud.com/oauth2/token" authorize_url = "https://soundcloud.com/connect" profile_url = "https://api.soundcloud.com/me.json" def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.profile_url, params={"oauth_token": token.token}) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(SoundCloudOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(SoundCloudOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/spotify/000077500000000000000000000000001452212273200244735ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/spotify/__init__.py000066400000000000000000000000001452212273200265720ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/spotify/provider.py000066400000000000000000000021661452212273200267040ustar00rootroot00000000000000from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class SpotifyAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("external_urls").get("spotify") def get_avatar_url(self): try: return self.account.extra_data.get("images")[0].get("url") except IndexError: return None def to_str(self): dflt = super(SpotifyAccount, self).to_str() return self.account.extra_data.get("display_name", dflt) class SpotifyOAuth2Provider(OAuth2Provider): id = "spotify" name = "Spotify" account_class = SpotifyAccount def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict(name=data.get("display_name"), email=data.get("email")) def get_default_scope(self): scope = [] if app_settings.QUERY_EMAIL: scope.append("user-read-email") return scope provider_classes = [SpotifyOAuth2Provider] django-allauth-0.58.2/allauth/socialaccount/providers/spotify/tests.py000066400000000000000000000023321452212273200262070ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import SpotifyOAuth2Provider class SpotifyOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = SpotifyOAuth2Provider.id def get_mocked_response(self): return MockedResponse( 200, """{ "birthdate": "1937-06-01", "country": "SE", "display_name": "JM Wizzler", "email": "email@example.com", "external_urls": { "spotify": "https://open.spotify.com/user/wizzler" }, "followers" : { "href" : null, "total" : 3829 }, "href": "https://api.spotify.com/v1/users/wizzler", "id": "wizzler", "images": [ { "height": null, "url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-frc3/t1.0-1/1970403_10152215092574354_1798272330_n.jpg", "width": null } ], "product": "premium", "type": "user", "uri": "spotify:user:wizzler" }""", ) # noqa django-allauth-0.58.2/allauth/socialaccount/providers/spotify/urls.py000066400000000000000000000002631452212273200260330ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import SpotifyOAuth2Provider urlpatterns = default_urlpatterns(SpotifyOAuth2Provider) django-allauth-0.58.2/allauth/socialaccount/providers/spotify/views.py000066400000000000000000000015241452212273200262040ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import SpotifyOAuth2Provider class SpotifyOAuth2Adapter(OAuth2Adapter): provider_id = SpotifyOAuth2Provider.id access_token_url = "https://accounts.spotify.com/api/token" authorize_url = "https://accounts.spotify.com/authorize" profile_url = "https://api.spotify.com/v1/me" def complete_login(self, request, app, token, **kwargs): extra_data = requests.get( self.profile_url, params={"access_token": token.token} ) return self.get_provider().sociallogin_from_response(request, extra_data.json()) oauth_login = OAuth2LoginView.adapter_view(SpotifyOAuth2Adapter) oauth_callback = OAuth2CallbackView.adapter_view(SpotifyOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/stackexchange/000077500000000000000000000000001452212273200256065ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/stackexchange/__init__.py000066400000000000000000000000001452212273200277050ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/stackexchange/provider.py000066400000000000000000000021641452212273200300150ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class StackExchangeAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("html_url") def get_avatar_url(self): return self.account.extra_data.get("avatar_url") def to_str(self): dflt = super(StackExchangeAccount, self).to_str() return self.account.extra_data.get("name", dflt) class StackExchangeProvider(OAuth2Provider): id = "stackexchange" name = "Stack Exchange" account_class = StackExchangeAccount def get_site(self): settings = self.get_settings() return settings.get("SITE", "stackoverflow") def extract_uid(self, data): # `user_id` varies if you use the same account for # e.g. StackOverflow and ServerFault. Therefore, we pick # `account_id`. uid = str(data["account_id"]) return uid def extract_common_fields(self, data): return dict(username=data.get("display_name")) provider_classes = [StackExchangeProvider] django-allauth-0.58.2/allauth/socialaccount/providers/stackexchange/tests.py000066400000000000000000000030061452212273200273210ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import StackExchangeProvider class StackExchangeTests(OAuth2TestsMixin, TestCase): provider_id = StackExchangeProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "has_more": false, "items": [ { "is_employee": false, "last_access_date": 1356200390, "display_name": "pennersr", "account_id": 291652, "badge_counts": { "bronze": 2, "silver": 2, "gold": 0 }, "last_modified_date": 1356199552, "profile_image": "http://www.gravatar.com/avatar/053d648486d567d3143d6bad8df8cfeb?d=identicon&r=PG", "user_type": "registered", "creation_date": 1296223711, "reputation_change_quarter": 148, "reputation_change_year": 378, "reputation": 504, "link": "http://stackoverflow.com/users/593944/pennersr", "reputation_change_week": 0, "user_id": 593944, "reputation_change_month": 10, "reputation_change_day": 0 } ], "quota_max": 10000, "quota_remaining": 9999 }""", ) # noqa django-allauth-0.58.2/allauth/socialaccount/providers/stackexchange/urls.py000066400000000000000000000002641452212273200271470ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import StackExchangeProvider urlpatterns = default_urlpatterns(StackExchangeProvider) django-allauth-0.58.2/allauth/socialaccount/providers/stackexchange/views.py000066400000000000000000000020421452212273200273130ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import StackExchangeProvider class StackExchangeOAuth2Adapter(OAuth2Adapter): provider_id = StackExchangeProvider.id access_token_url = "https://stackexchange.com/oauth/access_token" authorize_url = "https://stackexchange.com/oauth" profile_url = "https://api.stackexchange.com/2.1/me" def complete_login(self, request, app, token, **kwargs): provider = self.get_provider() site = provider.get_site() resp = requests.get( self.profile_url, params={"access_token": token.token, "key": app.key, "site": site}, ) resp.raise_for_status() extra_data = resp.json()["items"][0] return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(StackExchangeOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(StackExchangeOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/steam/000077500000000000000000000000001452212273200241075ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/steam/__init__.py000066400000000000000000000000001452212273200262060ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/steam/models.py000066400000000000000000000000001452212273200257320ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/steam/provider.py000066400000000000000000000060651452212273200263220ustar00rootroot00000000000000import requests from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.providers.openid.provider import ( OpenIDAccount, OpenIDProvider, ) if "allauth.socialaccount.providers.openid" not in settings.INSTALLED_APPS: raise ImproperlyConfigured( "The steam provider requires 'allauth.socialaccount.providers.openid' to be installed" ) class SteamAccount(OpenIDAccount): def to_str(self): dflt = super(SteamAccount, self).to_str() return self.account.extra_data.get("personaname", dflt) def get_profile_url(self): return self.account.extra_data.get("profileurl") def get_avatar_url(self): return ( self.account.extra_data.get("avatarfull") or self.account.extra_data.get("avatarmedium") or self.account.extra_data.get("avatar") ) def extract_steam_id(url): return url.lstrip("https://steamcommunity.com/openid/id/") def request_steam_account_summary(api_key, steam_id): api_base = "https://api.steampowered.com/" method = "ISteamUser/GetPlayerSummaries/v0002/" params = {"key": api_key, "steamids": steam_id} resp = requests.get(api_base + method, params) resp.raise_for_status() data = resp.json() playerlist = data.get("response", {}).get("players", []) return playerlist[0] if playerlist else {"steamid": steam_id} class SteamOpenIDProvider(OpenIDProvider): id = "steam" name = "Steam" account_class = SteamAccount uses_apps = True def __init__(self, request, app=None): if app is None: app = get_adapter().get_app(request, self.id) super().__init__(request, app=app) def get_login_url(self, request, **kwargs): url = reverse("steam_login") if kwargs: url += "?" + urlencode(kwargs) return url def sociallogin_from_response(self, request, response): steam_id = extract_steam_id(response.identity_url) steam_api_key = self.app.secret response._extra = request_steam_account_summary(steam_api_key, steam_id) return super(SteamOpenIDProvider, self).sociallogin_from_response( request, response ) def extract_uid(self, response): return response._extra["steamid"] def extract_extra_data(self, response): return response._extra.copy() def extract_common_fields(self, response): full_name = response._extra.get("realname", "").strip() if full_name.count(" ") == 1: first_name, last_name = full_name.split() else: first_name, last_name = full_name, "" username = response._extra.get("personaname", "") return { "username": username or response._extra["steamid"], "first_name": first_name, "last_name": last_name, "full_name": full_name, } provider_classes = [SteamOpenIDProvider] django-allauth-0.58.2/allauth/socialaccount/providers/steam/urls.py000066400000000000000000000003211452212273200254420ustar00rootroot00000000000000from django.urls import path from . import views urlpatterns = [ path("steam/login/", views.steam_login, name="steam_login"), path("steam/callback/", views.steam_callback, name="steam_callback"), ] django-allauth-0.58.2/allauth/socialaccount/providers/steam/views.py000066400000000000000000000020751452212273200256220ustar00rootroot00000000000000""" OpenID Adapter for Steam The Steam login API is simple OpenID but requires extra API calls for basic resources such as usernames. Resources: * Steam Web API Documentation https://steamcommunity.com/dev * Steam Partner API documentation https://partner.steamgames.com/doc/features/auth#website """ from django.urls import reverse from allauth.socialaccount.providers.openid.views import ( OpenIDCallbackView, OpenIDLoginView, ) from .provider import SteamOpenIDProvider STEAM_OPENID_URL = "https://steamcommunity.com/openid" class SteamOpenIDLoginView(OpenIDLoginView): provider = SteamOpenIDProvider def get_form(self): items = dict(list(self.request.GET.items()) + list(self.request.POST.items())) items["openid"] = STEAM_OPENID_URL return self.form_class(items) def get_callback_url(self): return reverse(steam_callback) class SteamOpenIDCallbackView(OpenIDCallbackView): provider = SteamOpenIDProvider steam_login = SteamOpenIDLoginView.as_view() steam_callback = SteamOpenIDCallbackView.as_view() django-allauth-0.58.2/allauth/socialaccount/providers/stocktwits/000077500000000000000000000000001452212273200252145ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/stocktwits/__init__.py000066400000000000000000000000001452212273200273130ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/stocktwits/provider.py000066400000000000000000000014601452212273200274210ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class StocktwitsAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("user", {}).get("avatar_url_ssl") def to_str(self): dflt = super(StocktwitsAccount, self).to_str() return self.account.extra_data.get("user", {}).get("name", dflt) class StocktwitsProvider(OAuth2Provider): id = "stocktwits" name = "Stocktwits" account_class = StocktwitsAccount def extract_uid(self, data): return str(data["user"]["id"]) def extract_common_fields(self, data): return dict( full_name=data.get("user", {}).get("name"), ) provider_classes = [StocktwitsProvider] django-allauth-0.58.2/allauth/socialaccount/providers/stocktwits/tests.py000066400000000000000000000013451452212273200267330ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import StocktwitsProvider class StocktwitsTests(OAuth2TestsMixin, TestCase): provider_id = StocktwitsProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "response": { "status": 200 }, "user": { "id": 3, "username": "zerobeta", "name": "Justin Paterno", "avatar_url": "http://avatars.stocktwits.com/images/default_avatar_thumb.jpg", "avatar_url_ssl": "https://s3.amazonaws.com/st-avatars/images/default_avatar_thumb.jpg", "identity": "Official", "classification": [ "ir" ] } } """, ) # noqa django-allauth-0.58.2/allauth/socialaccount/providers/stocktwits/urls.py000066400000000000000000000002561452212273200265560ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import StocktwitsProvider urlpatterns = default_urlpatterns(StocktwitsProvider) django-allauth-0.58.2/allauth/socialaccount/providers/stocktwits/views.py000066400000000000000000000017431452212273200267300ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import StocktwitsProvider class StocktwitsOAuth2Adapter(OAuth2Adapter): provider_id = StocktwitsProvider.id access_token_url = "https://api.stocktwits.com/api/2/oauth/token" authorize_url = "https://api.stocktwits.com/api/2/oauth/authorize" profile_url = "https://api.stocktwits.com/api/2/streams/user/{user}.json" scope_delimiter = "," def complete_login(self, request, app, token, **kwargs): user_id = kwargs.get("response").get("user_id") resp = requests.get(self.profile_url.format(user=user_id)) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(StocktwitsOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(StocktwitsOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/strava/000077500000000000000000000000001452212273200242765ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/strava/__init__.py000066400000000000000000000000001452212273200263750ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/strava/provider.py000066400000000000000000000027241452212273200265070ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class StravaAccount(ProviderAccount): def get_profile_url(self): id = self.account.extra_data.get("id") if id: return "https://www.strava.com/athletes/{}".format(id) return None def get_avatar_url(self): avatar = self.account.extra_data.get("profile") if avatar and avatar != "avatar/athlete/large.png": return avatar return None def to_str(self): name = super(StravaAccount, self).to_str() return self.account.extra_data.get("name", name) class StravaProvider(OAuth2Provider): id = "strava" name = "Strava" account_class = StravaAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): extra_common = super(StravaProvider, self).extract_common_fields(data) firstname = data.get("firstname") lastname = data.get("lastname") name = " ".join(part for part in (firstname, lastname) if part) extra_common.update( username=data.get("username"), email=data.get("email"), first_name=firstname, last_name=lastname, name=name.strip(), ) return extra_common def get_default_scope(self): return ["read,activity:read"] provider_classes = [StravaProvider] django-allauth-0.58.2/allauth/socialaccount/providers/strava/tests.py000066400000000000000000000065531452212273200260230ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.contrib.auth.models import User from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import StravaProvider class StravaTests(OAuth2TestsMixin, TestCase): provider_id = StravaProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "id": 32641234, "username": null, "resource_state": 2, "firstname": "georges", "lastname": "camembert", "city": "London", "state": "England", "country": "United Kingdom", "sex": "M", "premium": false, "summit": false, "created_at": "2017-07-12T12:42:52Z", "updated_at": "2017-10-21T11:01:23Z", "badge_type_id": 0, "profile_medium": "avatar/athlete/medium.png", "profile": "avatar/athlete/large.png", "friend": null, "follower": null, "email": "bill@example.com" }""", ) # noqa def get_mocked_response_avatar_invalid_id(self): """Profile including realistic avatar URL user ID set to 0 to test edge case where id would be missing""" return MockedResponse( 200, """{ "id": 0, "username": null, "resource_state": 2, "firstname": "georges", "lastname": "camembert", "city": "London", "state": "England", "country": "United Kingdom", "sex": "M", "premium": false, "summit": false, "created_at": "2017-07-12T12:42:52Z", "updated_at": "2017-10-21T11:01:23Z", "badge_type_id": 0, "profile_medium": "https://cloudfront.net/1/medium.jpg", "profile": "https://cloudfront.net/1/large.jpg", "friend": null, "follower": null, "email": "bill@example.com" }""", ) # noqa def test_valid_avatar(self): """test response with Avatar URL""" self.login(self.get_mocked_response_avatar_invalid_id()) user = User.objects.get(email="bill@example.com") soc_acc = SocialAccount.objects.filter( user=user, provider=self.provider.id ).get() provider_account = soc_acc.get_provider_account() self.assertEqual( provider_account.get_avatar_url(), "https://cloudfront.net/1/large.jpg", ) self.assertIsNone(provider_account.get_profile_url()) def get_login_response_json(self, with_refresh_token=True): rt = "" if with_refresh_token: rt = ',"refresh_token": "testrf"' return ( """{ "uid":"weibo", "access_token":"testac", "livemode": false, "token_type": "bearer", "strava_publishable_key": "pk_test_someteskey", "strava_user_id": "acct_sometestid", "scope": "read_write" %s }""" % rt ) django-allauth-0.58.2/allauth/socialaccount/providers/strava/urls.py000066400000000000000000000002461452212273200256370ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import StravaProvider urlpatterns = default_urlpatterns(StravaProvider) django-allauth-0.58.2/allauth/socialaccount/providers/strava/views.py000066400000000000000000000015671452212273200260160ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import StravaProvider class StravaOauth2Adapter(OAuth2Adapter): provider_id = StravaProvider.id access_token_url = "https://www.strava.com/oauth/token" authorize_url = "https://www.strava.com/oauth/authorize" profile_url = "https://www.strava.com/api/v3/athlete" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(StravaOauth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(StravaOauth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/stripe/000077500000000000000000000000001452212273200243045ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/stripe/__init__.py000066400000000000000000000000001452212273200264030ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/stripe/provider.py000066400000000000000000000013161452212273200265110ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class StripeAccount(ProviderAccount): def to_str(self): default = super(StripeAccount, self).to_str() return self.account.extra_data.get("business_name", default) class StripeProvider(OAuth2Provider): id = "stripe" name = "Stripe" account_class = StripeAccount def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict(name=data.get("display_name"), email=data.get("email")) def get_default_scope(self): return ["read_only"] provider_classes = [StripeProvider] django-allauth-0.58.2/allauth/socialaccount/providers/stripe/tests.py000066400000000000000000000031531452212273200260220ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import StripeProvider class StripeTests(OAuth2TestsMixin, TestCase): provider_id = StripeProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "id": "acct_sometestid", "object": "account", "business_logo": null, "business_name": null, "business_url": "example.com", "charges_enabled": true, "country": "SE", "currencies_supported": [ "usd", "eur", "sek" ], "default_currency": "eur", "details_submitted": true, "display_name": "Test", "email": "test@example.com", "managed": false, "metadata": {}, "statement_descriptor": "TEST.COM", "support_phone": "+460123456789", "timezone": "Europe/Stockholm", "transfers_enabled": true }""", ) def get_login_response_json(self, with_refresh_token=True): rt = "" if with_refresh_token: rt = ',"refresh_token": "testrf"' return ( """{ "uid":"weibo", "access_token":"testac", "livemode": false, "token_type": "bearer", "stripe_publishable_key": "pk_test_someteskey", "stripe_user_id": "acct_sometestid", "scope": "read_write" %s }""" % rt ) django-allauth-0.58.2/allauth/socialaccount/providers/stripe/urls.py000066400000000000000000000002461452212273200256450ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import StripeProvider urlpatterns = default_urlpatterns(StripeProvider) django-allauth-0.58.2/allauth/socialaccount/providers/stripe/views.py000066400000000000000000000017001452212273200260110ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import StripeProvider class StripeOAuth2Adapter(OAuth2Adapter): provider_id = StripeProvider.id access_token_url = "https://connect.stripe.com/oauth/token" authorize_url = "https://connect.stripe.com/oauth/authorize" profile_url = "https://api.stripe.com/v1/accounts/%s" def complete_login(self, request, app, token, response, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get( self.profile_url % response.get("stripe_user_id"), headers=headers ) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(StripeOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(StripeOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/telegram/000077500000000000000000000000001452212273200245765ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/telegram/__init__.py000066400000000000000000000000001452212273200266750ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/telegram/provider.py000066400000000000000000000025301452212273200270020ustar00rootroot00000000000000from django.urls import reverse from django.utils.http import urlencode from allauth.socialaccount.providers.base import Provider, ProviderAccount class TelegramAccount(ProviderAccount): pass class TelegramProvider(Provider): id = "telegram" name = "Telegram" account_class = TelegramAccount def get_login_url(self, request, **kwargs): url = reverse("telegram_login") if kwargs: url = url + "?" + urlencode(kwargs) return url def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): ret = {} if data.get("first_name"): ret["first_name"] = data.get("first_name") if data.get("last_name"): ret["last_name"] = data.get("last_name") if data.get("username"): ret["username"] = data.get("username") return ret def get_auth_date_validity(self): auth_date_validity = 30 settings = self.get_settings() if "AUTH_PARAMS" in settings: auth_date_validity = settings.get("AUTH_PARAMS").get( "auth_date_validity", auth_date_validity ) auth_date_validity = self.app.settings.get( "auth_date_validity", auth_date_validity ) return auth_date_validity provider_classes = [TelegramProvider] django-allauth-0.58.2/allauth/socialaccount/providers/telegram/static/000077500000000000000000000000001452212273200260655ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/telegram/static/telegram/000077500000000000000000000000001452212273200276655ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/telegram/static/telegram/js/000077500000000000000000000000001452212273200303015ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/telegram/static/telegram/js/telegram.js000066400000000000000000000007301452212273200324370ustar00rootroot00000000000000/* global document, window */ (function () { 'use strict' const f = document.createElement('form') f.method = 'POST' f.action = '' const fragment = window.location.hash.substr(1) const fragmentParams = new URLSearchParams(fragment) for (const param of fragmentParams) { const d = document.createElement('input') d.type = 'hidden' d.name = param[0] d.value = param[1] f.appendChild(d) } document.body.appendChild(f) f.submit() })() django-allauth-0.58.2/allauth/socialaccount/providers/telegram/templates/000077500000000000000000000000001452212273200265745ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/telegram/templates/telegram/000077500000000000000000000000001452212273200303745ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/telegram/templates/telegram/callback.html000066400000000000000000000002261452212273200330160ustar00rootroot00000000000000{% load static %} django-allauth-0.58.2/allauth/socialaccount/providers/telegram/tests.py000066400000000000000000000031211452212273200263070ustar00rootroot00000000000000import base64 import json from django.urls import reverse import pytest from pytest_django.asserts import assertTemplateUsed from allauth.socialaccount.models import SocialAccount @pytest.fixture def telegram_app(settings): settings.SOCIALACCOUNT_PROVIDERS = { "telegram": { "APPS": [ { "client_id": "123", } ] } } def test_login(client, db, telegram_app): resp = client.get(reverse("telegram_login")) assert resp.status_code == 302 assert ( resp["location"] == "https://oauth.telegram.org/auth?origin=http%3A%2F%2Ftestserver%2F&bot_id=123&request_access=write&embed=0&return_to=http%3A%2F%2Ftestserver%2Ftelegram%2Flogin%2Fcallback%2F%3F" ) def test_callback_get(client, db, telegram_app): resp = client.get(reverse("telegram_callback")) assert resp.status_code == 200 assertTemplateUsed(resp, "telegram/callback.html") def test_callback(client, db, telegram_app): auth_result = ( base64.b64encode( json.dumps( { "id": "123", "hash": "0744ab643757850e82fa8b4ac35978dca287c81df6a9829032d868c7f90e3b99", "auth_date": 2342342342, } ).encode("utf8") ) .decode("ascii") .replace("=", "") ) post_data = { "tgAuthResult": auth_result, } resp = client.post(reverse("telegram_callback"), post_data) assert resp.status_code == 302 assert SocialAccount.objects.filter(uid="123").exists() django-allauth-0.58.2/allauth/socialaccount/providers/telegram/urls.py000066400000000000000000000003271452212273200261370ustar00rootroot00000000000000from django.urls import path from . import views urlpatterns = [ path("telegram/login/", views.login, name="telegram_login"), path("telegram/login/callback/", views.callback, name="telegram_callback"), ] django-allauth-0.58.2/allauth/socialaccount/providers/telegram/views.py000066400000000000000000000050521452212273200263070ustar00rootroot00000000000000import base64 import hashlib import hmac import json import time from django.http import HttpResponseRedirect from django.shortcuts import render from django.urls import reverse from django.utils.decorators import method_decorator from django.utils.http import urlencode from django.views import View from django.views.decorators.csrf import csrf_exempt from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.helpers import ( complete_social_login, render_authentication_error, ) from .provider import TelegramProvider class LoginView(View): def dispatch(self, request): provider = get_adapter().get_provider(request, TelegramProvider.id) return_to = request.build_absolute_uri( reverse("telegram_callback") + "?" + request.GET.urlencode() ) url = "https://oauth.telegram.org/auth?" + urlencode( { "origin": request.build_absolute_uri("/"), "bot_id": provider.app.client_id, "request_access": "write", "embed": "0", "return_to": return_to, } ) return HttpResponseRedirect(url) login = LoginView.as_view() @method_decorator(csrf_exempt, name="dispatch") class CallbackView(View): def get(self, request): return render(request, "telegram/callback.html") def post(self, request): result = request.POST.get("tgAuthResult") padding = "=" * (4 - (len(result) % 4)) data = json.loads(base64.b64decode(result + padding)) adapter = get_adapter() provider = adapter.get_provider(request, TelegramProvider.id) hash = data.pop("hash") payload = "\n".join(sorted(["{}={}".format(k, v) for k, v in data.items()])) token = provider.app.secret token_sha256 = hashlib.sha256(token.encode()).digest() expected_hash = hmac.new( token_sha256, payload.encode(), hashlib.sha256 ).hexdigest() auth_date = int(data.pop("auth_date")) auth_date_validity = provider.get_auth_date_validity() if hash != expected_hash or time.time() - auth_date > auth_date_validity: return render_authentication_error( request, provider_id=provider.id, extra_context={"response": data} ) login = provider.sociallogin_from_response(request, data) process = request.GET.get("process") if process: login.state["process"] = process return complete_social_login(request, login) callback = CallbackView.as_view() django-allauth-0.58.2/allauth/socialaccount/providers/trainingpeaks/000077500000000000000000000000001452212273200256355ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/trainingpeaks/__init__.py000066400000000000000000000000001452212273200277340ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/trainingpeaks/provider.py000066400000000000000000000031051452212273200300400ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class TrainingPeaksAccount(ProviderAccount): def get_profile_url(self): return "https://app.trainingpeaks.com" def get_avatar_url(self): return None def to_str(self): name = ( self.account.extra_data.get("FirstName") + " " + self.account.extra_data.get("LastName") ) if name != " ": return name return super(TrainingPeaksAccount, self).to_str() class TrainingPeaksProvider(OAuth2Provider): id = "trainingpeaks" name = "TrainingPeaks" account_class = TrainingPeaksAccount def extract_uid(self, data): return str(data["Id"]) def extract_common_fields(self, data): extra_common = super(TrainingPeaksProvider, self).extract_common_fields(data) firstname = data.get("FirstName") lastname = data.get("LastName") # fallback username as there is actually no Username in response username = firstname.strip().lower() + "." + lastname.strip().lower() name = " ".join(part for part in (firstname, lastname) if part) extra_common.update( username=data.get("username", username), email=data.get("Email"), first_name=firstname, last_name=lastname, name=name.strip(), ) return extra_common def get_default_scope(self): return ["athlete:profile"] provider_classes = [TrainingPeaksProvider] django-allauth-0.58.2/allauth/socialaccount/providers/trainingpeaks/tests.py000066400000000000000000000053221452212273200273530ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Run just this suite: python manage.py test allauth.socialaccount.providers.trainingpeaks.tests.TrainingPeaksTests """ from __future__ import unicode_literals from collections import namedtuple from django.test.utils import override_settings from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import TrainingPeaksProvider from .views import TrainingPeaksOAuth2Adapter class TrainingPeaksTests(OAuth2TestsMixin, TestCase): provider_id = TrainingPeaksProvider.id def get_mocked_response(self): return MockedResponse( 200, """{ "Id": 123456, "FirstName": "John", "LastName": "Doe", "Email": "user@example.com", "DateOfBirth": "1986-02-01T00:00:00", "CoachedBy": 987654, "Weight": 87.5223617553711 }""", ) # noqa def get_login_response_json(self, with_refresh_token=True): rtoken = "" if with_refresh_token: rtoken = ',"refresh_token": "testrf"' return ( """{ "access_token" : "testac", "token_type" : "bearer", "expires_in" : 600, "scope": "scopes granted" %s }""" % rtoken ) def test_default_use_sandbox_uri(self): adapter = TrainingPeaksOAuth2Adapter(None) self.assertTrue(".sandbox." in adapter.authorize_url) self.assertTrue(".sandbox." in adapter.access_token_url) self.assertTrue(".sandbox." in adapter.profile_url) @override_settings( SOCIALACCOUNT_PROVIDERS={"trainingpeaks": {"USE_PRODUCTION": True}} ) def test_use_production_uri(self): adapter = TrainingPeaksOAuth2Adapter(None) self.assertFalse(".sandbox." in adapter.authorize_url) self.assertFalse(".sandbox." in adapter.access_token_url) self.assertFalse(".sandbox." in adapter.profile_url) def test_scope_from_default(self): Request = namedtuple("request", ["GET"]) mock_request = Request(GET={}) scope = self.provider.get_scope(mock_request) self.assertTrue("athlete:profile" in scope) @override_settings( SOCIALACCOUNT_PROVIDERS={ "trainingpeaks": {"SCOPE": ["athlete:profile", "workouts", "workouts:wod"]} } ) def test_scope_from_settings(self): Request = namedtuple("request", ["GET"]) mock_request = Request(GET={}) scope = self.provider.get_scope(mock_request) for item in ("athlete:profile", "workouts", "workouts:wod"): self.assertTrue(item in scope) django-allauth-0.58.2/allauth/socialaccount/providers/trainingpeaks/urls.py000066400000000000000000000002641452212273200271760ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import TrainingPeaksProvider urlpatterns = default_urlpatterns(TrainingPeaksProvider) django-allauth-0.58.2/allauth/socialaccount/providers/trainingpeaks/views.py000066400000000000000000000035051452212273200273470ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import TrainingPeaksProvider class TrainingPeaksOAuth2Adapter(OAuth2Adapter): # https://github.com/TrainingPeaks/PartnersAPI/wiki/OAuth provider_id = TrainingPeaksProvider.id def get_settings(self): """Provider settings""" return app_settings.PROVIDERS.get(self.provider_id, {}) def get_hostname(self): """Return hostname depending on sandbox setting""" settings = self.get_settings() if settings.get("USE_PRODUCTION"): return "trainingpeaks.com" return "sandbox.trainingpeaks.com" @property def access_token_url(self): return "https://oauth." + self.get_hostname() + "/oauth/token" @property def authorize_url(self): return "https://oauth." + self.get_hostname() + "/OAuth/Authorize" @property def profile_url(self): return "https://api." + self.get_hostname() + "/v1/athlete/profile" @property def api_hostname(self): """Return https://api.hostname.tld""" return "https://api." + self.get_hostname() # https://oauth.sandbox.trainingpeaks.com/oauth/deauthorize scope_delimiter = " " def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} response = requests.get(self.profile_url, headers=headers) response.raise_for_status() extra_data = response.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(TrainingPeaksOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(TrainingPeaksOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/trello/000077500000000000000000000000001452212273200242775ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/trello/__init__.py000066400000000000000000000000001452212273200263760ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/trello/provider.py000066400000000000000000000021621452212273200265040ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class TrelloAccount(ProviderAccount): def get_profile_url(self): return None def get_avatar_url(self): return None class TrelloProvider(OAuthProvider): id = "trello" name = "Trello" account_class = TrelloAccount def get_default_scope(self): return ["read"] def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict( email=data.get("email"), username=data.get("username"), name=data.get("name"), ) def get_auth_params(self, request, action): data = super(TrelloProvider, self).get_auth_params(request, action) data["type"] = "web_server" data["name"] = self.app.name data["scope"] = self.get_scope(request) # define here for how long it will be, this can be configured on the # social app data["expiration"] = "never" return data provider_classes = [TrelloProvider] django-allauth-0.58.2/allauth/socialaccount/providers/trello/tests.py000066400000000000000000000007571452212273200260240ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import TrelloProvider class TrelloTests(OAuthTestsMixin, TestCase): provider_id = TrelloProvider.id def get_mocked_response(self): return [ MockedResponse( 200, r""" {"id": "123", "email": "raymond.penners@example.com", "username": "pennersr", "name": "Raymond"} """, ), ] # noqa django-allauth-0.58.2/allauth/socialaccount/providers/trello/urls.py000066400000000000000000000002451452212273200256370ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import TrelloProvider urlpatterns = default_urlpatterns(TrelloProvider) django-allauth-0.58.2/allauth/socialaccount/providers/trello/views.py000066400000000000000000000022031452212273200260030ustar00rootroot00000000000000import requests from django.utils.http import urlencode from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import TrelloProvider class TrelloOAuthAdapter(OAuthAdapter): provider_id = TrelloProvider.id request_token_url = "https://trello.com/1/OAuthGetRequestToken" authorize_url = "https://trello.com/1/OAuthAuthorizeToken" access_token_url = "https://trello.com/1/OAuthGetAccessToken" def complete_login(self, request, app, token, response): # we need to get the member id and the other information info_url = "{base}?{query}".format( base="https://api.trello.com/1/members/me", query=urlencode({"key": app.key, "token": response.get("oauth_token")}), ) resp = requests.get(info_url) resp.raise_for_status() extra_data = resp.json() result = self.get_provider().sociallogin_from_response(request, extra_data) return result oauth_login = OAuthLoginView.adapter_view(TrelloOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(TrelloOAuthAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/tumblr/000077500000000000000000000000001452212273200243035ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/tumblr/__init__.py000066400000000000000000000000261452212273200264120ustar00rootroot00000000000000__author__ = "jshedd" django-allauth-0.58.2/allauth/socialaccount/providers/tumblr/provider.py000066400000000000000000000013751452212273200265150ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class TumblrAccount(ProviderAccount): def get_profile_url_(self): return "http://%s.tumblr.com/" % self.account.extra_data.get("name") def to_str(self): dflt = super(TumblrAccount, self).to_str() name = self.account.extra_data.get("name", dflt) return name class TumblrProvider(OAuthProvider): id = "tumblr" name = "Tumblr" account_class = TumblrAccount def extract_uid(self, data): return data["name"] def extract_common_fields(self, data): return dict( first_name=data.get("name"), ) provider_classes = [TumblrProvider] django-allauth-0.58.2/allauth/socialaccount/providers/tumblr/tests.py000066400000000000000000000017531452212273200260250ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import TumblrProvider class TumblrTests(OAuthTestsMixin, TestCase): provider_id = TumblrProvider.id def get_mocked_response(self): return [ MockedResponse( 200, """ { "meta": { "status": 200, "msg": "OK" }, "response": { "user": { "following": 263, "default_post_format": "html", "name": "derekg", "likes": 606, "blogs": [ { "name": "derekg", "title": "Derek Gottfrid", "url": "http://derekg.org/", "tweet": "auto", "primary": true, "followers": 33004929 }, { "name": "ihatehipstrz", "title": "I Hate Hipstrz" } ] } } } """, ) ] django-allauth-0.58.2/allauth/socialaccount/providers/tumblr/urls.py000066400000000000000000000002451452212273200256430ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import TumblrProvider urlpatterns = default_urlpatterns(TumblrProvider) django-allauth-0.58.2/allauth/socialaccount/providers/tumblr/views.py000066400000000000000000000021241452212273200260110ustar00rootroot00000000000000import json from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import TumblrProvider class TumblrAPI(OAuth): url = "http://api.tumblr.com/v2/user/info" def get_user_info(self): data = json.loads(self.query(self.url)) return data["response"]["user"] class TumblrOAuthAdapter(OAuthAdapter): provider_id = TumblrProvider.id request_token_url = "https://www.tumblr.com/oauth/request_token" access_token_url = "https://www.tumblr.com/oauth/access_token" authorize_url = "https://www.tumblr.com/oauth/authorize" def complete_login(self, request, app, token, response): client = TumblrAPI(request, app.client_id, app.secret, self.request_token_url) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(TumblrOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(TumblrOAuthAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/twentythreeandme/000077500000000000000000000000001452212273200263655ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/twentythreeandme/__init__.py000066400000000000000000000000001452212273200304640ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/twentythreeandme/provider.py000066400000000000000000000012301452212273200305650ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class TwentyThreeAndMeAccount(ProviderAccount): pass class TwentyThreeAndMeProvider(OAuth2Provider): id = "twentythreeandme" slug = "23andme" name = "23andMe" account_class = TwentyThreeAndMeAccount def extract_uid(self, data): return data["id"] def get_default_scope(self): scope = ["basic"] return scope def extract_common_fields(self, data): return dict( email=data.get("email"), ) provider_classes = [TwentyThreeAndMeProvider] django-allauth-0.58.2/allauth/socialaccount/providers/twentythreeandme/tests.py000066400000000000000000000014731452212273200301060ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import TwentyThreeAndMeProvider class TwentyThreeAndMeTests(OAuth2TestsMixin, TestCase): provider_id = TwentyThreeAndMeProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "profiles": [ {"id": "56c46bdb0902f8e2", "genotyped": false} ], "id": "b4b975a5a6a1b80b" } """, ) def get_login_response_json(self, with_refresh_token=True): return """ { "access_token":"testac", "token_type":"bearer", "expires_in": 86400, "refresh_token":"33c53cd7bb", "scope":"basic" }""" django-allauth-0.58.2/allauth/socialaccount/providers/twentythreeandme/urls.py000066400000000000000000000002721452212273200277250ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import TwentyThreeAndMeProvider urlpatterns = default_urlpatterns(TwentyThreeAndMeProvider) django-allauth-0.58.2/allauth/socialaccount/providers/twentythreeandme/views.py000066400000000000000000000016261452212273200301010ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import TwentyThreeAndMeProvider class TwentyTreeAndMeOAuth2Adapter(OAuth2Adapter): provider_id = TwentyThreeAndMeProvider.id access_token_url = "https://api.23andme.com/token" authorize_url = "https://api.23andme.com/authorize" profile_url = "https://api.23andme.com/1/user/" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(TwentyTreeAndMeOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(TwentyTreeAndMeOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/twitch/000077500000000000000000000000001452212273200243005ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/twitch/__init__.py000066400000000000000000000000001452212273200263770ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/twitch/provider.py000066400000000000000000000022511452212273200265040ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class TwitchAccount(ProviderAccount): def get_profile_url(self): return "http://twitch.tv/" + self.account.extra_data.get("login") def get_avatar_url(self): # We're using `logo` as a failback for legacy profiles retrieved # with the old https://api.twitch.tv/kraken/user endpoint. logo = self.account.extra_data.get("logo") return self.account.extra_data.get("profile_image_url", logo) def to_str(self): dflt = super(TwitchAccount, self).to_str() return self.account.extra_data.get("login", dflt) class TwitchProvider(OAuth2Provider): id = "twitch" name = "Twitch" account_class = TwitchAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return { "username": data.get("login"), "name": data.get("display_name"), "email": data.get("email"), } def get_default_scope(self): return ["user:read:email"] provider_classes = [TwitchProvider] django-allauth-0.58.2/allauth/socialaccount/providers/twitch/tests.py000066400000000000000000000062631452212273200260230ustar00rootroot00000000000000from django.test.client import RequestFactory from django.urls import reverse from allauth.socialaccount.models import SocialToken from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase, mocked_response from .provider import TwitchProvider from .views import TwitchOAuth2Adapter class TwitchTests(OAuth2TestsMixin, TestCase): provider_id = TwitchProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "data": [{ "id": "44322889", "login": "dallas", "display_name": "dallas", "type": "staff", "broadcaster_type": "", "description": "Just a gamer playing games and chatting. :)", "profile_image_url": "https://static-cdn.jtvnw.net/jtv_user_pictures/dallas-profile_image-1a2c906ee2c35f12-300x300.png", "offline_image_url": "https://static-cdn.jtvnw.net/jtv_user_pictures/dallas-channel_offline_image-1a2c906ee2c35f12-1920x1080.png", "view_count": 191836881, "email": "login@provider.com" }] } """, ) # noqa def test_response_over_400_raises_OAuth2Error(self): resp_mock = MockedResponse(400, '{"error": "Invalid token"}') expected_error = "Twitch API Error: Invalid token ()" self.check_for_error(resp_mock, expected_error) def test_empty_or_missing_data_key_raises_OAuth2Error(self): resp_mock = MockedResponse(200, '{"data": []}') expected_error = "Invalid data from Twitch API: {'data': []}" self.check_for_error(resp_mock, expected_error) resp_mock = MockedResponse(200, '{"missing_data": "key"}') expected_error = "Invalid data from Twitch API: {'missing_data': 'key'}" self.check_for_error(resp_mock, expected_error) def test_missing_twitch_id_raises_OAuth2Error(self): resp_mock = MockedResponse(200, '{"data": [{"login": "fake_twitch"}]}') expected_error = "Invalid data from Twitch API: {'login': 'fake_twitch'}" self.check_for_error(resp_mock, expected_error) def check_for_error(self, resp_mock, expected_error): with self.assertRaises(OAuth2Error) as error_ctx: self._run_just_complete_login(resp_mock) self.assertEqual(str(error_ctx.exception).replace("u", ""), expected_error) def _run_just_complete_login(self, resp_mock): """ Helper function for checking that Error cases are handled correctly. Running only `complete_login` means we can check that the specific errors are raised before they are caught and rendered to generic error HTML """ request = RequestFactory().get( reverse(self.provider.id + "_login"), {"process": "login"}, ) adapter = TwitchOAuth2Adapter(request) app = adapter.get_provider().app token = SocialToken(token="this-is-my-fake-token") with mocked_response(resp_mock): adapter = TwitchOAuth2Adapter(request) adapter.complete_login(request, app, token) django-allauth-0.58.2/allauth/socialaccount/providers/twitch/urls.py000066400000000000000000000002461452212273200256410ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import TwitchProvider urlpatterns = default_urlpatterns(TwitchProvider) django-allauth-0.58.2/allauth/socialaccount/providers/twitch/views.py000066400000000000000000000027351452212273200260160ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.client import OAuth2Error from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import TwitchProvider class TwitchOAuth2Adapter(OAuth2Adapter): provider_id = TwitchProvider.id access_token_url = "https://id.twitch.tv/oauth2/token" authorize_url = "https://id.twitch.tv/oauth2/authorize" profile_url = "https://api.twitch.tv/helix/users" def complete_login(self, request, app, token, **kwargs): headers = { "Authorization": "Bearer {}".format(token.token), "Client-ID": app.client_id, } response = requests.get(self.profile_url, headers=headers) data = response.json() if response.status_code >= 400: error = data.get("error", "") message = data.get("message", "") raise OAuth2Error("Twitch API Error: %s (%s)" % (error, message)) try: user_info = data.get("data", [])[0] except IndexError: raise OAuth2Error("Invalid data from Twitch API: %s" % (data)) if "id" not in user_info: raise OAuth2Error("Invalid data from Twitch API: %s" % (user_info)) return self.get_provider().sociallogin_from_response(request, user_info) oauth2_login = OAuth2LoginView.adapter_view(TwitchOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(TwitchOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/twitter/000077500000000000000000000000001452212273200245005ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/twitter/__init__.py000066400000000000000000000000001452212273200265770ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/twitter/provider.py000066400000000000000000000031271452212273200267070ustar00rootroot00000000000000from allauth.socialaccount.providers.base import AuthAction, ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class TwitterAccount(ProviderAccount): def get_screen_name(self): return self.account.extra_data.get("screen_name") def get_profile_url(self): ret = None screen_name = self.get_screen_name() if screen_name: ret = "http://twitter.com/" + screen_name return ret def get_avatar_url(self): ret = None profile_image_url = self.account.extra_data.get("profile_image_url") if profile_image_url: # Hmm, hack to get our hands on the large image. Not # really documented, but seems to work. ret = profile_image_url.replace("_normal", "") return ret def to_str(self): screen_name = self.get_screen_name() return screen_name or super(TwitterAccount, self).to_str() class TwitterProvider(OAuthProvider): id = "twitter" name = "Twitter" account_class = TwitterAccount def get_auth_url(self, request, action): if action == AuthAction.REAUTHENTICATE: url = "https://api.twitter.com/oauth/authorize" else: url = "https://api.twitter.com/oauth/authenticate" return url def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( username=data.get("screen_name"), name=data.get("name"), email=data.get("email"), ) provider_classes = [TwitterProvider] django-allauth-0.58.2/allauth/socialaccount/providers/twitter/tests.py000066400000000000000000000074441452212273200262250ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import TwitterProvider class TwitterTests(OAuthTestsMixin, TestCase): provider_id = TwitterProvider.id def get_mocked_response(self): # FIXME: Replace with actual/complete Twitter response return [ MockedResponse( 200, r""" {"follow_request_sent": false, "profile_use_background_image": true, "id": 45671919, "verified": false, "profile_text_color": "333333", "profile_image_url_https": "https://pbs.twimg.com/profile_images/793142149/r_normal.png", "profile_sidebar_fill_color": "DDEEF6", "is_translator": false, "geo_enabled": false, "entities": {"description": {"urls": []}}, "followers_count": 43, "protected": false, "location": "The Netherlands", "default_profile_image": false, "id_str": "45671919", "status": {"contributors": null, "truncated": false, "text": "RT @denibertovic: Okay I'm definitely using django-allauth from now on. So easy to set up, far less time consuming, and it just works. #dja\u2026", "in_reply_to_status_id": null, "id": 400658301702381568, "favorite_count": 0, "source": "Twitter Web Client", "retweeted": true, "coordinates": null, "entities": {"symbols": [], "user_mentions": [{"indices": [3, 16], "screen_name": "denibertovic", "id": 23508244, "name": "Deni Bertovic", "id_str": "23508244"}], "hashtags": [{"indices": [135, 139], "text": "dja"}], "urls": []}, "in_reply_to_screen_name": null, "id_str": "400658301702381568", "retweet_count": 6, "in_reply_to_user_id": null, "favorited": false, "retweeted_status": {"lang": "en", "favorited": false, "in_reply_to_user_id": null, "contributors": null, "truncated": false, "text": "Okay I'm definitely using django-allauth from now on. So easy to set up, far less time consuming, and it just works. #django", "created_at": "Sun Jul 28 19:56:26 +0000 2013", "retweeted": true, "in_reply_to_status_id": null, "coordinates": null, "id": 361575897674956800, "entities": {"symbols": [], "user_mentions": [], "hashtags": [{"indices": [117, 124], "text": "django"}], "urls": []}, "in_reply_to_status_id_str": null, "in_reply_to_screen_name": null, "source": "web", "place": null, "retweet_count": 6, "geo": null, "in_reply_to_user_id_str": null, "favorite_count": 8, "id_str": "361575897674956800"}, "geo": null, "in_reply_to_user_id_str": null, "lang": "en", "created_at": "Wed Nov 13 16:15:57 +0000 2013", "in_reply_to_status_id_str": null, "place": null}, "utc_offset": 3600, "statuses_count": 39, "description": "", "friends_count": 83, "profile_link_color": "0084B4", "profile_image_url": "http://pbs.twimg.com/profile_images/793142149/r_normal.png", "notifications": false, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "profile_background_color": "C0DEED", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "name": "Raymond Penners", "lang": "nl", "profile_background_tile": false, "favourites_count": 0, "screen_name": "pennersr", "url": null, "created_at": "Mon Jun 08 21:10:45 +0000 2009", "contributors_enabled": false, "time_zone": "Amsterdam", "profile_sidebar_border_color": "C0DEED", "default_profile": true, "following": false, "listed_count": 1} """, ) ] # noqa def test_login(self): account = super(TwitterTests, self).test_login() tw_account = account.get_provider_account() self.assertEqual(tw_account.get_screen_name(), "pennersr") self.assertEqual( tw_account.get_avatar_url(), "http://pbs.twimg.com/profile_images/793142149/r.png", ) self.assertEqual(tw_account.get_profile_url(), "http://twitter.com/pennersr") django-allauth-0.58.2/allauth/socialaccount/providers/twitter/urls.py000066400000000000000000000002471452212273200260420ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import TwitterProvider urlpatterns = default_urlpatterns(TwitterProvider) django-allauth-0.58.2/allauth/socialaccount/providers/twitter/views.py000066400000000000000000000026451452212273200262160ustar00rootroot00000000000000import json from allauth.socialaccount.app_settings import QUERY_EMAIL from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import TwitterProvider class TwitterAPI(OAuth): """ Verifying twitter credentials """ _base_url = "https://api.twitter.com/1.1/account/verify_credentials.json" url = _base_url + "?include_email=true" if QUERY_EMAIL else _base_url def get_user_info(self): user = json.loads(self.query(self.url)) return user class TwitterOAuthAdapter(OAuthAdapter): provider_id = TwitterProvider.id request_token_url = "https://api.twitter.com/oauth/request_token" access_token_url = "https://api.twitter.com/oauth/access_token" # Issue #42 -- this one authenticates over and over again... # authorize_url = 'https://api.twitter.com/oauth/authorize' authorize_url = "https://api.twitter.com/oauth/authenticate" def complete_login(self, request, app, token, response): client = TwitterAPI(request, app.client_id, app.secret, self.request_token_url) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(TwitterOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(TwitterOAuthAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/twitter_oauth2/000077500000000000000000000000001452212273200257625ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/twitter_oauth2/__init__.py000066400000000000000000000000001452212273200300610ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/twitter_oauth2/provider.py000066400000000000000000000026641452212273200301760ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class TwitterOAuth2Account(ProviderAccount): def get_username(self): return self.account.extra_data.get("username") def get_profile_url(self): username = self.get_username() if username: return "https://twitter.com/" + username return None def get_avatar_url(self): return self.account.extra_data.get("profile_image_url") def to_str(self): username = self.get_username() return username or super(TwitterOAuth2Account, self).to_str() class TwitterOAuth2Provider(OAuth2Provider): id = "twitter_oauth2" name = "Twitter" account_class = TwitterOAuth2Account pkce_enabled_default = True def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict( name=data["name"], username=data["username"], ) def get_fields(self): settings = self.get_settings() default_fields = [ "id", "name", "username", "verified", "profile_image_url", "created_at", ] return settings.get("FIELDS", default_fields) def get_default_scope(self): return ["users.read", "tweet.read"] provider_classes = [TwitterOAuth2Provider] django-allauth-0.58.2/allauth/socialaccount/providers/twitter_oauth2/tests.py000066400000000000000000000014461452212273200275030ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import TwitterOAuth2Provider class TwitterOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = TwitterOAuth2Provider.id def get_mocked_response(self): return MockedResponse( 200, """{ "data": { "created_at": "2020-09-02T13:39:14.000Z", "id": "1301152652357595137", "verified": false, "username": "realllkk520", "name": "realllkk520", "profile_image_url": "https://pbs.twimg.com/profile_images/1537259565632593920/OoRGPbUg_normal.jpg" } } """, ) # noqa django-allauth-0.58.2/allauth/socialaccount/providers/twitter_oauth2/urls.py000066400000000000000000000002641452212273200273230ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import TwitterOAuth2Provider urlpatterns = default_urlpatterns(TwitterOAuth2Provider) django-allauth-0.58.2/allauth/socialaccount/providers/twitter_oauth2/views.py000066400000000000000000000024511452212273200274730ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import TwitterOAuth2Provider class TwitterOAuth2Adapter(OAuth2Adapter): provider_id = TwitterOAuth2Provider.id access_token_url = "https://api.twitter.com/2/oauth2/token" authorize_url = "https://twitter.com/i/oauth2/authorize" profile_url = "https://api.twitter.com/2/users/me" basic_auth = True def complete_login(self, request, app, access_token, **kwargs): extra_data = self.get_user_info(access_token) return self.get_provider().sociallogin_from_response(request, extra_data) def get_user_info(self, token): fields = self.get_provider().get_fields() headers = {} headers.update(self.get_provider().get_settings().get("HEADERS", {})) headers["Authorization"] = " ".join(["Bearer", token.token]) resp = requests.get( url=self.profile_url, params={"user.fields": ",".join(fields)}, headers=headers, ) resp.raise_for_status() data = resp.json()["data"] return data oauth2_login = OAuth2LoginView.adapter_view(TwitterOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(TwitterOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/untappd/000077500000000000000000000000001452212273200244515ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/untappd/__init__.py000066400000000000000000000000001452212273200265500ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/untappd/client.py000066400000000000000000000033401452212273200263010ustar00rootroot00000000000000import requests from allauth.socialaccount import app_settings from allauth.socialaccount.providers.oauth2.client import ( OAuth2Client, OAuth2Error, ) from .provider import UntappdProvider class UntappdOAuth2Client(OAuth2Client): """ Custom client because Untappd: * uses redirect_url instead of redirect_uri * nests access_token inside an extra 'response' object """ def get_access_token(self, code, pkce_code_verifier=None): data = { "client_id": self.consumer_key, "redirect_url": self.callback_url, "grant_type": "authorization_code", "response_type": "code", "client_secret": self.consumer_secret, "code": code, } params = None self._strip_empty_keys(data) url = self.access_token_url if self.access_token_method == "GET": params = data data = None if data and pkce_code_verifier: data["code_verifier"] = pkce_code_verifier # Allow custom User Agent to comply with Untappd API settings = app_settings.PROVIDERS.get(UntappdProvider.id, {}) headers = {"User-Agent": settings.get("USER_AGENT", "django-allauth")} # TODO: Proper exception handling resp = requests.request( self.access_token_method, url, params=params, data=data, headers=headers, ) access_token = None if resp.status_code == 200: access_token = resp.json()["response"] if not access_token or "access_token" not in access_token: raise OAuth2Error("Error retrieving access token: %s" % resp.content) return access_token django-allauth-0.58.2/allauth/socialaccount/providers/untappd/provider.py000066400000000000000000000031351452212273200266570ustar00rootroot00000000000000from django.urls import reverse from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class UntappdAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("untappd_url") def get_avatar_url(self): return self.account.extra_data.get("user_avatar") def to_str(self): dflt = super(UntappdAccount, self).to_str() return self.account.extra_data.get("user_name", dflt) class UntappdProvider(OAuth2Provider): id = "untappd" name = "Untappd" account_class = UntappdAccount def get_auth_params(self, request, action): params = super(UntappdProvider, self).get_auth_params(request, action) # Untappd uses redirect_url instead of redirect_uri params["redirect_url"] = request.build_absolute_uri( reverse(self.id + "_callback") ) return params def extract_uid(self, data): return str(data["response"]["user"]["uid"]) def extract_common_fields(self, data): user = data["response"]["user"] return dict( username=user["user_name"], name=user["first_name"] + " " + user["last_name"], ) def extract_email_addresses(self, data): ret = [ EmailAddress( email=data["response"]["user"]["settings"]["email_address"], verified=True, primary=True, ) ] return ret provider_classes = [UntappdProvider] django-allauth-0.58.2/allauth/socialaccount/providers/untappd/tests.py000066400000000000000000000054721452212273200261750ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import UntappdProvider class UntappdTests(OAuth2TestsMixin, TestCase): provider_id = UntappdProvider.id def get_login_response_json(self, with_refresh_token=True): return """ { "meta": { "http_code": 200 }, "response": { "access_token": "testac" } }""" def get_mocked_response(self): return MockedResponse( 200, """ { "meta":{ "code":200, "response_time":{ "time":0.29, "measure":"seconds" }, "init_time":{ "time":0.011, "measure":"seconds" } }, "notifications":{ "type":"notifications", "unread_count":{ "comments":0, "toasts":0, "friends":0, "messages":0, "news":0 } }, "response":{ "user":{ "uid":123456, "id":123456, "user_name":"groovecoder", "first_name":"", "last_name":"", "user_avatar":"https:\\/\\/gravatar.com\\/avatar\\/ec25d046746de3be33779256f6957d8f?size=100&d=https%3A%2F%2Funtappd.akamaized.net%2Fsite%2Fassets%2Fimages%2Fdefault_avatar_v2.jpg%3Fv%3D1", "user_avatar_hd":"https:\\/\\/gravatar.com\\/avatar\\/ec25d046746de3be33779256f6957d8f?size=125&d=https%3A%2F%2Funtappd.akamaized.net%2Fsite%2Fassets%2Fimages%2Fdefault_avatar_v2.jpg%3Fv%3D1", "user_cover_photo":"https:\\/\\/untappd.akamaized.net\\/site\\/assets\\/v3\\/images\\/cover_default.jpg", "user_cover_photo_offset":0, "is_private":0, "location":"Testville", "url":"", "bio":"", "is_supporter":0, "relationship":"self", "untappd_url":"http:\\/\\/untappd.com\\/user\\/testuser", "account_type":"user", "stats":{ "total_badges":43, "total_friends":43, "total_checkins":73, "total_beers":61, "total_created_beers":1, "total_followings":9, "total_photos":31 }, "recent_brews":{}, "checkins":{}, "media":{}, "contact":{}, "date_joined":"Tue, 11 Dec 2012 14:27:53 +0000", "settings":{ "badge":{ "badges_to_facebook":1, "badges_to_twitter":1 }, "checkin":{ "checkin_to_facebook":0, "checkin_to_twitter":0, "checkin_to_foursquare":0 }, "navigation":{ "default_to_checkin":0 }, "email_address":"test@example.com" } } } } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/untappd/urls.py000066400000000000000000000002501452212273200260050ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import UntappdProvider urlpatterns = default_urlpatterns(UntappdProvider) django-allauth-0.58.2/allauth/socialaccount/providers/untappd/views.py000066400000000000000000000020341452212273200261570ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .client import UntappdOAuth2Client from .provider import UntappdProvider class UntappdOAuth2Adapter(OAuth2Adapter): client_class = UntappdOAuth2Client provider_id = UntappdProvider.id access_token_url = "https://untappd.com/oauth/authorize/" access_token_method = "GET" authorize_url = "https://untappd.com/oauth/authenticate/" user_info_url = "https://api.untappd.com/v4/user/info/" supports_state = False def complete_login(self, request, app, token, **kwargs): resp = requests.get(self.user_info_url, params={"access_token": token.token}) extra_data = resp.json() # TODO: get and store the email from the user info json return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(UntappdOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(UntappdOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/vimeo/000077500000000000000000000000001452212273200241155ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/vimeo/__init__.py000066400000000000000000000000001452212273200262140ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/vimeo/provider.py000066400000000000000000000011161452212273200263200ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class VimeoAccount(ProviderAccount): pass class VimeoProvider(OAuthProvider): id = "vimeo" name = "Vimeo" account_class = VimeoAccount def get_default_scope(self): scope = [] return scope def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict(name=data.get("display_name"), username=data.get("username")) provider_classes = [VimeoProvider] django-allauth-0.58.2/allauth/socialaccount/providers/vimeo/tests.py000066400000000000000000000027711452212273200256400ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import VimeoProvider class VimeoTests(OAuthTestsMixin, TestCase): provider_id = VimeoProvider.id def get_mocked_response(self): return [ MockedResponse( 200, """ {"generated_in":"0.0137", "stat":"ok","person":{ "created_on": "2013-04-08 14:24:47", "id":"17574504", "is_contact":"0", "is_plus":"0","is_pro":"0","is_staff":"0","is_subscribed_to":"0", "username":"user17574504","display_name":"Raymond Penners","location":"", "url":[""],"bio":"","number_of_contacts":"0","number_of_uploads":"0", "number_of_likes":"0","number_of_videos":"0", "number_of_videos_appears_in":"0","number_of_albums":"0", "number_of_channels":"0","number_of_groups":"0", "profileurl":"http:\\/\\/vimeo.com\\/user17574504", "videosurl":"http:\\/\\/vimeo.com\\/user17574504\\/videos", "portraits":{"portrait":[{"height":"30","width":"30", "_content": "http:\\/\\/a.vimeocdn.com\\/images_v6\\/portraits\\/portrait_30_yellow.png"}, {"height":"75","width":"75","_content": "http:\\/\\/a.vimeocdn.com\\/images_v6\\/portraits\\/portrait_75_yellow.png"}, {"height":"100","width":"100","_content": "http:\\/\\/a.vimeocdn.com\\/images_v6\\/portraits\\/portrait_100_yellow.png"}, {"height":"300","width":"300","_content": "http:\\/\\/a.vimeocdn.com\\/images_v6\\/portraits\\/portrait_300_yellow.png"}]}}} """, ) ] django-allauth-0.58.2/allauth/socialaccount/providers/vimeo/urls.py000066400000000000000000000002431452212273200254530ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import VimeoProvider urlpatterns = default_urlpatterns(VimeoProvider) django-allauth-0.58.2/allauth/socialaccount/providers/vimeo/views.py000066400000000000000000000021701452212273200256240ustar00rootroot00000000000000import json from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import VimeoProvider class VimeoAPI(OAuth): url = "http://vimeo.com/api/rest/v2?method=vimeo.people.getInfo" def get_user_info(self): url = self.url data = json.loads(self.query(url, params=dict(format="json"))) return data["person"] class VimeoOAuthAdapter(OAuthAdapter): provider_id = VimeoProvider.id request_token_url = "https://vimeo.com/oauth/request_token" access_token_url = "https://vimeo.com/oauth/access_token" authorize_url = "https://vimeo.com/oauth/authorize" def complete_login(self, request, app, token, response): client = VimeoAPI(request, app.client_id, app.secret, self.request_token_url) extra_data = client.get_user_info() return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(VimeoOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(VimeoOAuthAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/vimeo_oauth2/000077500000000000000000000000001452212273200253775ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/vimeo_oauth2/__init__.py000066400000000000000000000000001452212273200274760ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/vimeo_oauth2/models.py000066400000000000000000000000001452212273200272220ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/vimeo_oauth2/provider.py000066400000000000000000000012211452212273200275770ustar00rootroot00000000000000""" Provider for Patreon """ from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class VimeoOAuth2Account(ProviderAccount): pass class VimeoOAuth2Provider(OAuth2Provider): id = "vimeo_oauth2" name = "Vimeo" account_class = VimeoOAuth2Account def get_default_scope(self): return ["public", "private"] def extract_uid(self, data): return data.get("uri").split("/")[-1] def extract_common_fields(self, data): return { "fullname": data.get("name"), } provider_classes = [VimeoOAuth2Provider] django-allauth-0.58.2/allauth/socialaccount/providers/vimeo_oauth2/tests.py000066400000000000000000000017741452212273200271240ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import VimeoOAuth2Provider class VimeoOAuth2Tests(OAuth2TestsMixin, TestCase): provider_id = VimeoOAuth2Provider.id def get_mocked_response(self): return MockedResponse( 200, """{ "uri": "/users/12345", "name": "AllAuth", "link": "https://vimeo.com/user12345", "created_time": "2012-06-04T00:02:16+00:00", "pictures": { "uri": null, "active": false, "type": "default", "sizes": [{ "width": 30, "height": 30, "link": "https://i.vimeocdn.com/portrait/defaults-blue_30x30.png" }], "resource_key": "1234567890abcdef" }, "resource_key": "1234567890abcdef", "account": "pro" }""", ) # noqa django-allauth-0.58.2/allauth/socialaccount/providers/vimeo_oauth2/urls.py000066400000000000000000000003211452212273200267320ustar00rootroot00000000000000"""URLs for Patreon Provider""" from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import VimeoOAuth2Provider urlpatterns = default_urlpatterns(VimeoOAuth2Provider) django-allauth-0.58.2/allauth/socialaccount/providers/vimeo_oauth2/views.py000066400000000000000000000017171452212273200271140ustar00rootroot00000000000000""" Views for PatreonProvider https://www.patreon.com/platform/documentation/oauth """ import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import VimeoOAuth2Provider class VimeoOAuth2Adapter(OAuth2Adapter): provider_id = VimeoOAuth2Provider.id access_token_url = "https://api.vimeo.com/oauth/access_token" authorize_url = "https://api.vimeo.com/oauth/authorize" profile_url = "https://api.vimeo.com/me/" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer " + token.token}, ) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(VimeoOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(VimeoOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/vk/000077500000000000000000000000001452212273200234165ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/vk/__init__.py000066400000000000000000000000001452212273200255150ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/vk/provider.py000066400000000000000000000027751452212273200256350ustar00rootroot00000000000000from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class VKAccount(ProviderAccount): def get_profile_url(self): return "https://vk.com/id%s" % self.account.extra_data.get("id") def get_avatar_url(self): ret = None photo_big_url = self.account.extra_data.get("photo_big") photo_medium_url = self.account.extra_data.get("photo_medium") if photo_big_url: return photo_big_url elif photo_medium_url: return photo_medium_url else: return ret def to_str(self): first_name = self.account.extra_data.get("first_name", "") last_name = self.account.extra_data.get("last_name", "") name = " ".join([first_name, last_name]).strip() return name or super(VKAccount, self).to_str() class VKProvider(OAuth2Provider): id = "vk" name = "VK" account_class = VKAccount def get_default_scope(self): scope = [] if app_settings.QUERY_EMAIL: scope.append("email") return scope def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): return dict( email=data.get("email"), last_name=data.get("last_name"), username=data.get("screen_name"), first_name=data.get("first_name"), ) provider_classes = [VKProvider] django-allauth-0.58.2/allauth/socialaccount/providers/vk/tests.py000066400000000000000000000022711452212273200251340ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import VKProvider class VKTests(OAuth2TestsMixin, TestCase): provider_id = VKProvider.id def get_mocked_response(self, verified_email=True): return MockedResponse( 200, """ {"response": [{"last_name": "Penners", "university_name": "", "photo": "http://vk.com/images/camera_c.gif", "sex": 2, "photo_medium": "http://vk.com/images/camera_b.gif", "relation": "0", "timezone": 1, "photo_big": "http://vk.com/images/camera_a.gif", "id": 219004864, "universities": [], "city": "1430", "first_name": "Raymond", "faculty_name": "", "online": 1, "counters": {"videos": 0, "online_friends": 0, "notes": 0, "audios": 0, "photos": 0, "followers": 0, "groups": 0, "user_videos": 0, "albums": 0, "friends": 0}, "home_phone": "", "faculty": 0, "nickname": "", "screen_name": "id219004864", "has_mobile": 1, "country": "139", "university": 0, "graduation": 0, "activity": "", "last_seen": {"time": 1377805189}}]} """, ) def get_login_response_json(self, with_refresh_token=True): return '{"user_id": 219004864, "access_token":"testac"}' django-allauth-0.58.2/allauth/socialaccount/providers/vk/urls.py000066400000000000000000000002361452212273200247560ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import VKProvider urlpatterns = default_urlpatterns(VKProvider) django-allauth-0.58.2/allauth/socialaccount/providers/vk/views.py000066400000000000000000000030251452212273200251250ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import VKProvider USER_FIELDS = [ "first_name", "last_name", "nickname", "screen_name", "sex", "bdate", "city", "country", "timezone", "photo", "photo_medium", "photo_big", "photo_max_orig", "has_mobile", "contacts", "education", "online", "counters", "relation", "last_seen", "activity", "universities", ] class VKOAuth2Adapter(OAuth2Adapter): provider_id = VKProvider.id access_token_url = "https://oauth.vk.com/access_token" authorize_url = "https://oauth.vk.com/authorize" profile_url = "https://api.vk.com/method/users.get" def complete_login(self, request, app, token, **kwargs): uid = kwargs["response"].get("user_id") params = { "v": "5.95", "access_token": token.token, "fields": ",".join(USER_FIELDS), } if uid: params["user_ids"] = uid resp = requests.get(self.profile_url, params=params) resp.raise_for_status() extra_data = resp.json()["response"][0] email = kwargs["response"].get("email") if email: extra_data["email"] = email return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(VKOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(VKOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/wahoo/000077500000000000000000000000001452212273200241135ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/wahoo/__init__.py000066400000000000000000000000001452212273200262120ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/wahoo/provider.py000066400000000000000000000025411452212273200263210ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class WahooAccount(ProviderAccount): def get_profile_url(self): return "https://api.wahooligan.com/v1/user" class WahooProvider(OAuth2Provider): id = "wahoo" name = "Wahoo" account_class = WahooAccount def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): extra_common = super(WahooProvider, self).extract_common_fields(data) extra_common.update( # Additional properties we ignore: gender, created_at, updated_at height=data.get("height"), weight=data.get("weight"), first=data.get("first"), last=data.get("last"), birth=data.get("birth"), ) return extra_common def extract_email_addresses(self, data): email = EmailAddress( email=data.get("email"), primary=True, verified=False, ) return [email] def get_default_scope(self): scope = ["user_read"] if app_settings.QUERY_EMAIL: scope.append("email") return scope provider_classes = [WahooProvider] django-allauth-0.58.2/allauth/socialaccount/providers/wahoo/tests.py000066400000000000000000000015401452212273200256270ustar00rootroot00000000000000# -*- coding: utf-8 -*- from allauth.socialaccount.providers.wahoo.provider import WahooProvider from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase class WahooTests(OAuth2TestsMixin, TestCase): provider_id = WahooProvider.id def get_mocked_response(self): # https://cloud-api.wahooligan.com/#users return MockedResponse( 200, """ { "id": 60462, "height": "2.0", "weight": "80.0", "first": "Bob", "last": "Smith", "email": "sample@test-domain.com", "birth": "1980-10-02", "gender": 1, "created_at": "2018-10-23T15:38:23.000Z", "updated_at": "2018-10-24T20:46:40.000Z" } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/wahoo/urls.py000066400000000000000000000002441452212273200254520ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import WahooProvider urlpatterns = default_urlpatterns(WahooProvider) django-allauth-0.58.2/allauth/socialaccount/providers/wahoo/views.py000066400000000000000000000016271452212273200256300ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import WahooProvider class WahooOauth2Adapter(OAuth2Adapter): provider_id = WahooProvider.id access_token_url = "https://api.wahooligan.com/oauth/token" authorize_url = "https://api.wahooligan.com/oauth/authorize" profile_url = "https://api.wahooligan.com/v1/user" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(WahooOauth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(WahooOauth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/weibo/000077500000000000000000000000001452212273200241035ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/weibo/__init__.py000066400000000000000000000000001452212273200262020ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/weibo/provider.py000066400000000000000000000017631452212273200263160ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ( ProviderAccount, ProviderException, ) from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class WeiboAccount(ProviderAccount): def get_profile_url(self): # profile_url = "u/3195025850" return "http://www.weibo.com/" + self.account.extra_data.get("profile_url") def get_avatar_url(self): return self.account.extra_data.get("avatar_large") def to_str(self): dflt = super(WeiboAccount, self).to_str() return self.account.extra_data.get("name", dflt) class WeiboProvider(OAuth2Provider): id = "weibo" name = "Weibo" account_class = WeiboAccount def extract_uid(self, data): ret = data.get("idstr") if not ret: raise ProviderException("Missing 'idstr'") return ret def extract_common_fields(self, data): return dict(username=data.get("screen_name"), name=data.get("name")) provider_classes = [WeiboProvider] django-allauth-0.58.2/allauth/socialaccount/providers/weibo/tests.py000066400000000000000000000022531452212273200256210ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import WeiboProvider class WeiboTests(OAuth2TestsMixin, TestCase): provider_id = WeiboProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"bi_followers_count": 0, "domain": "", "avatar_large": "http://tp3.sinaimg.cn/3195025850/180/0/0", "block_word": 0, "star": 0, "id": 3195025850, "city": "1", "verified": false, "follow_me": false, "verified_reason": "", "followers_count": 6, "location": "\u5317\u4eac \u4e1c\u57ce\u533a", "mbtype": 0, "profile_url": "u/3195025850", "province": "11", "statuses_count": 0, "description": "", "friends_count": 0, "online_status": 0, "mbrank": 0, "idstr": "3195025850", "profile_image_url": "http://tp3.sinaimg.cn/3195025850/50/0/0", "allow_all_act_msg": false, "allow_all_comment": true, "geo_enabled": true, "name": "pennersr", "lang": "zh-cn", "weihao": "", "remark": "", "favourites_count": 0, "screen_name": "pennersr", "url": "", "gender": "f", "created_at": "Tue Feb 19 19:43:39 +0800 2013", "verified_type": -1, "following": false} """, ) django-allauth-0.58.2/allauth/socialaccount/providers/weibo/urls.py000066400000000000000000000002441452212273200254420ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import WeiboProvider urlpatterns = default_urlpatterns(WeiboProvider) django-allauth-0.58.2/allauth/socialaccount/providers/weibo/views.py000066400000000000000000000016401452212273200256130ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import WeiboProvider class WeiboOAuth2Adapter(OAuth2Adapter): provider_id = WeiboProvider.id access_token_url = "https://api.weibo.com/oauth2/access_token" authorize_url = "https://api.weibo.com/oauth2/authorize" profile_url = "https://api.weibo.com/2/users/show.json" def complete_login(self, request, app, token, **kwargs): uid = kwargs.get("response", {}).get("uid") resp = requests.get( self.profile_url, params={"access_token": token.token, "uid": uid} ) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(WeiboOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(WeiboOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/weixin/000077500000000000000000000000001452212273200243015ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/weixin/__init__.py000066400000000000000000000000001452212273200264000ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/weixin/client.py000066400000000000000000000034151452212273200261340ustar00rootroot00000000000000import requests from collections import OrderedDict from django.utils.http import urlencode from allauth.socialaccount.providers.oauth2.client import ( OAuth2Client, OAuth2Error, ) class WeixinOAuth2Client(OAuth2Client): def get_redirect_url(self, authorization_url, extra_params): params = { "appid": self.consumer_key, "redirect_uri": self.callback_url, "scope": self.scope, "response_type": "code", } if self.state: params["state"] = self.state params.update(extra_params) sorted_params = OrderedDict() for param in sorted(params): sorted_params[param] = params[param] return "%s?%s" % (authorization_url, urlencode(sorted_params)) def get_access_token(self, code, pkce_code_verifier=None): data = { "appid": self.consumer_key, "redirect_uri": self.callback_url, "grant_type": "authorization_code", "secret": self.consumer_secret, "scope": self.scope, "code": code, } params = None self._strip_empty_keys(data) url = self.access_token_url if self.access_token_method == "GET": params = data data = None if data and pkce_code_verifier: data["code_verifier"] = pkce_code_verifier # TODO: Proper exception handling resp = requests.request(self.access_token_method, url, params=params, data=data) access_token = None if resp.status_code == 200: access_token = resp.json() if not access_token or "access_token" not in access_token: raise OAuth2Error("Error retrieving access token: %s" % resp.content) return access_token django-allauth-0.58.2/allauth/socialaccount/providers/weixin/provider.py000066400000000000000000000014461452212273200265120ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class WeixinAccount(ProviderAccount): def get_avatar_url(self): return self.account.extra_data.get("headimgurl") def to_str(self): return self.account.extra_data.get( "nickname", super(WeixinAccount, self).to_str() ) class WeixinProvider(OAuth2Provider): id = "weixin" name = "Weixin" account_class = WeixinAccount def extract_uid(self, data): return data["openid"] def get_default_scope(self): return ["snsapi_login"] def extract_common_fields(self, data): return dict(username=data.get("nickname"), name=data.get("nickname")) provider_classes = [WeixinProvider] django-allauth-0.58.2/allauth/socialaccount/providers/weixin/tests.py000066400000000000000000000022571452212273200260230ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import WeixinProvider class WeixinTests(OAuth2TestsMixin, TestCase): provider_id = WeixinProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"access_token": "OezXcEiiBSKSxW0eoylIeO5cPxb4Ks1RpbXGMv9uiV35032zNHGzXcld-EKsSScE3gRZMrUU78skCbp1ShtZnR0dQB8Wr_LUf7FA-H97Lnd2HgQah_GnkQex-vPFsGEwPPcNAV6q1Vz3uRNgL0MUFg", "city": "Pudong New District", "country": "CN", "expires_in": 7200, "headimgurl": "http://wx.qlogo.cn/mmopen/VkvLVEpoJiaibYsVyW8GzxHibzlnqSM7iaX09r6TWUJXCNQHibHz37krvN65HR1ibEpgH5K5sukcIzA3r1C4KQ9qyyX9XIUdY9lNOk/0", "language": "zh_CN", "nickname": "某某某", "openid": "ohS-VwAJ9GEXlplngwybJ3Z-ZHrI", "privilege": [], "province": "Shanghai", "refresh_token": "OezXcEiiBSKSxW0eoylIeO5cPxb4Ks1RpbXGMv9uiV35032zNHGzXcld-EKsSScEbMnnMqVExcSpj7KRAuBA8BU2j2e_FK5dgBe-ro32k7OuHtznwqqBn5QR7LZGo2-P8G7gG0eitjyZ751sFlnTAw", "scope": "snsapi_login", "sex": 1, "unionid": "ohHrhwKnD9TOunEW0eKTS45vS5Qo"}""", ) # noqa django-allauth-0.58.2/allauth/socialaccount/providers/weixin/urls.py000066400000000000000000000002461452212273200256420ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import WeixinProvider urlpatterns = default_urlpatterns(WeixinProvider) django-allauth-0.58.2/allauth/socialaccount/providers/weixin/views.py000066400000000000000000000026301452212273200260110ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .client import WeixinOAuth2Client from .provider import WeixinProvider class WeixinOAuth2Adapter(OAuth2Adapter): provider_id = WeixinProvider.id access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token" profile_url = "https://api.weixin.qq.com/sns/userinfo" client_class = WeixinOAuth2Client @property def authorize_url(self): settings = self.get_provider().get_settings() url = settings.get( "AUTHORIZE_URL", "https://open.weixin.qq.com/connect/qrconnect" ) return url def complete_login(self, request, app, token, **kwargs): openid = kwargs.get("response", {}).get("openid") resp = requests.get( self.profile_url, params={"access_token": token.token, "openid": openid}, ) resp.raise_for_status() extra_data = resp.json() nickname = extra_data.get("nickname") if nickname: extra_data["nickname"] = nickname.encode("raw_unicode_escape").decode( "utf-8" ) return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(WeixinOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(WeixinOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/windowslive/000077500000000000000000000000001452212273200253505ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/windowslive/__init__.py000066400000000000000000000000001452212273200274470ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/windowslive/provider.py000066400000000000000000000023671452212273200275640ustar00rootroot00000000000000from __future__ import unicode_literals from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class WindowsLiveAccount(ProviderAccount): def to_str(self): name = "{0} {1}".format( self.account.extra_data.get("first_name", ""), self.account.extra_data.get("last_name", ""), ) if name.strip() != "": return name return super(WindowsLiveAccount, self).to_str() class WindowsLiveProvider(OAuth2Provider): id = str("windowslive") name = "Live" account_class = WindowsLiveAccount def get_default_scope(self): """ Doc on scopes available at http://msdn.microsoft.com/en-us/library/dn631845.aspx """ return ["wl.basic", "wl.emails"] def extract_uid(self, data): return str(data["id"]) def extract_common_fields(self, data): try: email = data.get("emails").get("preferred") except AttributeError: email = None return dict( email=email, last_name=data.get("last_name"), first_name=data.get("first_name"), ) provider_classes = [WindowsLiveProvider] django-allauth-0.58.2/allauth/socialaccount/providers/windowslive/tests.py000066400000000000000000000015541452212273200270710ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import WindowsLiveProvider class WindowsLiveTests(OAuth2TestsMixin, TestCase): provider_id = WindowsLiveProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "first_name": "James", "last_name": "Smith", "name": "James Smith", "locale": "en_US", "gender": null, "emails": { "personal": null, "account": "jsmith@example.com", "business": null, "preferred": "jsmith@example.com" }, "link": "https://profile.live.com/", "updated_time": "2014-02-07T00:35:27+0000", "id": "83605e110af6ff98" } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/windowslive/urls.py000066400000000000000000000002601452212273200267050ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import WindowsLiveProvider urlpatterns = default_urlpatterns(WindowsLiveProvider) django-allauth-0.58.2/allauth/socialaccount/providers/windowslive/views.py000066400000000000000000000026531452212273200270650ustar00rootroot00000000000000from __future__ import unicode_literals import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import WindowsLiveProvider class WindowsLiveOAuth2Adapter(OAuth2Adapter): provider_id = WindowsLiveProvider.id access_token_url = "https://login.live.com/oauth20_token.srf" authorize_url = "https://login.live.com/oauth20_authorize.srf" profile_url = "https://apis.live.net/v5.0/me" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) # example of what's returned (in python format): # {'first_name': 'James', 'last_name': 'Smith', # 'name': 'James Smith', 'locale': 'en_US', 'gender': None, # 'emails': {'personal': None, 'account': 'jsmith@example.com', # 'business': None, 'preferred': 'jsmith@example.com'}, # 'link': 'https://profile.live.com/', # 'updated_time': '2014-02-07T00:35:27+0000', # 'id': '83605e110af6ff98'} resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(WindowsLiveOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(WindowsLiveOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/xing/000077500000000000000000000000001452212273200237435ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/xing/__init__.py000066400000000000000000000000001452212273200260420ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/xing/provider.py000066400000000000000000000021271452212273200261510ustar00rootroot00000000000000from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth.provider import OAuthProvider class XingAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("permalink") def get_avatar_url(self): return self.account.extra_data.get("photo_urls", {}).get("large") def to_str(self): dflt = super(XingAccount, self).to_str() first_name = self.account.extra_data.get("first_name", "") last_name = self.account.extra_data.get("last_name", "") name = " ".join([first_name, last_name]).strip() return name or dflt class XingProvider(OAuthProvider): id = "xing" name = "Xing" account_class = XingAccount def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict( email=data.get("active_email"), username=data.get("page_name"), first_name=data.get("first_name"), last_name=data.get("last_name"), ) provider_classes = [XingProvider] django-allauth-0.58.2/allauth/socialaccount/providers/xing/tests.py000066400000000000000000000037331452212273200254650ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from allauth.socialaccount.tests import OAuthTestsMixin from allauth.tests import MockedResponse, TestCase from .provider import XingProvider class XingTests(OAuthTestsMixin, TestCase): provider_id = XingProvider.id def get_mocked_response(self): return [ MockedResponse( 200, """ {"users":[{"id":"20493333_1cd028","active_email":"raymond.penners@example.com", "badges":[],"birth_date":{"year":null,"month":null,"day":null}, "business_address":{"street":null,"zip_code":null,"city":null,"province":null, "country":"NL","email":null,"fax":null,"phone":null,"mobile_phone":null}, "display_name":"Raymond Penners","educational_background": {"primary_school_id":null,"schools":[],"qualifications":[]}, "employment_status":"EMPLOYEE","first_name":"Raymond","gender":"m", "haves":null,"instant_messaging_accounts":{},"interests":null,"languages": {"nl":null},"last_name":"Penners","organisation_member":null, "page_name":"Raymond_Penners", "permalink":"https://www.xing.com/profile/Raymond_Penners", "photo_urls":{"thumb":"https://www.xing.com/img/n/nobody_m.30x40.jpg", "large":"https://www.xing.com/img/n/nobody_m.140x185.jpg","mini_thumb": "https://www.xing.com/img/n/nobody_m.18x24.jpg","maxi_thumb": "https://www.xing.com/img/n/nobody_m.70x93.jpg","medium_thumb": "https://www.xing.com/img/n/nobody_m.57x75.jpg"},"premium_services":[], "private_address":{"street":null,"zip_code":null,"city":null,"province":null, "country":null,"email":"raymond.penners@example.com","fax":null, "phone":null,"mobile_phone":null},"professional_experience": {"primary_company":{"name":null,"url":null,"tag":null,"title":null, "begin_date":null,"end_date":null,"description":null,"industry":"OTHERS", "company_size":null,"career_level":null},"non_primary_companies":[], "awards":[]},"time_zone":{"utc_offset":2.0,"name":"Europe/Berlin"}, "wants":null,"web_profiles":{}}]} """, ) ] django-allauth-0.58.2/allauth/socialaccount/providers/xing/urls.py000066400000000000000000000002411452212273200252770ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth.urls import default_urlpatterns from .provider import XingProvider urlpatterns = default_urlpatterns(XingProvider) django-allauth-0.58.2/allauth/socialaccount/providers/xing/views.py000066400000000000000000000020621452212273200254520ustar00rootroot00000000000000import json from allauth.socialaccount.providers.oauth.client import OAuth from allauth.socialaccount.providers.oauth.views import ( OAuthAdapter, OAuthCallbackView, OAuthLoginView, ) from .provider import XingProvider class XingAPI(OAuth): url = "https://api.xing.com/v1/users/me.json" def get_user_info(self): user = json.loads(self.query(self.url)) return user class XingOAuthAdapter(OAuthAdapter): provider_id = XingProvider.id request_token_url = "https://api.xing.com/v1/request_token" access_token_url = "https://api.xing.com/v1/access_token" authorize_url = "https://www.xing.com/v1/authorize" def complete_login(self, request, app, token, response): client = XingAPI(request, app.client_id, app.secret, self.request_token_url) extra_data = client.get_user_info()["users"][0] return self.get_provider().sociallogin_from_response(request, extra_data) oauth_login = OAuthLoginView.adapter_view(XingOAuthAdapter) oauth_callback = OAuthCallbackView.adapter_view(XingOAuthAdapter) django-allauth-0.58.2/allauth/socialaccount/providers/yahoo/000077500000000000000000000000001452212273200241155ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/yahoo/__init__.py000066400000000000000000000000001452212273200262140ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/yahoo/models.py000066400000000000000000000000331452212273200257460ustar00rootroot00000000000000# Create your models here. django-allauth-0.58.2/allauth/socialaccount/providers/yahoo/provider.py000066400000000000000000000025741452212273200263310ustar00rootroot00000000000000from __future__ import unicode_literals from allauth.socialaccount.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class YahooAccount(ProviderAccount): def to_str(self): name = "{0} {1}".format( self.account.extra_data.get("given_name", ""), self.account.extra_data.get("family_name", ""), ) if name.strip() != "": return name return super(YahooAccount, self).to_str() class YahooProvider(OAuth2Provider): id = str("yahoo") name = "Yahoo" account_class = YahooAccount def get_default_scope(self): """ Doc on scopes available at https://developer.yahoo.com/oauth2/guide/yahoo_scopes/ """ return ["profile", "email"] def extract_uid(self, data): return data["sub"] def extract_common_fields(self, data): return dict( email=data["email"], last_name=data["family_name"], first_name=data["given_name"], ) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email and data.get("email_verified"): ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [YahooProvider] django-allauth-0.58.2/allauth/socialaccount/providers/yahoo/tests.py000066400000000000000000000012571452212273200256360ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import YahooProvider class YahooTests(OAuth2TestsMixin, TestCase): provider_id = YahooProvider.id def get_mocked_response(self): response_data = """ { "sub": "FSVIDUW3D7FSVIDUW3D72F2F", "name": "Jane Doe", "given_name": "Jane", "family_name": "Doe", "preferred_username": "j.doe", "email": "janedoe@example.com", "email_verified": true, "picture": "http://example.com/janedoe/me.jpg" } """ # noqa return MockedResponse(200, response_data) django-allauth-0.58.2/allauth/socialaccount/providers/yahoo/urls.py000066400000000000000000000002441452212273200254540ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import YahooProvider urlpatterns = default_urlpatterns(YahooProvider) django-allauth-0.58.2/allauth/socialaccount/providers/yahoo/views.py000066400000000000000000000017301452212273200256250ustar00rootroot00000000000000from __future__ import unicode_literals import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import YahooProvider class YahooOAuth2Adapter(OAuth2Adapter): provider_id = YahooProvider.id access_token_url = "https://api.login.yahoo.com/oauth2/get_token" authorize_url = "https://api.login.yahoo.com/oauth2/request_auth" profile_url = "https://api.login.yahoo.com/openid/v1/userinfo" def complete_login(self, request, app, token, **kwargs): headers = {"Authorization": "Bearer {0}".format(token.token)} resp = requests.get(self.profile_url, headers=headers) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(YahooOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(YahooOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/yandex/000077500000000000000000000000001452212273200242665ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/yandex/__init__.py000066400000000000000000000000001452212273200263650ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/yandex/provider.py000066400000000000000000000031401452212273200264700ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount import app_settings from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class YandexAccout(ProviderAccount): def to_str(self): first_name = self.account.extra_data.get("first_name", "") last_name = self.account.extra_data.get("last_name", "") name = " ".join([first_name, last_name]).strip() return name or super(YandexAccout, self).to_str() class YandexProvider(OAuth2Provider): id = "yandex" name = "Yandex" account_class = YandexAccout def get_default_scope(self): scope = ["login:info"] if app_settings.QUERY_EMAIL: scope.append("login:email") return scope def extract_uid(self, data): return str(data["id"]) def get_user_email(self, data): email = data.get("default_email") if not email: emails = data.get("emails") email = emails[0] if emails else "" return email def extract_common_fields(self, data): email = self.get_user_email(data) return dict( email=email, last_name=data.get("last_name"), username=data.get("display_name"), first_name=data.get("first_name"), ) def extract_email_addresses(self, data): ret = [] email = self.get_user_email(data) if email: ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [YandexProvider] django-allauth-0.58.2/allauth/socialaccount/providers/yandex/tests.py000066400000000000000000000025771452212273200260150ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import YandexProvider class YandexTests(OAuth2TestsMixin, TestCase): provider_id = YandexProvider.id yandex_data = """ { "login": "vasya", "old_social_login": "uid-mmzxrnry", "default_email": "test@yandex.ru", "id": "1000034426", "client_id": "4760187d81bc4b7799476b42b5103713", "emails": [ "test@yandex.ru", "other-test@yandex.ru" ], "openid_identities": [ "http://openid.yandex.ru/vasya/", "http://vasya.ya.ru/" ] }""" def get_mocked_response(self, data=None): if data is None: data = self.yandex_data return MockedResponse(200, data) def get_login_response_json(self, with_refresh_token=True): return """ { "access_token":"testac", "refresh_token":"1:GN686QVt0mmakDd9:A4pYuW9LGk0_UnlrMIWklk", "token_type":"bearer", "expires_in":124234123534 }""" django-allauth-0.58.2/allauth/socialaccount/providers/yandex/urls.py000066400000000000000000000002461452212273200256270ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import YandexProvider urlpatterns = default_urlpatterns(YandexProvider) django-allauth-0.58.2/allauth/socialaccount/providers/yandex/views.py000066400000000000000000000016501452212273200257770ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import YandexProvider class YandexAuth2Adapter(OAuth2Adapter): provider_id = YandexProvider.id access_token_url = "https://oauth.yandex.ru/token" authorize_url = "https://oauth.yandex.com/authorize" profile_url = "https://login.yandex.ru/info" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, params={"format": "json"}, headers={"Authorization": f"OAuth {token.token}"}, ) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(YandexAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(YandexAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/ynab/000077500000000000000000000000001452212273200237275ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/ynab/__init__.py000066400000000000000000000000001452212273200260260ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/ynab/provider.py000066400000000000000000000014341452212273200261350ustar00rootroot00000000000000from allauth.socialaccount.providers.base import AuthAction, ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class Scope(object): ACCESS = "read-only" class YNABAccount(ProviderAccount): pass class YNABProvider(OAuth2Provider): id = "ynab" name = "YNAB" account_class = YNABAccount def get_default_scope(self): scope = [Scope.ACCESS] return scope def get_auth_params(self, request, action): ret = super(YNABProvider, self).get_auth_params(request, action) if action == AuthAction.REAUTHENTICATE: ret["prompt"] = "select_account consent" return ret def extract_uid(self, data): return str(data["data"]["user"]["id"]) provider_classes = [YNABProvider] django-allauth-0.58.2/allauth/socialaccount/providers/ynab/tests.py000066400000000000000000000043001452212273200254400ustar00rootroot00000000000000from requests.exceptions import HTTPError from unittest.mock import patch from django.test.client import RequestFactory from django.test.utils import override_settings from django.urls import reverse from allauth.socialaccount.models import SocialToken from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import YNABProvider @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=True, ACCOUNT_SIGNUP_FORM_CLASS=None, ) # ACCOUNT_EMAIL_VERIFICATION=account_settings # .EmailVerificationMethod.MANDATORY) class YNABTests(OAuth2TestsMixin, TestCase): provider_id = YNABProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"data": { "user":{ "id": "abcd1234xyz5678" } } } """, ) def test_ynab_compelete_login_401(self): from allauth.socialaccount.providers.ynab.views import ( YNABOAuth2Adapter, ) class LessMockedResponse(MockedResponse): def raise_for_status(self): if self.status_code != 200: raise HTTPError(None) request = RequestFactory().get( reverse(self.provider.id + "_login"), dict(process="login") ) adapter = YNABOAuth2Adapter(request) app = adapter.get_provider().app token = SocialToken(token="some_token") response_with_401 = LessMockedResponse( 401, """ {"error": { "errors": [{ "domain": "global", "reason": "authError", "message": "Invalid Credentials", "locationType": "header", "location": "Authorization" } ], "code": 401, "message": "Invalid Credentials" } }""", ) with patch( "allauth.socialaccount.providers.ynab.views.requests" ) as patched_requests: patched_requests.get.return_value = response_with_401 with self.assertRaises(HTTPError): adapter.complete_login(request, app, token) django-allauth-0.58.2/allauth/socialaccount/providers/ynab/urls.py000066400000000000000000000002421452212273200252640ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import YNABProvider urlpatterns = default_urlpatterns(YNABProvider) django-allauth-0.58.2/allauth/socialaccount/providers/ynab/views.py000066400000000000000000000016741452212273200254460ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import YNABProvider class YNABOAuth2Adapter(OAuth2Adapter): provider_id = YNABProvider.id access_token_url = "https://app.youneedabudget.com/oauth/token" authorize_url = "https://app.youneedabudget.com/oauth/authorize" profile_url = "https://api.youneedabudget.com/v1/user" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer {}".format(token.token)}, ) resp.raise_for_status() extra_data = resp.json() login = self.get_provider().sociallogin_from_response(request, extra_data) return login oauth2_login = OAuth2LoginView.adapter_view(YNABOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(YNABOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/zoho/000077500000000000000000000000001452212273200237555ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/zoho/__init__.py000066400000000000000000000000001452212273200260540ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/zoho/provider.py000066400000000000000000000022631452212273200261640ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class ZohoAccount(ProviderAccount): def to_str(self): dflt = super(ZohoAccount, self).to_str() return self.account.extra_data.get("Display_Name", dflt) class ZohoProvider(OAuth2Provider): id = "zoho" name = "Zoho" account_class = ZohoAccount def get_default_scope(self): return ["aaaserver.profile.READ"] def extract_uid(self, data): return str(data["ZUID"]) def extract_common_fields(self, data): return dict( email=data["Email"], username=data["Display_Name"], first_name=data["First_Name"], last_name=data["Last_Name"], ) def extract_email_addresses(self, data): ret = [] email = data.get("Email") if email: ret.append( EmailAddress( email=email, verified=False, primary=True, ) ) return ret provider_classes = [ZohoProvider] django-allauth-0.58.2/allauth/socialaccount/providers/zoho/tests.py000066400000000000000000000006761452212273200255020ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import ZohoProvider class ZohoTests(OAuth2TestsMixin, TestCase): provider_id = ZohoProvider.id def get_mocked_response(self): return MockedResponse( 200, """ {"First_Name":"John","Email":"jdoe@example.com", "Last_Name":"Doe","Display_Name":"JDoee","ZUID":1234567} """, ) django-allauth-0.58.2/allauth/socialaccount/providers/zoho/urls.py000066400000000000000000000002421452212273200253120ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import ZohoProvider urlpatterns = default_urlpatterns(ZohoProvider) django-allauth-0.58.2/allauth/socialaccount/providers/zoho/views.py000066400000000000000000000016401452212273200254650ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import ZohoProvider class ZohoOAuth2Adapter(OAuth2Adapter): provider_id = ZohoProvider.id access_token_url = "https://accounts.zoho.com/oauth/v2/token" authorize_url = "https://accounts.zoho.com/oauth/v2/auth" profile_url = "https://accounts.zoho.com/oauth/user/info" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer {}".format(token.token)}, ) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(ZohoOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(ZohoOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/providers/zoom/000077500000000000000000000000001452212273200237625ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/zoom/__init__.py000066400000000000000000000000001452212273200260610ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/providers/zoom/provider.py000066400000000000000000000022061452212273200261660ustar00rootroot00000000000000from allauth.account.models import EmailAddress from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider class ZoomAccount(ProviderAccount): def get_profile_url(self): return self.account.extra_data.get("vanity_url") def get_avatar_url(self): return self.account.extra_data.get("pic_url") def to_str(self): dflt = super(ZoomAccount, self).to_str() return self.account.extra_data.get("name", dflt) class ZoomProvider(OAuth2Provider): id = "zoom" name = "Zoom" account_class = ZoomAccount def extract_uid(self, data): return data["id"] def extract_common_fields(self, data): return dict( email=data["email"], first_name=data["first_name"], last_name=data["last_name"], ) def extract_email_addresses(self, data): ret = [] email = data.get("email") if email and data.get("verified"): ret.append(EmailAddress(email=email, verified=True, primary=True)) return ret provider_classes = [ZoomProvider] django-allauth-0.58.2/allauth/socialaccount/providers/zoom/tests.py000066400000000000000000000023121452212273200254740ustar00rootroot00000000000000from allauth.socialaccount.tests import OAuth2TestsMixin from allauth.tests import MockedResponse, TestCase from .provider import ZoomProvider class ZoomTests(OAuth2TestsMixin, TestCase): provider_id = ZoomProvider.id def get_mocked_response(self): return MockedResponse( 200, """ { "id": "KdYKjnimT4KPd8FFgQt9FQ", "first_name": "Jane", "last_name": "Dev", "email": "jane.dev@email.com", "type": 2, "role_name": "Owner", "pmi": 1234567890, "use_pmi": false, "vanity_url": "https://janedevinc.zoom.us/my/janedev", "personal_meeting_url": "https://janedevinc.zoom.us/j/1234567890", "timezone": "America/Denver", "verified": 1, "dept": "", "created_at": "2019-04-05T15:24:32Z", "last_login_time": "2019-12-16T18:02:48Z", "last_client_version": "4.6.12611.1124(mac)", "pic_url": "https://janedev.zoom.us/p/KdYKjnimFR5Td8KKdQt9FQ/19f6430f-...", "host_key": "533895", "jid": "kdykjnimt4kpd8kkdqt9fq@xmpp.zoom.us", "group_ids": [], "im_group_ids": [ "3NXCD9VFTCOUH8LD-QciGw" ], "account_id": "gVcjZnYYRLDbb_MfgHuaxg", "language": "en-US", "phone_country": "US", "phone_number": "+1 1234567891", "status": "active" } """, ) django-allauth-0.58.2/allauth/socialaccount/providers/zoom/urls.py000066400000000000000000000002421452212273200253170ustar00rootroot00000000000000from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from .provider import ZoomProvider urlpatterns = default_urlpatterns(ZoomProvider) django-allauth-0.58.2/allauth/socialaccount/providers/zoom/views.py000066400000000000000000000016011452212273200254670ustar00rootroot00000000000000import requests from allauth.socialaccount.providers.oauth2.views import ( OAuth2Adapter, OAuth2CallbackView, OAuth2LoginView, ) from .provider import ZoomProvider class ZoomOAuth2Adapter(OAuth2Adapter): provider_id = ZoomProvider.id access_token_url = "https://zoom.us/oauth/token" authorize_url = "https://zoom.us/oauth/authorize" profile_url = "https://api.zoom.us/v2/users/me" def complete_login(self, request, app, token, **kwargs): resp = requests.get( self.profile_url, headers={"Authorization": "Bearer {}".format(token.token)}, ) resp.raise_for_status() extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data) oauth2_login = OAuth2LoginView.adapter_view(ZoomOAuth2Adapter) oauth2_callback = OAuth2CallbackView.adapter_view(ZoomOAuth2Adapter) django-allauth-0.58.2/allauth/socialaccount/sessions.py000066400000000000000000000035631452212273200232100ustar00rootroot00000000000000from importlib import import_module from urllib.parse import urlparse from django.conf import settings from django.utils.cache import patch_vary_headers engine = import_module(settings.SESSION_ENGINE) SessionStore = engine.SessionStore class LoginSession: """Some providers sometimes POST their responses, which due to CORS/Samesite-cookie rules means that this request cannot access the session as its session cookie is unavailable. We work around this by storing the response in a separate, temporary session and redirecting to a different endpoint that can pick up the flow. """ def __init__(self, request, attribute_name, cookie_name): """ Prepares an provider specific session. """ self.request = request self.attribute_name = attribute_name self.cookie_name = cookie_name self.store = getattr(request, attribute_name, None) if self.store is None: session_key = request.COOKIES.get(cookie_name) self.store = SessionStore(session_key) setattr(request, attribute_name, self.store) def save(self, response): """ Save the session and set a cookie. """ patch_vary_headers(response, ("Cookie",)) self.store.save() kwargs = {} samesite = getattr(settings, "SESSION_COOKIE_SAMESITE", None) if samesite: kwargs["samesite"] = samesite response.set_cookie( self.cookie_name, self.store.session_key, max_age=None, expires=None, domain=settings.SESSION_COOKIE_DOMAIN, # The cookie is only needed on this endpoint path=urlparse(response.url).path, secure=settings.SESSION_COOKIE_SECURE, httponly=None, **kwargs ) def delete(self): self.store.delete() django-allauth-0.58.2/allauth/socialaccount/signals.py000066400000000000000000000016251452212273200227770ustar00rootroot00000000000000from django.dispatch import Signal # Sent after a user successfully authenticates via a social provider, # but before the login is actually processed. This signal is emitted # for social logins, signups and when connecting additional social # accounts to an account. # Provides the arguments "request", "sociallogin" pre_social_login = Signal() # Sent after a user connects a social account to a their local account. # Provides the arguments "request", "sociallogin" social_account_added = Signal() # Sent after a user connects an already existing social account to a # their local account. The social account will have an updated token and # refreshed extra_data. # Provides the arguments "request", "sociallogin" social_account_updated = Signal() # Sent after a user disconnects a social account from their local # account. # Provides the arguments "request", "socialaccount" social_account_removed = Signal() django-allauth-0.58.2/allauth/socialaccount/templatetags/000077500000000000000000000000001452212273200234535ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/templatetags/__init__.py000066400000000000000000000000001452212273200255520ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/templatetags/socialaccount.py000066400000000000000000000047431452212273200266640ustar00rootroot00000000000000from django import template from django.utils.safestring import mark_safe from allauth.socialaccount.adapter import get_adapter from allauth.utils import get_request_param register = template.Library() @register.simple_tag(takes_context=True) def provider_login_url(context, provider, **params): """ {% provider_login_url "facebook" next=bla %} {% provider_login_url "openid" openid="http://me.yahoo.com" next=bla %} """ request = context.get("request") if isinstance(provider, str): adapter = get_adapter() provider = adapter.get_provider(request, provider) query = dict(params) auth_params = query.get("auth_params", None) scope = query.get("scope", None) process = query.get("process", None) if scope == "": del query["scope"] if auth_params == "": del query["auth_params"] if "next" not in query: next = get_request_param(request, "next") if next: query["next"] = next elif process == "redirect": query["next"] = request.get_full_path() else: if not query["next"]: del query["next"] # get the login url and append query as url parameters return provider.get_login_url(request, **query) @register.simple_tag(takes_context=True) def providers_media_js(context): request = context["request"] providers = get_adapter().list_providers(request) ret = "\n".join(p.media_js(request) for p in providers) return mark_safe(ret) @register.simple_tag def get_social_accounts(user): """ {% get_social_accounts user as accounts %} Then: {{accounts.twitter}} -- a list of connected Twitter accounts {{accounts.twitter.0}} -- the first Twitter account {% if accounts %} -- if there is at least one social account """ accounts = {} for account in user.socialaccount_set.all().iterator(): providers = accounts.setdefault(account.provider, []) providers.append(account) return accounts @register.simple_tag(takes_context=True) def get_providers(context): """ Returns a list of social authentication providers. Usage: `{% get_providers as socialaccount_providers %}`. Then within the template context, `socialaccount_providers` will hold a list of social providers configured for the current site. """ request = context["request"] adapter = get_adapter() providers = adapter.list_providers(request) return sorted(providers, key=lambda p: p.name) django-allauth-0.58.2/allauth/socialaccount/tests/000077500000000000000000000000001452212273200221235ustar00rootroot00000000000000django-allauth-0.58.2/allauth/socialaccount/tests/__init__.py000066400000000000000000000402001452212273200242300ustar00rootroot00000000000000import base64 import hashlib import json import random import requests import warnings from unittest.mock import Mock, patch from urllib.parse import parse_qs, urlparse from django.conf import settings from django.contrib.auth import get_user_model from django.test import RequestFactory from django.test.utils import override_settings from django.urls import reverse from django.utils.http import urlencode import allauth.app_settings from allauth.account.models import EmailAddress from allauth.account.utils import user_email, user_username from allauth.socialaccount import app_settings from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.models import SocialAccount, SocialApp from allauth.tests import MockedResponse, TestCase, mocked_response def setup_app(provider_id): request = RequestFactory().get("/") apps = get_adapter().list_apps(request, provider_id) if apps: return apps[0] app = SocialApp.objects.create( provider=provider_id, name=provider_id, client_id="app123id", key=provider_id, secret="dummy", ) if allauth.app_settings.SITES_ENABLED: from django.contrib.sites.models import Site app.sites.add(Site.objects.get_current()) return app class OAuthTestsMixin(object): provider_id = None def get_mocked_response(self): pass def setUp(self): super(OAuthTestsMixin, self).setUp() self.app = setup_app(self.provider_id) request = RequestFactory().get("/") self.provider = self.app.get_provider(request) @override_settings(SOCIALACCOUNT_AUTO_SIGNUP=False) def test_login(self): resp_mocks = self.get_mocked_response() if resp_mocks is None: warnings.warn("Cannot test provider %s, no oauth mock" % self.provider.id) return resp = self.login(resp_mocks) self.assertRedirects(resp, reverse("socialaccount_signup")) resp = self.client.get(reverse("socialaccount_signup")) sociallogin = resp.context["form"].sociallogin data = dict( email=user_email(sociallogin.user), username=str(random.randrange(1000, 10000000)), ) resp = self.client.post(reverse("socialaccount_signup"), data=data) self.assertRedirects(resp, "/accounts/profile/", fetch_redirect_response=False) user = resp.context["user"] self.assertFalse(user.has_usable_password()) account = SocialAccount.objects.get(user=user, provider=self.provider.id) # The following lines don't actually test that much, but at least # we make sure that the code is hit. provider_account = account.get_provider_account() provider_account.get_avatar_url() provider_account.get_profile_url() provider_account.get_brand() provider_account.to_str() return account @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=True, SOCIALACCOUNT_EMAIL_REQUIRED=False, ACCOUNT_EMAIL_REQUIRED=False, ) def test_auto_signup(self): resp_mocks = self.get_mocked_response() if not resp_mocks: warnings.warn("Cannot test provider %s, no oauth mock" % self.provider.id) return resp = self.login(resp_mocks) self.assertRedirects(resp, "/accounts/profile/", fetch_redirect_response=False) self.assertFalse(resp.context["user"].has_usable_password()) def login(self, resp_mocks, process="login"): with mocked_response( MockedResponse( 200, "oauth_token=token&oauth_token_secret=psst", {"content-type": "text/html"}, ) ): resp = self.client.post( reverse(self.provider.id + "_login") + "?" + urlencode(dict(process=process)) ) p = urlparse(resp["location"]) q = parse_qs(p.query) complete_url = reverse(self.provider.id + "_callback") self.assertGreater(q["oauth_callback"][0].find(complete_url), 0) with mocked_response(self.get_access_token_response(), *resp_mocks): resp = self.client.get(complete_url) return resp def get_access_token_response(self): return MockedResponse( 200, "oauth_token=token&oauth_token_secret=psst", {"content-type": "text/html"}, ) def test_authentication_error(self): resp = self.client.get(reverse(self.provider.id + "_callback")) self.assertTemplateUsed( resp, "socialaccount/authentication_error.%s" % getattr(settings, "ACCOUNT_TEMPLATE_EXTENSION", "html"), ) # For backward-compatibility with third-party provider tests that call # create_oauth_tests() rather than using the mixin directly. def create_oauth_tests(provider): class Class(OAuthTestsMixin, TestCase): provider_id = provider.id Class.__name__ = "OAuthTests_" + provider.id return Class class OAuth2TestsMixin(object): provider_id = None def get_mocked_response(self): pass def get_login_response_json(self, with_refresh_token=True): rt = "" if with_refresh_token: rt = ',"refresh_token": "testrf"' return ( """{ "uid":"weibo", "access_token":"testac" %s }""" % rt ) def setUp(self): super(OAuth2TestsMixin, self).setUp() self.setup_provider() def setup_provider(self): self.app = setup_app(self.provider_id) self.request = RequestFactory().get("/") self.provider = self.app.get_provider(self.request) def test_provider_has_no_pkce_params(self): provider_settings = app_settings.PROVIDERS.get(self.app.provider, {}) provider_settings_with_pkce_set = provider_settings.copy() provider_settings_with_pkce_set["OAUTH_PKCE_ENABLED"] = False with self.settings( SOCIALACCOUNT_PROVIDERS={self.app.provider: provider_settings_with_pkce_set} ): self.assertEqual(self.provider.get_pkce_params(), {}) def test_provider_has_pkce_params(self): provider_settings = app_settings.PROVIDERS.get(self.app.provider, {}) provider_settings_with_pkce_set = provider_settings.copy() provider_settings_with_pkce_set["OAUTH_PKCE_ENABLED"] = True with self.settings( SOCIALACCOUNT_PROVIDERS={self.app.provider: provider_settings_with_pkce_set} ): pkce_params = self.provider.get_pkce_params() self.assertEqual( set(pkce_params.keys()), {"code_challenge", "code_challenge_method", "code_verifier"}, ) hashed_verifier = hashlib.sha256( pkce_params["code_verifier"].encode("ascii") ) code_challenge = base64.urlsafe_b64encode(hashed_verifier.digest()) code_challenge_without_padding = code_challenge.rstrip(b"=") assert pkce_params["code_challenge"] == code_challenge_without_padding @override_settings(SOCIALACCOUNT_AUTO_SIGNUP=False) def test_login(self): resp_mock = self.get_mocked_response() if not resp_mock: warnings.warn("Cannot test provider %s, no oauth mock" % self.provider.id) return resp = self.login( resp_mock, ) self.assertRedirects(resp, reverse("socialaccount_signup")) @override_settings(SOCIALACCOUNT_AUTO_SIGNUP=False) def test_login_with_pkce_disabled(self): provider_settings = app_settings.PROVIDERS.get(self.app.provider, {}) provider_settings_with_pkce_disabled = provider_settings.copy() provider_settings_with_pkce_disabled["OAUTH_PKCE_ENABLED"] = False with self.settings( SOCIALACCOUNT_PROVIDERS={ self.app.provider: provider_settings_with_pkce_disabled } ): resp_mock = self.get_mocked_response() if not resp_mock: warnings.warn( "Cannot test provider %s, no oauth mock" % self.provider.id ) return resp = self.login( resp_mock, ) self.assertRedirects(resp, reverse("socialaccount_signup")) @override_settings(SOCIALACCOUNT_AUTO_SIGNUP=False) def test_login_with_pkce_enabled(self): provider_settings = app_settings.PROVIDERS.get(self.app.provider, {}) provider_settings_with_pkce_enabled = provider_settings.copy() provider_settings_with_pkce_enabled["OAUTH_PKCE_ENABLED"] = True with self.settings( SOCIALACCOUNT_PROVIDERS={ self.app.provider: provider_settings_with_pkce_enabled } ): resp_mock = self.get_mocked_response() if not resp_mock: warnings.warn( "Cannot test provider %s, no oauth mock" % self.provider.id ) return resp = self.login( resp_mock, ) self.assertRedirects(resp, reverse("socialaccount_signup")) @override_settings(SOCIALACCOUNT_STORE_TOKENS=True) def test_account_tokens(self, multiple_login=False): email = "user@example.com" user = get_user_model()(is_active=True) user_email(user, email) user_username(user, "user") user.set_password("test") user.save() EmailAddress.objects.create(user=user, email=email, primary=True, verified=True) self.client.login(username=user.username, password="test") self.login(self.get_mocked_response(), process="connect") if multiple_login: self.login( self.get_mocked_response(), with_refresh_token=False, process="connect", ) # get account sa = SocialAccount.objects.filter( user=user, provider=self.provider.app.provider_id or self.provider.id ).get() # The following lines don't actually test that much, but at least # we make sure that the code is hit. provider_account = sa.get_provider_account() provider_account.get_avatar_url() provider_account.get_profile_url() provider_account.get_brand() provider_account.to_str() # get token if self.app: t = sa.socialtoken_set.get() # verify access_token and refresh_token self.assertEqual("testac", t.token) resp = json.loads(self.get_login_response_json(with_refresh_token=True)) if "refresh_token" in resp: refresh_token = resp.get("refresh_token") elif "refreshToken" in resp: refresh_token = resp.get("refreshToken") else: refresh_token = "" self.assertEqual(t.token_secret, refresh_token) @override_settings(SOCIALACCOUNT_STORE_TOKENS=True) def test_account_refresh_token_saved_next_login(self): """ fails if a login missing a refresh token, deletes the previously saved refresh token. Systems such as google's oauth only send a refresh token on first login. """ self.test_account_tokens(multiple_login=True) def login(self, resp_mock=None, process="login", with_refresh_token=True): resp = self.client.post( self.provider.get_login_url(self.request, process=process) ) p = urlparse(resp["location"]) q = parse_qs(p.query) pkce_enabled = app_settings.PROVIDERS.get(self.app.provider, {}).get( "OAUTH_PKCE_ENABLED", self.provider.pkce_enabled_default ) self.assertEqual("code_challenge" in q, pkce_enabled) self.assertEqual("code_challenge_method" in q, pkce_enabled) if pkce_enabled: code_challenge = q["code_challenge"][0] self.assertEqual(q["code_challenge_method"][0], "S256") complete_url = self.provider.get_callback_url() self.assertGreater(q["redirect_uri"][0].find(complete_url), 0) response_json = self.get_login_response_json( with_refresh_token=with_refresh_token ) if isinstance(resp_mock, list): resp_mocks = resp_mock elif resp_mock is None: resp_mocks = [] else: resp_mocks = [resp_mock] with mocked_response( MockedResponse(200, response_json, {"content-type": "application/json"}), *resp_mocks, ): resp = self.client.get(complete_url, self.get_complete_parameters(q)) # Find the access token POST request, and assert that it contains # the correct code_verifier if and only if PKCE is enabled request_calls = requests.request.call_args_list for args, kwargs in request_calls: data = kwargs.get("data", {}) if ( args[0] == "POST" and isinstance(data, dict) and data.get("redirect_uri", "").endswith(complete_url) ): self.assertEqual("code_verifier" in data, pkce_enabled) if pkce_enabled: hashed_code_verifier = hashlib.sha256( data["code_verifier"].encode("ascii") ) expected_code_challenge = ( base64.urlsafe_b64encode(hashed_code_verifier.digest()) .rstrip(b"=") .decode() ) self.assertEqual(code_challenge, expected_code_challenge) return resp def get_complete_parameters(self, q): return {"code": "test", "state": q["state"][0]} def test_authentication_error(self): resp = self.client.get(self.provider.get_callback_url()) self.assertTemplateUsed( resp, "socialaccount/authentication_error.%s" % getattr(settings, "ACCOUNT_TEMPLATE_EXTENSION", "html"), ) class OpenIDConnectTests(OAuth2TestsMixin): oidc_info_content = { "authorization_endpoint": "/login", "userinfo_endpoint": "/userinfo", "token_endpoint": "/token", } userinfo_content = { "picture": "https://secure.gravatar.com/avatar/123", "email": "ness@some.oidc.server.onett.example", "sub": 2187, "identities": [], "name": "Ness", } extra_data = { "picture": "https://secure.gravatar.com/avatar/123", "email": "ness@some.oidc.server.onett.example", "sub": 2187, "identities": [], "name": "Ness", } def setUp(self): super(OpenIDConnectTests, self).setUp() patcher = patch( "allauth.socialaccount.providers.openid_connect.views.requests", get=Mock(side_effect=self._mocked_responses), ) self.mock_requests = patcher.start() self.addCleanup(patcher.stop) def setup_provider(self): self.app = setup_app(self.provider_id) self.app.provider_id = self.provider_id self.app.provider = "openid_connect" self.app.settings = { "server_url": "https://unittest.example.com", } self.app.save() self.request = RequestFactory().get("/") self.provider = self.app.get_provider(self.request) def get_mocked_response(self): # Enable test_login in OAuth2TestsMixin, but this response mock is unused return True def _mocked_responses(self, url, *args, **kwargs): if url.endswith("/.well-known/openid-configuration"): return MockedResponse(200, json.dumps(self.oidc_info_content)) elif url.endswith("/userinfo"): return MockedResponse(200, json.dumps(self.userinfo_content)) @override_settings(SOCIALACCOUNT_AUTO_SIGNUP=True) def test_login_auto_signup(self): resp = self.login() self.assertRedirects(resp, "/accounts/profile/", fetch_redirect_response=False) sa = SocialAccount.objects.get(provider=self.app.provider_id) self.assertDictEqual(sa.extra_data, self.extra_data) django-allauth-0.58.2/allauth/socialaccount/tests/conftest.py000066400000000000000000000026021452212273200243220ustar00rootroot00000000000000from unittest.mock import Mock, patch from django.urls import reverse import pytest from allauth.socialaccount.providers.base.constants import AuthProcess @pytest.fixture def provider_callback_response(): def f(client, process=AuthProcess.LOGIN): with patch("requests.get") as get_mock: resp = Mock() resp.json = Mock() resp.json.return_value = { "sub": "sub123", "token_endpoint": "/", "userinfo_endpoint": "/", } get_mock.return_value = resp with patch("requests.post"): with patch("requests.request") as request_mock: resp = Mock() resp.status_code = 200 resp.headers = {"content-type": "dummy"} resp.text = "access_token=456" request_mock.return_value = resp session = client.session session["socialaccount_state"] = [{"process": process}, None] session.save() resp = client.post( reverse( "openid_connect_callback", kwargs={"provider_id": "unittest-server"}, ) + "?code=123" ) return resp return f django-allauth-0.58.2/allauth/socialaccount/tests/test_adapter.py000066400000000000000000000017131452212273200251560ustar00rootroot00000000000000from django.contrib.sites.models import Site from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.models import SocialApp def test_list_db_based_apps(db, settings): app = SocialApp.objects.create( provider="saml", provider_id="urn:idp-identity-id", client_id="org-slug" ) app.sites.add(Site.objects.get_current()) apps = get_adapter().list_apps(None, provider="saml", client_id="org-slug") assert app.pk in [a.pk for a in apps] def test_list_settings_based_apps(db, settings): settings.SOCIALACCOUNT_PROVIDERS = { "saml": { "APPS": [ { "provider_id": "urn:idp-entity-id", "client_id": "org-slug", } ] } } apps = get_adapter().list_apps(None, provider="saml", client_id="org-slug") assert len(apps) == 1 app = apps[0] assert not app.pk assert app.client_id == "org-slug" django-allauth-0.58.2/allauth/socialaccount/tests/test_connect.py000066400000000000000000000031021452212273200251610ustar00rootroot00000000000000from django.urls import reverse from pytest_django.asserts import assertTemplateUsed from allauth.socialaccount.models import SocialAccount def test_disconnect(auth_client, user): account = SocialAccount.objects.create(uid="123", provider="twitter", user=user) resp = auth_client.get(reverse("socialaccount_connections")) assertTemplateUsed(resp, "socialaccount/connections.html") resp = auth_client.post( reverse("socialaccount_connections"), {"account": account.pk} ) assert not SocialAccount.objects.filter(pk=account.pk).exists() def test_connect_with_reauthentication( auth_client, user, provider_callback_response, settings, user_password ): settings.ACCOUNT_REAUTHENTICATION_REQUIRED = True resp = provider_callback_response(auth_client, process="connect") assert not SocialAccount.objects.filter(user=user).exists() assert resp.status_code == 302 assert resp["location"] == reverse("account_reauthenticate") resp = auth_client.post(resp["location"], {"password": user_password}) assert resp.status_code == 302 assert resp["location"] == reverse("socialaccount_connections") assert SocialAccount.objects.filter(user=user).exists() def test_connect( auth_client, user, provider_callback_response, settings, user_password ): settings.ACCOUNT_REAUTHENTICATION_REQUIRED = False resp = provider_callback_response(auth_client, process="connect") assert resp.status_code == 302 assert SocialAccount.objects.filter(user=user).exists() assert resp["location"] == reverse("socialaccount_connections") django-allauth-0.58.2/allauth/socialaccount/tests/test_login.py000066400000000000000000000064741452212273200246570ustar00rootroot00000000000000import copy from unittest.mock import patch from django.contrib.auth import get_user_model from django.contrib.auth.models import AnonymousUser from django.contrib.messages.middleware import MessageMiddleware from django.contrib.sessions.middleware import SessionMiddleware from django.urls import reverse import pytest from pytest_django.asserts import assertTemplateUsed from allauth.core import context from allauth.socialaccount.helpers import complete_social_login from allauth.socialaccount.models import SocialAccount @pytest.mark.parametrize("with_emailaddress", [False, True]) @pytest.mark.parametrize("auto_connect", [False, True]) @pytest.mark.parametrize("setting", ["off", "on-global", "on-provider"]) def test_email_authentication( db, setting, settings, user_factory, sociallogin_factory, client, rf, mailoutbox, auto_connect, with_emailaddress, ): """Tests that when an already existing email is given at the social signup form, enumeration preventation kicks in. """ settings.ACCOUNT_EMAIL_REQUIRED = True settings.ACCOUNT_UNIQUE_EMAIL = True settings.ACCOUNT_USERNAME_REQUIRED = False settings.ACCOUNT_AUTHENTICATION_METHOD = "email" settings.ACCOUNT_EMAIL_VERIFICATION = "mandatory" settings.SOCIALACCOUNT_AUTO_SIGNUP = True if setting == "on-global": settings.SOCIALACCOUNT_EMAIL_AUTHENTICATION = True elif setting == "on-provider": settings.SOCIALACCOUNT_PROVIDERS = copy.deepcopy( settings.SOCIALACCOUNT_PROVIDERS ) settings.SOCIALACCOUNT_PROVIDERS["openid_connect"][ "EMAIL_AUTHENTICATION" ] = True else: settings.SOCIALACCOUNT_EMAIL_AUTHENTICATION = False settings.SOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT = auto_connect user = user_factory(with_emailaddress=with_emailaddress) sociallogin = sociallogin_factory(email=user.email, provider="unittest-server") request = rf.get("/") SessionMiddleware(lambda request: None).process_request(request) MessageMiddleware(lambda request: None).process_request(request) request.user = AnonymousUser() with context.request_context(request): with patch( "allauth.socialaccount.signals.social_account_updated.send" ) as updated_signal: with patch( "allauth.socialaccount.signals.social_account_added.send" ) as added_signal: resp = complete_social_login(request, sociallogin) if setting == "off": assert resp["location"] == reverse("account_email_verification_sent") assert not added_signal.called assert not updated_signal.called else: if with_emailaddress: assert resp["location"] == "/accounts/profile/" else: # user.email is set, but not verified. assert resp["location"] == reverse("account_email_verification_sent") assert get_user_model().objects.count() == 1 assert SocialAccount.objects.filter(user=user.pk).exists() == auto_connect assert added_signal.called == auto_connect assert not updated_signal.called def test_login_cancelled(client): resp = client.get(reverse("socialaccount_login_cancelled")) assert resp.status_code == 200 assertTemplateUsed(resp, "socialaccount/login_cancelled.html") django-allauth-0.58.2/allauth/socialaccount/tests/test_registry.py000066400000000000000000000037411452212273200254110ustar00rootroot00000000000000from django.apps import AppConfig, apps from django.test.utils import override_settings from allauth.socialaccount import providers from allauth.tests import TestCase class CustomFacebookAppConfig(AppConfig): name = "allauth.socialaccount.providers.facebook" label = "allauth_facebook" class ProviderRegistryTests(TestCase): @override_settings( INSTALLED_APPS=[ "allauth.socialaccount.providers.facebook", ] ) def test_load_provider_with_default_app_config(self): registry = providers.ProviderRegistry() provider_list = registry.get_class_list() self.assertTrue(registry.loaded) self.assertEqual(1, len(provider_list)) self.assertTrue( issubclass( provider_list[0], providers.facebook.provider.FacebookProvider, ) ) app_config_list = list(apps.get_app_configs()) self.assertEqual(1, len(app_config_list)) app_config = app_config_list[0] self.assertEqual("allauth.socialaccount.providers.facebook", app_config.name) self.assertEqual("facebook", app_config.label) @override_settings( INSTALLED_APPS=[ "allauth.socialaccount.tests.test_registry.CustomFacebookAppConfig", ] ) def test_load_provider_with_custom_app_config(self): registry = providers.ProviderRegistry() provider_list = registry.get_class_list() self.assertTrue(registry.loaded) self.assertEqual(1, len(provider_list)) self.assertTrue( issubclass( provider_list[0], providers.facebook.provider.FacebookProvider, ) ) app_config_list = list(apps.get_app_configs()) self.assertEqual(1, len(app_config_list)) app_config = app_config_list[0] self.assertEqual("allauth.socialaccount.providers.facebook", app_config.name) self.assertEqual("allauth_facebook", app_config.label) django-allauth-0.58.2/allauth/socialaccount/tests/test_signup.py000066400000000000000000000475521452212273200250560ustar00rootroot00000000000000import django from django.contrib.auth import get_user_model from django.contrib.auth.models import AnonymousUser from django.contrib.messages.middleware import MessageMiddleware from django.contrib.sessions.middleware import SessionMiddleware from django.test.client import RequestFactory from django.test.utils import override_settings from django.urls import reverse import allauth.app_settings from allauth.account import app_settings as account_settings from allauth.account.models import EmailAddress from allauth.account.utils import user_email, user_username from allauth.core import context from allauth.socialaccount import providers from allauth.socialaccount.helpers import complete_social_login from allauth.socialaccount.models import SocialAccount, SocialApp, SocialLogin from allauth.socialaccount.views import signup from allauth.tests import TestCase class SignupTests(TestCase): def setUp(self): super().setUp() for provider in providers.registry.get_class_list(): if provider.id == "openid_connect": continue app = SocialApp.objects.create( provider=provider.id, name=provider.id, client_id="app123id", key="123", secret="dummy", ) if allauth.app_settings.SITES_ENABLED: from django.contrib.sites.models import Site site = Site.objects.get_current() app.sites.add(site) @override_settings( SOCIALACCOUNT_AUTO_SIGNUP=True, ACCOUNT_SIGNUP_FORM_CLASS=None, ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.NONE, # noqa ) def test_email_address_created(self): factory = RequestFactory() request = factory.get("/accounts/login/callback/") request.user = AnonymousUser() SessionMiddleware(lambda request: None).process_request(request) MessageMiddleware(lambda request: None).process_request(request) User = get_user_model() user = User() setattr(user, account_settings.USER_MODEL_USERNAME_FIELD, "test") setattr(user, account_settings.USER_MODEL_EMAIL_FIELD, "test@example.com") account = SocialAccount(provider="openid", uid="123") sociallogin = SocialLogin(user=user, account=account) with context.request_context(request): complete_social_login(request, sociallogin) user = User.objects.get(**{account_settings.USER_MODEL_USERNAME_FIELD: "test"}) self.assertTrue( SocialAccount.objects.filter(user=user, uid=account.uid).exists() ) self.assertTrue( EmailAddress.objects.filter(user=user, email=user_email(user)).exists() ) @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=True, ) def test_email_address_clash_username_required(self): """Test clash on both username and email""" request, resp = self._email_address_clash("test", "test@example.com") self.assertEqual(resp["location"], reverse("socialaccount_signup")) # POST different username/email to social signup form request.method = "POST" request.POST = {"username": "other", "email": "other@example.com"} with context.request_context(request): resp = signup(request) self.assertEqual(resp["location"], "/accounts/profile/") user = get_user_model().objects.get( **{account_settings.USER_MODEL_EMAIL_FIELD: "other@example.com"} ) self.assertEqual(user_username(user), "other") @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=False, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=True, ) def test_email_address_clash_username_not_required(self): """Test clash while username is not required""" request, resp = self._email_address_clash("test", "test@example.com") self.assertEqual(resp["location"], reverse("socialaccount_signup")) # POST email to social signup form (username not present) request.method = "POST" request.POST = {"email": "other@example.com"} with context.request_context(request): resp = signup(request) self.assertEqual(resp["location"], "/accounts/profile/") user = get_user_model().objects.get( **{account_settings.USER_MODEL_EMAIL_FIELD: "other@example.com"} ) self.assertNotEqual(user_username(user), "test") @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=False, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=True, ) def test_email_address_clash_username_auto_signup(self): # Clash on username, but auto signup still works request, resp = self._email_address_clash("test", "other@example.com") self.assertEqual(resp["location"], "/accounts/profile/") user = get_user_model().objects.get( **{account_settings.USER_MODEL_EMAIL_FIELD: "other@example.com"} ) self.assertNotEqual(user_username(user), "test") @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_USERNAME_BLACKLIST=["username", "username1", "username2"], ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=True, ) def test_populate_username_in_blacklist(self): factory = RequestFactory() request = factory.get("/accounts/twitter/login/callback/") request.user = AnonymousUser() SessionMiddleware(lambda request: None).process_request(request) MessageMiddleware(lambda request: None).process_request(request) User = get_user_model() user = User() setattr(user, account_settings.USER_MODEL_USERNAME_FIELD, "username") setattr( user, account_settings.USER_MODEL_EMAIL_FIELD, "username@example.com", ) account = SocialAccount(provider="twitter", uid="123") sociallogin = SocialLogin(user=user, account=account) with context.request_context(request): complete_social_login(request, sociallogin) self.assertNotIn(request.user.username, account_settings.USERNAME_BLACKLIST) def _email_address_clash(self, username, email): User = get_user_model() # Some existig user exi_user = User() user_username(exi_user, "test") exi_user_email = "test@example.com" user_email(exi_user, exi_user_email) exi_user.save() EmailAddress.objects.create( user=exi_user, email=exi_user_email, verified=True, primary=True ) # A social user being signed up... account = SocialAccount(provider="twitter", uid="123") user = User() user_username(user, username) user_email(user, email) sociallogin = SocialLogin(user=user, account=account) # Signing up, should pop up the social signup form factory = RequestFactory() request = factory.get("/accounts/twitter/login/callback/") request.user = AnonymousUser() SessionMiddleware(lambda request: None).process_request(request) MessageMiddleware(lambda request: None).process_request(request) with context.request_context(request): resp = complete_social_login(request, sociallogin) return request, resp @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_EMAIL_VERIFICATION="mandatory", ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=False, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=False, ) def test_verified_email_change_at_signup(self): """ Test scenario for when the user changes email at social signup. Current behavior is that both the unverified and verified email are added, and that the user is allowed to pass because he did provide a verified one. """ session = self.client.session User = get_user_model() sociallogin = SocialLogin( user=User(email="verified@example.com"), account=SocialAccount(provider="google"), email_addresses=[ EmailAddress(email="verified@example.com", verified=True, primary=True) ], ) session["socialaccount_sociallogin"] = sociallogin.serialize() session.save() resp = self.client.get(reverse("socialaccount_signup")) form = resp.context["form"] self.assertEqual(form["email"].value(), "verified@example.com") resp = self.client.post( reverse("socialaccount_signup"), data={"email": "unverified@example.org"}, ) self.assertRedirects(resp, "/accounts/profile/", fetch_redirect_response=False) user = User.objects.all()[0] self.assertEqual(user_email(user), "verified@example.com") self.assertTrue( EmailAddress.objects.filter( user=user, email="verified@example.com", verified=True, primary=True, ).exists() ) self.assertTrue( EmailAddress.objects.filter( user=user, email="unverified@example.org", verified=False, primary=False, ).exists() ) @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_EMAIL_VERIFICATION="mandatory", ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=False, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=False, ) def test_unverified_email_change_at_signup(self): """ Test scenario for when the user changes email at social signup, while his provider did not provide a verified email. In that case, email verification will kick in. Here, both email addresses are added as well. """ session = self.client.session User = get_user_model() sociallogin = SocialLogin( user=User(email="unverified@example.com"), account=SocialAccount(provider="google"), email_addresses=[ EmailAddress( email="unverified@example.com", verified=False, primary=True, ) ], ) session["socialaccount_sociallogin"] = sociallogin.serialize() session.save() resp = self.client.get(reverse("socialaccount_signup")) form = resp.context["form"] self.assertEqual(form["email"].value(), "unverified@example.com") resp = self.client.post( reverse("socialaccount_signup"), data={"email": "unverified@example.org"}, ) self.assertRedirects(resp, reverse("account_email_verification_sent")) user = User.objects.all()[0] self.assertEqual(user_email(user), "unverified@example.org") self.assertTrue( EmailAddress.objects.filter( user=user, email="unverified@example.com", verified=False, primary=False, ).exists() ) self.assertTrue( EmailAddress.objects.filter( user=user, email="unverified@example.org", verified=False, primary=True, ).exists() ) @override_settings( ACCOUNT_PREVENT_ENUMERATION=False, ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_EMAIL_VERIFICATION="mandatory", ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=False, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=False, ) def test_unique_email_validation_signup(self): session = self.client.session User = get_user_model() email = "me@example.com" user = User.objects.create(email=email) EmailAddress.objects.create(email=email, user=user, verified=True) sociallogin = SocialLogin( user=User(email="me@example.com"), account=SocialAccount(provider="google"), email_addresses=[ EmailAddress(email="me@example.com", verified=True, primary=True) ], ) session["socialaccount_sociallogin"] = sociallogin.serialize() session.save() resp = self.client.get(reverse("socialaccount_signup")) form = resp.context["form"] self.assertEqual(form["email"].value(), email) resp = self.client.post(reverse("socialaccount_signup"), data={"email": email}) if django.VERSION >= (4, 1): self.assertFormError( resp.context["form"], "email", "An account already exists with this email address." " Please sign in to that account first, then connect" " your Google account.", ) else: self.assertFormError( resp, "form", "email", "An account already exists with this email address." " Please sign in to that account first, then connect" " your Google account.", ) @override_settings( ACCOUNT_EMAIL_REQUIRED=True, ACCOUNT_EMAIL_VERIFICATION="mandatory", ACCOUNT_UNIQUE_EMAIL=True, ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_AUTHENTICATION_METHOD="email", SOCIALACCOUNT_AUTO_SIGNUP=False, ) def test_social_account_taken_at_signup(self): """ Test scenario for when the user signs up with a social account and uses email address in that social account. But upon seeing the verification screen, they realize that email address is somehow unusable for them, and so backs up and enters a different email address (and is forced to choose a new username) while providing the same social account token which is owned by their first attempt. """ session = self.client.session User = get_user_model() sociallogin = SocialLogin( user=User(email="me1@example.com"), account=SocialAccount(provider="facebook"), ) session["socialaccount_sociallogin"] = sociallogin.serialize() session.save() resp = self.client.get(reverse("socialaccount_signup")) form = resp.context["form"] self.assertEqual(form["email"].value(), "me1@example.com") resp = self.client.post( reverse("socialaccount_signup"), data={"username": "me1", "email": "me1@example.com"}, ) self.assertEqual(resp.status_code, 302) self.assertEqual(User.objects.count(), 1) self.assertEqual(SocialAccount.objects.count(), 1) resp = self.client.get(reverse("socialaccount_signup")) self.assertRedirects(resp, reverse("account_login")) def test_email_address_required_missing_from_sociallogin( db, settings, sociallogin_factory, client, rf ): """Tests that when the email address is missing from the sociallogin email verification kicks in. """ settings.ACCOUNT_EMAIL_REQUIRED = True settings.ACCOUNT_UNIQUE_EMAIL = True settings.ACCOUNT_USERNAME_REQUIRED = False settings.ACCOUNT_AUTHENTICATION_METHOD = "email" settings.ACCOUNT_EMAIL_VERIFICATION = "mandatory" settings.SOCIALACCOUNT_AUTO_SIGNUP = True sociallogin = sociallogin_factory(with_email=False) request = rf.get("/") request.session = {} request.user = AnonymousUser() resp = complete_social_login(request, sociallogin) assert resp["location"] == reverse("socialaccount_signup") session = client.session session["socialaccount_sociallogin"] = sociallogin.serialize() session.save() resp = client.post(reverse("socialaccount_signup"), {"email": "other@example.org"}) assert resp["location"] == reverse("account_email_verification_sent") def test_email_address_conflict_at_social_signup_form( db, settings, user_factory, sociallogin_factory, client, rf, mailoutbox ): """Tests that when an already existing email is given at the social signup form, enumeration preventation kicks in. """ settings.ACCOUNT_EMAIL_REQUIRED = True settings.ACCOUNT_UNIQUE_EMAIL = True settings.ACCOUNT_USERNAME_REQUIRED = False settings.ACCOUNT_AUTHENTICATION_METHOD = "email" settings.ACCOUNT_EMAIL_VERIFICATION = "mandatory" settings.SOCIALACCOUNT_AUTO_SIGNUP = True user = user_factory() sociallogin = sociallogin_factory(with_email=False) request = rf.get("/") request.session = {} request.user = AnonymousUser() resp = complete_social_login(request, sociallogin) # Auto signup does not kick in as the `sociallogin` does not have an email. assert resp["location"] == reverse("socialaccount_signup") session = client.session session["socialaccount_sociallogin"] = sociallogin.serialize() session.save() # Here, we input the already existing email. resp = client.post(reverse("socialaccount_signup"), {"email": user.email}) assert mailoutbox[0].subject == "[example.com] Account Already Exists" assert resp["location"] == reverse("account_email_verification_sent") def test_email_address_conflict_during_auto_signup( db, settings, user_factory, sociallogin_factory, client, rf, mailoutbox ): """Tests that when an already existing email is received from the provider, enumeration preventation kicks in. """ settings.ACCOUNT_EMAIL_REQUIRED = True settings.ACCOUNT_UNIQUE_EMAIL = True settings.ACCOUNT_USERNAME_REQUIRED = False settings.ACCOUNT_AUTHENTICATION_METHOD = "email" settings.ACCOUNT_EMAIL_VERIFICATION = "mandatory" settings.SOCIALACCOUNT_AUTO_SIGNUP = True user = user_factory() sociallogin = sociallogin_factory(email=user.email, with_email=True) request = rf.get("/") request.session = {} request.user = AnonymousUser() resp = complete_social_login(request, sociallogin) assert resp["location"] == reverse("account_email_verification_sent") assert mailoutbox[0].subject == "[example.com] Account Already Exists" def test_email_address_conflict_removes_conflicting_email( db, settings, user_factory, sociallogin_factory, client, rf, mailoutbox ): """Tests that when an already existing email is given at the social signup form, enumeration preventation kicks in. """ settings.ACCOUNT_EMAIL_REQUIRED = True settings.ACCOUNT_UNIQUE_EMAIL = True settings.ACCOUNT_USERNAME_REQUIRED = False settings.ACCOUNT_AUTHENTICATION_METHOD = "email" settings.ACCOUNT_EMAIL_VERIFICATION = "optional" settings.SOCIALACCOUNT_AUTO_SIGNUP = True settings.SOCIALACCOUNT_EMAIL_AUTHENTICATION = False user = user_factory(email_verified=False) sociallogin = sociallogin_factory(email=user.email, email_verified=False) request = rf.get("/") request.session = {} request.user = AnonymousUser() resp = complete_social_login(request, sociallogin) # Auto signup does not kick in as the `sociallogin` has a conflicting email. assert resp["location"] == reverse("socialaccount_signup") session = client.session session["socialaccount_sociallogin"] = sociallogin.serialize() session.save() # Here, we input the already existing email. resp = client.post(reverse("socialaccount_signup"), {"email": "other@email.org"}) assert mailoutbox[0].subject == "[example.com] Please Confirm Your Email Address" assert resp["location"] == settings.LOGIN_REDIRECT_URL assert EmailAddress.objects.filter(email=user.email).count() == 1 django-allauth-0.58.2/allauth/socialaccount/tests/test_utils.py000066400000000000000000000015511452212273200246760ustar00rootroot00000000000000from django.contrib.auth import get_user_model from django.test.utils import override_settings from allauth.socialaccount.models import SocialAccount from allauth.tests import TestCase class UtilTests(TestCase): def test_social_account_str_default(self): User = get_user_model() user = User(username="test") sa = SocialAccount(user=user) self.assertEqual("test", str(sa)) def socialaccount_str_custom_formatter(socialaccount): return "A custom str builder for {}".format(socialaccount.user) @override_settings( SOCIALACCOUNT_SOCIALACCOUNT_STR=socialaccount_str_custom_formatter ) def test_social_account_str_customized(self): User = get_user_model() user = User(username="test") sa = SocialAccount(user=user) self.assertEqual("A custom str builder for test", str(sa)) django-allauth-0.58.2/allauth/socialaccount/urls.py000066400000000000000000000006361452212273200223250ustar00rootroot00000000000000from django.urls import path from . import views urlpatterns = [ path( "login/cancelled/", views.login_cancelled, name="socialaccount_login_cancelled", ), path("login/error/", views.login_error, name="socialaccount_login_error"), path("signup/", views.signup, name="socialaccount_signup"), path("connections/", views.connections, name="socialaccount_connections"), ] django-allauth-0.58.2/allauth/socialaccount/views.py000066400000000000000000000106631452212273200224760ustar00rootroot00000000000000from django.contrib import messages from django.contrib.auth.decorators import login_required from django.contrib.sites.shortcuts import get_current_site from django.http import HttpResponseRedirect from django.urls import reverse, reverse_lazy from django.utils.decorators import method_decorator from django.views.generic.base import TemplateView from django.views.generic.edit import FormView from allauth.account.decorators import reauthentication_required from ..account import app_settings as account_settings from ..account.adapter import get_adapter as get_account_adapter from ..account.views import ( AjaxCapableProcessFormViewMixin, CloseableSignupMixin, RedirectAuthenticatedUserMixin, ) from ..utils import get_form_class from . import app_settings, helpers from .adapter import get_adapter from .forms import DisconnectForm, SignupForm from .models import SocialAccount, SocialLogin class SignupView( RedirectAuthenticatedUserMixin, CloseableSignupMixin, AjaxCapableProcessFormViewMixin, FormView, ): form_class = SignupForm template_name = "socialaccount/signup." + account_settings.TEMPLATE_EXTENSION def get_form_class(self): return get_form_class(app_settings.FORMS, "signup", self.form_class) def dispatch(self, request, *args, **kwargs): self.sociallogin = None data = request.session.get("socialaccount_sociallogin") if data: self.sociallogin = SocialLogin.deserialize(data) if not self.sociallogin: return HttpResponseRedirect(reverse("account_login")) return super(SignupView, self).dispatch(request, *args, **kwargs) def is_open(self): return get_adapter(self.request).is_open_for_signup( self.request, self.sociallogin ) def get_form_kwargs(self): ret = super(SignupView, self).get_form_kwargs() ret["sociallogin"] = self.sociallogin return ret def form_valid(self, form): self.request.session.pop("socialaccount_sociallogin", None) user, resp = form.try_save(self.request) if not resp: resp = helpers.complete_social_signup(self.request, self.sociallogin) return resp def get_context_data(self, **kwargs): ret = super(SignupView, self).get_context_data(**kwargs) ret.update( dict( site=get_current_site(self.request), account=self.sociallogin.account, ) ) return ret def get_authenticated_redirect_url(self): return reverse(connections) signup = SignupView.as_view() class LoginCancelledView(TemplateView): template_name = ( "socialaccount/login_cancelled." + account_settings.TEMPLATE_EXTENSION ) login_cancelled = LoginCancelledView.as_view() class LoginErrorView(TemplateView): template_name = ( "socialaccount/authentication_error." + account_settings.TEMPLATE_EXTENSION ) login_error = LoginErrorView.as_view() @method_decorator( reauthentication_required( allow_get=True, enabled=lambda request: account_settings.REAUTHENTICATION_REQUIRED, ), name="dispatch", ) class ConnectionsView(AjaxCapableProcessFormViewMixin, FormView): template_name = "socialaccount/connections." + account_settings.TEMPLATE_EXTENSION form_class = DisconnectForm success_url = reverse_lazy("socialaccount_connections") def get_form_class(self): return get_form_class(app_settings.FORMS, "disconnect", self.form_class) def get_form_kwargs(self): kwargs = super(ConnectionsView, self).get_form_kwargs() kwargs["request"] = self.request return kwargs def form_valid(self, form): get_account_adapter().add_message( self.request, messages.INFO, "socialaccount/messages/account_disconnected.txt", ) form.save() return super(ConnectionsView, self).form_valid(form) def get_ajax_data(self): account_data = [] for account in SocialAccount.objects.filter(user=self.request.user): provider_account = account.get_provider_account() account_data.append( { "id": account.pk, "provider": account.provider, "name": provider_account.to_str(), } ) return {"socialaccounts": account_data} connections = login_required(ConnectionsView.as_view()) django-allauth-0.58.2/allauth/templates/000077500000000000000000000000001452212273200201305ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/account/000077500000000000000000000000001452212273200215645ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/account/account_inactive.html000066400000000000000000000005241452212273200257710ustar00rootroot00000000000000{% extends "allauth/layouts/entrance.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Account Inactive" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Account Inactive" %} {% endelement %}

{% trans "This account is inactive." %}

{% endblock content %} django-allauth-0.58.2/allauth/templates/account/base_entrance.html000066400000000000000000000000561452212273200252440ustar00rootroot00000000000000{% extends "allauth/layouts/entrance.html" %} django-allauth-0.58.2/allauth/templates/account/base_manage.html000066400000000000000000000000541452212273200246730ustar00rootroot00000000000000{% extends "allauth/layouts/manage.html" %} django-allauth-0.58.2/allauth/templates/account/base_manage_email.html000066400000000000000000000000511452212273200260370ustar00rootroot00000000000000{% extends "account/base_manage.html" %} django-allauth-0.58.2/allauth/templates/account/base_manage_password.html000066400000000000000000000000511452212273200266120ustar00rootroot00000000000000{% extends "account/base_manage.html" %} django-allauth-0.58.2/allauth/templates/account/email.html000066400000000000000000000072471452212273200235530ustar00rootroot00000000000000{% extends "account/base_manage_email.html" %} {% load allauth i18n %} {% block head_title %} {% trans "Email Addresses" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Email Addresses" %} {% endelement %} {% if emailaddresses %}

{% trans 'The following email addresses are associated with your account:' %}

{% url 'account_email' as email_url %} {% element form form=form action=email_url method="post" %} {% slot body %} {% csrf_token %} {% for radio in emailaddress_radios %} {% with emailaddress=radio.emailaddress %} {% element field type="radio" checked=radio.checked name="email" value=emailaddress.email id=radio.id %} {% slot label %} {{ emailaddress.email }} {% if emailaddress.verified %} {% element badge tags="success,email,verified" %} {% translate "Verified" %} {% endelement %} {% else %} {% element badge tags="warning,email,unverified" %} {% translate "Unverified" %} {% endelement %} {% endif %} {% if emailaddress.primary %} {% element badge tags="email,primary" %} {% translate "Primary" %} {% endelement %} {% endif %} {% endslot %} {% endelement %} {% endwith %} {% endfor %} {% endslot %} {% slot actions %} {% element button type="submit" name="action_primary" %} {% trans 'Make Primary' %} {% endelement %} {% element button tags="secondary" type="submit" name="action_send" %} {% trans 'Re-send Verification' %} {% endelement %} {% element button tags="danger,delete" type="submit" name="action_remove" %} {% trans 'Remove' %} {% endelement %} {% endslot %} {% endelement %} {% else %} {% include "account/snippets/warn_no_email.html" %} {% endif %} {% if can_add_email %} {% element h2 %} {% trans "Add Email Address" %} {% endelement %} {% url 'account_email' as action_url %} {% element form form=form method="post" action=action_url %} Hoi bef bod {% slot body %} {% csrf_token %} {% element fields form=form %} {% endelement %} {% endslot %} befac {% slot actions %} {% element button name="action_add" type="submit" %} {% trans "Add Email" %} {% endelement %} {% endslot %} {% endelement %} {% endif %} {% endblock content %} {% block extra_body %} {% endblock extra_body %} django-allauth-0.58.2/allauth/templates/account/email/000077500000000000000000000000001452212273200226535ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/account/email/account_already_exists_message.txt000066400000000000000000000007621452212273200316610ustar00rootroot00000000000000{% extends "account/email/base_message.txt" %} {% load i18n %} {% block content %}{% autoescape off %}{% blocktrans %}You are receiving this email because you or someone else tried to signup for an account using email address: {{ email }} However, an account using that email address already exists. In case you have forgotten about this, please use the password forgotten procedure to recover your account: {{ password_reset_url }}{% endblocktrans %}{% endautoescape %}{% endblock content %} django-allauth-0.58.2/allauth/templates/account/email/account_already_exists_subject.txt000066400000000000000000000001631452212273200316670ustar00rootroot00000000000000{% load i18n %} {% autoescape off %} {% blocktrans %}Account Already Exists{% endblocktrans %} {% endautoescape %} django-allauth-0.58.2/allauth/templates/account/email/base_message.txt000066400000000000000000000005361452212273200260360ustar00rootroot00000000000000{% load i18n %}{% autoescape off %}{% blocktrans with site_name=current_site.name %}Hello from {{ site_name }}!{% endblocktrans %} {% block content %}{% endblock content %} {% blocktrans with site_name=current_site.name site_domain=current_site.domain %}Thank you for using {{ site_name }}! {{ site_domain }}{% endblocktrans %} {% endautoescape %} django-allauth-0.58.2/allauth/templates/account/email/email_confirmation_message.txt000066400000000000000000000007521452212273200307630ustar00rootroot00000000000000{% extends "account/email/base_message.txt" %} {% load account %} {% load i18n %} {% block content %}{% autoescape off %}{% user_display user as user_display %}{% blocktrans with site_name=current_site.name site_domain=current_site.domain %}You're receiving this email because user {{ user_display }} has given your email address to register an account on {{ site_domain }}. To confirm this is correct, go to {{ activate_url }}{% endblocktrans %}{% endautoescape %}{% endblock content %} django-allauth-0.58.2/allauth/templates/account/email/email_confirmation_signup_message.txt000066400000000000000000000000751452212273200323460ustar00rootroot00000000000000{% include "account/email/email_confirmation_message.txt" %} django-allauth-0.58.2/allauth/templates/account/email/email_confirmation_signup_subject.txt000066400000000000000000000000751452212273200323610ustar00rootroot00000000000000{% include "account/email/email_confirmation_subject.txt" %} django-allauth-0.58.2/allauth/templates/account/email/email_confirmation_subject.txt000066400000000000000000000001761452212273200307760ustar00rootroot00000000000000{% load i18n %} {% autoescape off %} {% blocktrans %}Please Confirm Your Email Address{% endblocktrans %} {% endautoescape %} django-allauth-0.58.2/allauth/templates/account/email/password_reset_key_message.txt000066400000000000000000000010371452212273200310350ustar00rootroot00000000000000{% extends "account/email/base_message.txt" %} {% load i18n %} {% block content %}{% autoescape off %}{% blocktrans %}You're receiving this email because you or someone else has requested a password reset for your user account. It can be safely ignored if you did not request a password reset. Click the link below to reset your password.{% endblocktrans %} {{ password_reset_url }}{% if username %} {% blocktrans %}In case you forgot, your username is {{ username }}.{% endblocktrans %}{% endif %}{% endautoescape %}{% endblock content %} django-allauth-0.58.2/allauth/templates/account/email/password_reset_key_subject.txt000066400000000000000000000001611452212273200310450ustar00rootroot00000000000000{% load i18n %} {% autoescape off %} {% blocktrans %}Password Reset Email{% endblocktrans %} {% endautoescape %} django-allauth-0.58.2/allauth/templates/account/email/unknown_account_message.txt000066400000000000000000000010221452212273200303260ustar00rootroot00000000000000{% extends "account/email/base_message.txt" %} {% load i18n %} {% block content %}{% autoescape off %}{% blocktrans %}You are receiving this email because you or someone else has requested a password for your user account. However, we do not have any record of a user with email {{ email }} in our database. This mail can be safely ignored if you did not request a password reset. If it was you, you can sign up for an account using the link below.{% endblocktrans %} {{ signup_url }}{% endautoescape %}{% endblock content %} django-allauth-0.58.2/allauth/templates/account/email/unknown_account_subject.txt000066400000000000000000000001611452212273200303440ustar00rootroot00000000000000{% load i18n %} {% autoescape off %} {% blocktrans %}Password Reset Email{% endblocktrans %} {% endautoescape %} django-allauth-0.58.2/allauth/templates/account/email_change.html000066400000000000000000000040241452212273200250460ustar00rootroot00000000000000{% extends "account/base_manage_email.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Email Address" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Email Address" %} {% endelement %} {% if emailaddresses %} {% if current_emailaddress %}

{% trans 'The following email address is associated with your account:' %} {{ current_emailaddress.email }}

{% endif %} {% if new_emailaddress %}

{% trans 'Your email address is still pending verification:' %} {{ new_emailaddress.email }}

{% url 'account_email' as action_url %} {% element form method="post" action=action_url tags="button-only" no_visible_fields=True %} {% slot body %} {% csrf_token %} {% endslot %} {% slot actions %} {% element button type="submit" name="action_send" %} {% trans 'Re-send Verification' %} {% endelement %} {% endslot %} {% endelement %} {% endif %} {% else %} {% include "account/snippets/warn_no_email.html" %} {% endif %} {% element h2 %} {% trans "Change Email Address" %} {% endelement %} {% url 'account_email' as action_url %} {% element form method="post" action=action_url %} {% slot body %} {% csrf_token %} {% element fields form=form %} {% endelement %} {% endslot %} {% slot actions %} {% element button name="action_add" type="submit" %} {% trans "Change Email" %} {% endelement %} {% endslot %} {% endelement %} {% endblock content %} django-allauth-0.58.2/allauth/templates/account/email_confirm.html000066400000000000000000000030631452212273200252600ustar00rootroot00000000000000{% extends "account/base_entrance.html" %} {% load i18n %} {% load account %} {% load allauth %} {% block head_title %} {% trans "Confirm Email Address" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Confirm Email Address" %} {% endelement %} {% if confirmation %} {% user_display confirmation.email_address.user as user_display %} {% if can_confirm %}

{% blocktrans with confirmation.email_address.email as email %}Please confirm that {{ email }} is an email address for user {{ user_display }}.{% endblocktrans %}

{% url 'account_confirm_email' confirmation.key as action_url %} {% element form method="post" action=action_url %} {% slot actions %} {% csrf_token %} {% element button type="submit" %} {% trans 'Confirm' %} {% endelement %} {% endslot %} {% endelement %} {% else %}

{% blocktrans %}Unable to confirm {{ email }} because it is already confirmed by a different account.{% endblocktrans %}

{% endif %} {% else %} {% url 'account_email' as email_url %}

{% blocktrans %}This email confirmation link expired or is invalid. Please issue a new email confirmation request.{% endblocktrans %}

{% endif %} {% endblock content %} django-allauth-0.58.2/allauth/templates/account/login.html000066400000000000000000000023441452212273200235650ustar00rootroot00000000000000{% extends "account/base_entrance.html" %} {% load i18n %} {% load allauth account socialaccount %} {% block head_title %} {% trans "Sign In" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Sign In" %} {% endelement %}

{% blocktrans %}If you have not created an account yet, then please sign up first.{% endblocktrans %}

{% url 'account_login' as login_url %} {% element form form=form method="post" action=login_url tags="entrance,login" %} {% slot body %} {% csrf_token %} {% element fields form=form unlabeled=True %} {% endelement %} {% if redirect_field_value %} {% endif %} {% endslot %} {% slot actions %} {% element button type="submit" tags="prominent,login" %} {% trans "Sign In" %} {% endelement %} {% endslot %} {% endelement %} {% include "socialaccount/snippets/login.html" with page_layout="entrance" %} {% endblock content %} django-allauth-0.58.2/allauth/templates/account/logout.html000066400000000000000000000016301452212273200237630ustar00rootroot00000000000000{% extends "account/base_manage.html" %} {% load allauth i18n %} {% block head_title %} {% trans "Sign Out" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Sign Out" %} {% endelement %}

{% trans 'Are you sure you want to sign out?' %}

{% url 'account_logout' as action_url %} {% element form method="post" action=action_url no_visible_fields=True %} {% slot body %} {% csrf_token %} {% if redirect_field_value %} {% endif %} {% endslot %} {% slot actions %} {% element button type="submit" %} {% trans 'Sign Out' %} {% endelement %} {% endslot %} {% endelement %} {% endblock content %} django-allauth-0.58.2/allauth/templates/account/messages/000077500000000000000000000000001452212273200233735ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/account/messages/cannot_delete_primary_email.txt000066400000000000000000000001551452212273200316530ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}You cannot remove your primary email address ({{email}}).{% endblocktrans %} django-allauth-0.58.2/allauth/templates/account/messages/email_confirmation_failed.txt000066400000000000000000000002071452212273200312760ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Unable to confirm {{email}} because it is already confirmed by a different account.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/account/messages/email_confirmation_sent.txt000066400000000000000000000001311452212273200310170ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Confirmation email sent to {{email}}.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/account/messages/email_confirmed.txt000066400000000000000000000001211452212273200272430ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}You have confirmed {{email}}.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/account/messages/email_deleted.txt000066400000000000000000000001241452212273200267060ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Removed email address {{email}}.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/account/messages/logged_in.txt000066400000000000000000000002121452212273200260560ustar00rootroot00000000000000{% load account %} {% load i18n %} {% user_display user as name %} {% blocktrans %}Successfully signed in as {{name}}.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/account/messages/logged_out.txt000066400000000000000000000001101452212273200262540ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}You have signed out.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/account/messages/password_changed.txt000066400000000000000000000001221452212273200274420ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Password successfully changed.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/account/messages/password_set.txt000066400000000000000000000001161452212273200266470ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Password successfully set.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/account/messages/primary_email_set.txt000066400000000000000000000001161452212273200276370ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Primary email address set.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/account/messages/unverified_primary_email.txt000066400000000000000000000001401452212273200312010ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Your primary email address must be verified.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/account/password_change.html000066400000000000000000000014761452212273200256310ustar00rootroot00000000000000{% extends "account/base_manage_password.html" %} {% load allauth i18n %} {% block head_title %} {% trans "Change Password" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Change Password" %} {% endelement %} {% url 'account_change_password' as action_url %} {% element form form=form method="post" action=action_url %} {% slot body %} {% csrf_token %} {% element fields form=form %} {% endelement %} {% endslot %} {% slot actions %} {% element button type="submit" %} {% trans "Change Password" %} {% endelement %} {% trans "Forgot Password?" %} {% endslot %} {% endelement %} {% endblock content %} django-allauth-0.58.2/allauth/templates/account/password_reset.html000066400000000000000000000021321452212273200255140ustar00rootroot00000000000000{% extends "account/base_entrance.html" %} {% load i18n allauth account %} {% block head_title %} {% trans "Password Reset" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Password Reset" %} {% endelement %} {% if user.is_authenticated %} {% include "account/snippets/already_logged_in.html" %} {% endif %}

{% trans "Forgotten your password? Enter your email address below, and we'll send you an email allowing you to reset it." %}

{% url 'account_reset_password' as reset_url %} {% element form form=form method="post" action=reset_url %} {% slot body %} {% csrf_token %} {% element fields form=form %} {% endelement %} {% endslot %} {% slot actions %} {% element button type="submit" %} {% trans 'Reset My Password' %} {% endelement %} {% endslot %} {% endelement %}

{% blocktrans %}Please contact us if you have any trouble resetting your password.{% endblocktrans %}

{% endblock content %} django-allauth-0.58.2/allauth/templates/account/password_reset_done.html000066400000000000000000000011621452212273200265230ustar00rootroot00000000000000{% extends "account/base_entrance.html" %} {% load i18n %} {% load allauth %} {% load account %} {% block head_title %} {% trans "Password Reset" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Password Reset" %} {% endelement %} {% if user.is_authenticated %} {% include "account/snippets/already_logged_in.html" %} {% endif %}

{% blocktrans %}We have sent you an email. If you have not received it please check your spam folder. Otherwise contact us if you do not receive it in a few minutes.{% endblocktrans %}

{% endblock content %} django-allauth-0.58.2/allauth/templates/account/password_reset_from_key.html000066400000000000000000000022501452212273200274100ustar00rootroot00000000000000{% extends "account/base_entrance.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Change Password" %} {% endblock head_title %} {% block content %} {% element h1 %} {% if token_fail %} {% trans "Bad Token" %} {% else %} {% trans "Change Password" %} {% endif %} {% endelement %} {% if token_fail %} {% url 'account_reset_password' as passwd_reset_url %}

{% blocktrans %}The password reset link was invalid, possibly because it has already been used. Please request a new password reset.{% endblocktrans %}

{% else %} {% element form method="post" action=action_url %} {% slot body %} {% csrf_token %} {% element fields form=form %} {% endelement %} {% endslot %} {% slot actions %} {% element button type="submit" name="action" %} {% trans 'Change Password' %} {% endelement %} {% endslot %} {% endelement %} {% endif %} {% endblock content %} django-allauth-0.58.2/allauth/templates/account/password_reset_from_key_done.html000066400000000000000000000005231452212273200304160ustar00rootroot00000000000000{% extends "account/base_entrance.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Change Password" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Change Password" %} {% endelement %}

{% trans 'Your password is now changed.' %}

{% endblock content %} django-allauth-0.58.2/allauth/templates/account/password_set.html000066400000000000000000000013451452212273200251720ustar00rootroot00000000000000{% extends "account/base_manage_password.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Set Password" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Set Password" %} {% endelement %} {% url 'account_set_password' as action_url %} {% element form method="post" action=action_url %} {% slot body %} {% csrf_token %} {% element fields form=form %} {% endelement %} {% endslot %} {% slot actions %} {% element button type="submit" name="action" %} {% trans 'Set Password' %} {% endelement %} {% endslot %} {% endelement %} {% endblock content %} django-allauth-0.58.2/allauth/templates/account/reauthenticate.html000066400000000000000000000021001452212273200254500ustar00rootroot00000000000000{% extends "account/base_manage.html" %} {% load allauth %} {% load i18n %} {% block head_title %} {% trans "Confirm Access" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Confirm Access" %} {% endelement %}

{% blocktranslate %}To safeguard the security of your account, please enter your password:{% endblocktranslate %}

{% url 'account_reauthenticate' as action_url %} {% element form form=form method="post" action=action_url %} {% slot body %} {% csrf_token %} {% element fields form=form %} {% endelement %} {% if redirect_field_value %} {% endif %} {% endslot %} {% slot actions %} {% element button type="submit" %} {% trans "Confirm" %} {% endelement %} {% endslot %} {% endelement %} {% endblock content %} django-allauth-0.58.2/allauth/templates/account/signup.html000066400000000000000000000022731452212273200237630ustar00rootroot00000000000000{% extends "account/base_entrance.html" %} {% load allauth i18n socialaccount %} {% block head_title %} {% trans "Signup" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Sign Up" %} {% endelement %}

{% blocktrans %}Already have an account? Then please sign in.{% endblocktrans %}

{% url 'account_signup' as action_url %} {% element form form=form method="post" action=action_url tags="entrance,signup" %} {% slot body %} {% csrf_token %} {% element fields form=form unlabeled=True %} {% endelement %} {% if redirect_field_value %} {% endif %} {% endslot %} {% slot actions %} {% element button tags="prominent,signup" type="submit" %} {% trans "Sign Up" %} {% endelement %} {% endslot %} {% endelement %} {% include "socialaccount/snippets/login.html" with page_layout="entrance" %} {% endblock content %} django-allauth-0.58.2/allauth/templates/account/signup_closed.html000066400000000000000000000005461452212273200253150ustar00rootroot00000000000000{% extends "account/base_entrance.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Sign Up Closed" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Sign Up Closed" %} {% endelement %}

{% trans "We are sorry, but the sign up is currently closed." %}

{% endblock content %} django-allauth-0.58.2/allauth/templates/account/snippets/000077500000000000000000000000001452212273200234315ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/account/snippets/already_logged_in.html000066400000000000000000000005221452212273200277460ustar00rootroot00000000000000{% load i18n %} {% load account %} {% load allauth %} {% user_display user as user_display %} {% element alert %} {% slot message %} {% blocktranslate %}Note{% endblocktranslate %}: {% blocktranslate %}You are already logged in as {{ user_display }}.{% endblocktranslate %} {% endslot %} {% endelement %} django-allauth-0.58.2/allauth/templates/account/snippets/warn_no_email.html000066400000000000000000000003521452212273200271310ustar00rootroot00000000000000{% load i18n %}

{% trans 'Warning:' %} {% trans "You currently do not have any email address set up. You should really add an email address so you can receive notifications, reset your password, etc." %}

django-allauth-0.58.2/allauth/templates/account/verification_sent.html000066400000000000000000000011761452212273200261720ustar00rootroot00000000000000{% extends "account/base_entrance.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Verify Your Email Address" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Verify Your Email Address" %} {% endelement %}

{% blocktrans %}We have sent an email to you for verification. Follow the link provided to finalize the signup process. If you do not see the verification email in your main inbox, check your spam folder. Please contact us if you do not receive the verification email within a few minutes.{% endblocktrans %}

{% endblock content %} django-allauth-0.58.2/allauth/templates/account/verified_email_required.html000066400000000000000000000017741452212273200273270ustar00rootroot00000000000000{% extends "account/base_manage.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Verify Your Email Address" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Verify Your Email Address" %} {% endelement %} {% url 'account_email' as email_url %}

{% blocktrans %}This part of the site requires us to verify that you are who you claim to be. For this purpose, we require that you verify ownership of your email address. {% endblocktrans %}

{% blocktrans %}We have sent an email to you for verification. Please click on the link inside that email. If you do not see the verification email in your main inbox, check your spam folder. Otherwise contact us if you do not receive it within a few minutes.{% endblocktrans %}

{% blocktrans %}Note: you can still change your email address.{% endblocktrans %}

{% endblock content %} django-allauth-0.58.2/allauth/templates/allauth/000077500000000000000000000000001452212273200215625ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/allauth/elements/000077500000000000000000000000001452212273200233765ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/allauth/elements/alert.html000066400000000000000000000001251452212273200253710ustar00rootroot00000000000000{% load i18n %} {% load allauth %}

{% slot message %} {% endslot %}

django-allauth-0.58.2/allauth/templates/allauth/elements/badge.html000066400000000000000000000001071452212273200253240ustar00rootroot00000000000000{% load allauth %} {% slot %} {% endslot %} django-allauth-0.58.2/allauth/templates/allauth/elements/button.html000066400000000000000000000005001452212273200255720ustar00rootroot00000000000000{% load allauth %} {% comment %} djlint:off {% endcomment %} <{% if attrs.href %}a href="{{ attrs.href }}"{% else %}button{% endif %} {% if attrs.name %}name="{{ attrs.name }}"{% endif %} {% if attrs.type %}type="{{ attrs.type }}"{% endif %} > {% slot %} {% endslot %} django-allauth-0.58.2/allauth/templates/allauth/elements/field.html000066400000000000000000000025611452212273200253530ustar00rootroot00000000000000{% load allauth %}

{% if attrs.type == "textarea" %} {% else %} {% endif %} {% if attrs.help_text %}{{ attrs.help_text }}{% endif %}

django-allauth-0.58.2/allauth/templates/allauth/elements/fields.html000066400000000000000000000000261452212273200255300ustar00rootroot00000000000000{{ attrs.form.as_p }} django-allauth-0.58.2/allauth/templates/allauth/elements/form.html000066400000000000000000000002511452212273200252250ustar00rootroot00000000000000{% load allauth %}
{% slot body %} {% endslot %} {% slot actions %} {% endslot %}
django-allauth-0.58.2/allauth/templates/allauth/elements/h1.html000066400000000000000000000001071452212273200245720ustar00rootroot00000000000000{% load allauth %}

{% slot default %} {% endslot %}

django-allauth-0.58.2/allauth/templates/allauth/elements/h2.html000066400000000000000000000001071452212273200245730ustar00rootroot00000000000000{% load allauth %}

{% slot default %} {% endslot %}

django-allauth-0.58.2/allauth/templates/allauth/elements/img.html000066400000000000000000000001241452212273200250350ustar00rootroot00000000000000 django-allauth-0.58.2/allauth/templates/allauth/elements/panel.html000066400000000000000000000004451452212273200253660ustar00rootroot00000000000000{% load allauth %}

{% slot title %} {% endslot %}

{% slot body %} {% endslot %} {% if slots.actions %}
    {% for action in slots.actions %}
  • {{ action }}
  • {% endfor %}
{% endif %}
django-allauth-0.58.2/allauth/templates/allauth/elements/provider.html000066400000000000000000000001301452212273200261100ustar00rootroot00000000000000
  • {{ attrs.name }}
  • django-allauth-0.58.2/allauth/templates/allauth/elements/provider_list.html000066400000000000000000000001071452212273200271470ustar00rootroot00000000000000{% load allauth %}
      {% slot default %} {% endslot %}
    django-allauth-0.58.2/allauth/templates/allauth/layouts/000077500000000000000000000000001452212273200232625ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/allauth/layouts/base.html000066400000000000000000000033141452212273200250630ustar00rootroot00000000000000{% load i18n %} {% block head_title %} {% endblock head_title %} {% block extra_head %} {% endblock extra_head %} {% block body %} {% if messages %}
    {% trans "Messages:" %}
      {% for message in messages %}
    • {{ message }}
    • {% endfor %}
    {% endif %}
    {% trans "Menu:" %}
    {% block content %} {% endblock content %} {% endblock body %} {% block extra_body %} {% endblock extra_body %} django-allauth-0.58.2/allauth/templates/allauth/layouts/entrance.html000066400000000000000000000001141452212273200257430ustar00rootroot00000000000000{% extends "allauth/layouts/base.html" %} {% block content %}{% endblock %} django-allauth-0.58.2/allauth/templates/allauth/layouts/manage.html000066400000000000000000000001141452212273200253740ustar00rootroot00000000000000{% extends "allauth/layouts/base.html" %} {% block content %}{% endblock %} django-allauth-0.58.2/allauth/templates/mfa/000077500000000000000000000000001452212273200206735ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/mfa/authenticate.html000066400000000000000000000016041452212273200242400ustar00rootroot00000000000000{% extends "mfa/base_entrance.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Sign In" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Two-Factor Authentication" %} {% endelement %}

    {% blocktranslate %}Your account is protected by two-factor authentication. Please enter an authenticator code:{% endblocktranslate %}

    {% url 'mfa_authenticate' as action_url %} {% element form form=form method="post" action=action_url %} {% slot body %} {% csrf_token %} {% element fields form=form unlabeled=True %} {% endelement %} {% endslot %} {% slot actions %} {% element button type="submit" %} {% trans "Sign In" %} {% endelement %} {% endslot %} {% endelement %} {% endblock content %} django-allauth-0.58.2/allauth/templates/mfa/base_entrance.html000066400000000000000000000000561452212273200243530ustar00rootroot00000000000000{% extends "allauth/layouts/entrance.html" %} django-allauth-0.58.2/allauth/templates/mfa/base_manage.html000066400000000000000000000000541452212273200240020ustar00rootroot00000000000000{% extends "allauth/layouts/manage.html" %} django-allauth-0.58.2/allauth/templates/mfa/index.html000066400000000000000000000065451452212273200227020ustar00rootroot00000000000000{% extends "mfa/base_manage.html" %} {% load allauth %} {% load i18n %} {% block head_title %} {% trans "Two-Factor Authentication" %} {% endblock head_title %} {% block content %} {% element h1 tags="mfa,index" %} {% trans "Two-Factor Authentication" %} {% endelement %} {% element panel %} {% slot title %} {% translate "Authenticator App" %} {% endslot %} {% slot body %} {% if authenticators.totp %}

    {% translate "Authentication using an authenticator app is active." %}

    {% else %}

    {% translate "An authenticator app is not active." %}

    {% endif %} {% endslot %} {% slot actions %} {% url 'mfa_deactivate_totp' as deactivate_url %} {% url 'mfa_activate_totp' as activate_url %} {% if authenticators.totp %} {% element button href=deactivate_url tags="danger,delete,panel" %} {% translate "Deactivate" %} {% endelement %} {% else %} {% element button href=activate_url tags="panel" %} {% translate "Activate" %} {% endelement %} {% endif %} {% endslot %} {% endelement %} {% with total_count=authenticators.recovery_codes.generate_codes|length unused_count=authenticators.recovery_codes.get_unused_codes|length %} {% element panel %} {% slot title %} {% translate "Recovery Codes" %} {% endslot %} {% slot body %} {% if authenticators.recovery_codes %}

    {% blocktranslate count unused_count=unused_count %}There is {{ unused_count }} out of {{ total_count }} recovery codes available.{% plural %}There are {{ unused_count }} out of {{ total_count }} recovery codes available.{% endblocktranslate %}

    {% else %}

    {% translate "No recovery codes set up." %}

    {% endif %} {% endslot %} {% if is_mfa_enabled %} {% if authenticators.recovery_codes %} {% if unused_count > 0 %} {% slot actions %} {% url 'mfa_view_recovery_codes' as view_url %} {% element button href=view_url tags="panel" %} {% translate "View" %} {% endelement %} {% endslot %} {% slot actions %} {% url 'mfa_download_recovery_codes' as download_url %} {% element button href=download_url tags="secondary,panel" %} {% translate "Download" %} {% endelement %} {% endslot %} {% endif %} {% endif %} {% slot actions %} {% url 'mfa_generate_recovery_codes' as generate_url %} {% element button href=generate_url tags="secondary,panel" %} {% translate "Generate" %} {% endelement %} {% endslot %} {% endif %} {% endelement %} {% endwith %} {% endblock content %} django-allauth-0.58.2/allauth/templates/mfa/messages/000077500000000000000000000000001452212273200225025ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/mfa/messages/recovery_codes_generated.txt000066400000000000000000000001431452212273200302720ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}A new set of recovery codes has been generated.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/mfa/messages/totp_activated.txt000066400000000000000000000001201452212273200262460ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Authenticator app activated.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/mfa/messages/totp_deactivated.txt000066400000000000000000000001221452212273200265610ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}Authenticator app deactivated.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/mfa/recovery_codes/000077500000000000000000000000001452212273200237065ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/mfa/recovery_codes/base.html000066400000000000000000000002071452212273200255050ustar00rootroot00000000000000{% extends "mfa/base_manage.html" %} {% load i18n %} {% block head_title %} {% trans "Recovery Codes" %} {% endblock head_title %} django-allauth-0.58.2/allauth/templates/mfa/recovery_codes/download.txt000066400000000000000000000000661452212273200262600ustar00rootroot00000000000000{% for code in unused_codes %}{{ code }} {% endfor %} django-allauth-0.58.2/allauth/templates/mfa/recovery_codes/generate.html000066400000000000000000000022431452212273200263670ustar00rootroot00000000000000{% extends "mfa/recovery_codes/base.html" %} {% load i18n %} {% load allauth %} {% block content %} {% element h1 %} {% translate "Recovery Codes" %} {% endelement %}

    {% blocktranslate %}You are about to generate a new set of recovery codes for your account.{% endblocktranslate %} {% if unused_code_count %} {% blocktranslate %}This action will invalidate your existing codes.{% endblocktranslate %} {% endif %} {% blocktranslate %}Are you sure?{% endblocktranslate %}

    {% url 'mfa_generate_recovery_codes' as action_url %} {% element form method="post" action=action_url no_visible_fields=True %} {% slot body %} {% csrf_token %} {{ form.as_p }} {% endslot %} {% slot actions %} {% setvar tags %} {% if unused_code_count %} danger {% else %} {% endif %} {% endsetvar %} {% element button type="submit" tags=tags %} {% trans "Generate" %} {% endelement %} {% endslot %} {% endelement %} {% endblock content %} django-allauth-0.58.2/allauth/templates/mfa/recovery_codes/index.html000066400000000000000000000023431452212273200257050ustar00rootroot00000000000000{% extends "mfa/recovery_codes/base.html" %} {% load i18n %} {% load allauth %} {% block content %} {% element h1 %} {% translate "Recovery Codes" %} {% endelement %}

    {% blocktranslate count unused_count=unused_codes|length %}There is {{ unused_count }} out of {{ total_count }} recovery codes available.{% plural %}There are {{ unused_count }} out of {{ total_count }} recovery codes available.{% endblocktranslate %}

    {% element field id="recovery_codes" type="textarea" disabled="disabled" rows=unused_codes|length readonly=True %} {% slot label %} {% translate "Unused codes" %} {% endslot %} {% comment %} djlint:off {% endcomment %} {% slot value %}{% for code in unused_codes %}{% if forloop.counter0 %} {% endif %}{{ code }}{% endfor %}{% endslot %} {% comment %} djlint:on {% endcomment %} {% endelement %} {% if unused_codes %} {% url 'mfa_download_recovery_codes' as download_url %} {% element button href=download_url %} {% translate "Download codes" %} {% endelement %} {% endif %} {% url 'mfa_generate_recovery_codes' as generate_url %} {% element button href=generate_url %} {% translate "Generate new codes" %} {% endelement %} {% endblock content %} django-allauth-0.58.2/allauth/templates/mfa/totp/000077500000000000000000000000001452212273200216615ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/mfa/totp/activate_form.html000066400000000000000000000027631452212273200254020ustar00rootroot00000000000000{% extends "mfa/totp/base.html" %} {% load allauth i18n %} {% block head_title %} {% translate "Activate Authenticator App" %} {% endblock head_title %} {% block content %} {% element h1 %} {% translate "Activate Authenticator App" %} {% endelement %}

    {% blocktranslate %}To protect your account with two-factor authentication, scan the QR code below with your authenticator app. Then, input the verification code generated by the app below.{% endblocktranslate %}

    {% url 'mfa_activate_totp' as action_url %} {% element form form=form method="post" action=action_url %} {% slot body %} {% element img src=totp_svg_data_uri alt=form.secret tags="mfa,totp,qr" %} {% endelement %} {% csrf_token %} {% element field type="text" value=form.secret disabled="disabled" %} {% slot label %} {% translate "Authenticator secret" %} {% endslot %} {% slot help_text %} {% translate "You can store this secret and use it to reinstall your authenticator app at a later time." %} {% endslot %} {% endelement %} {% element fields form=form %} {% endelement %} {% endslot %} {% slot actions %} {% element button type="submit" %} {% trans "Activate" %} {% endelement %} {% endslot %} {% endelement %} {% endblock content %} django-allauth-0.58.2/allauth/templates/mfa/totp/base.html000066400000000000000000000002121452212273200234540ustar00rootroot00000000000000{% extends "mfa/base_manage.html" %} {% load i18n %} {% block head_title %} {% trans "Authenticator App" %} {% endblock head_title %} django-allauth-0.58.2/allauth/templates/mfa/totp/deactivate_form.html000066400000000000000000000017211452212273200257040ustar00rootroot00000000000000{% extends "mfa/totp/base.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Deactivate Authenticator App" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Deactivate Authenticator App" %} {% endelement %}

    {% blocktranslate %}You are about to deactivate authenticator app based authentication. Are you sure?{% endblocktranslate %}

    {% url 'mfa_deactivate_totp' as action_url %} {% element form form=form method="post" action=action_url no_visible_fields=True %} {% slot body %} {% csrf_token %} {% element fields form=form %} {{ form.as_p }} {% endelement %} {% endslot %} {% slot actions %} {% element button tags="danger,delete" type="submit" %} {% trans "Deactivate" %} {% endelement %} {% endslot %} {% endelement %} {% endblock content %} django-allauth-0.58.2/allauth/templates/openid/000077500000000000000000000000001452212273200214065ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/openid/base.html000066400000000000000000000000611452212273200232030ustar00rootroot00000000000000{% extends "socialaccount/base_entrance.html" %} django-allauth-0.58.2/allauth/templates/openid/login.html000066400000000000000000000013241452212273200234040ustar00rootroot00000000000000{% extends "openid/base.html" %} {% load i18n %} {% load allauth %} {% block head_title %} OpenID {% translate "Sign In" %} {% endblock head_title %} {% block content %} {% element h1 %} OpenID {% trans 'Sign In' %} {% endelement %} {% url 'openid_login' as action_url %} {% element form method="post" action=action_url %} {% slot body %} {% csrf_token %} {% element fields form=form unlabeled=True %} {% endelement %} {% endslot %} {% slot actions %} {% element button type="submit" %} {% translate "Sign In" %} {% endelement %} {% endslot %} {% endelement %} {% endblock content %} django-allauth-0.58.2/allauth/templates/socialaccount/000077500000000000000000000000001452212273200227575ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/socialaccount/authentication_error.html000066400000000000000000000006421452212273200300770ustar00rootroot00000000000000{% extends "socialaccount/base_entrance.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Social Network Login Failure" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Social Network Login Failure" %} {% endelement %}

    {% trans "An error occurred while attempting to login via your social network account." %}

    {% endblock content %} django-allauth-0.58.2/allauth/templates/socialaccount/base_entrance.html000066400000000000000000000000561452212273200264370ustar00rootroot00000000000000{% extends "allauth/layouts/entrance.html" %} django-allauth-0.58.2/allauth/templates/socialaccount/base_manage.html000066400000000000000000000000541452212273200260660ustar00rootroot00000000000000{% extends "allauth/layouts/manage.html" %} django-allauth-0.58.2/allauth/templates/socialaccount/connections.html000066400000000000000000000043131452212273200261700ustar00rootroot00000000000000{% extends "socialaccount/base_manage.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Account Connections" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Account Connections" %} {% endelement %} {% if form.accounts %}

    {% blocktrans %}You can sign in to your account using any of the following third-party accounts:{% endblocktrans %}

    {% url 'socialaccount_connections' as action_url %} {% element form form=form method="post" action=action_url %} {% slot body %} {% csrf_token %} {% for acc in form.fields.account.choices %} {% with account=acc.0.instance.get_provider_account %} {% setvar radio_id %} id_account_{{ account.account.pk }} {% endsetvar %} {% setvar tags %} socialaccount,{{ account.account.provider }} {% endsetvar %} {% element field id=radio_id type="radio" name="account" value=account.account.pk %} {% slot label %} {{ account }} {% element badge tags=tags %} {{ account.get_brand.name }} {% endelement %} {% endslot %} {% endelement %} {% endwith %} {% endfor %} {% endslot %} {% slot actions %} {% element button tags="delete,danger" type="submit" %} {% trans 'Remove' %} {% endelement %} {% endslot %} {% endelement %} {% else %}

    {% trans 'You currently have no social network accounts connected to this account.' %}

    {% endif %} {% element h2 %} {% trans 'Add a Third-Party Account' %} {% endelement %} {% include "socialaccount/snippets/provider_list.html" with process="connect" %} {% include "socialaccount/snippets/login_extra.html" %} {% endblock content %} django-allauth-0.58.2/allauth/templates/socialaccount/login.html000066400000000000000000000022571452212273200247630ustar00rootroot00000000000000{% extends "socialaccount/base_entrance.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Sign In" %} {% endblock head_title %} {% block content %} {% if process == "connect" %} {% element h1 %} {% blocktrans with provider.name as provider %}Connect {{ provider }}{% endblocktrans %} {% endelement %}

    {% blocktrans with provider.name as provider %}You are about to connect a new third-party account from {{ provider }}.{% endblocktrans %}

    {% else %} {% element h1 %} {% blocktrans with provider.name as provider %}Sign In Via {{ provider }}{% endblocktrans %} {% endelement %}

    {% blocktrans with provider.name as provider %}You are about to sign in using a third-party account from {{ provider }}.{% endblocktrans %}

    {% endif %} {% element form method="post" no_visible_fields=True %} {% slot actions %} {% csrf_token %} {% element button type="submit" %} {% trans "Continue" %} {% endelement %} {% endslot %} {% endelement %} {% endblock content %} django-allauth-0.58.2/allauth/templates/socialaccount/login_cancelled.html000066400000000000000000000010511452212273200267440ustar00rootroot00000000000000{% extends "socialaccount/base_entrance.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Login Cancelled" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Login Cancelled" %} {% endelement %} {% url 'account_login' as login_url %}

    {% blocktrans %}You decided to cancel logging in to our site using one of your existing accounts. If this was a mistake, please proceed to sign in.{% endblocktrans %}

    {% endblock content %} django-allauth-0.58.2/allauth/templates/socialaccount/messages/000077500000000000000000000000001452212273200245665ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/socialaccount/messages/account_connected.txt000066400000000000000000000001321452212273200310010ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}The social account has been connected.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/socialaccount/messages/account_connected_other.txt000066400000000000000000000001631452212273200322060ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}The social account is already connected to a different account.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/socialaccount/messages/account_connected_updated.txt000066400000000000000000000000751452212273200325150ustar00rootroot00000000000000{% extends "socialaccount/messages/account_connected.txt" %} django-allauth-0.58.2/allauth/templates/socialaccount/messages/account_disconnected.txt000066400000000000000000000001351452212273200315040ustar00rootroot00000000000000{% load i18n %} {% blocktrans %}The social account has been disconnected.{% endblocktrans %} django-allauth-0.58.2/allauth/templates/socialaccount/signup.html000066400000000000000000000022741452212273200251570ustar00rootroot00000000000000{% extends "socialaccount/base_entrance.html" %} {% load i18n %} {% load allauth %} {% block head_title %} {% trans "Signup" %} {% endblock head_title %} {% block content %} {% element h1 %} {% trans "Sign Up" %} {% endelement %}

    {% blocktrans with provider_name=account.get_provider.name site_name=site.name %}You are about to use your {{provider_name}} account to login to {{site_name}}. As a final step, please complete the following form:{% endblocktrans %}

    {% url 'socialaccount_signup' as action_url %} {% element form form=form method="post" action=action_url %} {% slot body %} {% csrf_token %} {% element fields form=form unlabeled=True %} {% endelement %} {% if redirect_field_value %} {% endif %} {% endslot %} {% slot actions %} {% element button type="submit" %} {% trans "Sign Up" %} {% endelement %} {% endslot %} {% endelement %} {% endblock content %} django-allauth-0.58.2/allauth/templates/socialaccount/snippets/000077500000000000000000000000001452212273200246245ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/socialaccount/snippets/login.html000066400000000000000000000006111452212273200266200ustar00rootroot00000000000000{% load i18n %} {% load allauth %} {% load socialaccount %} {% get_providers as socialaccount_providers %} {% if socialaccount_providers %}
    {% element h2 %} {% translate "Or use a third-party" %} {% endelement %} {% include "socialaccount/snippets/provider_list.html" with process="login" %} {% include "socialaccount/snippets/login_extra.html" %} {% endif %} django-allauth-0.58.2/allauth/templates/socialaccount/snippets/login_extra.html000066400000000000000000000000621452212273200300230ustar00rootroot00000000000000{% load socialaccount %} {% providers_media_js %} django-allauth-0.58.2/allauth/templates/socialaccount/snippets/provider_list.html000066400000000000000000000015351452212273200304030ustar00rootroot00000000000000{% load allauth socialaccount %} {% get_providers as socialaccount_providers %} {% if socialaccount_providers %} {% element provider_list %} {% for provider in socialaccount_providers %} {% if provider.id == "openid" %} {% for brand in provider.get_brands %} {% provider_login_url provider openid=brand.openid_url process=process as href %} {% element provider name=brand.name provider_id=provider.id href=href %} {% endelement %} {% endfor %} {% endif %} {% provider_login_url provider process=process scope=scope auth_params=auth_params as href %} {% element provider name=provider.name provider_id=provider.id href=href %} {% endelement %} {% endfor %} {% endelement %} {% endif %} django-allauth-0.58.2/allauth/templates/tests/000077500000000000000000000000001452212273200212725ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templates/tests/test_403_csrf.html000066400000000000000000000001541452212273200245420ustar00rootroot00000000000000{% load socialaccount %} Sign In django-allauth-0.58.2/allauth/templatetags/000077500000000000000000000000001452212273200206245ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templatetags/__init__.py000066400000000000000000000000001452212273200227230ustar00rootroot00000000000000django-allauth-0.58.2/allauth/templatetags/allauth.py000066400000000000000000000110771452212273200226360ustar00rootroot00000000000000from django import template from django.template.base import FilterExpression, kwarg_re from django.template.loader import render_to_string from django.template.loader_tags import ExtendsNode SLOTS_CONTEXT_KEY = "slots_context" LAYOUT_CONTEXT_KEY = "layout_context" def parse_tag(token, parser): bits = token.split_contents() tag_name = bits.pop(0) args = [] kwargs = {} for bit in bits: # Is this a kwarg or an arg? match = kwarg_re.match(bit) kwarg_format = match and match.group(1) if kwarg_format: key, value = match.groups() kwargs[key] = FilterExpression(value, parser) else: args.append(FilterExpression(bit, parser)) return (tag_name, args, kwargs) register = template.Library() @register.tag(name="slot") def do_slot(parser, token): nodelist = parser.parse(("endslot",)) bits = token.split_contents() bits.pop(0) slot_name = bits.pop(0) if bits else "default" parser.delete_first_token() return SlotNode(slot_name, nodelist) class SlotNode(template.Node): def __init__(self, name, nodelist): self.name = name self.nodelist = nodelist def render(self, context): slots = context.render_context.get(SLOTS_CONTEXT_KEY) with context.push(): if slots is None: if self.name in context["slots"]: return "".join(context["slots"][self.name]) return self.nodelist.render(context) else: result = self.nodelist.render(context) slot_list = slots.setdefault(self.name, []) slot_list.append(result) return "" @register.tag(name="element") def do_element(parser, token): nodelist = parser.parse(("endelement",)) tag_name, args, kwargs = parse_tag(token, parser) usage = f'{{% {tag_name} "element" argument=value %}} ... {{% end{tag_name} %}}' if len(args) > 1: raise template.TemplateSyntaxError("Usage: %s" % usage) parser.delete_first_token() return ElementNode(nodelist, args[0], kwargs) class ElementNode(template.Node): def __init__(self, nodelist, element, kwargs): self.element = element self.kwargs = kwargs self.nodelist = nodelist def render(self, context): slots = {} extends_context = context.render_context.get(ExtendsNode.context_key) layout = None if extends_context: # Extract layout from the {% extends %} tags for ec in extends_context: prefix = "allauth/layouts/" if ec.template_name.startswith(prefix): layout = ec.template_name[len(prefix) :].replace(".html", "") break if not layout: # In case we're in a {% element %} element, the extends context is # not there. layout = context.render_context.get(LAYOUT_CONTEXT_KEY) if not layout: # Or, similarly, for {% include %} we also lose the extends context. layout = context.get("page_layout") template_names = [] if layout: template_names.append(f"allauth/elements/{self.element}__{layout}.html") template_names.append(f"allauth/elements/{self.element}.html") with context.render_context.push( **{SLOTS_CONTEXT_KEY: slots, LAYOUT_CONTEXT_KEY: layout} ): slots["default"] = [self.nodelist.render(context)] attrs = {} for k, v in self.kwargs.items(): attrs[k] = v.resolve(context) tags = attrs.get("tags") if tags: attrs["tags"] = tags.split(",") return render_to_string( template_names, { "attrs": attrs, "slots": slots, "origin": self.origin.template_name.replace(".html", ""), }, ) @register.tag(name="setvar") def do_setvar(parser, token): nodelist = parser.parse(("endsetvar",)) bits = token.split_contents() if len(bits) != 2: tag_name = bits[0] usage = f'{{% {tag_name} "setvar" var %}} ... {{% end{tag_name} %}}' raise template.TemplateSyntaxError("Usage: %s" % usage) parser.delete_first_token() return SetVarNode(nodelist, bits[1]) class SetVarNode(template.Node): def __init__(self, nodelist, var): self.nodelist = nodelist self.var = var def render(self, context): context[self.var] = self.nodelist.render(context).strip() return "" django-allauth-0.58.2/allauth/tests.py000066400000000000000000000157331452212273200176570ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals import json import requests from datetime import date, datetime from unittest.mock import Mock from django.core.files.base import ContentFile from django.db import models from django.test import RequestFactory, TestCase from django.utils.http import base36_to_int, int_to_base36 from django.views import csrf from allauth import app_settings from . import utils class MockedResponse(object): def __init__(self, status_code, content, headers=None): if headers is None: headers = {} self.status_code = status_code self.content = content.encode("utf8") self.headers = headers def json(self): return json.loads(self.text) def raise_for_status(self): pass @property def ok(self): return self.status_code // 100 == 2 @property def text(self): return self.content.decode("utf8") class mocked_response: def __init__(self, *responses): self.responses = list(responses) def __enter__(self): self.orig_get = requests.get self.orig_post = requests.post self.orig_request = requests.request def mockable_request(f): def new_f(*args, **kwargs): if self.responses: return self.responses.pop(0) return f(*args, **kwargs) return Mock(side_effect=new_f) requests.get = mockable_request(requests.get) requests.post = mockable_request(requests.post) requests.request = mockable_request(requests.request) def __exit__(self, type, value, traceback): requests.get = self.orig_get requests.post = self.orig_post requests.request = self.orig_request class BasicTests(TestCase): def setUp(self): self.factory = RequestFactory() def test_generate_unique_username(self): examples = [ ("a.b-c@example.com", "a.b-c"), ("Üsêrnamê", "username"), ("User Name", "user_name"), ("", "user"), ] for input, username in examples: self.assertEqual(utils.generate_unique_username([input]), username) def test_email_validation(self): s = "this.email.address.is.a.bit.too.long.but.should.still.validate@example.com" # noqa self.assertEqual(s, utils.valid_email_or_none(s)) def test_serializer(self): class SomeValue: pass some_value = SomeValue() class SomeField(models.Field): def get_prep_value(self, value): return "somevalue" def from_db_value(self, value, expression, connection): return some_value class SomeModel(models.Model): dt = models.DateTimeField() t = models.TimeField() d = models.DateField() img1 = models.ImageField() img2 = models.ImageField() img3 = models.ImageField() something = SomeField() def method(self): pass instance = SomeModel( dt=datetime.now(), d=date.today(), something=some_value, t=datetime.now().time(), ) instance.img1 = ContentFile(b"%PDF", name="foo.pdf") instance.img2 = ContentFile( b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x01\x00" b"\x00\x00\x007n\xf9$\x00\x00\x00\nIDATx\x9cc`\x00\x00\x00\x02\x00\x01H\xaf" b"\xa4q\x00\x00\x00\x00IEND\xaeB`\x82", name="foo.png", ) # make sure serializer doesn't fail if a method is attached to # the instance instance.method = method instance.nonfield = "hello" data = utils.serialize_instance(instance) instance2 = utils.deserialize_instance(SomeModel, data) self.assertEqual(getattr(instance, "method", None), method) self.assertEqual(getattr(instance2, "method", None), None) self.assertEqual(instance2.something, some_value) self.assertEqual(instance2.img1.name, "foo.pdf") self.assertEqual(instance2.img2.name, "foo.png") self.assertEqual(instance2.img3.name, "") self.assertEqual(instance.nonfield, instance2.nonfield) self.assertEqual(instance.d, instance2.d) self.assertEqual(instance.dt.date(), instance2.dt.date()) for t1, t2 in [ (instance.t, instance2.t), (instance.dt.time(), instance2.dt.time()), ]: self.assertEqual(t1.hour, t2.hour) self.assertEqual(t1.minute, t2.minute) self.assertEqual(t1.second, t2.second) # AssertionError: datetime.time(10, 6, 28, 705776) # != datetime.time(10, 6, 28, 705000) self.assertEqual(int(t1.microsecond / 1000), int(t2.microsecond / 1000)) def test_serializer_binary_field(self): class SomeBinaryModel(models.Model): bb = models.BinaryField() bb_empty = models.BinaryField() instance = SomeBinaryModel(bb=b"some binary data") serialized = utils.serialize_instance(instance) deserialized = utils.deserialize_instance(SomeBinaryModel, serialized) self.assertEqual(serialized["bb"], "c29tZSBiaW5hcnkgZGF0YQ==") self.assertEqual(serialized["bb_empty"], "") self.assertEqual(deserialized.bb, b"some binary data") self.assertEqual(deserialized.bb_empty, b"") def test_build_absolute_uri(self): request = None if not app_settings.SITES_ENABLED: request = self.factory.get("/") request.META["SERVER_NAME"] = "example.com" self.assertEqual( utils.build_absolute_uri(request, "/foo"), "http://example.com/foo" ) self.assertEqual( utils.build_absolute_uri(request, "/foo", protocol="ftp"), "ftp://example.com/foo", ) self.assertEqual( utils.build_absolute_uri(request, "http://foo.com/bar"), "http://foo.com/bar", ) def test_int_to_base36(self): n = 55798679658823689999 b36 = "brxk553wvxbf3" assert int_to_base36(n) == b36 assert base36_to_int(b36) == n def test_templatetag_with_csrf_failure(self): # Generate a fictitious GET request from allauth.socialaccount.models import SocialApp app = SocialApp.objects.create(provider="google") if app_settings.SITES_ENABLED: from django.contrib.sites.models import Site app.sites.add(Site.objects.get_current()) request = self.factory.get("/tests/test_403_csrf.html") # Simulate a CSRF failure by calling the View directly # This template is using the `provider_login_url` templatetag response = csrf.csrf_failure(request, template_name="tests/test_403_csrf.html") # Ensure that CSRF failures with this template # tag succeed with the expected 403 response self.assertEqual(response.status_code, 403) django-allauth-0.58.2/allauth/urls.py000066400000000000000000000022421452212273200174710ustar00rootroot00000000000000from importlib import import_module from django.urls import include, path from allauth.socialaccount import providers from . import app_settings urlpatterns = [path("", include("allauth.account.urls"))] if app_settings.MFA_ENABLED: urlpatterns += [path("2fa/", include("allauth.mfa.urls"))] if app_settings.SOCIALACCOUNT_ENABLED: urlpatterns += [path("social/", include("allauth.socialaccount.urls"))] # Provider urlpatterns, as separate attribute (for reusability). provider_urlpatterns = [] provider_classes = providers.registry.get_class_list() # We need to move the OpenID Connect provider to the end. The reason is that # matches URLs that the builtin providers also match. provider_classes = [cls for cls in provider_classes if cls.id != "openid_connect"] + [ cls for cls in provider_classes if cls.id == "openid_connect" ] for provider_class in provider_classes: try: prov_mod = import_module(provider_class.get_package() + ".urls") except ImportError: continue prov_urlpatterns = getattr(prov_mod, "urlpatterns", None) if prov_urlpatterns: provider_urlpatterns += prov_urlpatterns urlpatterns += provider_urlpatterns django-allauth-0.58.2/allauth/utils.py000066400000000000000000000256101452212273200176500ustar00rootroot00000000000000import base64 import importlib import json import random import re import string import unicodedata from collections import OrderedDict from urllib.parse import urlsplit from django.conf import settings from django.contrib.auth import get_user_model from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured from django.core.files.base import ContentFile from django.core.serializers.json import DjangoJSONEncoder from django.core.validators import ValidationError, validate_email from django.db.models import FileField from django.db.models.fields import ( BinaryField, DateField, DateTimeField, EmailField, TimeField, ) from django.utils import dateparse from django.utils.encoding import force_bytes, force_str from allauth import app_settings # Magic number 7: if you run into collisions with this number, then you are # of big enough scale to start investing in a decent user model... MAX_USERNAME_SUFFIX_LENGTH = 7 USERNAME_SUFFIX_CHARS = [string.digits] * 4 + [string.ascii_letters] * ( MAX_USERNAME_SUFFIX_LENGTH - 4 ) def _generate_unique_username_base(txts, regex=None): from .account.adapter import get_adapter adapter = get_adapter() username = None regex = regex or r"[^\w\s@+.-]" for txt in txts: if not txt: continue username = unicodedata.normalize("NFKD", force_str(txt)) username = username.encode("ascii", "ignore").decode("ascii") username = force_str(re.sub(regex, "", username).lower()) # Django allows for '@' in usernames in order to accommodate for # project wanting to use email for username. In allauth we don't # use this, we already have a proper place for putting email # addresses (EmailAddress), so let's not use the full email # address and only take the part leading up to the '@'. username = username.split("@")[0] username = username.strip() username = re.sub(r"\s+", "_", username) # Finally, validating base username without database lookups etc. try: username = adapter.clean_username(username, shallow=True) break except ValidationError: pass return username or "user" def get_username_max_length(): from .account.app_settings import USER_MODEL_USERNAME_FIELD if USER_MODEL_USERNAME_FIELD is not None: User = get_user_model() max_length = User._meta.get_field(USER_MODEL_USERNAME_FIELD).max_length else: max_length = 0 return max_length def generate_username_candidate(basename, suffix_length): max_length = get_username_max_length() suffix = "".join( random.choice(USERNAME_SUFFIX_CHARS[i]) for i in range(suffix_length) ) return basename[0 : max_length - len(suffix)] + suffix def generate_username_candidates(basename): from .account.app_settings import USERNAME_MIN_LENGTH if len(basename) >= USERNAME_MIN_LENGTH: ret = [basename] else: ret = [] min_suffix_length = max(1, USERNAME_MIN_LENGTH - len(basename)) max_suffix_length = min(get_username_max_length(), MAX_USERNAME_SUFFIX_LENGTH) for suffix_length in range(min_suffix_length, max_suffix_length): ret.append(generate_username_candidate(basename, suffix_length)) return ret def generate_unique_username(txts, regex=None): from allauth.account.utils import filter_users_by_username from .account.adapter import get_adapter from .account.app_settings import USER_MODEL_USERNAME_FIELD adapter = get_adapter() basename = _generate_unique_username_base(txts, regex) candidates = generate_username_candidates(basename) existing_usernames = filter_users_by_username(*candidates).values_list( USER_MODEL_USERNAME_FIELD, flat=True ) existing_usernames = set([n.lower() for n in existing_usernames]) for candidate in candidates: if candidate.lower() not in existing_usernames: try: return adapter.clean_username(candidate, shallow=True) except ValidationError: pass # This really should not happen raise NotImplementedError("Unable to find a unique username") def valid_email_or_none(email): ret = None try: if email: validate_email(email) if len(email) <= EmailField().max_length: ret = email except ValidationError: pass return ret def import_attribute(path): assert isinstance(path, str) pkg, attr = path.rsplit(".", 1) ret = getattr(importlib.import_module(pkg), attr) return ret def import_callable(path_or_callable): if not hasattr(path_or_callable, "__call__"): ret = import_attribute(path_or_callable) else: ret = path_or_callable return ret SERIALIZED_DB_FIELD_PREFIX = "_db_" def serialize_instance(instance): """ Since Django 1.6 items added to the session are no longer pickled, but JSON encoded by default. We are storing partially complete models in the session (user, account, token, ...). We cannot use standard Django serialization, as these are models are not "complete" yet. Serialization will start complaining about missing relations et al. """ data = {} for k, v in instance.__dict__.items(): if k.startswith("_") or callable(v): continue try: field = instance._meta.get_field(k) if isinstance(field, BinaryField): v = force_str(base64.b64encode(v)) elif isinstance(field, FileField): if v and not isinstance(v, str): v = { "name": v.name, "content": base64.b64encode(v.read()).decode("ascii"), } # Check if the field is serializable. If not, we'll fall back # to serializing the DB values which should cover most use cases. try: json.dumps(v, cls=DjangoJSONEncoder) except TypeError: v = field.get_prep_value(v) k = SERIALIZED_DB_FIELD_PREFIX + k except FieldDoesNotExist: pass data[k] = v return json.loads(json.dumps(data, cls=DjangoJSONEncoder)) def deserialize_instance(model, data): ret = model() for k, v in data.items(): is_db_value = False if k.startswith(SERIALIZED_DB_FIELD_PREFIX): k = k[len(SERIALIZED_DB_FIELD_PREFIX) :] is_db_value = True if v is not None: try: f = model._meta.get_field(k) if isinstance(f, DateTimeField): v = dateparse.parse_datetime(v) elif isinstance(f, TimeField): v = dateparse.parse_time(v) elif isinstance(f, DateField): v = dateparse.parse_date(v) elif isinstance(f, BinaryField): v = force_bytes(base64.b64decode(force_bytes(v))) elif isinstance(f, FileField): if isinstance(v, dict): v = ContentFile(base64.b64decode(v["content"]), name=v["name"]) elif is_db_value: try: # This is quite an ugly hack, but will cover most # use cases... # The signature of `from_db_value` changed in Django 3 # https://docs.djangoproject.com/en/3.0/releases/3.0/#features-removed-in-3-0 v = f.from_db_value(v, None, None) except Exception: raise ImproperlyConfigured( "Unable to auto serialize field '{}', custom" " serialization override required".format(k) ) except FieldDoesNotExist: pass setattr(ret, k, v) return ret def set_form_field_order(form, field_order): """ This function is a verbatim copy of django.forms.Form.order_fields() to support field ordering below Django 1.9. field_order is a list of field names specifying the order. Append fields not included in the list in the default order for backward compatibility with subclasses not overriding field_order. If field_order is None, keep all fields in the order defined in the class. Ignore unknown fields in field_order to allow disabling fields in form subclasses without redefining ordering. """ if field_order is None: return fields = OrderedDict() for key in field_order: try: fields[key] = form.fields.pop(key) except KeyError: # ignore unknown fields pass fields.update(form.fields) # add remaining fields in original order form.fields = fields def build_absolute_uri(request, location, protocol=None): """request.build_absolute_uri() helper Like request.build_absolute_uri, but gracefully handling the case where request is None. """ from .account import app_settings as account_settings if request is None: if not app_settings.SITES_ENABLED: raise ImproperlyConfigured( "Passing `request=None` requires `sites` to be enabled." ) from django.contrib.sites.models import Site site = Site.objects.get_current() bits = urlsplit(location) if not (bits.scheme and bits.netloc): uri = "{proto}://{domain}{url}".format( proto=account_settings.DEFAULT_HTTP_PROTOCOL, domain=site.domain, url=location, ) else: uri = location else: uri = request.build_absolute_uri(location) # NOTE: We only force a protocol if we are instructed to do so # (via the `protocol` parameter, or, if the default is set to # HTTPS. The latter keeps compatibility with the debatable use # case of running your site under both HTTP and HTTPS, where one # would want to make sure HTTPS links end up in password reset # mails even while they were initiated on an HTTP password reset # form. if not protocol and account_settings.DEFAULT_HTTP_PROTOCOL == "https": protocol = account_settings.DEFAULT_HTTP_PROTOCOL # (end NOTE) if protocol: uri = protocol + ":" + uri.partition(":")[2] return uri def get_form_class(forms, form_id, default_form): form_class = forms.get(form_id, default_form) if isinstance(form_class, str): form_class = import_attribute(form_class) return form_class def get_request_param(request, param, default=None): if request is None: return default return request.POST.get(param) or request.GET.get(param, default) def get_setting(name, dflt): getter = getattr( settings, "ALLAUTH_SETTING_GETTER", lambda name, dflt: getattr(settings, name, dflt), ) getter = import_callable(getter) return getter(name, dflt) django-allauth-0.58.2/docs/000077500000000000000000000000001452212273200154305ustar00rootroot00000000000000django-allauth-0.58.2/docs/Makefile000066400000000000000000000127341452212273200170770ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/django-allauth.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/django-allauth.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/django-allauth" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/django-allauth" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." django-allauth-0.58.2/docs/account/000077500000000000000000000000001452212273200170645ustar00rootroot00000000000000django-allauth-0.58.2/docs/account/advanced.rst000066400000000000000000000104231452212273200213630ustar00rootroot00000000000000Advanced Usage ============== Custom User Models ------------------ If you use a custom user model you need to specify what field represents the ``username``, if any. Here, ``username`` really refers to the field representing the nickname that the user uses to login, and not to some unique identifier (possibly including an email address) as is the case for Django's ``AbstractBaseUser.USERNAME_FIELD``. Therefore, if your custom user model does not have a ``username`` field (again, not to be mistaken with an email address or user id), you will need to set ``ACCOUNT_USER_MODEL_USERNAME_FIELD`` to ``None``. This will disable username related functionality in ``allauth``. Remember to also set ``ACCOUNT_USERNAME_REQUIRED`` to ``False``. Similarly, you will need to set ``ACCOUNT_USER_MODEL_EMAIL_FIELD`` to ``None`` or to the proper field (if other than ``email``). For example, if you want to use a custom user model that has ``email`` as the identifying field, and you don't want to collect usernames, you need the following in your settings.py:: ACCOUNT_USER_MODEL_USERNAME_FIELD = None ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_USERNAME_REQUIRED = False ACCOUNT_AUTHENTICATION_METHOD = 'email' Creating and Populating User instances -------------------------------------- The following adapter methods can be used to intervene in how User instances are created and populated with data - ``allauth.account.adapter.DefaultAccountAdapter``: - ``is_open_for_signup(self, request)``: The default function returns ``True``. You can override this method by returning ``False`` if you want to disable account signup. - ``new_user(self, request)``: Instantiates a new, empty ``User``. - ``save_user(self, request, user, form)``: Populates and saves the ``User`` instance using information provided in the signup form. - ``populate_username(self, request, user)``: Fills in a valid username, if required and missing. If the username is already present, then it is assumed to be valid (unique). - ``confirm_email(self, request, email_address)``: Marks the email address as confirmed and saves to the db. - ``generate_unique_username(self, txts, regex=None)``: Returns a unique username from the combination of strings present in txts iterable. A regex pattern can be passed to the method to make sure the generated username matches it. Invitations ----------- Invitation handling is not supported, and most likely will not be any time soon. An invitation app could cover anything ranging from invitations of new users, to invitations of existing users to participate in restricted parts of the site. All in all, the scope of invitation handling is large enough to warrant being addressed in an app of its own. Still, everything is in place to easily hook up any third party invitation app. The account adapter (``allauth.account.adapter.DefaultAccountAdapter``) offers the following methods: - ``is_open_for_signup(self, request)``. You can override this method to, for example, inspect the session to check if an invitation was accepted. - ``stash_verified_email(self, request, email)``. If an invitation was accepted by following a link in an email, then there is no need to send email verification mails after the signup is completed. Use this method to record the fact that an email address was verified. Custom Redirects ---------------- If redirecting to statically configurable URLs (as specified in your project settings) is not flexible enough, then you can override the following adapter methods: - ``allauth.account.adapter.DefaultAccountAdapter``: - ``get_login_redirect_url(self, request)`` - ``get_logout_redirect_url(self, request)`` - ``get_email_confirmation_redirect_url(self, request)`` - ``get_signup_redirect_url(self, request)`` For example, redirecting to ``/accounts//`` can be implemented as follows:: # project/settings.py: ACCOUNT_ADAPTER = 'project.users.adapter.MyAccountAdapter' # project/users/adapter.py: from django.conf import settings from allauth.account.adapter import DefaultAccountAdapter class MyAccountAdapter(DefaultAccountAdapter): def get_login_redirect_url(self, request): path = "/accounts/{username}/" return path.format(username=request.user.username) django-allauth-0.58.2/docs/account/configuration.rst000066400000000000000000000361571452212273200225010ustar00rootroot00000000000000Configuration ============= Available settings: ``ACCOUNT_ADAPTER`` (default: ``"allauth.account.adapter.DefaultAccountAdapter"``) Specifies the adapter class to use, allowing you to alter certain default behaviour. ``ACCOUNT_AUTHENTICATED_LOGIN_REDIRECTS`` (default: ``True``) The default behaviour is to redirect authenticated users to ``LOGIN_REDIRECT_URL`` when they try accessing login/signup pages. By changing this setting to ``False``, logged in users will not be redirected when they access login/signup pages. ``ACCOUNT_AUTHENTICATION_METHOD`` (default: ``"username"``, alternatives: ``"email"`` or ``"username_email"``) Specifies the login method to use -- whether the user logs in by entering their username, email address, or either one of both. Setting this to ``"email"`` requires ``ACCOUNT_EMAIL_REQUIRED=True`` ``ACCOUNT_CHANGE_EMAIL`` (default: ``False``) When disabled (``False``), users can add one or more email addresses (up to a maximum of ``ACCOUNT_MAX_EMAIL_ADDRESSES``) to their account and freely manage those email addresses. When enabled (``True``), users are limited to having exactly one email address that they can change by adding a temporary second email address that, when verified, replaces the current email address. ``ACCOUNT_CONFIRM_EMAIL_ON_GET`` (default: ``False``) Determines whether or not an email address is automatically confirmed by a GET request. `GET is not designed to modify the server state `_, though it is commonly used for email confirmation. To avoid requiring user interaction, consider using POST via Javascript in your email confirmation template as an alternative to setting this to True. ``ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL`` (default: ``settings.LOGIN_URL``) The URL to redirect to after a successful email confirmation, in case no user is logged in. ``ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL`` (default: ``None``) The URL to redirect to after a successful email confirmation, in case of an authenticated user. Set to ``None`` to use ``settings.LOGIN_REDIRECT_URL``. ``ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS`` (default: ``3``) Determines the expiration date of email confirmation mails (# of days). ``ACCOUNT_EMAIL_CONFIRMATION_HMAC`` (default: ``True``) In order to verify an email address a key is mailed identifying the email address to be verified. In previous versions, a record was stored in the database for each ongoing email confirmation, keeping track of these keys. Current versions use HMAC based keys that do not require server side state. ``ACCOUNT_EMAIL_REQUIRED`` (default: ``False``) The user is required to hand over an email address when signing up. ``ACCOUNT_EMAIL_VERIFICATION`` (default: ``"optional"``) Determines the email verification method during signup -- choose one of ``"mandatory"``, ``"optional"``, or ``"none"``. Setting this to ``"mandatory"`` requires ``ACCOUNT_EMAIL_REQUIRED`` to be ``True``. When set to ``"mandatory"`` the user is blocked from logging in until the email address is verified. Choose ``"optional"`` or ``"none"`` to allow logins with an unverified email address. In case of ``"optional"``, the email verification mail is still sent, whereas in case of "none" no email verification mails are sent. ``ACCOUNT_EMAIL_SUBJECT_PREFIX`` (default: ``"[Site] "``) Subject-line prefix to use for email messages sent. By default, the name of the current ``Site`` (``django.contrib.sites``) is used. ``ACCOUNT_DEFAULT_HTTP_PROTOCOL`` (default: ``"http"``) The default protocol used for when generating URLs, e.g. for the password forgotten procedure. Note that this is a default only -- see the section on HTTPS for more information. ``ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN`` (default: ``180``) Users can request email confirmation mails via the email management view, and, implicitly, when logging in with an unverified account. In order to prevent users from sending too many of these mails, a rate limit is in place that allows for one confirmation mail to be sent per the specified cooldown period (in seconds). ``ACCOUNT_EMAIL_MAX_LENGTH`` (default: ``254``) Maximum length of the email field. You won't need to alter this unless using MySQL with the InnoDB storage engine and the ``utf8mb4`` charset, and only in versions lower than 5.7.7, because the default InnoDB settings don't allow indexes bigger than 767 bytes. When using ``utf8mb4``, characters are 4-bytes wide, so at maximum column indexes can be 191 characters long (767/4). Unfortunately Django doesn't allow specifying index lengths, so the solution is to reduce the length in characters of indexed text fields. More information can be found at `MySQL's documentation on converting between 3-byte and 4-byte Unicode character sets `_. ``ACCOUNT_MAX_EMAIL_ADDRESSES`` (default: ``None``) The maximum amount of email addresses a user can associate to his account. It is safe to change this setting for an already running project -- it will not negatively affect users that already exceed the allowed amount. Note that if you set the maximum to 1, users will not be able to change their email address unless you enable ``ACCOUNT_CHANGE_EMAIL``. ``ACCOUNT_FORMS`` Used to override the builtin forms. Defaults to:: ACCOUNT_FORMS = { 'add_email': 'allauth.account.forms.AddEmailForm', 'change_password': 'allauth.account.forms.ChangePasswordForm', 'login': 'allauth.account.forms.LoginForm', 'reset_password': 'allauth.account.forms.ResetPasswordForm', 'reset_password_from_key': 'allauth.account.forms.ResetPasswordKeyForm', 'set_password': 'allauth.account.forms.SetPasswordForm', 'signup': 'allauth.account.forms.SignupForm', 'user_token': 'allauth.account.forms.UserTokenForm', } ``ACCOUNT_LOGIN_ATTEMPTS_LIMIT`` (default: ``5``) Number of failed login attempts. When this number is exceeded, the user is prohibited from logging in for the specified ``ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT`` seconds. Set to ``None`` to disable this functionality. Important: while this protects the allauth login view, it does not protect Django's admin login from being brute forced. ``ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT`` (default: ``300``) Time period, in seconds, from last unsuccessful login attempt, during which the user is prohibited from trying to log in. ``ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION`` (default: ``False``) The default behaviour is not log users in and to redirect them to ``ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL``. By changing this setting to ``True``, users will automatically be logged in once they confirm their email address. Note however that this only works when confirming the email address **immediately after signing up**, assuming users didn't close their browser or used some sort of private browsing mode. ``ACCOUNT_LOGOUT_ON_GET`` (default: ``False``) Determines whether or not the user is automatically logged out by a GET request. `GET is not designed to modify the server state `_, and in this case it can be dangerous. See `LogoutView in the documentation `_ for details. ``ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE`` (default: ``False``) Determines whether or not the user is automatically logged out after changing or setting their password. See documentation for `Django's session invalidation on password change `_. ``ACCOUNT_LOGIN_ON_PASSWORD_RESET`` (default: ``False``) By changing this setting to ``True``, users will automatically be logged in once they have reset their password. By default they are redirected to the password reset done page. ``ACCOUNT_LOGOUT_REDIRECT_URL`` (default: ``settings.LOGOUT_REDIRECT_URL or "/"``) The URL (or URL name) to return to after the user logs out. Defaults to Django's ``LOGOUT_REDIRECT_URL``, unless that is empty, then ``"/"`` is used. ``ACCOUNT_PASSWORD_INPUT_RENDER_VALUE`` (default: ``False``) ``render_value`` parameter as passed to ``PasswordInput`` fields. ``ACCOUNT_PASSWORD_RESET_TOKEN_GENERATOR`` (default: ``"allauth.account.forms.EmailAwarePasswordResetTokenGenerator"``) A string pointing to a custom token generator (e.g. 'myapp.auth.CustomTokenGenerator') for password resets. This class should implement the same methods as ``django.contrib.auth.tokens.PasswordResetTokenGenerator`` or subclass it. ``ACCOUNT_PRESERVE_USERNAME_CASING`` (default: ``True``) This setting determines whether the username is stored in lowercase (``False``) or whether its casing is to be preserved (``True``). Note that when casing is preserved, potentially expensive ``__iexact`` lookups are performed when filter on username. For now, the default is set to ``True`` to maintain backwards compatibility. ``ACCOUNT_PREVENT_ENUMERATION`` (default: ``True``) Controls whether or not information is revealed about whether or not a user account exists. For example, by entering random email addresses in the password reset form you can test whether or not those email addresses are associated with an account. Enabling this setting prevents that, and an email is always sent, regardless of whether or not the account exists. Note that there is a slight usability tax to pay because there is no immediate feedback. Whether or not enumeration can be prevented during signup depends on the email verification method. In case of mandatory verification, enumeration can be properly prevented because the case where an email address is already taken is indistinguishable from the case where it is not. However, in case of optional or disabled email verification, enumeration can only be prevented by allowing the signup to go through, resulting in multiple accounts sharing same email address (although only one of the accounts can ever have it verified). When enumeration is set to ``True``, email address uniqueness takes precedence over enumeration prevention, and the issue of multiple accounts having the same email address will be avoided, thus leaking information. Set it to ``"strict"`` to allow for signups to go through. ``ACCOUNT_RATE_LIMITS`` In order to be secure out of the box various rate limits are in place. The rate limit mechanism is backed by a Django cache. Hence, rate limiting will not work properly if you are using the `DummyCache`. To disable, set to ``{}``. When rate limits are hit the ``429.html`` template is rendered. Defaults to:: ACCOUNT_RATE_LIMITS = { # Change password view (for users already logged in) "change_password": "5/m", # Email management (e.g. add, remove, change primary) "manage_email": "10/m", # Request a password reset, global rate limit per IP "reset_password": "20/m", # Rate limit measured per individual email address "reset_password_email": "5/m", # Password reset (the view the password reset email links to). "reset_password_from_key": "20/m", # Signups. "signup": "20/m", # NOTE: Login is already protected via `ACCOUNT_LOGIN_ATTEMPTS_LIMIT` } ``ACCOUNT_REAUTHENTICATION_TIMEOUT`` (default: ``300``) Before asking the user to reauthenticate, we check if a successful (re)authentication happened within the amount of seconds specified here, and if that is the case, the new reauthentication flow is silently skipped. ``ACCOUNT_REAUTHENTICATION_REQUIRED`` (default: ``False``) Specifies whether or not reauthentication is required before the user can alter his account. ``ACCOUNT_SESSION_REMEMBER`` (default: ``None``) Controls the life time of the session. Set to ``None`` to ask the user ("Remember me?"), ``False`` to not remember, and ``True`` to always remember. ``ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE`` (default: ``False``) When signing up, let the user type in their email address twice to avoid typo's. ``ACCOUNT_SIGNUP_FORM_CLASS`` (default: ``None``) A string pointing to a custom form class (e.g. ``'myapp.forms.SignupForm'``) that is used during signup to ask the user for additional input (e.g. newsletter signup, birth date). This class should implement a ``def signup(self, request, user)`` method, where user represents the newly signed up user. ``ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE`` (default: ``True``) When signing up, let the user type in their password twice to avoid typos. ``ACCOUNT_SIGNUP_REDIRECT_URL`` (default: ``settings.LOGIN_REDIRECT_URL``) The URL (or URL name) to redirect to directly after signing up. Note that users are only redirected to this URL if the signup went through uninterruptedly, for example, without any side steps due to email verification. If your project requires the user to always pass through certain onboarding views after signup, you will have to keep track of state indicating whether or not the user successfully onboarded, and handle accordingly. ``ACCOUNT_TEMPLATE_EXTENSION`` (default: ``"html"``) A string defining the template extension to use, defaults to ``html``. ``ACCOUNT_USERNAME_BLACKLIST`` (default: ``[]``) A list of usernames that can't be used by user. ``ACCOUNT_UNIQUE_EMAIL`` (default: ``True``) Enforce uniqueness of email addresses. On the database level, this implies that only one user account can have an email address marked as verified. Forms prevent a user from registering with or adding an additional email address if that email address is in use by another account. ``ACCOUNT_USER_DISPLAY`` (default: a callable returning ``user.username``) A callable (or string of the form ``'some.module.callable_name'``) that takes a user as its only argument and returns the display name of the user. The default implementation returns ``user.username``. ``ACCOUNT_USER_MODEL_EMAIL_FIELD`` (default: ``"email"``) The name of the field containing the ``email``, if any. See custom user models. ``ACCOUNT_USER_MODEL_USERNAME_FIELD`` (default: ``"username"``) The name of the field containing the ``username``, if any. See custom user models. ``ACCOUNT_USERNAME_MIN_LENGTH`` (default: ``1``) An integer specifying the minimum allowed length of a username. ``ACCOUNT_USERNAME_REQUIRED`` (default: ``True``) The user is required to enter a username when signing up. Note that the user will be asked to do so even if ``ACCOUNT_AUTHENTICATION_METHOD`` is set to ``email``. Set to ``False`` when you do not wish to prompt the user to enter a username. ``ACCOUNT_USERNAME_VALIDATORS`` (default: ``None``) A path (``'some.module.validators.custom_username_validators'``) to a list of custom username validators. If left unset, the validators setup within the user model username field are used. Example:: # In validators.py from django.contrib.auth.validators import ASCIIUsernameValidator custom_username_validators = [ASCIIUsernameValidator()] # In settings.py ACCOUNT_USERNAME_VALIDATORS = 'some.module.validators.custom_username_validators' django-allauth-0.58.2/docs/account/decorators.rst000066400000000000000000000014111452212273200217600ustar00rootroot00000000000000Decorators ========== Verified Email Required ------------------------ Even when email verification is not mandatory during signup, there may be circumstances during which you really want to prevent unverified users from proceeding. For this purpose you can use the following decorator:: from allauth.account.decorators import verified_email_required @verified_email_required def verified_users_only_view(request): ... The behavior is as follows: - If the user isn't logged in, it acts identically to the ``login_required`` decorator. - If the user is logged in but has no verified email address, an email verification mail is automatically resent and the user is presented with a page informing them they need to verify their email address. django-allauth-0.58.2/docs/account/forms.rst000066400000000000000000000121741452212273200207510ustar00rootroot00000000000000Forms ===== Login ***** *Path*: ``allauth.account.forms.LoginForm`` *Used on*: `account_login `__ view. Example override:: from allauth.account.forms import LoginForm class MyCustomLoginForm(LoginForm): def login(self, *args, **kwargs): # Add your own processing here. # You must return the original result. return super(MyCustomLoginForm, self).login(*args, **kwargs) You have access to the following: - ``self.user`` is the User object that is logging in. ``settings.py``:: ACCOUNT_FORMS = {'login': 'mysite.forms.MyCustomLoginForm'} Signup ****** *Path*: ``allauth.account.forms.SignupForm`` *Used on*: `account_signup `__ view. Example override:: from allauth.account.forms import SignupForm class MyCustomSignupForm(SignupForm): def save(self, request): # Ensure you call the parent class's save. # .save() returns a User object. user = super(MyCustomSignupForm, self).save(request) # Add your own processing here. # You must return the original result. return user ``settings.py``:: ACCOUNT_FORMS = {'signup': 'mysite.forms.MyCustomSignupForm'} Add Email ********* *Path*: ``allauth.account.forms.AddEmailForm`` *Used on*: `account_email `__ view. Example override:: from allauth.account.forms import AddEmailForm class MyCustomAddEmailForm(AddEmailForm): def save(self, request): # Ensure you call the parent class's save. # .save() returns an allauth.account.models.EmailAddress object. email_address_obj = super(MyCustomAddEmailForm, self).save(request) # Add your own processing here. # You must return the original result. return email_address_obj You have access to the following: - ``self.user`` is the User object that is logged in. ``settings.py``:: ACCOUNT_FORMS = {'add_email': 'mysite.forms.MyCustomAddEmailForm'} Change Password *************** *Path*: ``allauth.account.forms.ChangePasswordForm`` *Used on*: `account_change_password `__ view. Example override:: from allauth.account.forms import ChangePasswordForm class MyCustomChangePasswordForm(ChangePasswordForm): def save(self): # Ensure you call the parent class's save. # .save() does not return anything super(MyCustomChangePasswordForm, self).save() # Add your own processing here. You have access to the following: - ``self.user`` is the User object that is logged in. ``settings.py``:: ACCOUNT_FORMS = {'change_password': 'mysite.forms.MyCustomChangePasswordForm'} Set Password ************ *Path*: ``allauth.account.forms.SetPasswordForm`` *Used on*: `account_set_password `__ view. Example override:: from allauth.account.forms import SetPasswordForm class MyCustomSetPasswordForm(SetPasswordForm): def save(self): # Ensure you call the parent class's save. # .save() does not return anything super(MyCustomSetPasswordForm, self).save() # Add your own processing here. You have access to the following: - ``self.user`` is the User object that is logged in. ``settings.py``:: ACCOUNT_FORMS = {'set_password': 'mysite.forms.MyCustomSetPasswordForm'} Reset Password ************** *Path*: ``allauth.account.forms.ResetPasswordForm`` *Used on*: `account_reset_password `__ view. Example override:: from allauth.account.forms import ResetPasswordForm class MyCustomResetPasswordForm(ResetPasswordForm): def save(self, request): # Ensure you call the parent class's save. # .save() returns a string containing the email address supplied email_address = super(MyCustomResetPasswordForm, self).save(request) # Add your own processing here. # Ensure you return the original result return email_address You have access to the following: - ``self.users`` is a list of all possible User objects with matching email address. ``settings.py``:: ACCOUNT_FORMS = {'reset_password': 'mysite.forms.MyCustomResetPasswordForm'} Reset Password From Key *********************** *Path*: ``allauth.account.forms.ResetPasswordKeyForm`` *Used on*: `account_reset_password `__ view. Example override:: from allauth.account.forms import ResetPasswordKeyForm class MyCustomResetPasswordKeyForm(ResetPasswordKeyForm): def save(self): # Add your own processing here. # Ensure you call the parent class's save. # .save() does not return anything super(MyCustomResetPasswordKeyForm, self).save() You have access to the following: - ``self.user`` is the User object. ``settings.py``:: ACCOUNT_FORMS = {'reset_password_from_key': 'mysite.forms.MyCustomResetPasswordKeyForm'} django-allauth-0.58.2/docs/account/index.rst000066400000000000000000000002261452212273200207250ustar00rootroot00000000000000Regular Accounts ================ .. toctree:: introduction configuration views templates forms decorators signals advanced django-allauth-0.58.2/docs/account/introduction.rst000066400000000000000000000011311452212273200223330ustar00rootroot00000000000000Introduction ============ A regular account is a user account, identified by an email address or username, and protected by a password. The ``allauth.account`` app is responsible for managing regular accounts. It supports: - Authentication by username or email. - Registration of new users, with custom signup form support. - Email address management: both a simple change email address flow, and more elaborate flows with multiple email addresses (adding secondary, setting a primary) is supported. - Password forgotten flow. - Changing of the password. - Email address verification flow. django-allauth-0.58.2/docs/account/signals.rst000066400000000000000000000030641452212273200212610ustar00rootroot00000000000000Signals ======= There are several signals emitted during authentication flows. You can hook to them for your own needs. - ``allauth.account.signals.user_logged_in(request, user)`` Sent when a user logs in. - ``allauth.account.signals.user_logged_out(request, user)`` Sent when a user logs out. - ``allauth.account.signals.user_signed_up(request, user)`` Sent when a user signs up for an account. This signal is typically followed by a ``user_logged_in``, unless email verification prohibits the user to log in. - ``allauth.account.signals.password_set(request, user)`` Sent when a password has been successfully set for the first time. - ``allauth.account.signals.password_changed(request, user)`` Sent when a password has been successfully changed. - ``allauth.account.signals.password_reset(request, user)`` Sent when a password has been successfully reset. - ``allauth.account.signals.email_confirmed(request, email_address)`` Sent after the email address in the db was updated and set to confirmed. - ``allauth.account.signals.email_confirmation_sent(request, confirmation, signup)`` Sent right after the email confirmation is sent. - ``allauth.account.signals.email_changed(request, user, from_email_address, to_email_address)`` Sent when a primary email address has been changed. - ``allauth.account.signals.email_added(request, user, email_address)`` Sent when a new email address has been added. - ``allauth.account.signals.email_removed(request, user, email_address)`` Sent when an email address has been deleted. django-allauth-0.58.2/docs/account/templates.rst000066400000000000000000000013461452212273200216200ustar00rootroot00000000000000Template Tags ============= Use ``user_display`` to render a user name without making assumptions on how the user is represented (e.g. render the username, or first name?):: {% load account %} {% user_display user %} Or, if you need to use in a ``{% blocktrans %}``:: {% load account %} {% user_display user as user_display %} {% blocktrans %}{{ user_display }} has logged in...{% endblocktrans %} Then, override the ``ACCOUNT_USER_DISPLAY`` setting with your project specific user display callable. If you set ``ACCOUNT_USERNAME_REQUIRED = False`` and ``ACCOUNT_USER_MODEL_USERNAME_FIELD = None``, then you can simply display the user.email with {{ user }}:: In case you forgot, your username is {{ user }}. django-allauth-0.58.2/docs/account/views.rst000066400000000000000000000057531452212273200207650ustar00rootroot00000000000000Views ===== Login ----- *URL name*: ``account_login`` Users login via the ``allauth.account.views.LoginView`` view over at ``/accounts/login/`` (URL name ``account_login``). When users attempt to login while their account is inactive (``user.is_active``) they are presented with the ``account/account_inactive.html`` template. Signup ------ *URL name*: ``account_signup`` Users sign up via the ``allauth.account.views.SignupView`` view over at ``/accounts/signup/`` (URL name ``account_signup``). Logout ------ *URL name*: ``account_logout`` The logout view (``allauth.account.views.LogoutView``) over at ``/accounts/logout/`` (URL name ``account_logout``) requests for confirmation before logging out. The user is logged out only when the confirmation is received by means of a POST request. If you are wondering why, consider what happens when a malicious user embeds the following image in a post:: For this and more background information on the subject, see: - https://code.djangoproject.com/ticket/15619 - http://stackoverflow.com/questions/3521290/logout-get-or-post If you insist on having logout on GET, then please consider adding a bit of Javascript to automatically turn a click on a logout link into a POST. As a last resort, you can set ``ACCOUNT_LOGOUT_ON_GET`` to ``True``. Password Management ------------------- Authenticated users can manage their password account using the ``allauth.account.views.PasswordSetView`` and ``allauth.account.views.PasswordChangeView`` views, over at ``/accounts/password/set/`` respectively ``/accounts/password/change/`` (URL names ``account_set_password`` and ``account_change_password`` respectively). Users are redirected between these views, according to whether or not they have setup a password (``user.has_usable_password()``). Typically, when users signup via a social provider they will not have a password set. Password Reset -------------- *URL name*: ``account_reset_password`` Users can request a password reset using the ``allauth.account.views.PasswordResetView`` view over at ``/accounts/password/reset/`` (URL name ``account_reset_password``). An email will be sent containing a reset link pointing to ``PasswordResetFromKeyView`` view. Emails Management ----------------- *URL name*: ``account_email`` Users manage the email addresses tied to their account using the ``allauth.account.views.EmailView`` view over at ``/accounts/email/`` (URL name ``account_email``). Here, users can add (and verify) email addresses, remove email addresses, and choose a new primary email address. Email Verification ------------------- Depending on the setting ``ACCOUNT_EMAIL_VERIFICATION``, a verification email is sent pointing to the ``allauth.account.views.ConfirmEmailView`` view. The setting ``ACCOUNT_CONFIRM_EMAIL_ON_GET`` determines whether users have to manually confirm the address by submitting a confirmation form, or whether the address is automatically confirmed by a mere GET request. django-allauth-0.58.2/docs/common/000077500000000000000000000000001452212273200167205ustar00rootroot00000000000000django-allauth-0.58.2/docs/common/admin.rst000066400000000000000000000020551452212273200205440ustar00rootroot00000000000000Admin ===== The Django admin site (``django.contrib.admin``) does not use Django allauth by default. Since Django admin provides a custom login view, it does not go through the normal Django allauth workflow. .. warning:: This limitation means that Django allauth features are not applied to the Django admin site: * ``ACCOUNT_LOGIN_ATTEMPTS_LIMIT`` and ``ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT`` do not protect Django’s admin login from being brute forced. * Any other custom workflow that overrides the Django allauth adapter's login method will not be applied. An easy workaround for this is to require users to login before going to the Django admin site's login page (note that the following would need to be applied to every instance of ``AdminSite``): .. code-block:: python from django.conf import settings from django.contrib import admin from django.contrib.admin.views.decorators import staff_member_required admin.site.login = staff_member_required( admin.site.login, login_url=settings.LOGIN_URL ) django-allauth-0.58.2/docs/common/email.rst000066400000000000000000000016731452212273200205500ustar00rootroot00000000000000Sending Email ============= Emails sent (e.g. in case of password forgotten or email confirmation) can be altered by providing your own templates. Templates are named as follows:: account/email/email_confirmation_signup_subject.txt account/email/email_confirmation_signup_message.txt account/email/email_confirmation_subject.txt account/email/email_confirmation_message.txt In case you want to include an HTML representation, add an HTML template as follows:: account/email/email_confirmation_signup_message.html account/email/email_confirmation_message.html The project does not contain any HTML email templates out of the box. When you do provide these yourself, note that both the text and HTML versions of the message are sent. If this does not suit your needs, you can hook up your own custom mechanism by overriding the ``send_mail`` method of the account adapter (``allauth.account.adapter.DefaultAccountAdapter``). django-allauth-0.58.2/docs/common/https.rst000066400000000000000000000012211452212273200206100ustar00rootroot00000000000000HTTPS ===== This app currently provides no functionality for enforcing views to be HTTPS only, or switching from HTTP to HTTPS (and back) on demand. There are third party packages aimed at providing precisely this, so please use those. What is provided is the following: - The protocol to be used for generating links (e.g. password forgotten) for emails is configurable by means of the ``ACCOUNT_DEFAULT_HTTP_PROTOCOL`` setting. - Automatically switching to HTTPS is built-in for OAuth providers that require this (e.g. Amazon). However, remembering the original protocol before the switch and switching back after the login is not provided. django-allauth-0.58.2/docs/common/index.rst000066400000000000000000000001751452212273200205640ustar00rootroot00000000000000Common Functionality ==================== .. toctree:: :maxdepth: 1 email templates messages admin https django-allauth-0.58.2/docs/common/messages.rst000066400000000000000000000005141452212273200212610ustar00rootroot00000000000000Messages ======== The Django messages framework (``django.contrib.messages``) is used if it is listed in ``settings.INSTALLED_APPS``. All messages (as in ``django.contrib.messages``) are configurable by overriding their respective template. If you want to disable a message, simply override the message template with a blank one. django-allauth-0.58.2/docs/common/templates.rst000066400000000000000000000067461452212273200214650ustar00rootroot00000000000000Templates ========= Introduction ------------ The templates that are offered out of the box are intentionally plain and without any styling. We do not want to pick a side in the multitudes of frontend styling options out there, and the look and feel typically should be adjusted to match the branding of your poject. Therefore it is recommended that you copy all templates over to your own project and adjust them as you see fit. Having said that, over time the years the complexity of authentication grew considerably. For example, with features such as third party account providers and two-factor authentication adjusting the templates involves a lot more than just styling a ``login.html`` and a ``signup.html`` template. Therefore, a mechanism is included that allows you to adjust the look and feel of all templates by only overriding a few core templates. This approach allows you to achieve visual results fast, but is of course more limited compared to styling all templates yourself. Overriding the Built-In Templates --------------------------------- The ``allauth`` app includes all templates, and can be found in the `allauth/templates `__ directory. When ``allauth`` is part of your ``INSTALLED_APPS``, and ``"APP_DIRS": True`` is configured, Django will be able to find its templates. As ``DIRS`` is searched before ``APP_DIRS``, overriding the templates involves adding an entry to ``DIRS`` that points to your a project specific template folder, as follows:: from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [ BASE_DIR / "templates" ], "APP_DIRS": True, "OPTIONS": { "context_processors": [ "django.template.context_processors.debug", "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ], }, }, ] If you copy over all templates to your ``BASE_DIR / "templates"`` it should contain these entries (a.o.): - An ``account`` folder containing the templates from the ``allauth.account`` app. - A ``socialaccount`` folder containing the templates from the ``allauth.socialaccount`` app. - A ``mfa`` folder containing the templates from the ``allauth.mfa`` app. - An ``allauth`` folder containing the overall styling templates (see the next section). Styling the Existing Templates ------------------------------ Instead of copying all templates, a mechanism is included that allows you to adjust the look and feel of all templates by only overriding a few core templates. This approach allows you to achieve visual results fast, but is of course more limited compared to styling all templates yourself. The built-in templates do not render headings, buttons or forms directly. So, you will not find this::

    Welcome

    Instead, the above is rendered using:: {% load allauth %} {% element h1 %}Welcome{% endelement %} The ``{% element h1 %}`` template tag results in ``allauth/elements/h1.html`` being rendered. Here, you can decide to render the `h1` heading using as you see fit:: {% load allauth %}
    {% slot default %}{% endslot %}
    django-allauth-0.58.2/docs/conf.py000066400000000000000000000201001452212273200167200ustar00rootroot00000000000000import os import sys # -*- coding: utf-8 -*- # # django-allauth documentation build configuration file, created by # sphinx-quickstart on Wed Jun 6 22:58:42 2012. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.insert(0, os.path.abspath('.')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix of source filenames. source_suffix = ".rst" # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = "index" # General information about the project. project = "django-allauth" copyright = "2017, Raymond Penners" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = "0.58.2" # The full version, including alpha/beta/rc tags. release = "0.58.2" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ["_build"] # The reST default role (used for this markup: `text`) to use for all documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = "sphinx_rtd_theme" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = "django-allauthdoc" # -- Options for LaTeX output -------------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ( "index", "django-allauth.tex", "django-allauth Documentation", "Raymond Penners", "manual", ), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ( "index", "django-allauth", "django-allauth Documentation", ["Raymond Penners"], 1, ) ] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ------------------------------------------------ # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ( "index", "django-allauth", "django-allauth Documentation", "Raymond Penners", "django-allauth", "One line description of project.", "Miscellaneous", ), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' extensions = [ "sphinx.ext.autodoc", "sphinx_rtd_theme", ] sys.path.insert(0, os.path.abspath("../")) autodoc_mock_imports = [ "allauth.account.utils", "allauth.mfa.app_settings", "allauth.app_settings", ] django-allauth-0.58.2/docs/faq.rst000066400000000000000000000103131452212273200167270ustar00rootroot00000000000000Frequently Asked Questions ========================== Overall ------- Why don't you implement support for ... ? ***************************************** This app is just about authentication. Anything that is project specific, such as making choices on what to display in a profile page, or, what information is stored for a user (e.g. home address, or favorite color?), is beyond scope and therefore not offered. This information is nice and all, but... I need more! ***************************************************** Here are a few third party resources to help you get started: - https://dev.to/gajesh/the-complete-django-allauth-guide-la3 - https://learndjango.com/tutorials/django-allauth-tutorial - https://www.youtube.com/watch?v=2QLAc7RJ99s - https://speakerdeck.com/tedtieken/signing-up-and-signing-in-users-in-django-with-django-allauth - https://stackoverflow.com/questions/tagged/django-allauth - https://github.com/aellerton/demo-allauth-bootstrap - https://github.com/danihodovic/django-allauth-ui I think I found a security issue... now what? ********************************************* Please report security issues only to django-allauth-security@googlegroups.com. This is a private list only open to long-time, highly trusted django-allauth developers, and its archives are not public. You may also want to subscribe to django-allauth-announce@googlegroups.com to get notified about security releases. Troubleshooting --------------- The /accounts/ URL is giving me a 404 ************************************* There is no such URL. Try ``/accounts/login/`` instead. When I attempt to login I run into a 404 on /accounts/profile/ ************************************************************** When you end up here you have successfully logged in. However, you will need to implement a view for this URL yourself, as whatever is to be displayed here is project specific. You can also decide to redirect elsewhere: https://docs.djangoproject.com/en/dev/ref/settings/#login-redirect-url When I sign up I run into connectivity errors (connection refused et al) ************************************************************************ You probably have not got an email (SMTP) server running on the machine you are developing on. Therefore, ``allauth`` is unable to send verification mails. You can work around this by adding the following line to ``settings.py``:: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' This will avoid the need for an SMTP server as emails will be printed to the console. For more information, please refer to: https://docs.djangoproject.com/en/dev/ref/settings/#email-host Development ----------- Why did you just close my issue? ******************************** Time is limited and I have to pick my battles. Please do not file the following types of issues: - **Support questions, installation instructions, "How do I...?":** please direct these questions elsewhere, for example here: https://stackoverflow.com/questions/tagged/django-allauth - **Documentation related complaints:** while the documentation can most certainly be improved, I am adhering to the debatable principle that keeping open issues around with respect to documentation is not very helpful in improving things. Please step in and file a pull request if you feel there is something unclear. - **Project specific integration trouble:** In cases where ``allauth`` is just one piece of the puzzle and for example a stack trace indicates another module crashing, please try to come up stripped version of the issue where it is clear that ``allauth`` is the one that is misbehaving. - **Social login trouble:** There are many reasons why the social login for a provider is not working for you. Common causes are errors in setting up the credential for the OAuth app and/or having setup invalid callback URLs. Filing issues stating that things are not working for you is not very helpful. It is simply not feasible to debug your specific setup. If you really do think that there is an issue in ``allauth``, please do the initial debugging and analysis yourself, and, provide detailed information in the issue. If the issue does not point to any concrete issue in ``allauth``, it is likely to get closed. django-allauth-0.58.2/docs/index.rst000066400000000000000000000007031452212273200172710ustar00rootroot00000000000000.. django-allauth documentation master file, created by sphinx-quickstart on Wed Jun 6 22:58:42 2012. .. include:: ../README.rst :end-before: .. end-welcome Contents ******** .. toctree:: :maxdepth: 2 introduction/index installation/index account/index socialaccount/index mfa/index common/index project/index faq release-notes/index Indices and tables ****************** * :ref:`genindex` * :ref:`search` django-allauth-0.58.2/docs/installation/000077500000000000000000000000001452212273200201315ustar00rootroot00000000000000django-allauth-0.58.2/docs/installation/index.rst000066400000000000000000000001441452212273200217710ustar00rootroot00000000000000============ Installation ============ .. toctree:: :maxdepth: 2 requirements quickstart django-allauth-0.58.2/docs/installation/quickstart.rst000066400000000000000000000217131452212273200230610ustar00rootroot00000000000000Quickstart ========== First, Install the python package:: pip install django-allauth Then, assuming you have a Django project up and running, add the following to the ``settings.py`` of your project:: # Specify the context processors as follows: TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ # Already defined Django-related contexts here # `allauth` needs this from django 'django.template.context_processors.request', ], }, }, ] AUTHENTICATION_BACKENDS = [ ... # Needed to login by username in Django admin, regardless of `allauth` 'django.contrib.auth.backends.ModelBackend', # `allauth` specific authentication methods, such as login by email 'allauth.account.auth_backends.AuthenticationBackend', ... ] INSTALLED_APPS = [ ... # The following apps are required: 'django.contrib.auth', 'django.contrib.messages', 'allauth', 'allauth.account', 'allauth.socialaccount', # ... include the providers you want to enable: 'allauth.socialaccount.providers.agave', 'allauth.socialaccount.providers.amazon', 'allauth.socialaccount.providers.amazon_cognito', 'allauth.socialaccount.providers.angellist', 'allauth.socialaccount.providers.apple', 'allauth.socialaccount.providers.asana', 'allauth.socialaccount.providers.auth0', 'allauth.socialaccount.providers.authentiq', 'allauth.socialaccount.providers.baidu', 'allauth.socialaccount.providers.basecamp', 'allauth.socialaccount.providers.battlenet', 'allauth.socialaccount.providers.bitbucket', 'allauth.socialaccount.providers.bitbucket_oauth2', 'allauth.socialaccount.providers.bitly', 'allauth.socialaccount.providers.box', 'allauth.socialaccount.providers.cilogon', 'allauth.socialaccount.providers.clever', 'allauth.socialaccount.providers.coinbase', 'allauth.socialaccount.providers.dataporten', 'allauth.socialaccount.providers.daum', 'allauth.socialaccount.providers.digitalocean', 'allauth.socialaccount.providers.dingtalk', 'allauth.socialaccount.providers.discord', 'allauth.socialaccount.providers.disqus', 'allauth.socialaccount.providers.douban', 'allauth.socialaccount.providers.doximity', 'allauth.socialaccount.providers.draugiem', 'allauth.socialaccount.providers.drip', 'allauth.socialaccount.providers.dropbox', 'allauth.socialaccount.providers.dwolla', 'allauth.socialaccount.providers.edmodo', 'allauth.socialaccount.providers.edx', 'allauth.socialaccount.providers.eventbrite', 'allauth.socialaccount.providers.eveonline', 'allauth.socialaccount.providers.evernote', 'allauth.socialaccount.providers.exist', 'allauth.socialaccount.providers.facebook', 'allauth.socialaccount.providers.feedly', 'allauth.socialaccount.providers.figma', 'allauth.socialaccount.providers.fivehundredpx', 'allauth.socialaccount.providers.flickr', 'allauth.socialaccount.providers.foursquare', 'allauth.socialaccount.providers.frontier', 'allauth.socialaccount.providers.fxa', 'allauth.socialaccount.providers.gitea', 'allauth.socialaccount.providers.github', 'allauth.socialaccount.providers.gitlab', 'allauth.socialaccount.providers.globus', 'allauth.socialaccount.providers.google', 'allauth.socialaccount.providers.gumroad', 'allauth.socialaccount.providers.hubic', 'allauth.socialaccount.providers.instagram', 'allauth.socialaccount.providers.jupyterhub', 'allauth.socialaccount.providers.kakao', 'allauth.socialaccount.providers.lemonldap', 'allauth.socialaccount.providers.line', 'allauth.socialaccount.providers.linkedin', 'allauth.socialaccount.providers.linkedin_oauth2', 'allauth.socialaccount.providers.mailchimp', 'allauth.socialaccount.providers.mailru', 'allauth.socialaccount.providers.mediawiki', 'allauth.socialaccount.providers.meetup', 'allauth.socialaccount.providers.miro', 'allauth.socialaccount.providers.microsoft', 'allauth.socialaccount.providers.naver', 'allauth.socialaccount.providers.nextcloud', 'allauth.socialaccount.providers.notion', 'allauth.socialaccount.providers.odnoklassniki', 'allauth.socialaccount.providers.openid', 'allauth.socialaccount.providers.openid_connect', 'allauth.socialaccount.providers.openstreetmap', 'allauth.socialaccount.providers.orcid', 'allauth.socialaccount.providers.patreon', 'allauth.socialaccount.providers.paypal', 'allauth.socialaccount.providers.persona', 'allauth.socialaccount.providers.pinterest', 'allauth.socialaccount.providers.pocket', "allauth.socialaccount.providers.questrade", 'allauth.socialaccount.providers.quickbooks', 'allauth.socialaccount.providers.reddit', 'allauth.socialaccount.providers.robinhood', 'allauth.socialaccount.providers.salesforce', 'allauth.socialaccount.providers.sharefile', 'allauth.socialaccount.providers.shopify', 'allauth.socialaccount.providers.slack', 'allauth.socialaccount.providers.snapchat', 'allauth.socialaccount.providers.soundcloud', 'allauth.socialaccount.providers.spotify', 'allauth.socialaccount.providers.stackexchange', 'allauth.socialaccount.providers.steam', 'allauth.socialaccount.providers.stocktwits', 'allauth.socialaccount.providers.strava', 'allauth.socialaccount.providers.stripe', 'allauth.socialaccount.providers.telegram', 'allauth.socialaccount.providers.trainingpeaks', 'allauth.socialaccount.providers.trello', 'allauth.socialaccount.providers.tumblr', 'allauth.socialaccount.providers.twentythreeandme', 'allauth.socialaccount.providers.twitch', 'allauth.socialaccount.providers.twitter', 'allauth.socialaccount.providers.twitter_oauth2', 'allauth.socialaccount.providers.untappd', 'allauth.socialaccount.providers.vimeo', 'allauth.socialaccount.providers.vimeo_oauth2', 'allauth.socialaccount.providers.vk', 'allauth.socialaccount.providers.wahoo', 'allauth.socialaccount.providers.weibo', 'allauth.socialaccount.providers.weixin', 'allauth.socialaccount.providers.windowslive', 'allauth.socialaccount.providers.xing', 'allauth.socialaccount.providers.yahoo', 'allauth.socialaccount.providers.yandex', 'allauth.socialaccount.providers.ynab', 'allauth.socialaccount.providers.zoho', 'allauth.socialaccount.providers.zoom', 'allauth.socialaccount.providers.okta', 'allauth.socialaccount.providers.feishu', ... ] MIDDLEWARE = ( "django.middleware.common.CommonMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", # Add the account middleware: "allauth.account.middleware.AccountMiddleware", ) # Provider specific settings SOCIALACCOUNT_PROVIDERS = { 'google': { # For each OAuth based provider, either add a ``SocialApp`` # (``socialaccount`` app) containing the required client # credentials, or list them here: 'APP': { 'client_id': '123', 'secret': '456', 'key': '' } } } Additionally, add this to your project ``urls.py``:: urlpatterns = [ ... path('accounts/', include('allauth.urls')), ... ] Note that you do not necessarily need the URLs provided by ``django.contrib.auth.urls``. Instead of the URLs ``login``, ``logout``, and ``password_change`` (among others), you can use the URLs provided by ``allauth``: ``account_login``, ``account_logout``, ``account_set_password``... Post-Installation ----------------- In your Django root execute the command below to create your database tables:: python manage.py migrate Now start your server, visit your admin pages (e.g. http://localhost:8000/admin/) and follow these steps: - For each OAuth based provider, either add a ``SocialApp`` (``socialaccount`` app) containing the required client credentials, or, make sure that these are configured via the ``SOCIALACCOUNT_PROVIDERS[]['APP']`` setting (see example above). django-allauth-0.58.2/docs/installation/requirements.rst000066400000000000000000000005111452212273200234030ustar00rootroot00000000000000Requirements ------------ This package has the following external dependencies: - Python 3.7, 3.8, 3.9, or 3.10, 3.11, 3.12. - Django (3.2+) - Depending on which social providers you use: - requests and requests-oauthlib - python-openid or python3-openid (depending on your Python version) - pyjwt - python3-saml django-allauth-0.58.2/docs/introduction/000077500000000000000000000000001452212273200201515ustar00rootroot00000000000000django-allauth-0.58.2/docs/introduction/index.rst000066400000000000000000000015111452212273200220100ustar00rootroot00000000000000Introduction ============ Rationale --------- .. include:: ../../README.rst :start-after: .. begin-rationale :end-before: .. end-rationale Features -------- .. include:: ../../README.rst :start-after: .. begin-features :end-before: .. end-features Design ------ This package is internally subdivided into individual Django apps that each target a specific functional part: - Functionality related to regular (username and/or email based) accounts is implemented in the ``allauth.account`` app. - Functionality related to social accounts is implemented in the ``allauth.socialaccount`` app. - Functionality related to multi-factor authentication is implemented in the ``allauth.mfa`` app. The documentation is structured according to the subdivision above, where each functional part is covered by its own chapter. django-allauth-0.58.2/docs/mfa/000077500000000000000000000000001452212273200161735ustar00rootroot00000000000000django-allauth-0.58.2/docs/mfa/adapter.rst000066400000000000000000000001231452212273200203410ustar00rootroot00000000000000Adapter ======= .. autoclass:: allauth.mfa.adapter.DefaultMFAAdapter :members: django-allauth-0.58.2/docs/mfa/configuration.rst000066400000000000000000000010531452212273200215730ustar00rootroot00000000000000Configuration ============= Available settings: ``MFA_ADAPTER`` (default: ``"allauth.mfa.adapter.DefaultAccountAdapter"``) Specifies the adapter class to use, allowing you to alter certain default behaviour. ``MFA_RECOVERY_CODE_COUNT`` (default: ``10``) The number of recovery codes. ``MFA_TOTP_PERIOD`` (default: ``30``) The period that a TOTP code will be valid for, in seconds. ``MFA_TOTP_DIGITS`` (default: ``6``) The number of digits for TOTP codes. ``MFA_TOTP_ISSUER`` (default: ``""``) The issuer (appearing in the TOTP QR code). django-allauth-0.58.2/docs/mfa/django-allauth-2fa.rst000066400000000000000000000035051452212273200222700ustar00rootroot00000000000000Upgrading from django-allauth-2fa ================================= In case you are currently using django-allauth-2fa and want to switch to the built-in implementation, you will need to migrate the existing TOTP keys and recovery codes. For that purpose, the following reference code is available:: import base64 from allauth.mfa.adapter import get_adapter from allauth.mfa.models import Authenticator from django.core.management.base import BaseCommand from django_otp.plugins.otp_static.models import StaticDevice from django_otp.plugins.otp_totp.models import TOTPDevice class Command(BaseCommand): def handle(self, **options): adapter = get_adapter() authenticators = [] for totp in TOTPDevice.objects.filter(confirmed=True).iterator(): recovery_codes = set() for sdevice in StaticDevice.objects.filter(confirmed=True, user_id=totp.user_id).iterator(): recovery_codes.update(sdevice.token_set.values_list("token", flat=True)) secret = base64.b32encode(bytes.fromhex(totp.key)).decode("ascii") totp_authenticator = Authenticator( user_id=totp.user_id, type=Authenticator.Type.TOTP, data={"secret": adapter.encrypt(secret)}, ) authenticators.append(totp_authenticator) authenticators.append( Authenticator( user_id=totp.user_id, type=Authenticator.Type.RECOVERY_CODES, data={ "migrated_codes": [adapter.encrypt(c) for c in recovery_codes], }, ) ) Authenticator.objects.bulk_create(authenticators) django-allauth-0.58.2/docs/mfa/index.rst000066400000000000000000000002111452212273200200260ustar00rootroot00000000000000Multi-Factor Authentication =========================== .. toctree:: introduction configuration adapter django-allauth-2fa django-allauth-0.58.2/docs/mfa/introduction.rst000066400000000000000000000006331452212273200214500ustar00rootroot00000000000000Introduction ============ The ``allauth.mfa`` app contains all functionality related to Multi-Factor Authentication. It supports: - TOTP based authentication. - Authentication by recovery codes. - Viewing, downloading and regenerating recovery codes. Note that in order to use this functionality you need to install the ``mfa`` extras of the ``django-allauth`` package:: pip install django-allauth[mfa] django-allauth-0.58.2/docs/project/000077500000000000000000000000001452212273200170765ustar00rootroot00000000000000django-allauth-0.58.2/docs/project/index.rst000066400000000000000000000007121452212273200207370ustar00rootroot00000000000000Project ======= Commercial Support ------------------ .. include:: ../../README.rst :start-after: .. begin-support :end-before: .. end-support Funding ------- Maintaining a project of this nature to align with the latest standards and expectations demands a significant investment of time and effort. If you are using this project, especially in a commercial context, then please do consider `sponsoring `_. django-allauth-0.58.2/docs/release-notes/000077500000000000000000000000001452212273200201765ustar00rootroot00000000000000django-allauth-0.58.2/docs/release-notes/2012.rst000066400000000000000000000262611452212273200213230ustar00rootroot000000000000000.8.3 (2012-12-06) ****************** Note worthy changes ------------------- - Markus Thielen contributed a German translation, thanks! - The ``site`` foreign key from ``SocialApp`` to ``Site`` has been replaced by a ``ManyToManyField``. Many apps can be used across multiple domains (Facebook cannot). - account: Added adapter class for increased pluggability. Added hook for 3rd party invitation system to by pass email verification (``stash_email_verified``). Moved sending of mail to adapter. - account: Added option to completely disable email verification during signup. Backwards incompatible changes ------------------------------ - The ``ACCOUNT_EMAIL_VERIFICATION`` setting is no longer a boolean based setting. Use a string value of "none", "optional" or "mandatory" instead. - The template "account/password_reset_key_message.txt" has been moved to "account/email/password_reset_key_message.txt". The subject of the message has been moved into a template ("account/email/password_reset_key_subject.txt"). - The ``site`` foreign key from ``SocialApp`` to ``Site`` has been replaced by a ``ManyToManyField``. Many apps can be used across multiple domains (Facebook cannot). 0.8.2 (2012-10-10) ****************** Note worthy changes ------------------- - Twitter: Login was broken due to change at in URLs at Twitter, fixed. - LinkedIn: Added support for passing along the OAuth scope. - account: Improved email confirmation error handling, no more confusing 404s. - account: Aldiantoro Nugroho contributed support for a new setting: ACCOUNT_USERNAME_MIN_LENGTH - socialaccount: Added preliminary support for Mozilla Persona. - account: Sam Solomon added various signals for email and password related changes. - account: Usernames may now contain @, +, . and - characters. Backwards incompatible changes ------------------------------ - Dropped support for ``CONTACT_EMAIL`` from the ``account`` template context processor. It was never documented and only used in the templates as an example -- there is no need to pollute the ``allauth`` settings with that. If your templates rely on it then you will have to put it in a context processor yourself. 0.8.1 (2012-09-03) ****************** Note worthy changes ------------------- - Python 2.6.2 compatibility issue, fixed. - The example project was unintentionally packaged, fixed. Backwards incompatible changes ------------------------------ None 0.8.0 (2012-09-01) ****************** Note worthy changes ------------------- - account: Dropped dependency on the emailconfirmation app, integrating its functionality into the account app. This change is of major impact, please refer to the documentation on how to upgrade. - account: Documented ACCOUNT_USERNAME_REQUIRED. This is actually not a new setting, but it somehow got overlooked in the documentation. - account/socialaccount: Dropped the _tags postfix from the template tag libraries. Simply use {% load account %} and {% load socialaccount %}. - Added signup and social login signals. - SoundCloud: Rabi Alam contributed a SoundCloud provider, thanks! - account: Sam Solomon cleaned up the email management view: added proper redirect after POSTs, prevent deletion of primary email. Thanks. - account: When signing up, instead of generating a completely random username a more sensible username is automatically derived from first/last name or email. Backwards incompatible changes ------------------------------ - ``allauth`` now depends on Django 1.4 or higher. - Major impact: dropped dependency on the ``emailconfirmation`` app, as this project is clearly left unmaintained. Important tickets such as https://github.com/pinax/django-email-confirmation/pull/5 are not being addressed. All models and related functionality have been directly integrated into the ``allauth.account`` app. When upgrading take care of the following: - The ``emailconfirmation`` setting ``EMAIL_CONFIRMATION_DAYS`` has been replaced by ``ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS``. - Instead of directly confirming the email address upon the GET request the confirmation is now processed as part of an explicit POST. Therefore, a new template ``account/email_confirm.html`` must be setup. - Existing ``emailconfirmation`` data should be migrated to the new tables. For this purpose a special management command is available: ``python manage.py account_emailconfirmationmigration``. This command does not drop the old ``emailconfirmation`` tables -- you will have to do this manually yourself. Why not use South? EmailAddress uniqueness depends on the configuration (``ACCOUNT_UNIQUE_EMAIL``), South does not handle settings dependent database models. - ``{% load account_tags %}`` is deprecated, simply use: ``{% load account %}`` - ``{% load socialaccount_tags %}`` is deprecated, simply use: ``{% load socialaccount %}`` 0.7.0 (2012-07-18) ****************** Note worthy changes ------------------- - Facebook: Facundo Gaich contributed support for dynamically deriving the Facebook locale from the Django locale, thanks!. - OAuth: All OAuth/OAuth2 tokens are now consistently stored across the board. Cleaned up OAuth flow removing superfluous redirect. - Facebook: Dropped Facebook SDK dependency. - socialaccount: DRY focused refactoring of social login. - socialaccount: Added support for Google OAuth2 and Facebook OAuth2. Fixed GitHub. - account: Added verified_email_required decorator. - socialaccount: When signing up, user.first/last_name where always taken from the provider signup data, even when a custom signup form was in place that offered user inputs for editing these fields. Fixed. Backwards incompatible changes ------------------------------ None 0.6.0 (2012-06-20) ****************** Note worthy changes ------------------- - account: Added ACCOUNT_USER_DISPLAY to render a user name without making assumptions on how the user is represented. - allauth, socialaccount: Removed the last remaining bits of hardcodedness with respect to the enabled social authentication providers. - account: Added ACCOUNT_AUTHENTICATION_METHOD setting, supporting login by username, email or both. Backwards incompatible changes ------------------------------ - The ``ACCOUNT_EMAIL_AUTHENTICATION`` setting has been dropped in favor of ``ACCOUNT_AUTHENTICATION_METHOD``. - The login form field is now always named ``login``. This used to by either ``username`` or ``email``, depending on the authentication method. If needed, update your templates accordingly. - The ``allauth`` template tags (containing template tags for OpenID, Twitter and Facebook) have been removed. Use the ``socialaccount`` template tags instead (specifically: ``{% provider_login_url ... %}``). - The ``allauth.context_processors.allauth`` context processor has been removed, in favor of ``allauth.socialaccount.context_processors.socialaccount``. In doing so, all hardcodedness with respect to providers (e.g ``allauth.facebook_enabled``) has been removed. 0.5.0 (2012-06-08) ****************** Note worthy changes ------------------- - account: Added setting ACCOUNT_PASSWORD_MIN_LENGTH for specifying the minimum password length. - socialaccount: Added generic OAuth2 support. Added GitHub support as proof of concept. - socialaccount: More refactoring: generic provider & OAuth consumer approach. Added LinkedIn support to test this approach. - socialaccount: Introduced generic models for storing social apps, accounts and tokens in a central and consistent manner, making way for adding support for more account providers. Note: there is more refactoring to be done -- this first step only focuses on the database models. - account: Email confirmation mails are now automatically resent whenever a user attempts to login with an unverified email address (if ACCOUNT_EMAIL_VERIFICATION=True). Backwards incompatible changes ------------------------------ - Upgrade your ``settings.INSTALLED_APPS``: Replace ``allauth.`` (where provider is one of ``twitter``, ``facebook`` or ``openid``) with ``allauth.socialaccount.providers.`` - All provider related models (``FacebookAccount``, ``FacebookApp``, ``TwitterAccount``, ``TwitterApp``, ``OpenIDAccount``) have been unified into generic ``SocialApp`` and ``SocialAccount`` models. South migrations are in place to move the data over to the new models, after which the original tables are dropped. Therefore, be sure to run migrate using South. 0.4.0 (2012-03-25) ****************** Note worthy changes ------------------- - account: The render_value parameter of all PasswordInput fields used can now be configured via a setting. - account: Added support for prefixing the subject of sent emails. - account: Added support for a plugging in a custom signup form used for additional questions to ask during signup. - account: ``is_active`` is no longer used to keep users with an unverified email address from logging in. - Dropping uniform dependency. Moved uniform templates into example project. Backwards incompatible changes ------------------------------ None 0.3.0 (2012-01-19) ****************** Note worthy changes ------------------- - The email authentication backend now attempts to use the 'username' parameter as an email address. This is needed to properly integrate with other apps invoking authenticate. - SmileyChris contributed support for automatically generating a user name at signup when ``ACCOUNT_USERNAME_REQUIRED`` is set to False. - Vuong Nguyen contributed support for (optionally) asking for the password just once during signup (``ACCOUNT_SIGNUP_PASSWORD_VERIFICATION``). - The Twitter oauth sequence now respects the "oauth_callback" parameter instead of defaulting to the callback URL configured at Twitter. - Pass along ``?next=`` parameter between login and signup views. - Added Dutch translation. - Added template tags for pointing to social login URLs. These tags automatically pass along any ``?next=`` parameter. Additionally, added an overall allauth_tags that gracefully degrades when e.g. allauth.facebook is not installed. - Pass along next URL, if any, at ``/accounts/social/signup/``. - Duplicate email address handling could throw a MultipleObjectsReturned exception, fixed. - Removed separate social account login view, in favour of having a single unified login view including both forms of login. - Added support for passing along a next URL parameter to Facebook, OpenID logins. - Added support for django-avatar, copying the Twitter profile image locally on signup. - ``allauth/account/forms.py`` (``BaseSignupForm.clean_email``): With ``ACCOUNT_EMAIL_REQUIRED=False``, empty email addresses were considered duplicates. Fixed. - The existing migrations for allauth.openid were not compatible with MySQL due to the use of an URLField with max_length above 255. The issue has now been addressed but unfortunately at the cost of the existing migrations for this app. Existing installations will have to be dealt with manually (altering the "identity" column of OpenIDAccount, deleting ghost migrations). Backwards incompatible changes ------------------------------ - None django-allauth-0.58.2/docs/release-notes/2013.rst000066400000000000000000000320721452212273200213210ustar00rootroot000000000000000.15.0 (2013-12-01) ******************* Note worthy changes ------------------- - socialaccount: Added ``is_auto_signup_allowed`` to social account adapter. - facebook: Added a new setting: VERIFIED_EMAIL. - socialaccount: a collision on email address when you sign up using a third party social account is now more clearly explained: "An account already exists with this email address. Please sign in to that account first, then connect your Google account". - account: You are now automatically logged in after confirming your email address during sign up. - account: The ``/accounts/login/`` view now supports AJAX requests. - facebook: The fbconnect.js script is now more pluggable. - socialaccount: Markus Kaiserswerth contributed a Feedly provider, thanks! - socialaccount: Dropped django-avatar support. - openid: First, last and full name are now also queried together with the email address. Thanks, @andrvb. - openid: Compatibility fix for Django 1.6 (JSON serializer). - account: Added support for ``ACCOUNT_CONFIRM_EMAIL_ON_GET``. Backwards incompatible changes ------------------------------ - Instead of directly rendering and returning a template, logging in while the account is inactive or not yet confirmed now redirects to two new views: ``/accounts/inactive/`` respectively ``/accounts/confirm-email/``. - The ``account/verification_sent.html`` template no longer receives the email address in the context (``email``). Note that a message containing that email address is still emitted using the messages framework. - The ``/accounts/confirm_email/key/`` view has been renamed to ``/accounts/confirm-email/`` (human friendlier). Redirects are in place to handle old still pending confirmations. - Built-in support for django-avatar has been removed. Offering such functionality means making choices which may not be valid for everyone. For example, allauth was downloading the image (which can take some time, or even block) in the context of the login, whereas a better place might be some celery background job. Additionally, in case of an error it simply ignored this. How about retries et al? Also, do you want to copy the avatar once at sign up, or do you want to update on each login? All in all, this functionality goes way beyond authentication and should be addressed elsewhere, beyond allauth scope. The original code has been preserved here so that you can easily reinstate it in your own project: https://gist.github.com/pennersr/7571752 0.14.2 (2013-11-16) ******************* Note worthy changes ------------------- - Compatibility fix for logging in with Django 1.6. - Maksim Rukomoynikov contributed a Russian translation, thanks! Backwards incompatible changes ------------------------------ - In case you were using the internal method ``generate_unique_username``, note that its signature has changed. It now takes a list of candidates to base the username on. 0.14.1 (2013-10-28) ******************* Note worthy changes ------------------- - PyPi did not render the README.rst properly. Backwards incompatible changes ------------------------------ None 0.14.0 (2013-10-28) ******************* Note worthy changes ------------------- - Stuart Ross contributed AngelList support, thanks! - LinkedIn: profile fields that are to be fetched are now configurable (``PROFILE_FIELDS`` provider-level setting). - Udi Oron contributed a Hebrew translation, thanks! - Add setting ``ACCOUNT_DEFAULT_HTTP_PROTOCOL`` (HTTPS support). - George Whewell contributed Instagram support, thanks! - Refactored adapter methods relating to creating and populating ``User`` instances. - User creation methods in the ``Default(Social)AccountAdapter`` now have access to the ``request``. Backwards incompatible changes ------------------------------ - The ``socialaccount/account_inactive.html`` template has been moved to ``account/account_inactive.html``. - The adapter API for creating and populating users has been overhauled. As a result, the ``populate_new_user`` adapter methods have disappeared. Please refer to the section on "Creating and Populating User Instances" for more information. 0.13.0 (2013-08-31) ******************* Note worthy changes ------------------- - Koichi Harakawa contributed a Japanese translation, thanks! - Added ``is_open_for_signup`` to DefaultSocialAccountAdapter. - Added VK provider support. - Marcin Spoczynski contributed a Polish translation, thanks! - All views are now class-based. - ``django.contrib.messages`` is now optional. - "jresins" contributed a simplified Chinese, thanks! Backwards incompatible changes ------------------------------ - The password reset from key success response now redirects to a "done" view (``/accounts/password/reset/key/done/``). This view has its own ``account/password_reset_from_key_done.html`` template. In previous versions, the success template was intertwined with the ``account/password_reset_from_key.html`` template. 0.12.0 (2013-07-01) ******************* Note worthy changes ------------------- - Added support for re-authenticated (forced prompt) by means of a new ``action="reauthenticate"`` parameter to the ``{% provider_login_url %}`` - Roberto Novaes contributed a Brazilian Portuguese translation, thanks! - Daniel Eriksson contributed a Swedish translation, thanks! - You can now logout from both allauth and Facebook via a Javascript helper: ``window.allauth.facebook.logout()``. - Connecting a social account is now a flow that needs to be explicitly triggered, by means of a ``process="connect"`` parameter that can be passed along to the ``{% provider_login_url %}``, or a ``process=connect`` GET parameter. - Tomas Marcik contributed a Czech translation, thanks! Backwards incompatible changes ------------------------------ - The ``{% provider_login_url %}`` tag now takes an optional process parameter that indicates how to process the social login. As a result, if you include the template ``socialaccount/snippets/provider_list.html`` from your own overridden ``socialaccount/connections.html`` template, you now need to pass along the process parameter as follows: ``{% include "socialaccount/snippets/provider_list.html" with process="connect" %}``. - Instead of inlining the required Facebook SDK Javascript wrapper code into the HTML, it now resides into its own .js file (served with ``{% static %}``). If you were using the builtin ``fbconnect.html`` this change should go by unnoticed. 0.11.1 (2013-06-04) ******************* Note worthy changes ------------------- - Released (due to issue in disconnecting social accounts). Backwards incompatible changes ------------------------------ None 0.11.0 (2013-06-02) ******************* Note worthy changes ------------------- - Moved logic whether or not a social account can be disconnected to the ``SocialAccountAdapter`` (``validate_disconnect``). - Added ``social_account_removed`` signal. - Implemented CSRF protection (http://tools.ietf.org/html/draft-ietf-oauth-v2-30#section-10.12). - The ``user_logged_in`` signal now optionally receives a ``sociallogin`` parameter, in case of a social login. - Added ``social_account_added`` (contributed by orblivion, thanks). - Hatem Nassrat contributed Bitly support, thanks! - Bojan Mihelac contributed a Croatian translation, thanks! - Messages (as in ``django.contrib.messages``) are now configurable through templates. - Added support for differentiating email handling (verification, required) between local and social accounts: ``SOCIALACCOUNT_EMAIL_REQUIRED`` and ``SOCIALACCOUNT_EMAIL_VERIFICATION``. Backwards incompatible changes ------------------------------ None 0.10.1 (2013-04-16) ******************* Note worthy changes ------------------- - Cleaning of ``username`` can now be overridden via ``DefaultAccountAdapter.clean_username`` - Fixed potential error (``assert``) when connecting social accounts. - Added support for custom username handling in case of custom user models (``ACCOUNT_USER_MODEL_USERNAME_FIELD``). Backwards incompatible changes ------------------------------ None 0.10.0 (2013-04-12) ******************* Note worthy changes ------------------- - Chris Davis contributed Vimeo support, thanks! - Added support for overriding the URL to return to after connecting a social account (``allauth.socialaccount.adapter.DefaultSocialAccountAdapter.get_connect_redirect_url``). - Python 3 is now supported! - Dropped dependency on (unmaintained?) oauth2 package, in favor of requests-oauthlib. - account: Email confirmation mails generated at signup can now be differentiated from regular email confirmation mails by placing e.g. a welcome message into the ``account/email/email_confirmation_signup*`` templates. Thanks to Sam Solomon for the patch. - account: Moved User instance creation to adapter so that e.g. username generation can be influenced. Thanks to John Bazik for the patch. - Robert Balfre contributed Dropbox support, thanks! - socialaccount: Added support for Weibo. - account: Added support for sending HTML email. Add ``*_message.html`` templates and they will be automatically picked up. - Added support for passing along extra parameters to the OAuth2 authentication calls, such as ``access_type`` (Google) or ``auth_type`` (Facebook). - Both the login and signup view now immediately redirect to the login redirect url in case the user was already authenticated. - Added support for closing down signups in a pluggable fashion, making it easy to hookup your own invitation handling mechanism. - Added support for passing along extra parameters to the ``FB.login`` API call. Backwards incompatible changes ------------------------------ - Logout no longer happens on GET request. Refer to the ``LogoutView`` documentation for more background information. Logging out on GET can be restored by the setting ``ACCOUNT_LOGOUT_ON_GET``. Furthermore, after logging out you are now redirected to ``ACCOUNT_LOGOUT_REDIRECT_URL`` instead of rendering the ``account/logout.html`` template. - ``LOGIN_REDIRECT_URLNAME`` is now deprecated. Django 1.5 accepts both URL names and URLs for ``LOGIN_REDIRECT_URL``, so we do so as well. - ``DefaultAccountAdapter.stash_email_verified`` is now named ``stash_verified_email``. - Django 1.4.3 is now the minimal requirement. - Dropped dependency on (unmaintained?) oauth2 package, in favor of requests-oauthlib. So you will need to update your (virtual) environment accordingly. - We noticed a very rare bug that affects end users who add Google social login to existing accounts. The symptom is you end up with users who have multiple primary email addresses which conflicts with assumptions made by the code. In addition to fixing the code that allowed duplicates to occur, there is a management command you can run if you think this effects you (and if it doesn't effect you there is no harm in running it anyways if you are unsure): - ``python manage.py account_unsetmultipleprimaryemails`` - Will silently remove primary flags for email addresses that aren't the same as ``user.email``. - If no primary ``EmailAddress`` is ``user.email`` it will pick one at random and print a warning. - The expiry time, if any, is now stored in a new column ``SocialToken.expires_at``. Migrations are in place. - Furthermore, Facebook started returning longer tokens, so the maximum token length was increased. Again, migrations are in place. - Login and signup views have been turned into class-based views. - The template variable ``facebook_perms`` is no longer passed to the "facebook/fbconnect.html" template. Instead, ``fb_login_options`` containing all options is passed. 0.9.0 (2013-01-30) ****************** Note worthy changes ------------------- - account: ``user_signed_up`` signal now emits an optional ``sociallogin`` parameter so that receivers can easily differentiate between local and social signups. - account: Added ``email_removed`` signal. - socialaccount: Populating of User model fields is now centralized in the adapter, splitting up ``name`` into ``first_name`` and ``last_name`` if these were not individually available. - Ahmet Emre Aladağ contributed a Turkish translation, thanks! - socialaccount: Added SocialAccountAdapter hook to allow for intervention in social logins. - google: support for Google's ``verified_email`` flag to determine whether or not to send confirmation emails. - Fábio Santos contributed a Portuguese translation, thanks! - socialaccount: Added support for Stack Exchange. - socialaccount: Added ``get_social_accounts`` template tag. - account: Default URL to redirect to after login can now be overridden via the adapter, both for login and email confirmation redirects. Backwards incompatible changes ------------------------------ - ``requests`` is now a dependency (dropped ``httplib2``). - Added a new column ``SocialApp.client_id``. The value of ``key`` needs to be moved to the new ``client_id`` column. The ``key`` column is required for Stack Exchange. Migrations are in place to handle all of this automatically. django-allauth-0.58.2/docs/release-notes/2014.rst000066400000000000000000000063541452212273200213260ustar00rootroot000000000000000.18.0 (2014-08-12) ******************* Note worthy changes ------------------- - Storing social access tokens is now optional (``SOCIALACCOUNT_STORE_TOKENS``). - ``nimiq`` contributed ORCID support, thanks. - All forms are now pluggable via a new setting: ``(SOCIAL)ACCOUNT_FORMS``. - James Thompson contributed Windows Live support, thanks! Backwards incompatible changes ------------------------------ - SECURITY: The Persona provider now requires the ``AUDIENCE`` parameter to be explicitly configured, as required by the Persona specification for security reasons. - The inline Javascript is removed from the ``fbconnect.html`` template, which allows for a more strict ``Content-Security-Policy``. If you were using the builtin ``fbconnect.html`` this change should go by unnoticed. 0.17.0 (2014-06-16) ******************* Note worthy changes ------------------- - ``sourenaraya`` contributed Mail.Ru support, thanks. - account: Justin Michalicek contributed support to control session life time and age: ``ACCOUNT_SESSION_COOKIE_AGE`` and ``ACCOUNT_SESSION_REMEMBER``. - Serafeim Papastefanos contributed an Ukrainian translation, thanks! - ``kkarwows`` contributed AppConfig support, thanks. - socialaccount: Added Xing provider. - socialaccount: Marcin Skarbek contributed Hubic support, thanks! - Volodymyr Yatsyk contributed an Ukrainian translation, thanks! - ``joke2k`` contributed an Italian translation, thanks! - socialaccount: All providers now support the ``VERIFIED_EMAIL`` property have email addresses forced to be interpreted as verified. Backwards incompatible changes ------------------------------ None 0.16.1 (2014-03-12) ******************* Note worthy changes ------------------- - Facebook login via Javascript was broken if ``auth_type`` was not set to ``reauthenticate``, fixed. - Support for hooking up a callback when ``FB.init()`` is ready (``allauth.facebook.onInit``) Backwards incompatible changes ------------------------------ None 0.16.0 (2014-03-10) ******************* Note worthy changes ------------------- - Nariman Gharib contributed a Persian translation, thanks! - The custom signup form ``save`` has been deprecated in favour of a ``def signup(request, user)`` method. - Facebook reauthentication now uses an ``auth_nonce``. - Added a new option ``ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION``, to indicate whether or not email confirmation is to automatically log in. - socialaccount: Added Bitbucket provider. - Jack Shedd contributed Tumblr support, thanks! - Romanos Tsouroplis contributed Foursquare support, thanks! - "excessivedemon" contributed Flickr support, thanks! - Luis Diego García contributed Amazon and Paypal support, thanks! - Stuart Ross contributed LinkedIn OAuth 2.0 support, thanks! Backwards incompatible changes ------------------------------ - Previously, the ``save(user)`` was called on the custom signup form. However, this shadowed the existing ``save`` method in case a model form was used. To avoid confusion, the ``save`` method has been deprecated in favour of a ``def signup(request, user)`` method. - The Amazon provider requires more space for ``token_secret``, so the maximum length restriction has been dropped. Migrations are in place. django-allauth-0.58.2/docs/release-notes/2015.rst000066400000000000000000000145061452212273200213250ustar00rootroot000000000000000.24.1 (2015-11-09) ******************* Note worthy changes ------------------- - Non-test code accidentally had test packages as a dependency. Backwards incompatible changes ------------------------------ - Setting a password after logging in with a social account no longer logs out the user by default on Django 1.7+. Setting an initial password and changing the password both respect ``settings.ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE``. 0.24.0 (2015-11-08) ******************* Note worthy changes ------------------- - Django 1.9b1 compatibility. - Seppo Erviälä contributed a Finnish translation, thanks! - Iurii Kriachko contributed a Basecamp provider, thanks! Backwards incompatible changes ------------------------------ - Increased ``SocialApp`` key/secret/token sizes to 191, decreased ``SocialAccount.uid`` size to 191. The latter was done in order to accommodate for MySQL in combination with utf8mb4 and constraints on ``uid``. Note that ``uid`` is used to store OpenID URLs, which can theoretically be longer than 191 characters, although in practice this does not seem to be the case. In case you really need to control the ``uid`` length, set ``settings.SOCIALACCOUNT_UID_MAX_LENGTH`` accordingly. Migrations are in place. 0.23.0 (2015-08-02) ******************* Note worthy changes ------------------- - David Friedman contributed Edmodo support, thanks! - Added support for ``ACCOUNT_LOGIN_ON_PASSWORD_RESET`` (thanks Julen!) Backwards incompatible changes ------------------------------ None 0.22.0 (2015-07-23) ******************* Note worthy changes ------------------- - Reversal of the email confirmation url can now be overridden in the adapter (``get_email_confirmation_url``). Additionally, the complete confirmation email handling can be overridden via ``send_confirmation_mail``. - Template context processors are no longer used. - The Facebook Graph API fields (/me/?fields=...) can now be configured using the provider ``FIELDS`` setting. Backwards incompatible changes ------------------------------ - Dropped support for Python 2.6 and Django <1.6. - The default Facebook Graph API version is now v2.4. - Template context processors are no longer used. The context processor for ``allauth.account`` was already empty, and the context processor for ``allauth.socialaccount`` has been converted into the :doc:``{% get_providers %} `` template tag. 0.21.0 (2015-07-02) ******************* Note worthy changes ------------------- - You can now tweak the authentication params per OAuth provider, as you already could for OAuth2. Contributed by Peter Rowlands, thanks. - Nattaphoom Ch. contributed a Thai translation, thanks! - Guoyu Hao contributed a Baidu provider, thanks! - Rod Xavier Bondoc contributed support logging out on password change (see setting: ``ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE``) Backwards incompatible changes ------------------------------ - In version 0.20.0 an ``account`` migration (``0002_email_max_length``) was added to alter the maximum length of the email field. Unfortunately, a side effect of this migration was that the ``unique=True`` setting slipped through as well. Hardcoding this to ``True`` is wrong, as uniqueness actually depends on the ``ACCOUNT_UNIQUE_EMAIL`` setting. We cannot create a followup ``0003`` migration to set things straight, as the ``0002`` migration may fail on installations where email addresses are not unique. Therefore, we had to resort to changing an existing migration which is normally not the right thing to do. In case your installation has ``ACCOUNT_UNIQUE_EMAIL`` set to ``True``, you need not take any further action. In case it is set to ``False`` and migration ``0002`` already ran, please issue a ``--fake`` migration down to ``0001``, followed by a re-run of the updated ``0002``. 0.20.0 (2015-05-25) ******************* Note worthy changes ------------------- - Patrick Paul contributed a provider for Evernote, thanks! - Josh Wright contributed a provider for Spotify, thanks! - Björn Andersson added support for Dropbox OAuth2, thanks! - guoqiao contributed a provider for Douban, thanks! Backwards incompatible changes ------------------------------ - Given that the ``max_length`` for the Django 1.8 ``EmailField`` has been bumped to 254, allauth is following up. Migrations (``account``) are in place. 0.19.1 (2015-02-05) ******************* Note worthy changes ------------------- - Fixed migrations when using South & Django 1.6. 0.19.0 (2015-01-04) ******************* Note worthy changes ------------------- - Basil Shubin contributed an Odnoklassniki provider, thanks! - Facebook: If the JS SDK is not available, for example due to a browser plugin like Disconnect.me that blocks it, login falls back to the regular non JS handshake. - ``is_safe_url`` can now be overridden - Facebook: The Graph API version is now configurable via ``SOCIALACCOUNT_PROVIDERS``. - A Firefox Accounts provider was added by Jannis Leidel, thanks! - Josh Owen contributed Coinbase support, thanks! - Tomas Babej contributed a Slovak translation, thanks! - Moved existing migrations into ``south_migrations`` - "zbryikt" contributed a Taiwanese Chinese translation, thanks! - Added support for custom password rules via ``clean_password``. Backwards incompatible changes ------------------------------ - In the upcoming Django 1.8 it is no longer possible to hookup an unsaved ``User`` instance to a ``SocialAccount``. Therefore, if you are inspecting the ``sociallogin`` object, you should now use ``sociallogin.user`` instead of ``sociallogin.account.user``. - When users logged in while ``User.is_active`` was ``False``, they were sent to ``/accounts/inactive/`` in case of a social login, and received a form validation error in case of a local login. This needless inconsistency has been removed. The validation error no longer appears and local logins are also redirected to ``/accounts/inactive/``. - In case you were overriding the ``ResetPasswordForm``: the save method now takes ``request`` as its first argument. - All existing migrations have been moved into ``south_migrations`` packages, this in order not to conflict with Django's built-in support for migrations. South 1.0 automatically picks up this new location. Upgrade South if you are still dependent on these migrations. django-allauth-0.58.2/docs/release-notes/2016.rst000066400000000000000000000110321452212273200213150ustar00rootroot000000000000000.29.0 (2016-11-21) ******************* Note worthy changes ------------------- - Addressed Django 1.10 deprecation warnings. 0.28.0 (2016-10-13) ******************* Security notice --------------- - Previous versions contained a vulnerability allowing an attacker to alter the provider specific settings for ``SCOPE`` and/or ``AUTH_PARAMS`` (part of the larger ``SOCIALACCOUNT_PROVIDERS`` setting). The changes would persist across subsequent requests for all users, provided these settings were explicitly set within your project. These settings translate directly into request parameters, giving the attacker undesirable control over the OAuth(2) handshake. You are not affected if you did not explicitly configure these settings. Thanks to Ryan Kelly for reporting! Note worthy changes ------------------- - New providers: Doximity. - New translations: Korean. 0.27.0 (2016-08-18) ******************* Note worthy changes ------------------- - Django 1.10 compatibility. - The Twitter and GitHub providers now support querying of the email address. Backwards incompatible changes ------------------------------ - When ``ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE`` was turned on, the email field key changed from ``email`` to ``email1``, which could introduce subtle bugs. This has now been changed: there always is an ``email`` field, and optionally an ``email2`` field. - The "You must type the same password each time" form validation error that can be triggered during signup is now added to the ``password2`` field instead of being added to the non field errors. - The ``email_confirmation_sent`` signal is now passed ``request``, ``confirmation`` and ``signup`` instead of only the ``confirmation``. - ``ACCOUNT_PASSWORD_MIN_LENGTH`` was already deprecated, but is now completely ignored if ``AUTH_PASSWORD_VALIDATORS`` is not empty. 0.26.1 (2016-07-25) ******************* Note worthy changes ------------------- - Locale files wrongly packaged, fixed. - Fixed bug (``KeyError``) when ``ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE`` was set to ``True``. 0.26.0 (2016-07-24) ******************* Note worthy changes ------------------- - New providers: Weixin, Battle.net, Asana, Eve Online, 23andMe, Slack - Django's password validation mechanism (see ``AUTH_PASSWORD_VALIDATORS``) is now used to validate passwords. - By default, email confirmations are no longer stored in the database. Instead, the email confirmation mail contains an HMAC based key identifying the email address to confirm. The verification lookup includes a fallback to the previous strategy so that there is no negative impact on pending verification emails. - A new setting ``ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE`` was added, requiring users to input their email address twice. The setting ``ACCOUNT_SIGNUP_PASSWORD_VERIFICATION`` has been renamed to ``ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE``. - New translations: Latvian, Kyrgyz. Backwards incompatible changes ------------------------------ - Dropped support for Django 1.6 - In order to accommodate for Django's password validation, the ``clean_password`` method of the adapter now takes an (optional) ``user`` parameter as its second argument. - The new HMAC based keys may contain colons. If you have forked ``account/urls.py``, be sure to sync the ``account_confirm_email`` pattern. 0.25.2 (2016-03-13) ******************* Note worthy changes ------------------- - Bug fix release (MemcachedKeyCharacterError: "Control characters not allowed") 0.25.1 (2016-03-13) ******************* Note worthy changes ------------------- - Bug fix release (AttributeError in password reset view). 0.25.0 (2016-03-12) ******************* Note worthy changes ------------------- - Many providers were added: Reddit, Untappd, GitLab, Stripe, Pinterest, Shopify, Draugiem, DigitalOcean, Robinhood, Bitbucket(OAuth2). - The account connections view is now AJAX aware. - You can now customize the template extension that is being used to render all HTML templates (``ACCOUNT_TEMPLATE_EXTENSION``) - In order to be secure by default, users are now blocked from logging in after exceeding a maximum number of failed login attempts (see ``ACCOUNT_LOGIN_ATTEMPTS_LIMIT``, ``ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT``). Set ``ACCOUNT_LOGIN_ATTEMPTS_LIMIT`` to ``None`` to disable this functionality. Important: while this protects the allauth login view, it does not protect Django's admin login from being brute forced. - New translations: Arabic, Lithuanian Backwards incompatible changes ------------------------------ None django-allauth-0.58.2/docs/release-notes/2017.rst000066400000000000000000000116541452212273200213300ustar00rootroot000000000000000.34.0 (2017-10-29) ******************* Security notice --------------- - The "Set Password" view did not properly check whether or not the user already had a usable password set. This allowed an attacker to set the password without providing the current password, but only in case the attacker already gained control over the victim's session. Note worthy changes ------------------- - New provider: Meetup. 0.33.0 (2017-08-20) ******************* Note worthy changes ------------------- - Security: password reset tokens are now prevented from being leaked through the password reset URL. - New providers: Patreon, Authentiq, Dataporten. - Dropbox has been upgraded to API V2. - New translation: Norwegian. Backwards incompatible changes ------------------------------ - Dropped support for Django 1.9. 0.32.0 (2017-04-27) ******************* Note worthy changes ------------------- - Improved AJAX support: the account management views (change/set password, manage email addresses and social connections) now support AJAX GET requests. These views hand over all the required data for you to build your frontend application upon. - New providers: Dwolla, Trello. - Shopify: support for per-user access mode. Backwards incompatible changes ------------------------------ - In previous versions, the views only responded with JSON responses when issuing AJAX requests of type POST. Now, the views also respond in JSON when making AJAX GET requests. - The structure of the response for AJAX requests has changed. Previously, it contained a ``form_errors`` key containing all form validation errors, if any. Now, it contains a ``form`` key that describes the complete form, including the fields. Field specific errors are placed in ``form.fields['some_field'].errors``, non-field errors in ``form.errors``. - The parameters passed to the Facebook JS SDK ``FB.init()`` method used to contain ``cookie``, ``status``, and ``xfbml``, all set to ``true``. These parameters are no longer explicitly passed. You can use the newly introduced ``INIT_PARAMS`` provider setting to provide your own values. 0.31.0 (2017-02-28) ******************* Note worthy changes ------------------- - Added a new ``user_logged_out`` signal. - OpenId: Added support for requesting additional data. - New providers: Auth0, Box, Line, Naver, Kakao, Daum, MailChimp, Eventbrite. Backwards incompatible changes ------------------------------ - Django 1.7 / Python 3.2 compatibility has been dropped. - Due to providers being registered in the same file as their definition it was impossible to subclass a provider without having the parent be registered. This has been addressed. If you have implemented a custom provider, you will need to change ``providers.registry.register(CustomProvider)`` into ``provider_classes = [CustomProvider]``. 0.30.0 (2017-01-01) ******************* Note worthy changes ------------------- - Changed the algorithm that generates unique usernames. Previously, in case the provider did not hand over any information to base the username on, the username "user" extended with an ever increasing numeric suffix would be attempted until a free username was found. In case of a large number of existing users, this could result in many queries being executed before a free username would be found, potentially resulting in a denial of service. The new algorithm uses a random suffix and only one query to determine the final username. - Added a new setting: ``ACCOUNT_PRESERVE_USERNAME_CASING``. This setting determines whether the username is stored in lowercase (``False``) or whether its casing is to be preserved (``True``). Note that when casing is preserved, potentially expensive ``__iexact`` lookups are performed when filter on username. For now, the default is set to ``True`` to maintain backwards compatibility. - The OAuth2Adapter class has gained a ``get_callback_url`` method for when customizing the callback URL is desired. - The Battle.net login backend now accepts the ``region`` GET parameter. - New providers: 500px, Discord. Backwards incompatible changes ------------------------------ - In previous versions, the ``DefaultAccountAdapter`` contained a ``username_regex`` property and accompanying ``error_messages['invalid_username']`` validation error message. These have been removed in favor of using the regex validation already defined at the user model level. Alternatively, you can use the newly introduced ``ACCOUNT_USERNAME_VALIDATORS`` setting. - The Battle.net backend no longer overrides username regex validation. In order to use battletags as usernames, you are expected to override either the ``username`` field on your User model, or to pass a custom validator which will accept the ``#`` character using the new ``ACCOUNT_USERNAME_VALIDATORS`` setting. Such a validator is available in ``socialaccount.providers.battlenet.validators.BattletagUsernameValidator``. django-allauth-0.58.2/docs/release-notes/2018.rst000066400000000000000000000041451452212273200213260ustar00rootroot000000000000000.38.0 (2018-10-03) ******************* Security notice --------------- The ``{% user_display user %}`` tag did not escape properly. Depending on the username validation rules, this could lead to XSS issues. Note worthy changes ------------------- - New provider: Vimeo (OAuth2). - New translations: Basque. 0.37.1 (2018-08-27) ******************* Backwards incompatible changes ------------------------------ - Dropped the ``x-li-src: msdk`` headers from the ``linkedin_oauth2`` handshake. This header is only required for mobile tokens, and breaks the regular flow. Use the ``HEADERS`` setting to add this header if you need it. 0.37.0 (2018-08-27) ******************* Note worthy changes ------------------- - The Battle.net login backend now recognizes ``apac`` as a valid region. - User model using a ``UUIDField`` as it's primary key can now be logged in upon email confirmation (if using ``ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION``). - New providers: Agave, Cern, Disqus, Globus. - New translation: Danish. 0.36.0 (2018-05-08) ******************* Note worthy changes ------------------- - New providers: Telegram, QuickBooks. - The Facebook API version now defaults to v2.12. - ORCID upgraded to use API v2.1. Security notice --------------- - In previous versions, the authentication backend did not invoke the ``user_can_authenticate()`` method, potentially allowing users with ``is_active=False`` to authenticate when the allauth authentication backend was used in a non allauth context. 0.35.0 (2018-02-02) ******************* Note worthy changes ------------------- - Add support for Django 2.0 Security notice --------------- - As an extra security measure on top of what the standard Django password reset token generator is already facilitating, allauth now adds the user email address to the hash such that whenever the user's email address changes the token is invalidated. Backwards incompatible changes ------------------------------ - Drop support for Django 1.8 and Django 1.10. Note worthy changes ------------------- - New provider: Azure, Microsoft Graph, Salesforce, Yahoo. django-allauth-0.58.2/docs/release-notes/2019.rst000066400000000000000000000045531452212273200213320ustar00rootroot000000000000000.41.0 (2019-12-18) ******************* Security notice --------------- - See `CVE-2019-19844 `_. Note worthy changes ------------------- - New providers: Exist.io., YNAB, Amazon Cognito. - You can now store OAuth credentials directly in your ``settings.SOCIALACCOUNT_PROVIDERS`` settings instead of storing them in the database using a ``SocialApp`` record. - Adding Keycloak Provider Backwards incompatible changes ------------------------------ - Dropped Python 2 and Django 1 compatibility. 0.40.0 (2019-08-29) ******************* Note worthy changes ------------------- - The ``instagram`` provider now extracts the user's full name. - New provider: NextCloud (OAuth2) - Added an ``SDK_URL`` setting for customizing the loading of the Facebook JavaScript SDK. - Updated Twitch provider to use new authentication endpoints (``https://id.twitch.tv``) over deprecated v5 endpoints (``https://api.twitch.tv/kraken``) - Added support for Patreon API v2, with API v1 set as default for backwards compatibility. Backwards incompatible changes ------------------------------ - ``Twitch``: The new API's profile data is different in both structure and content than the old V5 endpoint. Any project that relies on data from ``SocialAccount.extra_data`` should refer to the new API user endpoint documentation: https://dev.twitch.tv/docs/api/reference/#get-users 0.39.1 (2019-02-28) ******************* Note worthy changes ------------------- - The ``linkedin_oauth2`` provider now gracefully deals with old V1 data that might still be present in ``SocialAccount.extra_data``. Backwards incompatible changes ------------------------------ - The ``globus`` provider's ``extract_uid`` now uses the openid required field ``sub`` instead of the ``create_time`` field. 0.39.0 (2019-02-26) ******************* Note worthy changes ------------------- - New providers: JupyterHub (OAuth2), Steam (OpenID) - Refactor translations: Portuguese (Portugal). - Add testing for Django 2.2 (no code changes required) Backwards incompatible changes ------------------------------ - ``linkedin_oauth2``: As the LinkedIn V1 API is deprecated, the user info endpoint has been moved over to use the API V2. The format of the user ``extra_data`` is different and the profile picture is absent by default. django-allauth-0.58.2/docs/release-notes/2020.rst000066400000000000000000000040401452212273200213110ustar00rootroot000000000000000.44.0 (2020-11-25) ******************* Security notice --------------- In previous versions, the mechanism to prevent too many failed login attempts (``ACCOUNT_LOGIN_ATTEMPTS_LIMIT``) could be bypassed by changing the casing of the login. Backwards incompatible changes ------------------------------ - The ``certificate`` key part of the ``SOCIALACCOUNT_PROVIDERS`` configuration has been renamed to ``certificate_key``. This is done to prevent the key from being displayed without being masked in Django debug pages. 0.43.0 (2020-10-15) ******************* Note worthy changes ------------------- - New translation: Slovenian. - If ``ACCOUNT_LOGIN_ATTEMPTS_LIMIT`` is set and the user successfully resets their password, the timeout is cleared to allow immediate login. - You can now limit the amount of email addresses a user can associate to his account by setting ``ACCOUNT_MAX_EMAIL_ADDRESSES``. - New providers: Apple, Okta, Stocktwits, Zoho, Zoom. - If email verification is set to mandatory, the email address you use to login with must now be verified as well. In previous versions, it was sufficient if the account had at least one verified email address, not necessarily the one used to login with. - Added a new setting: ``ACCOUNT_SIGNUP_REDIRECT_URL`` -- the URL (or URL name) to redirect to directly after signing up. Backwards incompatible changes ------------------------------ - In previous versions, the ``allauth`` app included a ``base.html`` template. This template could conflict with an equally named template at project level. Therefore, ``base.html`` has now been moved to ``account/base.html`` -- you will need to check your templates and likely override ``account/base.html`` within your project. 0.42.0 (2020-05-24) ******************* Note worthy changes ------------------- - New providers: EDX, Yandex, Mixer. - Fixed Twitch ``get_avatar_url()`` method to use the profile picture retrieved by new user details endpoint introduced in version 0.40.0. - The Facebook API version now defaults to v7.0. django-allauth-0.58.2/docs/release-notes/2021.rst000066400000000000000000000027171452212273200213230ustar00rootroot000000000000000.47.0 (2021-12-09) ******************* Note worthy changes ------------------- - New providers: Gumroad. Backwards incompatible changes ------------------------------ - Added a new setting ``SOCIALACCOUNT_LOGIN_ON_GET`` that controls whether or not the endpoints for initiating a social login (for example, "/accounts/google/login/") require a POST request to initiate the handshake. As requiring a POST is more secure, the default of this new setting is ``False``. Security notice --------------- Automatically signing in users into their account and connecting additional third party accounts via a simple redirect ("/accounts/facebook/login/") can lead to unexpected results and become a security issue especially when the redirect is triggered from a malicious web site. For example, if an attacker prepares a malicious website that (ab)uses the Facebook password recovery mechanism to first sign into his/her own Facebook account, followed by a redirect to connect a new social account, you may end up with the attacker's Facebook account added to the account of the victim. To mitigate this, ``SOCIALACCOUNT_LOGIN_ON_GET`` is introduced. 0.46.0 (2021-11-15) ******************* Note worthy changes ------------------- - New providers: Gitea, MediaWiki. - New translations: Georgian, Mongolian. - Django 3.2 compatibility. 0.45.0 (2021-07-11) ******************* Note worthy changes ------------------- - New providers: Feishu, NetIQ, Frontier, CILogin. django-allauth-0.58.2/docs/release-notes/history.rst000066400000000000000000000007741452212273200224410ustar00rootroot000000000000002021 **** .. toctree:: :maxdepth: 1 2021 2020 **** .. toctree:: :maxdepth: 1 2020 2019 **** .. toctree:: :maxdepth: 1 2019 2018 **** .. toctree:: :maxdepth: 1 2018 2017 **** .. toctree:: :maxdepth: 1 2017 2016 **** .. toctree:: :maxdepth: 1 2016 2015 **** .. toctree:: :maxdepth: 1 2015 2014 **** .. toctree:: :maxdepth: 1 2014 2013 **** .. toctree:: :maxdepth: 1 2013 2012 **** .. toctree:: :maxdepth: 1 2012 django-allauth-0.58.2/docs/release-notes/index.rst000066400000000000000000000002361452212273200220400ustar00rootroot00000000000000============= Release Notes ============= Recent ****** .. toctree:: :maxdepth: 1 recent History ******* .. toctree:: :maxdepth: 1 history django-allauth-0.58.2/docs/release-notes/recent.rst000066400000000000000000000000411452212273200222030ustar00rootroot00000000000000.. include:: ../../ChangeLog.rst django-allauth-0.58.2/docs/requirements.txt000066400000000000000000000000461452212273200207140ustar00rootroot00000000000000Django==4.2.6 sphinx_rtd_theme==1.3.0 django-allauth-0.58.2/docs/socialaccount/000077500000000000000000000000001452212273200202575ustar00rootroot00000000000000django-allauth-0.58.2/docs/socialaccount/advanced.rst000066400000000000000000000071401452212273200225600ustar00rootroot00000000000000Advanced Usage ============== Creating and Populating User instances -------------------------------------- The following adapter methods can be used to intervene in how User instances are created and populated with data - ``allauth.socialaccount.adapter.DefaultSocialAccountAdapter``: - ``is_open_for_signup(self, request, socialaccount)``: The default function returns that is the same as ``ACCOUNT_ADAPTER`` in ``settings.py``. You can override this method by returning ``True``/``False`` if you want to enable/disable socialaccount signup. - ``new_user(self, request, sociallogin)``: Instantiates a new, empty ``User``. - ``save_user(self, request, sociallogin, form=None)``: Populates and saves the ``User`` instance (and related social login data). The signup form is not available in case of auto signup. - ``populate_user(self, request, sociallogin, data)``: Hook that can be used to further populate the user instance (``sociallogin.account.user``). Here, ``data`` is a dictionary of common user properties (``first_name``, ``last_name``, ``email``, ``username``, ``name``) that the provider already extracted for you. Custom Redirects ---------------- If redirecting to statically configurable URLs (as specified in your project settings) is not flexible enough, then you can override the following adapter methods: - ``allauth.socialaccount.adapter.DefaultSocialAccountAdapter``: - ``get_connect_redirect_url(self, request, socialaccount)`` Customizing providers --------------------- When an existing provider doesn't quite meet your needs, you might find yourself needing to customize a provider. This can be achieved by subclassing an existing provider and making your changes there. Providers are defined as django applications, so typically customizing one will mean creating a django application in your project. This application will contain your customized urls.py, views.py and provider.py files. The behaviour that can be customized is beyond the scope of this documentation. .. warning:: In your ``provider.py`` file, you will need to expose the provider class by having a module level attribute called ``provider_classes`` with your custom classes in a list. This allows your custom provider to be registered properly on the basis of the ``INSTALLED_APPS`` setting. Be sure to use a custom id property on your provider class such that its default URLs do not clash with the provider you are subclassing. .. code-block:: python class GoogleNoDefaultScopeProvider(GoogleProvider): id = 'google_no_scope' def get_default_scope(self): return [] provider_classes = [GoogleNoDefaultScopeProvider] Changing provider scopes ------------------------ Some projects may need more scopes than the default required for authentication purposes. Scopes can be modified via ``SOCIALACCOUNT_PROVIDERS`` in your project settings.py file. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { '': { 'SCOPE': [...] } } You need to obtain the default scopes that allauth uses by looking in ``allauth/socialaccount/providers//provider.py`` and look for ``def get_default_scope(self):`` method. Copy those default scopes into the SCOPE list shown above. Example of adding calendar.readonly scope to Google scopes:: SOCIALACCOUNT_PROVIDERS = { 'google': { 'SCOPE': [ 'profile', 'email', 'openid', 'https://www.googleapis.com/auth/calendar.readonly' ], } } django-allauth-0.58.2/docs/socialaccount/configuration.rst000066400000000000000000000074531452212273200236710ustar00rootroot00000000000000Configuration ============= Available settings: ``SOCIALACCOUNT_ADAPTER`` (default: ``"allauth.socialaccount.adapter.DefaultSocialAccountAdapter"``) Specifies the adapter class to use, allowing you to alter certain default behaviour. ``SOCIALACCOUNT_AUTO_SIGNUP`` (default: ``True``) Attempt to bypass the signup form by using fields (e.g. username, email) retrieved from the social account provider. If a conflict arises due to a duplicate email address the signup form will still kick in. ``SOCIALACCOUNT_EMAIL_AUTHENTICATION`` (default: ``False``) Consider a scenario where a social login occurs, and the social account comes with a verified email address (verified by the account provider), but that email address is already taken by a local user account. Additionally, assume that the local user account does not have any social account connected. Now, if the provider can be fully trusted, you can argue that we should treat this scenario as a login to the existing local user account even if the local account does not already have the social account connected, because -- according to the provider -- the user logging in has ownership of the email address. This is how this scenario is handled when ``SOCIALACCOUNT_EMAIL_AUTHENTICATION`` is set to ``True``. As this implies that an untrustworthy provider can login to any local account by fabricating social account data, this setting defaults to ``False``. Only set it to ``True`` if you are using providers that can be fully trusted. Instead of turning this on globally, you can also turn it on selectively per provider, for example:: SOCIALACCOUNT_PROVIDERS = { 'google': { 'EMAIL_AUTHENTICATION': True } } ``SOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT`` (default: ``False``) In case email authentication is applied, this setting controls whether or not the social account is automatically connected to the local account. In case of ``False`` the local account remains unchanged during the login. In case of ``True``, the social account for which the email matched, is automatically added to the list of social accounts connected to the local account. As a result, even if the user were to change the email address afterwards, social login would still be possible when using ``True``, but not in case of ``False``. ``SOCIALACCOUNT_EMAIL_VERIFICATION`` (default: ``ACCOUNT_EMAIL_VERIFICATION``) As ``ACCOUNT_EMAIL_VERIFICATION``, but for social accounts. ``SOCIALACCOUNT_EMAIL_REQUIRED`` (default: ``ACCOUNT_EMAIL_REQUIRED``) The user is required to hand over an email address when signing up using a social account. ``SOCIALACCOUNT_FORMS`` Used to override forms. Defaults to:: SOCIALACCOUNT_FORMS = { 'disconnect': 'allauth.socialaccount.forms.DisconnectForm', 'signup': 'allauth.socialaccount.forms.SignupForm', } ``SOCIALACCOUNT_LOGIN_ON_GET`` (default: ``False``) Controls whether or not the endpoints for initiating a social login (for example, "/accounts/google/login/") require a POST request to initiate the handshake. For security considerations, it is strongly recommended to require POST requests. ``SOCIALACCOUNT_PROVIDERS`` (default: ``{}``) Dictionary containing `provider specific settings `__. ``SOCIALACCOUNT_QUERY_EMAIL`` (default: ``ACCOUNT_EMAIL_REQUIRED``) Request email address from 3rd party account provider? E.g. using OpenID AX, or the Facebook "email" permission. ``SOCIALACCOUNT_SOCIALACCOUNT_STR`` (default: ``str`` of user object) Used to override the str value for the SocialAccount model. Must be a function accepting a single parameter for the socialaccount object. ``SOCIALACCOUNT_STORE_TOKENS`` (default: ``False``) Indicates whether or not the access tokens are stored in the database. django-allauth-0.58.2/docs/socialaccount/forms.rst000066400000000000000000000037451452212273200221500ustar00rootroot00000000000000Forms ===== Signup ****** *Path*: ``allauth.socialaccount.forms.SignupForm`` *Used on*: ``socialaccount_signup`` view used when a user initially signs up with a social account and needs to create an account. Example override:: from allauth.socialaccount.forms import SignupForm class MyCustomSocialSignupForm(SignupForm): def save(self, request): # Ensure you call the parent class's save. # .save() returns a User object. user = super(MyCustomSocialSignupForm, self).save(request) # Add your own processing here. # You must return the original result. return user You have access to the following: - ``self.socialaccount`` ``settings.py``:: SOCIALACCOUNT_FORMS = {'signup': 'mysite.forms.MyCustomSocialSignupForm'} Disconnect ********** *Path*: ``allauth.socialaccount.forms.DisconnectForm`` *Used on*: ``socialaccount_connections`` view, used when removing a social account. Example override:: from allauth.socialaccount.forms import DisconnectForm class MyCustomSocialDisconnectForm(DisconnectForm): def save(self): # Add your own processing here if you do need access to the # socialaccount being deleted. # Ensure you call the parent class's save. # .save() does not return anything super(MyCustomSocialDisconnectForm, self).save() # Add your own processing here if you don't need access to the # socialaccount being deleted. You have access to the following: - ``self.request`` is the request object - ``self.accounts`` is a list containing all of the user's SocialAccount objects. - ``self.cleaned_data['account']`` contains the socialaccount being deleted. ``.save()`` issues the delete. So if you need access to the socialaccount beforehand, move your code before ``.save()``. ``settings.py``:: SOCIALACCOUNT_FORMS = {'disconnect': 'mysite.forms.MyCustomSocialDisconnectForm'} django-allauth-0.58.2/docs/socialaccount/index.rst000066400000000000000000000003031452212273200221140ustar00rootroot00000000000000Social Accounts =============== .. toctree:: :maxdepth: 1 introduction configuration provider_configuration views templates forms signals providers/index advanced django-allauth-0.58.2/docs/socialaccount/introduction.rst000066400000000000000000000007221452212273200235330ustar00rootroot00000000000000Introduction ============ A social account is a user account where authentication is delegated to an external identity provider. The ``allauth.socialaccount`` app is responsible for managing social accounts. It supports: - Connecting more one or more social accounts to a local/regular account - Disconnecting a social account -- requires setting a password if only the local account remains - Optional instant-signup for social accounts -- no questions asked django-allauth-0.58.2/docs/socialaccount/provider_configuration.rst000066400000000000000000000056741452212273200256060ustar00rootroot00000000000000Provider Configuration ====================== Providers typically require various configuration parameters before your users can authenticate with them. For example, for a regular OAuth provider you first need to setup an OAuth app over on the provider developer portal. Then, you need to configure the resulting client ID and client secret in your application. Even though providers with other protocols may use different terminology, the overall idea remains the same. Throughout allauth the term "social app" ("app" for short) refers to the unit of configuration of a provider. You provide the app configuration either in your project ``settings.py``, or, by means of setting up ``SocialApp`` instances via the Django admin. When picking a method, consider the following: - Using the Django admin to setup ``SocialApp`` instances effectively stores secrets in your database, which has security implications. - The ``SocialApp`` approach has (optional) support for the Django sites (``django.contrib.sites``). For example, it allows you to setup multiple apps for one and the same provider, and assign an app to a specific site/domain. This may be of use in a multi tenant setup. **Important**: While you can mix both methods, be aware you need to avoid configuring one and the same provider both via ``settings.py`` and a ``SocialApp`` instance. In that case, it is not clear what app to pick, resulting in a ``MultipleObjectsReturned`` exception. The examples presented in this documentation are all settings based. If you prefer the ``SocialApp`` based approach, simply create an entry via the Django admin and populate the fields exactly like listed in the example. The ``SOCIALACCOUNT_PROVIDERS`` setting is used to configure providers and their apps. Next to the secrets that are configured per app, there are also parameters such as ``VERIFIED_EMAIL`` that hold for all apps. The following is an example configuration:: SOCIALACCOUNT_PROVIDERS = { "github": { # For each provider, you can choose whether or not the # email address(es) retrieved from the provider are to be # interpreted as verified. "VERIFIED_EMAIL": True }, "google": { # For each OAuth based provider, either add a ``SocialApp`` # (``socialaccount`` app) containing the required client # credentials, or list them here: "APPS": [ { "client_id": "123", "secret": "456", "key": "" }, ], # These are provider-specific settings that can only be # listed here: "SCOPE": [ "profile", "email", ], "AUTH_PARAMS": { "access_type": "online", }, } } Note that provider-specific settings are documented `for each provider separately `__. django-allauth-0.58.2/docs/socialaccount/providers/000077500000000000000000000000001452212273200222745ustar00rootroot00000000000000django-allauth-0.58.2/docs/socialaccount/providers/23andme.rst000066400000000000000000000002671452212273200242640ustar00rootroot0000000000000023andMe ------- App registration (get your key and secret here) https://api.23andme.com/dev/ Development callback URL http://localhost:8000/accounts/23andme/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/500px.rst000066400000000000000000000002741452212273200237050ustar00rootroot00000000000000500px ----- App registration (get your key and secret here) https://500px.com/settings/applications Development callback URL http://localhost:8000/accounts/500px/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/agave.rst000066400000000000000000000010571452212273200241140ustar00rootroot00000000000000AgaveAPI -------- Account Signup https://public.agaveapi.co/create_account App registration Run ``client-create`` from the cli: https://bitbucket.org/agaveapi/cli/overview Development callback URL http://localhost:8000/accounts/agave/login/callback/ *May require https url, even for localhost* .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'agave': { 'API_URL': 'https://api.tacc.utexas.edu', } } In the absence of a specified API_URL, the default Agave tenant is https://public.agaveapi.co/ django-allauth-0.58.2/docs/socialaccount/providers/amazon.rst000066400000000000000000000004631452212273200243160ustar00rootroot00000000000000Amazon ------ Amazon requires secure OAuth callback URLs (``redirect_uri``), please see the section on HTTPS about how this is handled. App registration (get your key and secret here) http://login.amazon.com/manageApps Development callback URL https://example.com/accounts/amazon/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/amazon_cognito.rst000066400000000000000000000024151452212273200260370ustar00rootroot00000000000000Amazon Cognito -------------- App registration (get your key and secret here) 1. Go to your https://console.aws.amazon.com/cognito/ and create a Cognito User Pool if you haven't already. 2. Go to General Settings > App Clients section and create a new App Client if you haven't already. Please make sure you select the option to generate a secret key. 3. Go to App Integration > App Client Settings section and: 1. Enable Cognito User Pool as an identity provider. 2. Set the callback and sign-out URLs. (see next section for development callback URL) 3. Enable Authorization Code Grant OAuth flow. 4. Select the OAuth scopes you'd like to allow. 4. Go to App Integration > Domain Name section and create a domain prefix for your Cognito User Pool. Development callback URL: http://localhost:8000/accounts/amazon-cognito/login/callback/ In addition, you'll need to specify your user pool's domain like so: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'amazon_cognito': { 'DOMAIN': 'https://.auth.us-east-1.amazoncognito.com', } } Your domain prefix is the value you specified in step 4 of the app registration process. If you provided a custom domain such as accounts.example.com provide that instead. django-allauth-0.58.2/docs/socialaccount/providers/angellist.rst000066400000000000000000000003031452212273200250040ustar00rootroot00000000000000AngelList --------- App registration (get your key and secret here) https://angel.co/api/oauth/clients Development callback URL http://localhost:8000/accounts/angellist/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/apple.rst000066400000000000000000000034321452212273200241310ustar00rootroot00000000000000Apple ----- App registration (create an App ID and then a related Service ID here) https://developer.apple.com/account/resources/certificates/list Private Key registration (be sure to save it) https://developer.apple.com/account/resources/authkeys/list Development callback URL http://domain.com/accounts/apple/login/callback/ Add the following configuration to your settings: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { "apple": { "APP": { # Your service identifier. "client_id": "your.service.id", # The Key ID (visible in the "View Key Details" page). "secret": "KEYID", # Member ID/App ID Prefix -- you can find it below your name # at the top right corner of the page, or it’s your App ID # Prefix in your App ID. "key": "MEMAPPIDPREFIX", "settings": { # The certificate you downloaded when generating the key. "certificate_key": """-----BEGIN PRIVATE KEY----- s3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr 3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3 c3ts3cr3t -----END PRIVATE KEY----- """ } } } } Note: Sign In With Apple uses a slight variation of OAuth2, which uses a POST instead of a GET. Unlike a GET with SameSite=Lax, the session cookie will not get sent along with a POST. If you encounter 'PermissionDenied' errors during Apple log in, check that you don't have any 3rd party middleweare that is generating a new session on this cross-origin POST, as this will prevent the login process from being able to access the original session after the POST completes. django-allauth-0.58.2/docs/socialaccount/providers/auth0.rst000066400000000000000000000006671452212273200240600ustar00rootroot00000000000000Auth0 ----- App registration (get your key and secret here) https://manage.auth0.com/#/clients Development callback URL http://localhost:8000/accounts/auth0/login/callback/ You'll need to specify the base URL for your Auth0 domain: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'auth0': { 'AUTH0_URL': 'https://your.auth0domain.auth0.com', 'OAUTH_PKCE_ENABLED': True, } } django-allauth-0.58.2/docs/socialaccount/providers/authentiq.rst000066400000000000000000000017271452212273200250370ustar00rootroot00000000000000Authentiq --------- Browse to https://www.authentiq.com/developers to get started. App registration https://dashboard.authentiq.com/ Sign in or register with your Authentiq ID (select ``Download the app`` while signing in if you don't have Authentiq ID yet). Development redirect URL http://localhost:8000/accounts/authentiq/login/callback/ While testing you can leave the ``Redirect URIs`` field empty in the dashboard. You can specify what identity details to request via the ``SCOPE`` parameter. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'authentiq': { 'SCOPE': ['email', 'aq:name'] } } Valid scopes include: ``email``, ``phone``, ``address``, ``aq:name``, ``aq:location``. The default is to request a user's name, and email address if ``SOCIALACCOUNT_QUERY_EMAIL=True``. You can request and require a verified email address by setting ``SOCIALACCOUNT_EMAIL_VERIFICATION=True`` and ``SOCIALACCOUNT_EMAIL_REQUIRED=True``. django-allauth-0.58.2/docs/socialaccount/providers/baidu.rst000066400000000000000000000003341452212273200241120ustar00rootroot00000000000000Baidu ----- The Baidu OAuth2 authentication documentation: http://developer.baidu.com/wiki/index.php?title=docs/oauth/refresh http://developer.baidu.com/wiki/index.php?title=docs/oauth/rest/file_data_apis_lista django-allauth-0.58.2/docs/socialaccount/providers/basecamp.rst000066400000000000000000000005041452212273200246000ustar00rootroot00000000000000Basecamp -------- App registration (get your key and secret here) https://integrate.37signals.com/ The Basecamp OAuth2 authentication documentation https://github.com/basecamp/api/blob/master/sections/authentication.md#oauth-2 Development callback URL https://localhost:8000/accounts/basecamp/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/battlenet.rst000066400000000000000000000025431452212273200250140ustar00rootroot00000000000000Battle.net ---------- The Battle.net OAuth2 authentication documentation https://develop.battle.net/documentation/guides/using-oauth Register your app here (Blizzard account required) https://develop.battle.net/access/clients/create Development callback URL https://localhost:8000/accounts/battlenet/login/callback/ Note that in order to use battletags as usernames, you are expected to override either the ``username`` field on your User model, or to pass a custom validator which will accept the ``#`` character using the ``ACCOUNT_USERNAME_VALIDATORS`` setting. Such a validator is available in ``socialaccount.providers.battlenet.validators.BattletagUsernameValidator``. The following Battle.net settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'battlenet': { 'SCOPE': ['wow.profile', 'sc2.profile'], 'REGION': 'us', } } SCOPE: Scope can be an array of the following options: ``wow.profile`` allows access to the user's World of Warcraft characters. ``sc2.profile`` allows access to the user's StarCraft 2 profile. The default setting is ``[]``. REGION: Either ``apac``, ``cn``, ``eu``, ``kr``, ``sea``, ``tw`` or ``us`` Sets the default region to use, can be overridden using query parameters in the URL, for example: ``?region=eu``. Defaults to ``us``. django-allauth-0.58.2/docs/socialaccount/providers/bitbucket.rst000066400000000000000000000006741452212273200250110ustar00rootroot00000000000000Bitbucket --------- App registration (get your key and secret here) https://bitbucket.org/account/user/{{yourusername}}/oauth-consumers/new Make sure you select the Account:Read permission. Development callback URL http://127.0.0.1:8000/accounts/bitbucket_oauth2/login/callback/ Note that Bitbucket calls the ``client_id`` *Key* in their user interface. Don't get confused by that; use the *Key* value for your ``client_id`` field. django-allauth-0.58.2/docs/socialaccount/providers/box.rst000066400000000000000000000002741452212273200236210ustar00rootroot00000000000000Box --- App registration (get your key and secret here) https://app.box.com/developers/services/edit/ Development callback URL http://localhost:8000/accounts/box/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/cern.rst000066400000000000000000000017211452212273200237560ustar00rootroot00000000000000CERN ---- Starting from September 1st 2023, CERN upgraded their SSO to a standard OpenID Connect based solution. As a result, the previously builtin CERN provider is no longer needed and has been removed. Instead, use the regular OpenID Connect configuration:: SOCIALACCOUNT_PROVIDERS = { "openid_connect": { "APPS": [ { "provider_id": "cern", "name": "CERN", "client_id": "", "secret": "", "settings": { "server_url": "https://auth.cern.ch/auth/realms/cern/.well-known/openid-configuration", }, } ] } } App registration (get your key and secret here) https://sso-management.web.cern.ch/OAuth/RegisterOAuthClient.aspx CERN OAuth2 Documentation https://espace.cern.ch/authentication/CERN%20Authentication/OAuth.aspx django-allauth-0.58.2/docs/socialaccount/providers/cilogon.rst000066400000000000000000000004401452212273200244560ustar00rootroot00000000000000CILogon ------- CILogon is a federated identity provider for hundreds of universities and research institutions around the world. App registration (get your key and secret here) https://cilogon.org/oauth2/register CILogon OIDC/OAuth2 Documentation https://www.cilogon.org/oidc django-allauth-0.58.2/docs/socialaccount/providers/clever.rst000066400000000000000000000001761452212273200243120ustar00rootroot00000000000000Clever ------ Single sign-on for education Clever OAUth2 Documentation https://dev.clever.com/docs/classroom-with-oauth django-allauth-0.58.2/docs/socialaccount/providers/dataporten.rst000066400000000000000000000003211452212273200251630ustar00rootroot00000000000000Dataporten ---------- App registration (get your key and secret here) https://docs.dataporten.no/docs/gettingstarted/ Development callback URL http://localhost:8000/accounts/dataporten/login/callback django-allauth-0.58.2/docs/socialaccount/providers/daum.rst000066400000000000000000000002651452212273200237570ustar00rootroot00000000000000daum ---- App registration (get your key and secret here) https://developers.daum.net/console Development callback URL http://127.0.0.1:8000/accounts/daum/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/digitalocean.rst000066400000000000000000000011521452212273200254500ustar00rootroot00000000000000DigitalOcean ------------ App registration (get your key and secret here) https://cloud.digitalocean.com/settings/applications Development callback URL http://127.0.0.1:8000/accounts/digitalocean/login/callback/ With the acquired access token you will have read permissions on the API by default. If you also need write access specify the scope as follows. See https://developers.digitalocean.com/documentation/oauth/#scopes for details. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'digitalocean': { 'SCOPE': [ 'read write', ], } } django-allauth-0.58.2/docs/socialaccount/providers/dingtalk.rst000066400000000000000000000010241452212273200246200ustar00rootroot00000000000000DingTalk -------- The DingTalk OAuth2 documentation: https://open.dingtalk.com/document/orgapp-server/obtain-identity-credentials You can optionally specify additional scope to use. If no ``SCOPE`` value is set, will use ``openapi`` by default(for Open Platform Account, need registration). Other ``SCOPE`` options are: corpid. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'dingtalk': { 'APP': { 'client_id': 'xxxx', 'secret': 'xxxx', }, } } django-allauth-0.58.2/docs/socialaccount/providers/discord.rst000066400000000000000000000004321452212273200244540ustar00rootroot00000000000000Discord ------- App registration and management (get your key and secret here) https://discordapp.com/developers/applications/me Make sure to Add Redirect URI to your application. Development callback (redirect) URL http://127.0.0.1:8000/accounts/discord/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/doximity.rst000066400000000000000000000004341452212273200246750ustar00rootroot00000000000000Doximity -------- Doximity OAuth2 implementation documentation https://www.doximity.com/developers/documentation#oauth Request API keys here https://www.doximity.com/developers/api_signup Development callback URL http://localhost:8000/accounts/doximity/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/draugiem.rst000066400000000000000000000004571452212273200246310ustar00rootroot00000000000000Draugiem -------- App registration (get your key and secret here) https://www.draugiem.lv/applications/dev/create/?type=4 Authentication documentation https://www.draugiem.lv/applications/dev/docs/passport/ Development callback URL http://localhost:8000/accounts/draugiem/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/drip.rst000066400000000000000000000004731452212273200237700ustar00rootroot00000000000000Drip -------- App registration (get your key and secret here) https://www.getdrip.com/user/applications Authentication documentation https://developer.drip.com/?shell#oauth Development callback URL https://localhost:8000/accounts/drip/login/callback/ Make sure the registered application is active. django-allauth-0.58.2/docs/socialaccount/providers/dropbox.rst000066400000000000000000000003031452212273200244770ustar00rootroot00000000000000Dropbox ------- App registration (get your key and secret here) https://www.dropbox.com/developers/apps/ Development callback URL http://localhost:8000/accounts/dropbox/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/dwolla.rst000066400000000000000000000007511452212273200243130ustar00rootroot00000000000000Dwolla ------------ App registration (get your key and secret here) https://dashboard-uat.dwolla.com/applications Development callback URL http://127.0.0.1:8000/accounts/dwolla/login/callback/ .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'dwolla': { 'SCOPE': [ 'Send', 'Transactions', 'Funding', 'AccountInfoFull', ], 'ENVIROMENT':'sandbox', } } django-allauth-0.58.2/docs/socialaccount/providers/edmodo.rst000066400000000000000000000011341452212273200242740ustar00rootroot00000000000000Edmodo ------ Edmodo OAuth2 documentation https://developers.edmodo.com/edmodo-connect/edmodo-connect-overview-getting-started/ You can optionally specify additional permissions to use. If no ``SCOPE`` value is set, the Edmodo provider will use ``basic`` by default: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'edmodo': { 'SCOPE': [ 'basic', 'read_groups', 'read_connections', 'read_user_email', 'create_messages', 'write_library_items', ] } } django-allauth-0.58.2/docs/socialaccount/providers/edx.rst000066400000000000000000000006421452212273200236100ustar00rootroot00000000000000Edx ------ Open Edx OAuth2 documentation https://course-catalog-api-guide.readthedocs.io/en/latest/authentication/ It is necessary to set ``EDX_URL`` to your open edx installation. If no ``EDX_URL`` value is set, the Edx provider will use ``https://edx.org`` which does not work: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'edx': { 'EDX_URL': "https://openedx.local", } } django-allauth-0.58.2/docs/socialaccount/providers/eventbrite.rst000066400000000000000000000010151452212273200251720ustar00rootroot00000000000000Eventbrite ------------------ Log in and click your profile name in the top right navigation, then select ``Account Settings``. Choose ``App Management`` near the bottom of the left navigation column. You can then click ``Create A New App`` on the upper left corner. App registration https://www.eventbrite.com/myaccount/apps/ Fill in the form with the following link Development callback URL http://127.0.0.1:8000/accounts/eventbrite/login/callback/ for both the ``Application URL`` and ``OAuth Redirect URI``. django-allauth-0.58.2/docs/socialaccount/providers/eveonline.rst000066400000000000000000000005431452212273200250140ustar00rootroot00000000000000Eve Online ---------- Register your application at ``https://developers.eveonline.com/applications/create``. Note that if you have ``STORE_TOKENS`` enabled (the default), you will need to set up your application to be able to request an OAuth scope. This means you will need to set it as having "CREST Access". The least obtrusive scope is "publicData". django-allauth-0.58.2/docs/socialaccount/providers/evernote.rst000066400000000000000000000004501452212273200246540ustar00rootroot00000000000000Evernote -------- Register your OAuth2 application at ``https://dev.evernote.com/doc/articles/authentication.php``: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'evernote': { 'EVERNOTE_HOSTNAME': 'evernote.com' # defaults to sandbox.evernote.com } } django-allauth-0.58.2/docs/socialaccount/providers/exist.rst000066400000000000000000000020141452212273200241570ustar00rootroot00000000000000Exist ----- Register your OAuth2 app in apps page: https://exist.io/account/apps/ During development set the callback url to: http://localhost:8000/accounts/exist/login/callback/ In production replace localhost with whatever domain you're hosting your app on. If your app is writing to certain attributes you need to specify this during the creation of the app. For a full list of scopes see: https://developer.exist.io/reference/authentication/oauth2/#scopes The following Exist settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'exist': { 'SCOPE': ['mood_read', 'health_read', 'productivity_read'], } } SCOPE: The default scopes are listed above. For reading additional attributes or writing data see https://developer.exist.io/reference/authentication/oauth2/#scopes. For more information: OAuth documentation: https://developer.exist.io/reference/authentication/oauth2 API documentation: https://developer.exist.io/reference/important_values/ django-allauth-0.58.2/docs/socialaccount/providers/facebook.rst000066400000000000000000000122511452212273200246000ustar00rootroot00000000000000Facebook -------- For Facebook both OAuth2 and the Facebook Connect Javascript SDK are supported. You can even mix the two. An advantage of the Javascript SDK may be a more streamlined user experience as you do not leave your site. Furthermore, you do not need to worry about tailoring the login dialog depending on whether or not you are using a mobile device. Yet, relying on Javascript may not be everybody's cup of tea. To initiate a login use: .. code-block:: python {% load socialaccount %} {% providers_media_js %} Facebook Connect The following Facebook settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'facebook': { 'METHOD': 'oauth2', # Set to 'js_sdk' to use the Facebook connect SDK 'SDK_URL': '//connect.facebook.net/{locale}/sdk.js', 'SCOPE': ['email', 'public_profile'], 'AUTH_PARAMS': {'auth_type': 'reauthenticate'}, 'INIT_PARAMS': {'cookie': True}, 'FIELDS': [ 'id', 'first_name', 'last_name', 'middle_name', 'name', 'name_format', 'picture', 'short_name' ], 'EXCHANGE_TOKEN': True, 'LOCALE_FUNC': 'path.to.callable', 'VERIFIED_EMAIL': False, 'VERSION': 'v13.0', 'GRAPH_API_URL': 'https://graph.facebook.com/v13.0', } } METHOD: Either ``js_sdk`` or ``oauth2``. The default is ``oauth2``. SDK_URL: If needed, use ``SDK_URL`` to override the default Facebook JavaScript SDK URL, ``//connect.facebook.net/{locale}/sdk.js``. This may be necessary, for example, when using the `Customer Chat Plugin `_. If the ``SDK_URL`` contains a ``{locale}`` format string named argument, the locale given by the ``LOCALE_FUNC`` will be used to generate the ``SDK_URL``. SCOPE: By default, the ``email`` scope is required depending on whether or not ``SOCIALACCOUNT_QUERY_EMAIL`` is enabled. Apps using permissions beyond ``email`` and ``public_profile`` require review by Facebook. See `Permissions with Facebook Login `_ for more information. AUTH_PARAMS: Use ``AUTH_PARAMS`` to pass along other parameters to the ``FB.login`` JS SDK call. FIELDS: The fields to fetch from the Graph API ``/me/?fields=`` endpoint. For example, you could add the ``'friends'`` field in order to capture the user's friends that have also logged into your app using Facebook (requires ``'user_friends'`` scope). EXCHANGE_TOKEN: The JS SDK returns a short-lived token suitable for client-side use. Set ``EXCHANGE_TOKEN = True`` to make a server-side request to upgrade to a long-lived token before storing in the ``SocialToken`` record. See `Expiration and Extending Tokens `_. LOCALE_FUNC: The locale for the JS SDK is chosen based on the current active language of the request, taking a best guess. This can be customized using the ``LOCALE_FUNC`` setting, which takes either a callable or a path to a callable. This callable must take exactly one argument, the request, and return `a valid Facebook locale `_ as a string, e.g. US English: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'facebook': { 'LOCALE_FUNC': lambda request: 'en_US' } } VERIFIED_EMAIL: It is not clear from the Facebook documentation whether or not the fact that the account is verified implies that the email address is verified as well. For example, verification could also be done by phone or credit card. To be on the safe side, the default is to treat email addresses from Facebook as unverified. But, if you feel that is too paranoid, then use this setting to mark them as verified. Due to lack of an official statement from the side of Facebook, attempts have been made to `reverse engineer the meaning of the verified flag `_. Do know that by setting this to ``True`` you may be introducing a security risk. VERSION: The Facebook Graph API version to use. The default is ``v13.0``. App registration (get your key and secret here) A key and secret key can be obtained by `creating an app `_. After registration you will need to make it available to the public. In order to do that your app first has to be `reviewed by Facebook `_. Development callback URL Leave your App Domains empty and put ``http://localhost:8000`` in the section labeled ``Website with Facebook Login``. Note that you'll need to add your site's actual domain to this section once it goes live. django-allauth-0.58.2/docs/socialaccount/providers/feishu.rst000066400000000000000000000012371452212273200243140ustar00rootroot00000000000000Feishu ------ App Registration https://open.feishu.cn/app Authorized Redirect URI http://127.0.0.1:8000/accounts/feishu/login/callback/ Into the developer background https://open.feishu.cn/app, click on the create self-built application, obtain app_id and app_secret. In the configuration of application security domain name added to redirect URL, such as https://open.feishu.cn/document. Redirect URL is the interface through which the application obtains the user's identity by using the user login pre-authorization code after the user has logged in. If it is not configured or configured incorrectly, the open platform will prompt the request to be illegal. django-allauth-0.58.2/docs/socialaccount/providers/figma.rst000066400000000000000000000003071452212273200241110ustar00rootroot00000000000000Figma ------------------ App registration (get your key and secret here) https://www.figma.com/developers/apps Development callback URL http://localhost:8000/accounts/figma/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/flickr.rst000066400000000000000000000007741452212273200243100ustar00rootroot00000000000000Flickr ------ App registration (get your key and secret here) https://www.flickr.com/services/apps/create/ You can optionally specify the application permissions to use. If no ``perms`` value is set, the Flickr provider will use ``read`` by default. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'flickr': { 'AUTH_PARAMS': { 'perms': 'write', } } } More info: https://www.flickr.com/services/api/auth.oauth.html#authorization django-allauth-0.58.2/docs/socialaccount/providers/frontier.rst000066400000000000000000000026031452212273200246570ustar00rootroot00000000000000Frontier -------- The Frontier provider is OAuth2 based. Client registration ******************* Frontier Developments switched to OAuth2 based authentication in early 2019. Before a developer can use the authentication and CAPI (Companion API) service from Frontier, they must first apply for access. Go to https://user.frontierstore.net/ and apply for access. Once your application is approved for access. Under "Developer Zone", you will see a list of authorized clients granted access. To add access for your client, click on the "Create Client" button and fill out the form and submit the form. After creating the client access, click on "View" to reveal your Client ID and Shared Key. You can also regenerate the key in an event that your shared key is compromised. Configuring Django ****************** The app credentials are configured for your Django installation via the admin interface. Create a new socialapp through ``/admin/socialaccount/socialapp/``. Fill in the form as follows: * Provider, "Frontier" * Name, your pick, suggest "Frontier" * Client id, is called "Client ID" by Frontier * Secret key, is called "Shared Key" by Frontier * Key, is not needed, leave blank. Optionally, you can specify the scope to use as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'frontier': { 'SCOPE': ['auth', 'capi'], 'VERIFIED_EMAIL': True }, } django-allauth-0.58.2/docs/socialaccount/providers/fxa.rst000066400000000000000000000022651452212273200236110ustar00rootroot00000000000000Firefox Accounts ---------------- The Firefox Accounts provider is currently limited to Mozilla relying services but there is the intention, in the future, to allow third-party services to delegate authentication. There is no committed timeline for this. The provider is OAuth2 based. More info: https://developer.mozilla.org/en-US/Firefox_Accounts The following Firefox Accounts settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'fxa': { 'SCOPE': ['profile'], 'OAUTH_ENDPOINT': 'https://oauth.accounts.firefox.com/v1', 'PROFILE_ENDPOINT': 'https://profile.accounts.firefox.com/v1', } } SCOPE: Requested OAuth2 scope. Default is ['profile'], which will work for applications on the Mozilla trusted whitelist. If your application is not on the whitelist, then define SCOPE to be ['profile:email', 'profile:uid']. OAUTH_ENDPOINT: Explicitly set the OAuth2 endpoint. Default is the production endpoint "https://oauth.accounts.firefox.com/v1". PROFILE_ENDPOINT: Explicitly set the profile endpoint. Default is the production endpoint and is "https://profile.accounts.firefox.com/v1". django-allauth-0.58.2/docs/socialaccount/providers/gitea.rst000066400000000000000000000007451452212273200241250ustar00rootroot00000000000000Gitea ----- App registration (get your key and secret here) https://gitea.com/user/settings/applications Development callback URL http://127.0.0.1:8000/accounts/gitea/login/callback/ Self-hosted Support ******************* If you use a self-hosted Gitea instance add your server URL to your Django settings as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'gitea': { 'GITEA_URL': 'https://your.gitea-server.domain', } } django-allauth-0.58.2/docs/socialaccount/providers/github.rst000066400000000000000000000015061452212273200243120ustar00rootroot00000000000000GitHub ------ App registration (get your key and secret here) https://github.com/settings/applications/new Development callback URL http://127.0.0.1:8000/accounts/github/login/callback/ If you want more than just read-only access to public data, specify the scope as follows. See https://developer.github.com/v3/oauth/#scopes for details. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'github': { 'SCOPE': [ 'user', 'repo', 'read:org', ], } } Enterprise Support ****************** If you use GitHub Enterprise add your server URL to your Django settings as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'github': { 'GITHUB_URL': 'https://your.github-server.domain', } } django-allauth-0.58.2/docs/socialaccount/providers/gitlab.rst000066400000000000000000000016011452212273200242660ustar00rootroot00000000000000GitLab ------ The GitLab provider works by default with https://gitlab.com. It allows you to connect to your private GitLab server and use GitLab as an OAuth2 authentication provider as described in GitLab docs at http://doc.gitlab.com/ce/integration/oauth_provider.html The following GitLab settings are available, if unset https://gitlab.com will be used, with a ``read_user`` scope. GITLAB_URL: Override endpoint to request an authorization and access token. For your private GitLab server you use: ``https://your.gitlab.server.tld`` SCOPE: The ``read_user`` scope is required for the login procedure, and is the default. If more access is required, the scope should be set here. Example: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'gitlab': { 'GITLAB_URL': 'https://your.gitlab.server.tld', 'SCOPE': ['api'], }, } django-allauth-0.58.2/docs/socialaccount/providers/globus.rst000066400000000000000000000011451452212273200243220ustar00rootroot00000000000000Globus ------ Registering an application: https://developers.globus.org/ By default, you will have access to the openid, profile, and offline_access scopes. With the offline_access scope, the API will provide you with a refresh token. For additional scopes, see the Globus API docs: https://docs.globus.org/api/auth/reference/ .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'globus': { 'SCOPE': [ 'openid', 'profile', 'email', 'urn:globus:auth:scope:transfer.api.globus.org:all' ] } } django-allauth-0.58.2/docs/socialaccount/providers/google.rst000066400000000000000000000045531452212273200243110ustar00rootroot00000000000000Google ------ The Google provider is OAuth2 based. More info: https://developers.google.com/identity/protocols/OAuth2 App registration **************** Create a google app to obtain a key and secret through the developer console. Google Developer Console https://console.developers.google.com/ After you create a project you will have to create a "Client ID" and fill in some project details for the consent form that will be presented to the client. Under "APIs & auth" go to "Credentials" and create a new Client ID. Probably you will want a "Web application" Client ID. Provide your domain name or test domain name in "Authorized JavaScript origins". Finally fill in ``http://127.0.0.1:8000/accounts/google/login/callback/`` in the "Authorized redirect URI" field. You can fill multiple URLs, one for each test domain. After creating the Client ID you will find all details for the Django configuration on this page. Users that login using the app will be presented a consent form. For this to work additional information is required. Under "APIs & auth" go to "Consent screen" and at least provide an email and product name. Django configuration ******************** The app credentials are configured for your Django installation via the admin interface. Create a new socialapp through ``/admin/socialaccount/socialapp/``. Fill in the form as follows: * Provider, "Google" * Name, your pick, suggest "Google" * Client id, is called "Client ID" by Google * Secret key, is called "Client secret" by Google * Key, is not needed, leave blank. Optionally, you can specify the scope to use as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'google': { 'SCOPE': [ 'profile', 'email', ], 'AUTH_PARAMS': { 'access_type': 'online', }, 'OAUTH_PKCE_ENABLED': True, } } By default (if you do not specify ``SCOPE``), ``profile`` scope is requested, and optionally ``email`` scope depending on whether or not ``SOCIALACCOUNT_QUERY_EMAIL`` is enabled. You must set ``AUTH_PARAMS['access_type']`` to ``offline`` in order to receive a refresh token on first login and on reauthentication requests (which is needed to refresh authentication tokens in the background, without involving the user's browser). When unspecified, Google defaults to ``online``. django-allauth-0.58.2/docs/socialaccount/providers/gumroad.rst000066400000000000000000000003321452212273200244620ustar00rootroot00000000000000Gumroad --------- App registration (get your key and secret here) https://help.gumroad.com/article/280-create-application-api Development callback URL http://localhost:8000/accounts/instagram/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/hubspot.rst000066400000000000000000000004611452212273200245130ustar00rootroot00000000000000Hubspot -------- App registration (get your key and secret here) https://developers.hubspot.com/docs/api/creating-an-app Authentication documentation https://developers.hubspot.com/docs/api/working-with-oauth Development callback URL https://localhost:8000/accounts/hubspot/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/index.rst000066400000000000000000000040711452212273200241370ustar00rootroot00000000000000Providers ========= Introduction ************ Most providers require you to sign up for a so called API client or app, containing a client ID and API secret. You must add a ``SocialApp`` record per provider via the Django admin containing these app credentials. When creating the OAuth app on the side of the provider pay special attention to the callback URL (sometimes also referred to as redirect URL). If you do not configure this correctly, you will receive login failures when attempting to log in, such as:: An error occurred while attempting to login via your social network account. Use a callback URL of the form:: http://example.com/accounts/twitter/login/callback/ http://example.com/accounts/soundcloud/login/callback/ ... For local development, use the following:: http://127.0.0.1:8000/accounts/twitter/login/callback/ Provider Specifics ****************** .. toctree:: :maxdepth: 1 23andme 500px agave amazon_cognito amazon angellist apple auth0 authentiq baidu basecamp battlenet bitbucket box cern cilogon clever dataporten daum digitalocean dingtalk discord doximity draugiem drip dropbox dwolla edmodo edx eventbrite eveonline evernote exist facebook feishu figma flickr frontier fxa gitea github gitlab globus google gumroad hubspot instagram jupyterhub kakao keycloak lemonldap line linkedin mailchimp mediawiki microsoft miro naver netiq nextcloud notion odnoklassniki okta openid_connect openid openstreetmap orcid patreon paypal pinterest pocket questrade quickbooks reddit saml salesforce sharefile shopify slack snapchat soundcloud stackexchange steam stocktwits strava stripe telegram trainingpeaks trello twitch twitter_oauth2 twitter untappd vimeo_oauth2 vimeo wahoo weibo weixin windowslive xing yahoo yandex ynab zoho zoom django-allauth-0.58.2/docs/socialaccount/providers/instagram.rst000066400000000000000000000003241452212273200250120ustar00rootroot00000000000000Instagram --------- App registration (get your key and secret here) https://www.instagram.com/developer/clients/manage/ Development callback URL http://localhost:8000/accounts/instagram/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/jupyterhub.rst000066400000000000000000000006701452212273200252320ustar00rootroot00000000000000JupyterHub ---------- Documentation on configuring a key and secret key https://jupyterhub.readthedocs.io/en/stable/api/services.auth.html Development callback URL http://localhost:800/accounts/jupyterhub/login/callback/ Specify the URL of your JupyterHub server as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'jupyterhub': { 'API_URL': 'https://jupyterhub.example.com', } } django-allauth-0.58.2/docs/socialaccount/providers/kakao.rst000066400000000000000000000002531452212273200241140ustar00rootroot00000000000000Kakao ----- App registration (get your key here) https://developers.kakao.com/apps Development callback URL http://localhost:8000/accounts/kakao/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/keycloak.rst000066400000000000000000000012101452212273200246220ustar00rootroot00000000000000Keycloak -------- Starting since version 0.56.0, the builtin Keycloak provider has been removed in favor of relying on the OpenID Connect provider as is: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { "openid_connect": { "APPS": [ { "provider_id": "keycloak", "name": "Keycloak", "client_id": "", "secret": "", "settings": { "server_url": "http://keycloak:8080/realms/master/.well-known/openid-configuration", }, } ] } } django-allauth-0.58.2/docs/socialaccount/providers/lemonldap.rst000066400000000000000000000011331452212273200247770ustar00rootroot00000000000000LemonLDAP::NG ------------- Create a new OpenID Connect Relying Party with the following settings: * Exported attributes: * ``email`` * ``name`` * ``preferred_username`` * Basic options: * Development Redirect URI: http://localhost:8000/accounts/lemonldap/login/callback/ The following LemonLDAP::NG settings are available. LEMONLDAP_URL: The base URL of your LemonLDAP::NG portal. For example: ``https://auth.example.com`` Example: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'lemonldap': { 'LEMONLDAP_URL': 'https://auth.example.com' } } django-allauth-0.58.2/docs/socialaccount/providers/line.rst000066400000000000000000000012161452212273200237550ustar00rootroot00000000000000Line ---- scope options https://developers.line.biz/en/docs/line-login/integrate-line-login/#scopes App registration, create a Line login channel (get your channel_id and channel_secret here) https://developers.line.biz/console/ Development callback URL http://127.0.0.1:8000/accounts/line/login/callback/ .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'line': { 'APP': { 'client_id': 'LINE_LOGIN_CHANNEL_ID', 'secret': 'LINE_LOGIN_CHANNEL_SECRET' }, "SCOPE": ['profile', 'openid', 'email'] } } django-allauth-0.58.2/docs/socialaccount/providers/linkedin.rst000066400000000000000000000044511452212273200246270ustar00rootroot00000000000000LinkedIn -------- The LinkedIn provider comes in two flavors: OAuth 1.0 (``allauth.socialaccount.providers.linkedin``) and OAuth 2.0 (``allauth.socialaccount.providers.linkedin_oauth2``). You can specify the scope and fields to fetch as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'linkedin': { 'SCOPE': [ 'r_basicprofile', 'r_emailaddress' ], 'PROFILE_FIELDS': [ 'id', 'first-name', 'last-name', 'email-address', 'picture-url', 'public-profile-url', ] } } By default, ``r_emailaddress`` scope is required depending on whether or not ``SOCIALACCOUNT_QUERY_EMAIL`` is enabled. Note: if you are experiencing issues where it seems as if the scope has no effect you may be using an old LinkedIn app that is not scope enabled. Please refer to ``https://developer.linkedin.com/forum/when-will-old-apps-have-scope-parameter-enabled`` for more background information. Furthermore, we have experienced trouble upgrading from OAuth 1.0 to OAuth 2.0 using the same app. Attempting to do so resulted in a weird error message when fetching the access token:: missing required parameters, includes an invalid parameter value, parameter more then once. : Unable to retrieve access token : authorization code not found If you are using tokens originating from the mobile SDK, you will need to specify additional headers: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'linkedin': { 'HEADERS': { 'x-li-src': 'msdk' } } } App registration (get your key and secret here) https://www.linkedin.com/secure/developer?newapp= Authorized Redirect URLs (OAuth2) ********************************* Add any you need (up to 200) consisting of: {``ACCOUNT_DEFAULT_HTTP_PROTOCOL``}://{hostname}{:optional_port}/{allauth_base_url}/linkedin_oauth2/login/callback/ For example when using the built-in django server and default settings: http://localhost:8000/accounts/linkedin_oauth2/login/callback/ Development "Accept" and "Cancel" redirect URL (OAuth 1.0a) *********************************************************** Leave the OAuth1 redirect URLs empty. django-allauth-0.58.2/docs/socialaccount/providers/mailchimp.rst000066400000000000000000000036511452212273200247760ustar00rootroot00000000000000MailChimp (OAuth2) ------------------ MailChimp has a simple API for working with your own data and a `good library`_ already exists for this use. However, to allow other MailChimp users to use an app you develop, the OAuth2 API allows those users to give or revoke access without creating a key themselves. .. _good library: https://pypi.python.org/pypi/mailchimp3 Registering a new app ********************* Instructions for generating your own OAuth2 app can be found at https://developer.mailchimp.com/documentation/mailchimp/guides/how-to-use-oauth2/. It is worth reading that carefully before following the instructions below. Login via https://login.mailchimp.com/, which will redirect you to ``https://usX.admin.mailchimp.com/`` where the prefix ``usX`` (``X`` is an integer) is the subdomain you need to connect to. Click on your username in the top right corner and select *Profile*. On the next page select *Extras* then click API keys, which should lead you to: App registration (where ``X`` is dependent on your account) https://usX.admin.mailchimp.com/account/oauth2/ Fill in the form with the following URL for local development: Development callback URL https://127.0.0.1:8000/accounts/mailchimp/login/callback/ Testing Locally *************** Note the requirement of **https**. If you would like to test OAuth2 authentication locally before deploying a default django project will raise errors because development mode does not support ``https``. One means of circumventing this is to install ``django-extensions``:: pip install django-extensions add it to your ``INSTALLED_APPS`` .. code-block:: python INSTALLED_APPS = ( ... 'django_extensions', ... ) and then run:: ./manage.py runserver_plus --cert cert which should allow you to test locally via https://127.0.0.1:8000. Some browsers may require enabling this on localhost and not support by default and ask for permission. django-allauth-0.58.2/docs/socialaccount/providers/mediawiki.rst000066400000000000000000000013721452212273200247740ustar00rootroot00000000000000MediaWiki --------- MediaWiki OAuth2 documentation: https://www.mediawiki.org/wiki/OAuth/For_Developers The following MediaWiki settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'mediawiki': { 'REST_API': 'https://meta.wikimedia.org/w/rest.php', 'USERPAGE_TEMPLATE': 'https://meta.wikimedia.org/wiki/{username}', } } REST_API: Base URL of the MediaWiki site's REST API. USERPAGE_TEMPLATE: Link template for linking to users. Must have a ``{username}`` format field. With the default settings, Wikimedia user identities (meta.wikimedia.org) will be used. App registration for Wikimedia wikis: https://meta.wikimedia.org/wiki/Special:OAuthConsumerRegistration/propose django-allauth-0.58.2/docs/socialaccount/providers/microsoft.rst000066400000000000000000000024541452212273200250400ustar00rootroot00000000000000Microsoft Graph ----------------- Microsoft Graph API is the gateway to connect to mail, calendar, contacts, documents, directory, devices and more. Apps can be registered (for consumer key and secret) here https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade By default, ``common`` (``organizations`` and ``consumers``) tenancy is configured for the login. To restrict it, change the ``tenant`` setting as shown below. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { "microsoft": { "APPS": [ { "client_id": "", "secret": "", "settings": { "tenant": "organizations", } } ] } } .. note:: When you have configured your application to use single tenant authentication make sure to use the fragment above to set the ``"tenant"`` value to ``"organizations"`` in order to prevent the following error: .. error:: AADSTS50194: Application 'application id' (application name) is not configured as a multi-tenant application. Usage of the /common endpoint is not supported for such applications created after '10/15/2018'. Use a tenant-specific endpoint or configure the application to be multi-tenant. django-allauth-0.58.2/docs/socialaccount/providers/miro.rst000066400000000000000000000003161452212273200237740ustar00rootroot00000000000000Miro ---- Create your app here and acquire Client ID and Client Secret https://miro.com/app/settings/user-profile/apps Development callback URL http://localhost:8000/accounts/miro/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/naver.rst000066400000000000000000000002711452212273200241410ustar00rootroot00000000000000Naver ----- App registration (get your key and secret here) https://developers.naver.com/appinfo Development callback URL http://localhost:8000/accounts/naver/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/netiq.rst000066400000000000000000000006271452212273200241530ustar00rootroot00000000000000NetIQ/Microfocus AccessManager (NAM) ------------------------------------ The following AccessManager settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'netiq': { 'NETIQ_URL': 'https://my.identity.provider.example.org', } } App registration (get your key and secret here) is done by the administrator of your NetIQ/Microfocus AccessManager. django-allauth-0.58.2/docs/socialaccount/providers/nextcloud.rst000066400000000000000000000005111452212273200250300ustar00rootroot00000000000000NextCloud --------- The following NextCloud settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'nextcloud': { 'SERVER': 'https://nextcloud.example.org', } } App registration (get your key and secret here) https://nextcloud.example.org/settings/admin/security django-allauth-0.58.2/docs/socialaccount/providers/notion.rst000066400000000000000000000011311452212273200243300ustar00rootroot00000000000000Notion ------ After creating an integration perform the following steps: 1. Navigate to your integration then Capabilities, User Capabilities, and select 'Read user information including email addresses.' 2. Click 'Distribution' and check 'yes' on 'Do you want to make this integration public?'. 3. In the 'Redirect URL' paste the callback URL below. Notion only allows using 'http' for 'localhost' - do not use 127.0.0.1. App registration (get your key and secret here) https://www.notion.so/my-integrations Development callback URL http://localhost:8000/accounts/notion/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/odnoklassniki.rst000066400000000000000000000003441452212273200256770ustar00rootroot00000000000000Odnoklassniki ------------- App registration (get your key and secret here) http://apiok.ru/wiki/pages/viewpage.action?pageId=42476486 Development callback URL http://example.com/accounts/odnoklassniki/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/okta.rst000066400000000000000000000004021452212273200237600ustar00rootroot00000000000000Okta ----- .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'okta': { 'OKTA_BASE_URL': 'example.okta.com', 'OAUTH_PKCE_ENABLED': True, } } Okta OIDC https://developer.okta.com/docs/reference/api/oidc/ django-allauth-0.58.2/docs/socialaccount/providers/openid.rst000066400000000000000000000050551452212273200243110ustar00rootroot00000000000000OpenID ------ The OpenID provider does not require any settings per se. However, a typical OpenID login page presents the user with a predefined list of OpenID providers and allows the user to input their own OpenID identity URL in case their provider is not listed by default. The list of providers displayed by the builtin templates can be configured as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'openid': { 'SERVERS': [ { 'id': 'yahoo', 'name': 'Yahoo', 'openid_url': 'http://me.yahoo.com', }, { 'id': 'hyves', 'name': 'Hyves', 'openid_url': 'http://hyves.nl', }, { 'id': 'google', 'name': 'Google', 'openid_url': 'https://www.google.com/accounts/o8/id', }, ] } } You can manually specify extra_data you want to request from server as follows:: SOCIALACCOUNT_PROVIDERS = \ { 'openid': { 'SERVERS': [ { 'id': 'mojeid', 'name': 'MojeId', 'openid_url': 'https://mojeid.cz/endpoint/', 'extra_attributes': [ ('phone', ''http://axschema.org/contact/phone/default', False), ('birth_date', 'http://axschema.org/birthDate', False), ] }, ] } } Attributes are in form (id, name, required) where id is key in extra_data field of socialaccount, name is identifier of requested attribute and required specifies whether attribute is required. If you want to manually include login links yourself, you can use the following template tag: .. code-block:: python {% load socialaccount %} Google The OpenID provider can be forced to operate in stateless mode as follows:: SOCIALACCOUNT_PROVIDERS = \ { 'openid': { 'SERVERS': [ { 'id': 'steam', 'name': 'Steam', 'openid_url': 'https://steamcommunity.com/openid', 'stateless': True, }, ] } } django-allauth-0.58.2/docs/socialaccount/providers/openid_connect.rst000066400000000000000000000035331452212273200260210ustar00rootroot00000000000000OpenID Connect -------------- The OpenID Connect provider provides access to multiple independent OpenID Connect (sub)providers. You configure these (sub)providers by adding apps to the configuration of the overall OpenID connect provider. Each app represents a standalone OpenID Connect provider: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { "openid_connect": { "APPS": [ { "provider_id": "my-server", "name": "My Login Server", "client_id": "your.service.id", "secret": "your.service.secret", "settings": { "server_url": "https://my.server.example.com", # Optional token endpoint authentication method. # May be one of "client_secret_basic", "client_secret_post" # If omitted, a method from the the server's # token auth methods list is used "token_auth_method": "client_secret_basic", }, }, { "provider_id": "other-server", "name": "Other Login Server", "client_id": "your.other.service.id", "secret": "your.other.service.secret", "settings": { "server_url": "https://other.server.example.com", }, }, ] } } This configuration example will create two independent provider instances, ``My Login Server`` and ``Other Login Server``. The OpenID Connect callback URL for each configured server is at ``/accounts/{id}/login/callback/`` where ``{id}`` is the configured app's ``provider_id`` value (``my-server`` or ``other-server`` in the above example). django-allauth-0.58.2/docs/socialaccount/providers/openstreetmap.rst000066400000000000000000000004741452212273200257210ustar00rootroot00000000000000OpenStreetMap ------------- Register your client application under `My Settings`/`oauth settings`: https://www.openstreetmap.org/user/{Display Name}/oauth_clients In this page you will get your key and secret For more information: OpenStreetMap OAuth documentation: https://wiki.openstreetmap.org/wiki/OAuth django-allauth-0.58.2/docs/socialaccount/providers/orcid.rst000066400000000000000000000011541452212273200241270ustar00rootroot00000000000000ORCID ----- The ORCID provider should work out of the box provided that you are using the Production ORCID registry and the public API. In other settings, you will need to define the API you are using in your site's settings, as follows: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'orcid': { # Base domain of the API. Default value: 'orcid.org', for the production API 'BASE_DOMAIN':'sandbox.orcid.org', # for the sandbox API # Member API or Public API? Default: False (for the public API) 'MEMBER_API': True, # for the member API } } django-allauth-0.58.2/docs/socialaccount/providers/patreon.rst000066400000000000000000000014101452212273200244720ustar00rootroot00000000000000Patreon ------- The following Patreon settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'patreon': { 'VERSION': 'v1', 'SCOPE': ['pledges-to-me', 'users', 'my-campaign'], } } VERSION: API version. Either ``v1`` or ``v2``. Defaults to ``v1``. SCOPE: Defaults to the scope above if using API v1. If using v2, the scope defaults to ``['identity', 'identity[email]', 'campaigns', 'campaigns.members']``. API documentation: https://www.patreon.com/platform/documentation/clients App registration (get your key and secret for the API here): https://www.patreon.com/portal/registration/register-clients Development callback URL http://127.0.0.1:8000/accounts/patreon/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/paypal.rst000066400000000000000000000013321452212273200243130ustar00rootroot00000000000000Paypal ------ The following Paypal settings are available: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'paypal': { 'SCOPE': ['openid', 'email'], 'MODE': 'live', } } SCOPE: In the Paypal developer site, you must also check the required attributes for your application. For a full list of scope options, see https://developer.paypal.com/docs/integration/direct/identity/attributes/ MODE: Either ``live`` or ``test``. Set to test to use the Paypal sandbox. App registration (get your key and secret here) https://developer.paypal.com/webapps/developer/applications/myapps Development callback URL http://example.com/accounts/paypal/login/callback django-allauth-0.58.2/docs/socialaccount/providers/pinterest.rst000066400000000000000000000017521452212273200250500ustar00rootroot00000000000000Pinterest --------- The Pinterest OAuth2 documentation: # v1 # has been deprecated https://developers.pinterest.com/docs/api/overview/#authentication # v3 # plan to enforce an end of life on June 30, 2023. https://developers.pinterest.com/docs/redoc/#section/User-Authorization # v5 https://developers.pinterest.com/docs/getting-started/authentication/ You can optionally specify additional permissions to use. If no ``SCOPE`` value is set, the Pinterest provider will use reading scope by default. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'pinterest': { 'SCOPE': ['user_accounts:read'], "API_VERSION": "v5", } } SCOPE: For a full list of scope options, see # v1 https://developers.pinterest.com/docs/api/overview/#scopes # v3 https://developers.pinterest.com/docs/redoc/#section/User-Authorization/OAuth-scopes # v5 https://developers.pinterest.com/docs/getting-started/scopes/ django-allauth-0.58.2/docs/socialaccount/providers/pocket.rst000066400000000000000000000001561452212273200243150ustar00rootroot00000000000000Pocket ------------- App registration (get your consumer key here) https://getpocket.com/developer/apps/ django-allauth-0.58.2/docs/socialaccount/providers/questrade.rst000066400000000000000000000005011452212273200250170ustar00rootroot00000000000000Questrade --------- App registration (get your key here, follow "Creating your first personal app") https://www.questrade.com/api/documentation/getting-started https://apphub.questrade.com/UI/UserApps.aspx Development callback URL (HTTPS is required). https://example.com/accounts/questrade/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/quickbooks.rst000066400000000000000000000013251452212273200252010ustar00rootroot00000000000000QuickBooks ---------- App registration (get your key and secret here) https://developers.intuit.com/v2/ui#/app/startcreate Development callback URL http://localhost:8000/accounts/quickbooks/login/callback/ You can specify sandbox mode by adding the following to the SOCIALACCOUNT_PROVIDERS in your settings. You can also add space-delimited scope to utilize the QuickBooks Payments and Payroll API .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'quickbooks': { 'SANDBOX': TRUE, 'SCOPE': [ 'openid', 'com.intuit.quickbooks.accounting com.intuit.quickbooks.payment', 'profile', 'phone', ] } } django-allauth-0.58.2/docs/socialaccount/providers/reddit.rst000066400000000000000000000017121452212273200243020ustar00rootroot00000000000000Reddit ------ App registration (get your key and secret here) https://www.reddit.com/prefs/apps/ Development callback URL http://localhost:8000/accounts/reddit/login/callback/ By default, access to Reddit is temporary. You can specify the ``duration`` auth parameter to make it ``permanent``. You can optionally specify additional permissions to use. If no ``SCOPE`` value is set, the Reddit provider will use ``identity`` by default. In addition, you should override your user agent to comply with Reddit's API rules, and specify something in the format ``:: (by /u/)``. Otherwise, you will risk additional rate limiting in your application. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'reddit': { 'AUTH_PARAMS': {'duration': 'permanent'}, 'SCOPE': ['identity', 'submit'], 'USER_AGENT': 'django:myappid:1.0 (by /u/yourredditname)', } } django-allauth-0.58.2/docs/socialaccount/providers/salesforce.rst000066400000000000000000000014461452212273200251610ustar00rootroot00000000000000Salesforce ---------- The Salesforce provider requires you to set the login VIP as the provider model's 'key' (in addition to client id and secret). Production environments use https://login.salesforce.com/. Sandboxes use https://test.salesforce.com/. HTTPS is required for the callback. Development callback URL https://localhost:8000/accounts/salesforce/login/callback/ Salesforce OAuth2 documentation https://developer.salesforce.com/page/Digging_Deeper_into_OAuth_2.0_on_Force.com To Use: - Include allauth.socialaccount.providers.salesforce in INSTALLED_APPS - In a new Salesforce Developer Org, create a Connected App with OAuth (minimum scope id, openid), and a callback URL - Create a Social application in Django admin, with client id, client key, and login_url (in "key" field) django-allauth-0.58.2/docs/socialaccount/providers/saml.rst000066400000000000000000000124361452212273200237700ustar00rootroot00000000000000SAML ---- SAML 2.0 is supported out of the box. However, the required dependencies are not installed by default. Therefore, you will need to specifcy the ``saml`` extra when installing the package:: $ pip install django-allauth[saml] When you need to support SAML based authentication, often you need to support multiple organizations, each having their own SAML based Identity Provider (IdP). The way this translates to allauth is as follows: - The allauth SAML endpoints all include an organization slug. For example, ``/accounts/saml//login/`` is used to initiate the SAML login flow. - The organization slug is used to lookup the SAML IdP configuration, which is stored in a ``SocialApp``, or, its settings based ``SOCIALACCOUNT_PROVIDERS['saml']['APPS']`` counterpart. - As per the SAML specification, each IdP is identified by an entity ID. Entity IDs typically use a URI based notation, and are therefore not suitable to be used as the organization slug. So, you need to be aware that allauth has two ways of identifying the ``SocialApp`` -- via the SAML entity ID, and, via the organization slug. - For each user signing in via the SAML provider, a ``SocialAccount`` record is created. Here, the combination of ``SocialAccount.provider`` and ``SocialAccount.uid`` is expected to be unique. The ``uid`` identitifer is the SAML account ID which is locally unique within the IdP. Therefore, if you are using multiple IdP's ``SocialAccount.provider`` cannot be set to ``"saml"``. Instead, the IdP entity ID would be a good candidate. - The SAML account attributes can differ per IdP. Therefore, additional configuration is needed to be able to extract relevant account attributes, such as the ``uid`` and ``email``. This is done by setting up an attribute mapping. How all of the above is configured in practice is shown below. Note that here we are using the settings based configuration, but you can setup the ``SocialApp`` via the Django admin as well: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { "saml": { # Here, each app represents the SAML provider configuration of one # organization. "APPS": [ { # Used for display purposes, e.g. over by: {% get_providers %} "name": "Acme Inc", # Accounts signed up via this provider will have their # `SocialAccount.provider` value set to this ID. The combination # of this value and the `uid` must be unique. The IdP entity ID is a # good choice for this. "provider_id": "urn:dev-123.us.auth0.com", # The organization slug is configured by setting the # `client_id` value. In this example, the SAML login URL is: # # /accounts/saml/acme-inc/login/ "client_id": "acme-inc", # The fields above are common `SocialApp` fields. For SAML, # additional configuration is needed, which is placed in # `SocialApp.settings`: "settings": { # Mapping account attributes to upstream (IdP specific) attributes. # If left empty, an attempt will be done to map the attributes using # built-in defaults. "attribute_mapping": { "uid": "http://schemas.auth0.com/clientID", "email_verified": "http://schemas.auth0.com/email_verified", "email": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress", }, # The configuration of the IdP. "idp": { # The entity ID of the IdP is required. "entity_id": "urn:dev-123.us.auth0.com", # Then, you can either specify the IdP's metadata URL: "metadata_url": "https://dev-123.us.auth0.com/samlp/metadata/456", # Or, you can inline the IdP parameters here as follows: "sso_url": "https://dev-123.us.auth0.com/samlp/456", "slo_url": "https://dev-123.us.auth0.com/samlp/456", "x509cert": """ -----BEGIN CERTIFICATE----- MIIDHTCCAgWgAwIBAgIJLogff5x+S0BlMA0GCSqGSIb3DQEBCwUAMCwxKjAoBgNV BAMTIWRldi1uYXAybWY1ZTFwMXR3Z2Rv................................ ................................G7qmyqcXRaf9HAuL/MvWz6zd96Ay6WHM pXk92/DyUV48JxK/Bl7Bj8qjl5w5R7Dwps6wj+69PIAg -----END CERTIFICATE----- """, }, }, }, In your templates, you can construct login URLs using the following template tag:: {% load socialaccount %} {% provider_login_url "" %} The SAML provider has the following endpoints: - ``/accounts/saml//login/``: Initiate a login. - ``/accounts/saml//acs/``: Assertion Consumer Service URL. - ``/accounts/saml//sls/``: Single Logout Service URL. - ``/accounts/saml//metadata/``: Metadata URL. django-allauth-0.58.2/docs/socialaccount/providers/sharefile.rst000066400000000000000000000013101452212273200247630ustar00rootroot00000000000000ShareFile --------- The following ShareFile settings are available. https://api.sharefile.com/rest/ SUBDOMAIN: Subdomain of your organization with ShareFile. This is required. Example: ``test`` for ``https://test.sharefile.com`` APICP: Defaults to ``secure``. Refer to the ShareFile documentation if you need to change this value. DEFAULT_URL: Defaults to ``https://secure.sharefile.com`` Refer to the ShareFile documentation if you need to change this value. Example: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'sharefile': { 'SUBDOMAIN': 'TEST', 'APICP': 'sharefile.com', 'DEFAULT_URL': 'https://secure.sharefile.com', } } django-allauth-0.58.2/docs/socialaccount/providers/shopify.rst000066400000000000000000000026601452212273200245130ustar00rootroot00000000000000Shopify ------- The Shopify provider requires a ``shop`` parameter to login. For example, for a shop ``petstore.myshopify.com``, use this:: /accounts/shopify/login/?shop=petstore You can create login URLs like these as follows: .. code-block:: python {% provider_login_url "shopify" shop="petstore" %} For setting up authentication in your app, use this url as your ``App URL`` (if your server runs at localhost:8000):: http://localhost:8000/accounts/shopify/login/ And set ``Redirection URL`` to:: http://localhost:8000/accounts/shopify/login/callback/ **Embedded Apps** If your Shopify app is embedded you will want to tell allauth to do the required JS (rather than server) redirect.:: SOCIALACCOUNT_PROVIDERS = { 'shopify': { 'IS_EMBEDDED': True, } } Note that there is more an embedded app creator must do in order to have a page work as an iFrame within Shopify (building the x_frame_exempt landing page, handing session expiration, etc...). However that functionality is outside the scope of django-allauth. **Online/per-user access mode** Shopify has two access modes, offline (the default) and online/per-user. Enabling 'online' access will cause all-auth to tie the logged in Shopify user to the all-auth account (rather than the shop as a whole).:: SOCIALACCOUNT_PROVIDERS = { 'shopify': { 'AUTH_PARAMS': {'grant_options[]': 'per-user'}, } } django-allauth-0.58.2/docs/socialaccount/providers/slack.rst000066400000000000000000000003651452212273200241270ustar00rootroot00000000000000Slack ----- App registration (get your key and secret here) https://api.slack.com/apps/new Development callback URL http://example.com/accounts/slack/login/callback/ API documentation https://api.slack.com/docs/sign-in-with-slack django-allauth-0.58.2/docs/socialaccount/providers/snapchat.rst000066400000000000000000000004051452212273200246260ustar00rootroot00000000000000Snapchat -------- App registration (get your key and secret here) https://kit.snapchat.com/manage/ Development callback URL http://example.com/accounts/snap/login/callback/ API documentation https://docs.snap.com/docs/snap-kit/login-kit/overview django-allauth-0.58.2/docs/socialaccount/providers/soundcloud.rst000066400000000000000000000004221452212273200252030ustar00rootroot00000000000000SoundCloud ---------- SoundCloud allows you to choose between OAuth1 and OAuth2. Choose the latter. App registration (get your key and secret here) http://soundcloud.com/you/apps/new Development callback URL http://example.com/accounts/soundcloud/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/stackexchange.rst000066400000000000000000000012001452212273200256270ustar00rootroot00000000000000Stack Exchange -------------- Register your OAuth2 app over at ``http://stackapps.com/apps/oauth/register``. Do not enable "Client Side Flow". For local development you can simply use "localhost" for the OAuth domain. As for all providers, provider specific data is stored in ``SocialAccount.extra_data``. For Stack Exchange we need to choose what data to store there by choosing the Stack Exchange site (e.g. Stack Overflow, or Server Fault). This can be controlled by means of the ``SITE`` setting: .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'stackexchange': { 'SITE': 'stackoverflow', } } django-allauth-0.58.2/docs/socialaccount/providers/steam.rst000066400000000000000000000005521452212273200241410ustar00rootroot00000000000000Steam ----- Steam is an OpenID-compliant provider. However, the `steam` provider allows access to more of the user's details such as username, full name, avatar, etc. You need to register an API key here: https://steamcommunity.com/dev/apikey Copy the Key supplied by the website above into BOTH Client ID and Secret Key fields of the Social Application. django-allauth-0.58.2/docs/socialaccount/providers/stocktwits.rst000066400000000000000000000003661452212273200252510ustar00rootroot00000000000000Stocktwits ---------- App Registration https://api.stocktwits.com/developers/apps/new - Site Domain, Must be an external url (127.0.0.1 and localhost do not work). - Consumer key is your ``client id`` - Consumer secret is your ``secret key`` django-allauth-0.58.2/docs/socialaccount/providers/strava.rst000066400000000000000000000007031452212273200243260ustar00rootroot00000000000000Strava ------ Register your OAuth2 app in api settings page: https://strava.com/settings/api In this page you will get your key and secret Development callback URL (only the domain is required on strava.com/settings/api) http://example.com/accounts/strava/login/callback/ For more information: Strava auth documentation: https://developers.strava.com/docs/authentication/ API documentation: https://developers.strava.com/docs/reference/ django-allauth-0.58.2/docs/socialaccount/providers/stripe.rst000066400000000000000000000013051452212273200243330ustar00rootroot00000000000000Stripe ------ You register your OAUth2 app via the Connect->Settings page of the Stripe dashboard: https://dashboard.stripe.com/account/applications/settings This page will provide you with both a Development and Production `client_id`. You can also register your OAuth2 app callback on the Settings page in the "Website URL" box, e.g.: http://example.com/accounts/stripe/login/callback/ However, the OAuth2 secret key is not on this page. The secret key is the same secret key that you use with the Stripe API generally. This can be found on the Stripe dashboard API page: https://dashboard.stripe.com/account/apikeys See more in documentation https://stripe.com/docs/connect/standalone-accounts django-allauth-0.58.2/docs/socialaccount/providers/telegram.rst000066400000000000000000000013351452212273200246300ustar00rootroot00000000000000Telegram -------- Telegram does not strictly regulate the authorization expiration time, so you may need to set your own expiration time, which can be less than the default value. You can also set this parameter in Social applications settings as json ``{"auth_date_validity": 100}``. The default value of the ``auth_date_validity`` is 30 seconds. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'telegram': { 'APP': { 'client_id': '', 'secret': '', }, 'AUTH_PARAMS': {'auth_date_validity': 30}, } } .. code-block:: python Attention! If your server time is different from the telegram server time, you need NTP. django-allauth-0.58.2/docs/socialaccount/providers/trainingpeaks.rst000066400000000000000000000012041452212273200256620ustar00rootroot00000000000000TrainingPeaks ------------- You need to request an API Partnership to get your OAth credentials: https://api.trainingpeaks.com/request-access Make sure to request scope `athlete:profile` to be able to use OAuth for user login (default if setting `SCOPE` is omitted). In development you should only use the sandbox services, which is the default unless you set `USE_PRODUCTION` to `True`. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'trainingpeaks': { 'SCOPE': ['athlete:profile'], 'USE_PRODUCTION': False, } } API documentation: https://github.com/TrainingPeaks/PartnersAPI/wiki django-allauth-0.58.2/docs/socialaccount/providers/trello.rst000066400000000000000000000010321452212273200243230ustar00rootroot00000000000000Trello ------ Register the application at https://trello.com/app-key You get one application key per account. Save the "Key" to "Client id", the "Secret" to "Secret Key" and "Key" to the "Key" field. Verify which scope you need at https://developers.trello.com/page/authorization Need to change the default scope? Add or update the `trello` setting to `settings.py` .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'trello': { 'AUTH_PARAMS': { 'scope': 'read,write', }, }, } django-allauth-0.58.2/docs/socialaccount/providers/twitch.rst000066400000000000000000000002641452212273200243320ustar00rootroot00000000000000Twitch ------ App registration (get your key and secret here) http://dev.twitch.tv/console Development callback URL http://localhost:8000/accounts/twitch/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/twitter.rst000066400000000000000000000027241452212273200245350ustar00rootroot00000000000000Twitter ------- You will need to create a Twitter app and configure the Twitter provider for your Django application via the admin interface. App registration **************** To register an app on Twitter you will need a Twitter account. With an account, you can create a new app via:: https://apps.twitter.com/app/new In the app creation form fill in the development callback URL:: http://127.0.0.1:8000/accounts/twitter/login/callback/ Twitter won't allow using http://localhost:8000. For production use a callback URL such as:: http://{{yourdomain}}.com/accounts/twitter/login/callback/ To allow users to login without authorizing each session, select "Allow this application to be used to Sign in with Twitter" under the application's "Settings" tab. App database configuration through admin **************************************** The second part of setting up the Twitter provider requires you to configure your Django application. Configuration is done by creating a Socialapp object in the admin. Add a social app on the admin page:: /admin/socialaccount/socialapp/ Use the twitter keys tab of your application to fill in the form. It's located:: https://apps.twitter.com/app/{{yourappid}}/keys The configuration is as follows: * Provider, "Twitter" * Name, your pick, suggest "Twitter" * Client id, is called "Consumer Key (API Key)" on Twitter * Secret key, is called "Consumer Secret (API Secret)" on Twitter * Key, is not needed, leave blank django-allauth-0.58.2/docs/socialaccount/providers/twitter_oauth2.rst000066400000000000000000000025301452212273200260120ustar00rootroot00000000000000Twitter OAuth2 -------------- You will need to create a Twitter app with OAuth 2.0 enabled and configure the Twitter provider for your Django application via the admin interface. App registration **************** To register an app on Twitter you will need a Twitter account. With an account, you can create a new app via:: https://developer.twitter.com/en/portal/dashboard In the app creation form fill in the development callback URL:: http://127.0.0.1:8000/accounts/twitter_oauth2/login/callback/ For production use a callback URL such as:: http://{{yourdomain}}.com/accounts/twitter_oauth2/login/callback/ App database configuration through admin **************************************** The second part of setting up the Twitter provider requires you to configure your Django application. Configuration is done by creating a SocialApp object in the admin. Add a social app on the admin page:: /admin/socialaccount/socialapp/ Use the twitter keys tab of your application to fill in the form. It's located:: https://developer.twitter.com/en/portal/projects/{project-id}/apps/{app-id}/keys The configuration is as follows: * Provider, "Twitter" * Name, your pick, suggest "Twitter" * Client id, is called "OAuth2.0 Client ID" on Twitter * Secret key, is called "OAuth2.0 Client Secret" on Twitter * Key, is not needed, leave blank django-allauth-0.58.2/docs/socialaccount/providers/untappd.rst000066400000000000000000000020001452212273200244710ustar00rootroot00000000000000Untappd ------- App registration **************** https://untappd.com/api/register?register=new In the app creation form fill in the development callback URL, e.g.:: http://127.0.0.1:8000/accounts/untappd/login/callback/ For production, make it your production host, e.g.:: http://yoursite.com/accounts/untappd/login/callback/ SocialApp configuration *********************** The configuration values come from your API dashboard on Untappd: https://untappd.com/api/dashboard * Provider: "Untappd" * Name: "Untappd" * Client id: "Client ID" from Untappd * Secret key: "Client Secret" from Untappd * Sites: choose your site In addition, you should override your user agent to comply with Untappd's API rules, and specify something in the format ``::``. Otherwise, you will risk additional rate limiting in your application. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'untappd': { 'USER_AGENT': 'django:myappid:1.0', } } django-allauth-0.58.2/docs/socialaccount/providers/vimeo.rst000066400000000000000000000002301452212273200241400ustar00rootroot00000000000000Vimeo ----- App registration (get your key and secret here) https://developer.vimeo.com/apps Development callback URL http://localhost:8000/a django-allauth-0.58.2/docs/socialaccount/providers/vimeo_oauth2.rst000066400000000000000000000005171452212273200254320ustar00rootroot00000000000000Vimeo (OAuth 2) --------------- App registration (get your key and secret here) https://developer.vimeo.com/apps Development callback URL http://localhost:8000/accounts/vimeo_oauth2/login/callback/ VK -- App registration https://vk.com/editapp?act=create Development callback URL ("Site address") http://localhost django-allauth-0.58.2/docs/socialaccount/providers/wahoo.rst000066400000000000000000000013061452212273200241430ustar00rootroot00000000000000Wahoo ----- Register your OAuth2 app here: https://developers.wahooligan.com/applications/new The API documentation can be found here: https://cloud-api.wahooligan.com/#introduction .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'wahoo': { 'SCOPE': ['user_read'], } } SCOPE: The default scope is ``user_read`` which allows you to read profile data. If ``SOCIALACCOUNT_QUERY_EMAIL`` is set to True the ``email`` scope is also requested. In order to read or write workout history data you must request additional scopes. The available scopes are: ``user_read``, ``user_write``, ``workouts_read``, ``workouts_write``, ``offline_data``. django-allauth-0.58.2/docs/socialaccount/providers/weibo.rst000066400000000000000000000005211452212273200241310ustar00rootroot00000000000000Weibo ----- Register your OAuth2 app over at ``http://open.weibo.com/apps``. Unfortunately, Weibo does not allow for specifying a port number in the authorization callback URL. So for development purposes you have to use a callback url of the form ``http://127.0.0.1/accounts/weibo/login/callback/`` and run ``runserver 127.0.0.1:80``. django-allauth-0.58.2/docs/socialaccount/providers/weixin.rst000066400000000000000000000017311452212273200243330ustar00rootroot00000000000000Weixin ------ The Weixin OAuth2 documentation: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN Weixin supports two kinds of oauth2 authorization, one for open platform and one for media platform, AUTHORIZE_URL is the only difference between them, you can specify ``AUTHORIZE_URL`` in setting, If no ``AUTHORIZE_URL`` value is set will support open platform by default, which value is ``https://open.weixin.qq.com/connect/qrconnect``. You can optionally specify additional scope to use. If no ``SCOPE`` value is set, will use ``snsapi_login`` by default(for Open Platform Account, need registration). Other ``SCOPE`` options are: snsapi_base, snsapi_userinfo. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'weixin': { 'AUTHORIZE_URL': 'https://open.weixin.qq.com/connect/oauth2/authorize', # for media platform 'SCOPE': ['snsapi_base'], } } django-allauth-0.58.2/docs/socialaccount/providers/windowslive.rst000066400000000000000000000010201452212273200253710ustar00rootroot00000000000000Windows Live ------------ The Windows Live provider currently does not use any settings in ``SOCIALACCOUNT_PROVIDERS``. App registration (get your key and secret here) https://apps.dev.microsoft.com/#/appList Development callback URL http://localhost:8000/accounts/windowslive/login/callback/ Microsoft calls the "client_id" an "Application Id" and it is a UUID. Also, the "client_secret" is not created by default, you must edit the application after it is created, then click "Generate New Password" to create it. django-allauth-0.58.2/docs/socialaccount/providers/xing.rst000066400000000000000000000002251452212273200237720ustar00rootroot00000000000000Xing ---- App registration (get your key and secret here) https://dev.xing.com/applications Development callback URL http://localhost:8000 django-allauth-0.58.2/docs/socialaccount/providers/yahoo.rst000066400000000000000000000007371452212273200241540ustar00rootroot00000000000000Yahoo ----- Register your OAuth2 app below and enter the resultant client id and secret into admin https://developer.yahoo.com/apps/create/ The Redirect URL requires secure URLs, please see the section on HTTPS about how this is handled. When you register the app within yahoo, ensure you select the following API Permissions - OpenID Connect Permissions - Email - Profile When copying the supplied Client ID and Client Secret, do not include the 4 starting spaces. django-allauth-0.58.2/docs/socialaccount/providers/yandex.rst000066400000000000000000000006771452212273200243300ustar00rootroot00000000000000Yandex ------ App registration (get key and secret here) https://oauth.yandex.com/client/new Development callback URL https://oauth.yandex.com/verification_code Yandex OAuth app has many different access rights for its services. For the basic access level, you just need to a choose "Yandex.Passport API" section and check "Access to email address" and "Access to username, first name and surname, gender". Everything else is optional. django-allauth-0.58.2/docs/socialaccount/providers/ynab.rst000066400000000000000000000007661452212273200237700ustar00rootroot00000000000000YNAB ------ App Registration https://app.youneedabudget.com/settings/developer Development callback URL http://127.0.0.1:8000/accounts/ynab/login/callback/ Default SCOPE permissions are 'read-only'. If this is the desired functionality, do not add SCOPE entry with ynab app in SOCIALACCOUNT_PROVIDERS. Otherwise, adding SCOPE and an empty string will give you read / write. .. code-block:: python SOCIALACCOUNT_PROVIDERS = { 'ynab': { 'SCOPE': '' } } django-allauth-0.58.2/docs/socialaccount/providers/zoho.rst000066400000000000000000000002651452212273200240100ustar00rootroot00000000000000Zoho ---- App Registration https://api-console.zoho.com/add Select "Server-base Applications" Authorized Redirect URI http://127.0.0.1:8000/accounts/zoho/login/callback/ django-allauth-0.58.2/docs/socialaccount/providers/zoom.rst000066400000000000000000000003141452212273200240100ustar00rootroot00000000000000Zoom ---- App Registration https://marketplace.zoom.us/develop/create Development callback URL http://127.0.0.1:8000/accounts/zoom/login/callback/ Select scope user:read during app registration. django-allauth-0.58.2/docs/socialaccount/signals.rst000066400000000000000000000023471452212273200224570ustar00rootroot00000000000000Signals ======= There are several signals emitted during authentication flows. You can hook to them for your own needs. - ``allauth.socialaccount.signals.pre_social_login(request, sociallogin)`` Sent after a user successfully authenticates via a social provider, but before the login is fully processed. This signal is emitted as part of the social login and/or signup process, as well as when connecting additional social accounts to an existing account. Access tokens and profile information, if applicable for the provider, is provided. - ``allauth.socialaccount.signals.social_account_added(request, sociallogin)`` Sent after a user connects a social account to their local account. - ``allauth.socialaccount.signals.social_account_updated(request, sociallogin)`` Sent after a social account has been updated. This happens when a user logs in using an already connected social account, or completes a `connect` flow for an already connected social account. Useful if you need to unpack extra data for social accounts as they are updated. - ``allauth.socialaccount.signals.social_account_removed(request, socialaccount)`` Sent after a user disconnects a social account from their local account. django-allauth-0.58.2/docs/socialaccount/templates.rst000066400000000000000000000033211452212273200230060ustar00rootroot00000000000000Template Tags ============= Use the ``provider_login_url`` tag to generate provider specific login URLs:: {% load socialaccount %} Google Twitter Here, you can pass along an optional ``process`` parameter that indicates how to process the social login. You can choose between ``login`` and ``connect``:: Connect a Twitter account Furthermore, you can pass along an ``action`` parameter with value ``reauthenticate`` to indicate that you want the user to be re-prompted for authentication even if they already signed in before. For now, this is supported by Facebook, Google and Twitter only. For Javascript based logins (e.g. when you enable the Facebook JS SDK), you will need to make sure that the required Javascript is loaded. The following tag loads all scripts for the enabled providers:: {% providers_media_js %} For easy access to the social accounts for a user use:: {% get_social_accounts user as accounts %} Then:: {{accounts.twitter}} -- a list of connected Twitter accounts {{accounts.twitter.0}} -- the first Twitter account {% if accounts %} -- if there is at least one social account Finally, social authentication providers configured for the current site can be retrieved via:: {% get_providers as socialaccount_providers %} Which will populate the ``socialaccount_providers`` variable in the template context with a list of configured social authentication providers. This supersedes the context processor used in version 0.21 and below. django-allauth-0.58.2/docs/socialaccount/views.rst000066400000000000000000000004651452212273200221530ustar00rootroot00000000000000Views ===== Social Connections ------------------ *URL name*: ``socialaccount_connections`` The ``allauth.socialaccount.views.ConnectionsView`` view over at ``/accounts/social/connections/`` (URL name ``socialaccount_connections``) allows users to manage the social accounts tied to their local account. django-allauth-0.58.2/example/000077500000000000000000000000001452212273200161335ustar00rootroot00000000000000django-allauth-0.58.2/example/README.rst000066400000000000000000000015041452212273200176220ustar00rootroot00000000000000=============================== Running the example application =============================== Assuming you use virtualenv, follow these steps to download and run the django-allauth example application in this directory: :: $ git clone git://github.com/pennersr/django-allauth.git $ cd django-allauth/example $ virtualenv venv $ . venv/bin/activate $ pip install .. Now we need to create the database tables and an admin user. Run the following and when prompted to create a superuser choose yes and follow the instructions: :: $ python manage.py migrate $ python manage.py createsuperuser Now you need to run the Django development server: :: $ python manage.py runserver You should then be able to open your browser on http://127.0.0.1:8000 and see a page with links to sign in or sign up. django-allauth-0.58.2/example/example/000077500000000000000000000000001452212273200175665ustar00rootroot00000000000000django-allauth-0.58.2/example/example/__init__.py000066400000000000000000000000001452212273200216650ustar00rootroot00000000000000django-allauth-0.58.2/example/example/demo/000077500000000000000000000000001452212273200205125ustar00rootroot00000000000000django-allauth-0.58.2/example/example/demo/__init__.py000066400000000000000000000000001452212273200226110ustar00rootroot00000000000000django-allauth-0.58.2/example/example/demo/apps.py000066400000000000000000000003451452212273200220310ustar00rootroot00000000000000from django.apps import AppConfig from django.utils.translation import gettext_lazy as _ class DemoConfig(AppConfig): name = "example.demo" verbose_name = _("Demo") default_auto_field = "django.db.models.AutoField" django-allauth-0.58.2/example/example/demo/models.py000066400000000000000000000000001452212273200223350ustar00rootroot00000000000000django-allauth-0.58.2/example/example/demo/tests.py000066400000000000000000000005771452212273200222370ustar00rootroot00000000000000""" This file demonstrates writing tests using the unittest module. These will pass when you run "manage.py test". Replace this with more appropriate tests for your application. """ from django.test import TestCase class SimpleTest(TestCase): def test_basic_addition(self): """ Tests that 1 + 1 always equals 2. """ self.assertEqual(1 + 1, 2) django-allauth-0.58.2/example/example/demo/views.py000066400000000000000000000000321452212273200222140ustar00rootroot00000000000000# Create your views here. django-allauth-0.58.2/example/example/local_settings.example000066400000000000000000000067421452212273200241660ustar00rootroot00000000000000# django-allauth Configuration variables you might like to change. # # DO NOT CHANGE THIS FILE. Instead, copy it to local_settings.py # and make your changes there. # Specifies the login method to use -- whether the user logs in by entering # their username, e-mail address, or either one of both. Possible values # are 'username' | 'email' | 'username_email' # ACCOUNT_AUTHENTICATION_METHOD # The URL to redirect to after a successful e-mail confirmation, in case no # user is logged in. Default value is settings.LOGIN_URL. # ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL # The URL to redirect to after a successful e-mail confirmation, in case of # an authenticated user. Default is settings.LOGIN_REDIRECT_URL # ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL # Determines the expiration date of email confirmation mails (# of days). # ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 3 # The user is required to hand over an e-mail address when signing up. # ACCOUNT_EMAIL_REQUIRED = False # Determines the e-mail verification method during signup. When set to # "mandatory" the user is blocked from logging in until the email # address is verified. Choose "optional" or "none" to allow logins # with an unverified e-mail address. In case of "optional", the e-mail # verification mail is still sent, whereas in case of "none" no e-mail # verification mails are sent. # ACCOUNT_EMAIL_VERIFICATION = "optional" # Subject-line prefix to use for email messages sent. By default, the name # of the current Site (django.contrib.sites) is used. # ACCOUNT_EMAIL_SUBJECT_PREFIX = '[Site] ' # A string pointing to a custom form class # (e.g. 'myapp.forms.SignupForm') that is used during signup to ask # the user for additional input (e.g. newsletter signup, birth # date). This class should implement a `def signup(self, request, user)` # method, where user represents the newly signed up user. # ACCOUNT_SIGNUP_FORM_CLASS = None # When signing up, let the user type in their password twice to avoid typ-o's. # ACCOUNT_SIGNUP_PASSWORD_VERIFICATION = True # Enforce uniqueness of e-mail addresses. # ACCOUNT_UNIQUE_EMAIL = True # A callable (or string of the form 'some.module.callable_name') that takes # a user as its only argument and returns the display name of the user. The # default implementation returns user.username. # ACCOUNT_USER_DISPLAY # An integer specifying the minimum allowed length of a username. # ACCOUNT_USERNAME_MIN_LENGTH = 1 # The user is required to enter a username when signing up. Note that the # user will be asked to do so even if ACCOUNT_AUTHENTICATION_METHOD is set # to email. Set to False when you do not wish to prompt the user to enter a # username. # ACCOUNT_USERNAME_REQUIRED = True # render_value parameter as passed to PasswordInput fields. # ACCOUNT_PASSWORD_INPUT_RENDER_VALUE = False # Request e-mail address from 3rd party account provider? E.g. using OpenID # AX, or the Facebook 'email' permission. # SOCIALACCOUNT_QUERY_EMAIL = ACCOUNT_EMAIL_REQUIRED # Attempt to bypass the signup form by using fields (e.g. username, email) # retrieved from the social account provider. If a conflict arises due to a # duplicate e-mail address the signup form will still kick in. # SOCIALACCOUNT_AUTO_SIGNUP = True # Enable support for django-avatar. When enabled, the profile image of the # user is copied locally into django-avatar at signup. Default is # 'avatar' in settings.INSTALLED_APPS. # SOCIALACCOUNT_AVATAR_SUPPORT # Dictionary containing provider specific settings. # SOCIALACCOUNT_PROVIDERS django-allauth-0.58.2/example/example/settings.py000066400000000000000000000141101452212273200217750ustar00rootroot00000000000000# Django settings for example project. import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent DEBUG = True ADMINS = ( # ('Your Name', 'your_email@example.com'), ) MANAGERS = ADMINS EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", # Add 'postgresql_psycopg2', 'postgresql', # 'mysql', 'sqlite3' or 'oracle'. "NAME": os.path.join( BASE_DIR / "example" / "example.db" ), # Or path to database file if using sqlite3. "USER": "", # Not used with sqlite3. "PASSWORD": "", # Not used with sqlite3. "HOST": "", # Set to empty string for localhost. Not used with sqlite3. "PORT": "", # Set to empty string for default. Not used with sqlite3. } } # Local time zone for this installation. Choices can be found here: # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name # although not all choices may be available on all operating systems. # On Unix systems, a value of None will cause Django to use the same # timezone as the operating system. # If running in a Windows environment this must be set to the same as your # system time zone. TIME_ZONE = "America/Chicago" # Language code for this installation. All choices can be found here: # http://www.i18nguy.com/unicode/language-identifiers.html LANGUAGE_CODE = "en-us" SITE_ID = 1 # If you set this to False, Django will make some optimizations so as not # to load the internationalization machinery. USE_I18N = True # If you set this to False, Django will not format dates, numbers and # calendars according to the current locale USE_L10N = True # Absolute filesystem path to the directory that will hold user-uploaded files. # Example: "/home/media/media.lawrence.com/media/" MEDIA_ROOT = "" # URL that handles the media served from MEDIA_ROOT. Make sure to use a # trailing slash. # Examples: "http://media.lawrence.com/media/", "http://example.com/media/" MEDIA_URL = "" # Absolute path to the directory static files should be collected to. # Don't put anything in this directory yourself; store your static files # in apps' "static/" subdirectories and in STATICFILES_DIRS. # Example: "/home/media/media.lawrence.com/static/" STATIC_ROOT = "" # URL prefix for static files. # Example: "http://media.lawrence.com/static/" STATIC_URL = "/static/" # Additional locations of static files STATICFILES_DIRS = ( # Put strings here, like "/home/html/static" or "C:/www/django/static". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. ) # List of finder classes that know how to find static files in # various locations. STATICFILES_FINDERS = ( "django.contrib.staticfiles.finders.FileSystemFinder", "django.contrib.staticfiles.finders.AppDirectoriesFinder", # 'django.contrib.staticfiles.finders.DefaultStorageFinder', ) # Make this unique, and don't share it with anybody. SECRET_KEY = "t8_)kj3v!au0!_i56#gre**mkg0&z1df%3bw(#5^#^5e_64!$_" # List of callables that know how to import templates from various sources. TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [ BASE_DIR / "example" / "templates", ], "APP_DIRS": True, "OPTIONS": { "context_processors": [ "django.template.context_processors.debug", "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ], }, }, ] MIDDLEWARE = ( "django.middleware.common.CommonMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "allauth.account.middleware.AccountMiddleware", ) AUTHENTICATION_BACKENDS = ("allauth.account.auth_backends.AuthenticationBackend",) ROOT_URLCONF = "example.urls" INSTALLED_APPS = ( "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.sites", "django.contrib.messages", "django.contrib.staticfiles", "django.contrib.admin", "allauth", "allauth.account", "allauth.socialaccount", "allauth.mfa", "allauth.socialaccount.providers.dropbox", "allauth.socialaccount.providers.dingtalk", "allauth.socialaccount.providers.facebook", "allauth.socialaccount.providers.edx", "allauth.socialaccount.providers.evernote", "allauth.socialaccount.providers.google", "allauth.socialaccount.providers.github", "allauth.socialaccount.providers.linkedin", "allauth.socialaccount.providers.mediawiki", "allauth.socialaccount.providers.openid", "allauth.socialaccount.providers.openid_connect", "allauth.socialaccount.providers.pinterest", "allauth.socialaccount.providers.pocket", "allauth.socialaccount.providers.reddit", "allauth.socialaccount.providers.saml", "allauth.socialaccount.providers.shopify", "allauth.socialaccount.providers.slack", "allauth.socialaccount.providers.snapchat", "allauth.socialaccount.providers.soundcloud", "allauth.socialaccount.providers.stackexchange", "allauth.socialaccount.providers.telegram", "allauth.socialaccount.providers.twitch", "allauth.socialaccount.providers.twitter", "allauth.socialaccount.providers.twitter_oauth2", "allauth.socialaccount.providers.vimeo", "allauth.socialaccount.providers.vimeo_oauth2", "allauth.socialaccount.providers.weibo", "allauth.socialaccount.providers.xing", "example.demo", ) AUTH_PASSWORD_VALIDATORS = [ { "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", "OPTIONS": { "min_length": 9, }, } ] ALLOWED_HOSTS = ["127.0.0.1", "localhost"] SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") try: from .local_settings import * # noqa except ImportError: pass django-allauth-0.58.2/example/example/templates/000077500000000000000000000000001452212273200215645ustar00rootroot00000000000000django-allauth-0.58.2/example/example/templates/429.html000066400000000000000000000004451452212273200227730ustar00rootroot00000000000000{% extends "allauth/layouts/entrance.html" %} {% load allauth %} {% block head_title %} Too Many Requests {% endblock head_title %} {% block content %} {% element h1 %} Too Many Requests {% endelement %}

    You are sending too many requests.

    {% endblock content %} django-allauth-0.58.2/example/example/templates/account/000077500000000000000000000000001452212273200232205ustar00rootroot00000000000000django-allauth-0.58.2/example/example/templates/account/base_manage_email.html000066400000000000000000000001561452212273200275010ustar00rootroot00000000000000{% extends "allauth/layouts/manage.html" %} {% block nav_class_email %}{{ block.super }} active{% endblock %} django-allauth-0.58.2/example/example/templates/account/base_manage_password.html000066400000000000000000000001611452212273200302500ustar00rootroot00000000000000{% extends "allauth/layouts/manage.html" %} {% block nav_class_password %}{{ block.super }} active{% endblock %} django-allauth-0.58.2/example/example/templates/allauth/000077500000000000000000000000001452212273200232165ustar00rootroot00000000000000django-allauth-0.58.2/example/example/templates/allauth/elements/000077500000000000000000000000001452212273200250325ustar00rootroot00000000000000django-allauth-0.58.2/example/example/templates/allauth/elements/alert.html000066400000000000000000000001731452212273200270300ustar00rootroot00000000000000{% load i18n %} {% load allauth %}
    {% slot message %} {% endslot %}
    django-allauth-0.58.2/example/example/templates/allauth/elements/badge.html000066400000000000000000000005341452212273200267640ustar00rootroot00000000000000{% load allauth %} {% setvar variant %} {% if "warning" in attrs.tags %} warning {% elif "danger" in attrs.tags %} danger {% elif "success" in attrs.tags %} success {% else %} primary {% endif %} {% endsetvar %} {% slot %} {% endslot %} django-allauth-0.58.2/example/example/templates/allauth/elements/button.html000066400000000000000000000025661452212273200272440ustar00rootroot00000000000000{% load allauth %} {% comment %} djlint:off {% endcomment %} <{% if attrs.href %}a href="{{ attrs.href }}"{% else %}button{% endif %} {% if attrs.name %}name="{{ attrs.name }}"{% endif %} {% if attrs.type %}type="{{ attrs.type }}"{% endif %} {% if attrs.id %}id="{{ attrs.id }}"{% endif %} class="{% block class %} btn {% if "prominent" in attrs.tags %}btn-lg {% elif "minor" in attrs.tags %}btn-sm{% endif %} {% if "danger" in attrs.tags %}btn-danger {% elif "secondary" in attrs.tags %}btn-secondary {% elif "warning" in attrs.tags %}btn-warning {% else %}btn-primary {% endif %} {% endblock %}"> {% if "tool" in attrs.tags %} {% if "delete" in attrs.tags %} {% endif %} {% endif %} {% if not "tool" in attrs.tags %} {% slot %} {% endslot %} {% endif %} django-allauth-0.58.2/example/example/templates/allauth/elements/button__entrance.html000066400000000000000000000001441452212273200312500ustar00rootroot00000000000000{% extends "allauth/elements/button.html" %} {% block class %}{{ block.super }} w-100{% endblock %} django-allauth-0.58.2/example/example/templates/allauth/elements/field.html000066400000000000000000000057171452212273200270150ustar00rootroot00000000000000{% load allauth %} {% if attrs.type == "checkbox" or attrs.type == "radio" %}
    {% elif attrs.type == "textarea" %}
    {% elif attrs.type == "hidden" %} {% else %}
    {% if not attrs.unlabeled %} {% endif %} {% if attrs.unlabeled %} {% endif %} {% if slots.help_text %}
    {% slot help_text %} {% endslot %}
    {% endif %} {% if attrs.errors %} {% for error in attrs.errors %}
    {{ error }}
    {% endfor %} {% endif %}
    {% endif %} django-allauth-0.58.2/example/example/templates/allauth/elements/fields.html000066400000000000000000000011331452212273200271640ustar00rootroot00000000000000{% load allauth %} {% for bound_field in attrs.form %} {% element field unlabeled=attrs.unlabeled name=bound_field.name type=bound_field.field.widget.input_type required=bound_field.field.required value=bound_field.value id=bound_field.auto_id errors=bound_field.errors placeholder=bound_field.field.widget.attrs.placeholder autocomplete=bound_field.field.widget.attrs.autocomplete %} {% slot label %} {{ bound_field.label }} {% endslot %} {% slot help_text %} {{ bound_field.field.help_text }} {% endslot %} {% endelement %} {% endfor %} django-allauth-0.58.2/example/example/templates/allauth/elements/form.html000066400000000000000000000012411452212273200266610ustar00rootroot00000000000000{% load allauth %} {% for err in attrs.form.non_field_errors %}
    {{ err }}
    {% endfor %}
    {% if not attrs.no_visible_fields %}
    {% endif %} {% slot body %} {% endslot %} {% if not attrs.no_visible_fields %}
    {% endif %} {% if not attrs.no_visible_fields %}{% endif %}
    django-allauth-0.58.2/example/example/templates/allauth/elements/form__entrance.html000066400000000000000000000001201452212273200306720ustar00rootroot00000000000000{% extends "allauth/elements/form.html" %} {% block form_class %}{% endblock %} django-allauth-0.58.2/example/example/templates/allauth/elements/h1.html000066400000000000000000000001241452212273200262250ustar00rootroot00000000000000{% load allauth %}

    {% slot default %} {% endslot %}

    django-allauth-0.58.2/example/example/templates/allauth/elements/h1__entrance.html000066400000000000000000000001341452212273200302440ustar00rootroot00000000000000{% load allauth %}

    {% slot default %} {% endslot %}

    django-allauth-0.58.2/example/example/templates/allauth/elements/h2__entrance.html000066400000000000000000000001341452212273200302450ustar00rootroot00000000000000{% load allauth %}

    {% slot default %} {% endslot %}

    django-allauth-0.58.2/example/example/templates/allauth/elements/img.html000066400000000000000000000002301452212273200264670ustar00rootroot00000000000000
    django-allauth-0.58.2/example/example/templates/allauth/elements/panel.html000066400000000000000000000006011452212273200270140ustar00rootroot00000000000000{% load allauth %}
    {% slot title %} {% endslot %}
    {% slot body %} {% endslot %}
    {% if slots.actions %} {% endif %}
    django-allauth-0.58.2/example/example/templates/allauth/elements/provider.html000066400000000000000000000002621452212273200275520ustar00rootroot00000000000000{% load allauth %} {{ attrs.name }} django-allauth-0.58.2/example/example/templates/allauth/elements/provider_list.html000066400000000000000000000001341452212273200306030ustar00rootroot00000000000000{% load allauth %}
    {% slot default %} {% endslot %}
    django-allauth-0.58.2/example/example/templates/allauth/layouts/000077500000000000000000000000001452212273200247165ustar00rootroot00000000000000django-allauth-0.58.2/example/example/templates/allauth/layouts/base.html000066400000000000000000000062341452212273200265230ustar00rootroot00000000000000 {% block head_title %}{% endblock %}
    {% block body %} {% block content %} {% endblock content %} {% endblock body %} {% block extra_body %} {% endblock extra_body %} django-allauth-0.58.2/example/example/templates/allauth/layouts/entrance.html000066400000000000000000000014541452212273200274070ustar00rootroot00000000000000{% extends "allauth/layouts/base.html" %} {% load i18n %} {% block body %}
    {% if messages %} {% for message in messages %}
    {{ message }}
    {% endfor %} {% endif %}
    {% block content %}{% endblock %}
    {% endblock %} django-allauth-0.58.2/example/example/templates/allauth/layouts/manage.html000066400000000000000000000031201452212273200270300ustar00rootroot00000000000000{% extends "allauth/layouts/base.html" %} {% block body %}
    {% if messages %}
    {% for message in messages %}
    {{ message }}
    {% endfor %}
    {% endif %} {% block content %}{% endblock %}
    {% endblock %} django-allauth-0.58.2/example/example/templates/index.html000066400000000000000000000003501452212273200235570ustar00rootroot00000000000000{% extends "allauth/layouts/entrance.html" %} {% load allauth %} {% block content %} {% element h1 %} Example Project {% endelement %}

    Welcome to the django-allauth example project.

    {% endblock content %} django-allauth-0.58.2/example/example/templates/mfa/000077500000000000000000000000001452212273200223275ustar00rootroot00000000000000django-allauth-0.58.2/example/example/templates/mfa/base_manage.html000066400000000000000000000001541452212273200254370ustar00rootroot00000000000000{% extends "allauth/layouts/manage.html" %} {% block nav_class_mfa %}{{ block.super }} active{% endblock %} django-allauth-0.58.2/example/example/templates/profile.html000066400000000000000000000002741452212273200241150ustar00rootroot00000000000000{% extends "allauth/layouts/manage.html" %} {% load allauth %} {% block content %} {% element h1 %} Profile {% endelement %}

    Your profile

    {% endblock content %} django-allauth-0.58.2/example/example/templates/socialaccount/000077500000000000000000000000001452212273200244135ustar00rootroot00000000000000django-allauth-0.58.2/example/example/templates/socialaccount/base_manage.html000066400000000000000000000001661452212273200275260ustar00rootroot00000000000000{% extends "allauth/layouts/manage.html" %} {% block nav_class_socialaccount %}{{ block.super }} active{% endblock %} django-allauth-0.58.2/example/example/urls.py000066400000000000000000000006141452212273200211260ustar00rootroot00000000000000from django.contrib import admin from django.urls import include, path from django.views.generic.base import TemplateView admin.autodiscover() urlpatterns = [ path("", TemplateView.as_view(template_name="index.html")), path("accounts/", include("allauth.urls")), path("accounts/profile/", TemplateView.as_view(template_name="profile.html")), path("admin/", admin.site.urls), ] django-allauth-0.58.2/example/manage.py000066400000000000000000000003731452212273200177400ustar00rootroot00000000000000#!/usr/bin/env python import os import sys if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings") from django.core.management import execute_from_command_line execute_from_command_line(sys.argv) django-allauth-0.58.2/manage.py000066400000000000000000000003041452212273200162770ustar00rootroot00000000000000#!/usr/bin/env python import os os.environ["DJANGO_SETTINGS_MODULE"] = "test_settings" from django.core import management if __name__ == "__main__": management.execute_from_command_line() django-allauth-0.58.2/pyproject.toml000066400000000000000000000001311452212273200174070ustar00rootroot00000000000000[build-system] requires = ['setuptools>=40.8.0'] build-backend = 'setuptools.build_meta' django-allauth-0.58.2/pytest.ini000066400000000000000000000001351452212273200165300ustar00rootroot00000000000000[pytest] DJANGO_SETTINGS_MODULE = test_settings python_files = tests.py test_*.py *_tests.py django-allauth-0.58.2/setup.cfg000066400000000000000000000044401452212273200163230ustar00rootroot00000000000000[metadata] name = django-allauth version = attr: allauth.__version__ url = https://www.intenct.nl/projects/django-allauth/ author = Raymond Penners author_email = raymond.penners@intenct.nl description = Integrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication. long_description = file: README.rst license = MIT classifiers = Development Status :: 5 - Production/Stable Intended Audience :: Developers Topic :: Software Development :: Libraries :: Python Modules Environment :: Web Environment Topic :: Internet License :: OSI Approved :: MIT License Operating System :: OS Independent Programming Language :: Python Programming Language :: Python :: 3 Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 Framework :: Django Framework :: Django :: 3.2 Framework :: Django :: 4.0 Framework :: Django :: 4.1 Framework :: Django :: 4.2 Framework :: Django :: 5.0 project_urls = Documentation = https://docs.allauth.org/en/latest/ Changelog = https://github.com/pennersr/django-allauth/blob/main/ChangeLog.rst Source = https://github.com/pennersr/django-allauth Tracker = https://github.com/pennersr/django-allauth/issues Donate = https://github.com/sponsors/pennersr [options] python_requires = >=3.7 packages = find: include_package_data = true zip_safe = false tests_require = Pillow >= 9.0 pytest >= 7.4 pytest-django >= 4.5.2 install_requires = Django >= 3.2 python3-openid >= 3.0.8 requests-oauthlib >= 0.3.0 requests >= 2.0.0 pyjwt[crypto] >= 1.7 [options.extras_require] saml = python3-saml>=1.15.0,<2.0.0 mfa = qrcode >= 7.0.0 [options.packages.find] exclude = example [isort] indent=4 combine_star=1 combine_as_imports=1 include_trailing_comma=1 multi_line_output=3 lines_after_imports=2 known_django=django extra_standard_library=types,requests known_first_party=allauth sections=FUTURE,STDLIB,DJANGO,THIRDPARTY,FIRSTPARTY,LOCALFOLDER [flake8] max-line-length = 88 # Black ignore = E203, W503, E501, E231 django-allauth-0.58.2/setup.py000066400000000000000000000001061452212273200162070ustar00rootroot00000000000000from setuptools import setup if __name__ == "__main__": setup() django-allauth-0.58.2/shell.nix000066400000000000000000000013711452212273200163310ustar00rootroot00000000000000with import {}; stdenv.mkDerivation { name = "django-allauth"; buildInputs = [ black gettext isort python310 python310Packages.django python310Packages.flake8 python310Packages.pycodestyle python310Packages.pyls-flake8 python310Packages.pylsp-rope python310Packages.pytest python310Packages.pytest-cov python310Packages.pytest-django python310Packages.python-lsp-server python310Packages.python3-openid python310Packages.python3-saml python310Packages.qrcode python310Packages.sphinx-rtd-theme python310Packages.requests-oauthlib python310Packages.tox sphinx twine ]; } django-allauth-0.58.2/test_settings.py000066400000000000000000000214621452212273200177560ustar00rootroot00000000000000import os from django.contrib.auth.hashers import PBKDF2PasswordHasher SECRET_KEY = "psst" SITE_ID = 1 ALLOWED_HOSTS = ("*",) USE_I18N = False USE_TZ = True DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:", "USER": "", "PASSWORD": "", "HOST": "", "PORT": "", } } ROOT_URLCONF = "allauth.urls" LOGIN_URL = "/login/" TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [ os.path.join(os.path.dirname(__file__), "example", "example", "templates") ], "APP_DIRS": True, "OPTIONS": { "context_processors": [ "django.template.context_processors.debug", "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ], }, }, ] CACHES = { "default": { "BACKEND": "django.core.cache.backends.dummy.DummyCache", } } MIDDLEWARE = ( "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", "allauth.account.middleware.AccountMiddleware", ) INSTALLED_APPS = ( "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.sites", "django.contrib.messages", "django.contrib.staticfiles", "django.contrib.admin", "allauth", "allauth.account", "allauth.mfa", "allauth.socialaccount", "allauth.socialaccount.providers.agave", "allauth.socialaccount.providers.amazon", "allauth.socialaccount.providers.amazon_cognito", "allauth.socialaccount.providers.angellist", "allauth.socialaccount.providers.apple", "allauth.socialaccount.providers.asana", "allauth.socialaccount.providers.auth0", "allauth.socialaccount.providers.authentiq", "allauth.socialaccount.providers.baidu", "allauth.socialaccount.providers.basecamp", "allauth.socialaccount.providers.battlenet", "allauth.socialaccount.providers.bitbucket", "allauth.socialaccount.providers.bitbucket_oauth2", "allauth.socialaccount.providers.bitly", "allauth.socialaccount.providers.box", "allauth.socialaccount.providers.cilogon", "allauth.socialaccount.providers.coinbase", "allauth.socialaccount.providers.dataporten", "allauth.socialaccount.providers.daum", "allauth.socialaccount.providers.digitalocean", "allauth.socialaccount.providers.dingtalk", "allauth.socialaccount.providers.discord", "allauth.socialaccount.providers.disqus", "allauth.socialaccount.providers.douban", "allauth.socialaccount.providers.doximity", "allauth.socialaccount.providers.draugiem", "allauth.socialaccount.providers.drip", "allauth.socialaccount.providers.dropbox", "allauth.socialaccount.providers.dwolla", "allauth.socialaccount.providers.edmodo", "allauth.socialaccount.providers.edx", "allauth.socialaccount.providers.eventbrite", "allauth.socialaccount.providers.eveonline", "allauth.socialaccount.providers.evernote", "allauth.socialaccount.providers.exist", "allauth.socialaccount.providers.facebook", "allauth.socialaccount.providers.feedly", "allauth.socialaccount.providers.figma", "allauth.socialaccount.providers.fivehundredpx", "allauth.socialaccount.providers.flickr", "allauth.socialaccount.providers.foursquare", "allauth.socialaccount.providers.frontier", "allauth.socialaccount.providers.fxa", "allauth.socialaccount.providers.gitea", "allauth.socialaccount.providers.github", "allauth.socialaccount.providers.gitlab", "allauth.socialaccount.providers.globus", "allauth.socialaccount.providers.google", "allauth.socialaccount.providers.gumroad", "allauth.socialaccount.providers.hubic", "allauth.socialaccount.providers.hubspot", "allauth.socialaccount.providers.instagram", "allauth.socialaccount.providers.jupyterhub", "allauth.socialaccount.providers.kakao", "allauth.socialaccount.providers.lemonldap", "allauth.socialaccount.providers.line", "allauth.socialaccount.providers.linkedin", "allauth.socialaccount.providers.linkedin_oauth2", "allauth.socialaccount.providers.mailchimp", "allauth.socialaccount.providers.mailru", "allauth.socialaccount.providers.mediawiki", "allauth.socialaccount.providers.meetup", "allauth.socialaccount.providers.microsoft", "allauth.socialaccount.providers.miro", "allauth.socialaccount.providers.naver", "allauth.socialaccount.providers.netiq", "allauth.socialaccount.providers.nextcloud", "allauth.socialaccount.providers.notion", "allauth.socialaccount.providers.odnoklassniki", "allauth.socialaccount.providers.openid", "allauth.socialaccount.providers.openid_connect", "allauth.socialaccount.providers.openstreetmap", "allauth.socialaccount.providers.orcid", "allauth.socialaccount.providers.patreon", "allauth.socialaccount.providers.paypal", "allauth.socialaccount.providers.pinterest", "allauth.socialaccount.providers.pocket", "allauth.socialaccount.providers.questrade", "allauth.socialaccount.providers.quickbooks", "allauth.socialaccount.providers.reddit", "allauth.socialaccount.providers.robinhood", "allauth.socialaccount.providers.salesforce", "allauth.socialaccount.providers.saml", "allauth.socialaccount.providers.sharefile", "allauth.socialaccount.providers.shopify", "allauth.socialaccount.providers.slack", "allauth.socialaccount.providers.snapchat", "allauth.socialaccount.providers.soundcloud", "allauth.socialaccount.providers.spotify", "allauth.socialaccount.providers.stackexchange", "allauth.socialaccount.providers.steam", "allauth.socialaccount.providers.stocktwits", "allauth.socialaccount.providers.strava", "allauth.socialaccount.providers.stripe", "allauth.socialaccount.providers.telegram", "allauth.socialaccount.providers.trainingpeaks", "allauth.socialaccount.providers.trello", "allauth.socialaccount.providers.tumblr", "allauth.socialaccount.providers.twentythreeandme", "allauth.socialaccount.providers.twitch", "allauth.socialaccount.providers.twitter", "allauth.socialaccount.providers.twitter_oauth2", "allauth.socialaccount.providers.untappd", "allauth.socialaccount.providers.vimeo", "allauth.socialaccount.providers.vimeo_oauth2", "allauth.socialaccount.providers.vk", "allauth.socialaccount.providers.wahoo", "allauth.socialaccount.providers.weibo", "allauth.socialaccount.providers.weixin", "allauth.socialaccount.providers.windowslive", "allauth.socialaccount.providers.xing", "allauth.socialaccount.providers.yahoo", "allauth.socialaccount.providers.yandex", "allauth.socialaccount.providers.ynab", "allauth.socialaccount.providers.zoho", "allauth.socialaccount.providers.zoom", "allauth.socialaccount.providers.okta", "allauth.socialaccount.providers.feishu", ) AUTHENTICATION_BACKENDS = ( "django.contrib.auth.backends.ModelBackend", "allauth.account.auth_backends.AuthenticationBackend", ) STATIC_ROOT = "/tmp/" # Dummy STATIC_URL = "/static/" class MyPBKDF2PasswordHasher(PBKDF2PasswordHasher): """ A subclass of PBKDF2PasswordHasher that uses 1 iteration. This is for test purposes only. Never use anywhere else. """ iterations = 1 PASSWORD_HASHERS = [ "test_settings.MyPBKDF2PasswordHasher", "django.contrib.auth.hashers.PBKDF2PasswordHasher", "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher", "django.contrib.auth.hashers.Argon2PasswordHasher", "django.contrib.auth.hashers.BCryptSHA256PasswordHasher", ] ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN = 0 ACCOUNT_RATE_LIMITS = {} SOCIALACCOUNT_QUERY_EMAIL = True SOCIALACCOUNT_PROVIDERS = { "openid_connect": { "APPS": [ { "provider_id": "unittest-server", "name": "Unittest Server", "client_id": "Unittest client_id", "client_secret": "Unittest client_secret", "settings": { "server_url": "https://unittest.example.com", }, }, { "provider_id": "other-server", "name": "Other Example Server", "client_id": "other client_id", "client_secret": "other client_secret", "settings": { "server_url": "https://other.example.com", }, }, ], } } django-allauth-0.58.2/tox.ini000066400000000000000000000044451452212273200160220ustar00rootroot00000000000000[tox] envlist = py{37,38,39,310}-django32 py{38,39,310,311,312}-django{40,41,42} py{310,311,312}-django{50} py{310,311,312}-djangomain docs isort black flake8 standardjs compilemessages [testenv] setenv = PYTHONWARNINGS = all deps = # 6.x drops py35/36 support coverage==5.5 Pillow>=9.0 pytest>=7.4 pytest-django>=4.5.2 django32: Django==3.2.* django40: Django==4.0.* django41: Django==4.1.* django42: Django==4.2.* django50: Django==5.0a1 djangomain: git+https://github.com/django/django.git@main#egg=django python3-saml>=1.15.0,<2.0.0 extras = mfa commands = coverage run -m pytest {posargs:allauth} coverage report coverage html allowlist_externals = /usr/bin/env make [testenv:docs] skip_install = True deps = Sphinx sphinx_rtd_theme whitelist_externals = make commands = make -C {toxinidir}/docs html [testenv:isort] skip_install = True deps = isort==5.12.0 commands = isort --check-only --skip-glob '*/migrations/*' --diff {posargs:{toxinidir}/allauth} [testenv:black] skip_install = True deps = black==23.1.0 commands = black --check {posargs:{toxinidir}/allauth} {posargs:{toxinidir}/setup.py} [testenv:djlint] skip_install = True deps = djlint==1.33.0 commands = djlint --configuration {posargs:{toxinidir}/.djlintrc} --check {posargs:{toxinidir}/allauth} {posargs:{toxinidir}/example} [testenv:flake8] skip_install = True deps = flake8==6.0.0 commands = flake8 {posargs:{toxinidir}/allauth} [testenv:compilemessages] skip_install = True deps = Django commands = /usr/bin/env bash -c "cd allauth; python ../manage.py compilemessages" [testenv:standardjs] skip_install = True commands = /usr/bin/env bash -c "mkdir -p {toxinidir}/node_modules" /usr/bin/env npm install standard --no-lockfile --no-progress --non-interactive --silent /usr/bin/env bash -c "find {toxinidir}/allauth -name '*.js' | xargs {toxinidir}/node_modules/.bin/standard" [coverage:run] include = allauth* [flake8] exclude = migrations [gh-actions:env] PYTHON_VER = 3.7: py37 3.8: py38 3.9: py39 3.10: py310 3.11: py311 3.12: py312 DJANGO = main: djangomain 3.2: django32 4.0: django40 4.1: django41 4.2: django42 5.0: django50