Compare commits

..
Author SHA1 Message Date
Raphael Michel b5ad4680c8 Devices: Allow admins to inspect raw info data 2026-07-16 16:39:33 +02:00
Raphael Michel 2660dfe1bc CSP: Hotfix connect-src to allow static file access for PDF editor 2026-07-16 10:23:44 +02:00
Raphael MichelandGitHub 08c376a459 API: Add raw_source_type to failed checkins update (#6272) 2026-07-15 18:06:58 +02:00
Gerasimos ChourdakisandGitHub 6901ed8b26 Event settings: Improve wording of help message for is_remote (#6386) 2026-07-15 17:46:15 +02:00
Llewelyn BarkhuizenandRaphael Michel 62f1cbadaf Translations: Update Afrikaans
Currently translated at 0.1% (3 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/af/

powered by weblate
2026-07-15 17:44:34 +02:00
szurofkamarciidfbe08444ef04788andRaphael Michel 1386b40e6f Translations: Update Hungarian
Currently translated at 100.0% (260 of 260 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/hu/

powered by weblate
2026-07-15 17:44:34 +02:00
szurofkamarciidfbe08444ef04788andRaphael Michel bbcd1b86b7 Translations: Update Hungarian
Currently translated at 17.8% (1138 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/hu/

powered by weblate
2026-07-15 17:44:34 +02:00
Jochen SiebertandRaphael Michel 6894070239 Translations: Update German
Currently translated at 100.0% (6362 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de/

powered by weblate
2026-07-15 17:44:34 +02:00
Llewelyn BarkhuizenandRaphael Michel 7470a7198b Translations: Add Afrikaans 2026-07-15 17:44:34 +02:00
Llewelyn BarkhuizenandRaphael Michel ddda634ef3 Translations: Add Afrikaans 2026-07-15 17:44:34 +02:00
szurofkamarciidfbe08444ef04788andRaphael Michel 3f7064f12b Translations: Update Hungarian
Currently translated at 100.0% (260 of 260 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/hu/

powered by weblate
2026-07-15 17:44:34 +02:00
szurofkamarciidfbe08444ef04788andRaphael Michel 6386c99175 Translations: Update Hungarian
Currently translated at 17.0% (1084 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/hu/

powered by weblate
2026-07-15 17:44:34 +02:00
eb29101d09 Allow more decimal places for tax rates (#6092)
* Allow more decimal places for tax rates

* Fix normalization

* More tax rate handling

* Add uncommitted tests

* Rebase migration

* Update src/pretix/base/migrations/0304_tax_rate_decimals.py

Co-authored-by: robbi5 <richt@rami.io>

---------

Co-authored-by: robbi5 <richt@rami.io>
2026-07-15 16:20:45 +02:00
szurofkamarciidfbe08444ef04788andRaphael Michel d007fb9566 Translations: Update Hungarian
Currently translated at 100.0% (260 of 260 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/hu/

powered by weblate
2026-07-15 11:39:34 +02:00
szurofkamarciidfbe08444ef04788andRaphael Michel 93cbbea193 Translations: Update Hungarian
Currently translated at 16.7% (1064 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/hu/

powered by weblate
2026-07-15 11:39:34 +02:00
szurofkamarciidfbe08444ef04788andRaphael Michel eacce6d1f8 Translations: Update Hungarian
Currently translated at 100.0% (260 of 260 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/hu/

powered by weblate
2026-07-15 11:39:34 +02:00
szurofkamarciidfbe08444ef04788andRaphael Michel cdd7412fbb Translations: Update Hungarian
Currently translated at 13.2% (844 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/hu/

powered by weblate
2026-07-15 11:39:34 +02:00
szurofkamarciidfbe08444ef04788andRaphael Michel a6d462c14e Translations: Update Hungarian
Currently translated at 11.2% (717 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/hu/

powered by weblate
2026-07-15 11:39:34 +02:00
Hijiri UmemotoandRaphael Michel d5d928cdce Translations: Update Japanese
Currently translated at 100.0% (6362 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ja/

powered by weblate
2026-07-15 11:39:34 +02:00
szurofkamarciidfbe08444ef04788andRaphael Michel e0a8b81290 Translations: Update Hungarian
Currently translated at 11.1% (711 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/hu/

powered by weblate
2026-07-15 11:39:34 +02:00
szurofkamarciidfbe08444ef04788andRaphael Michel 6b0419e488 Translations: Update Hungarian
Currently translated at 100.0% (260 of 260 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/hu/

powered by weblate
2026-07-15 11:39:34 +02:00
szurofkamarciidfbe08444ef04788andRaphael Michel 48104e0c9f Translations: Update Hungarian
Currently translated at 10.8% (690 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/hu/

powered by weblate
2026-07-15 11:39:34 +02:00
ahmed badrandRaphael Michel 7eefb18b67 Translations: Update Arabic
Currently translated at 99.7% (6348 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ar/

powered by weblate
2026-07-15 11:39:34 +02:00
ahmed badrandRaphael Michel f9022e5a5e Translations: Update Arabic
Currently translated at 100.0% (260 of 260 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/ar/

powered by weblate
2026-07-15 11:39:34 +02:00
ahmed shabbatandRaphael Michel 08c5963d7b Translations: Update Arabic
Currently translated at 99.7% (6348 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ar/

powered by weblate
2026-07-15 11:39:34 +02:00
ahmed badrandRaphael Michel e8274527cb Translations: Update Arabic
Currently translated at 99.7% (6348 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ar/

powered by weblate
2026-07-15 11:39:34 +02:00
Raphael MichelandRaphael Michel f77aad0eeb Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (260 of 260 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/de_Informal/

powered by weblate
2026-07-15 11:39:34 +02:00
ahmed badrandRaphael Michel d5b0059c34 Translations: Update Arabic
Currently translated at 100.0% (260 of 260 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/ar/

powered by weblate
2026-07-15 11:39:34 +02:00
ahmed badrandRaphael Michel 47a170ab62 Translations: Update Arabic
Currently translated at 78.6% (5005 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ar/

powered by weblate
2026-07-15 11:39:34 +02:00
ahmed shabbatandRaphael Michel 93aebffe2c Translations: Update Arabic
Currently translated at 65.8% (4191 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ar/

powered by weblate
2026-07-15 11:39:34 +02:00
ahmed badrandRaphael Michel 7795c711be Translations: Update Arabic
Currently translated at 65.8% (4191 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ar/

powered by weblate
2026-07-15 11:39:34 +02:00
ahmed badrandRaphael Michel 1eb685d4ee Translations: Update Arabic
Currently translated at 59.8% (3808 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ar/

powered by weblate
2026-07-15 11:39:34 +02:00
CVZ-esandRaphael Michel b8c523cfac Translations: Update Spanish
Currently translated at 100.0% (6362 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/es/

powered by weblate
2026-07-15 11:39:34 +02:00
Joram SchwartzmannandRaphael Michel fae9fff98e Translations: Update French
Currently translated at 100.0% (260 of 260 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/fr/

powered by weblate
2026-07-15 11:39:34 +02:00
CVZ-esandRaphael Michel 92cfbd54b9 Translations: Update French
Currently translated at 100.0% (6362 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/fr/

powered by weblate
2026-07-15 11:39:34 +02:00
Joram SchwartzmannandRaphael Michel 18203e0804 Translations: Update French
Currently translated at 100.0% (6362 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/fr/

powered by weblate
2026-07-15 11:39:34 +02:00
Raphael MichelandGitHub 52ed8eeb50 Mail setup: Add DKIM + DMARC validation (#6339)
* Mail setup: Add DKIM + DMARC validation

* Tests

* Test fixes
2026-07-15 11:36:35 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1e4888bad0 Bump django-filter from 25.1 to 26.1 (#6377)
Bumps [django-filter](https://github.com/carltongibson/django-filter) from 25.1 to 26.1.
- [Release notes](https://github.com/carltongibson/django-filter/releases)
- [Changelog](https://github.com/carltongibson/django-filter/blob/main/CHANGES.rst)
- [Commits](https://github.com/carltongibson/django-filter/compare/25.1...26.1)

---
updated-dependencies:
- dependency-name: django-filter
  dependency-version: '26.1'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-15 09:41:35 +02:00
dependabot[bot]andRaphael Michel c3056a8aae Update sentry-sdk requirement from ==2.64.* to ==2.65.*
Updates the requirements on [sentry-sdk](https://github.com/getsentry/sentry-python) to permit the latest version.
- [Release notes](https://github.com/getsentry/sentry-python/releases)
- [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-python/compare/2.64.0...2.65.0)

---
updated-dependencies:
- dependency-name: sentry-sdk
  dependency-version: 2.65.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-15 09:41:18 +02:00
Raphael MichelandGitHub 4a4cff3c41 Drop all csp_ignore statements from core (except stripe, for now) (#6337)
* Add proper CSP policy for HTML email preview

* Handle safe types centrally

* Precompile schema validation function to get rid of ajv2020

* Fix tests

* adjust more tests
2026-07-15 09:39:42 +02:00
Raphael MichelandGitHub ffca102a8a Question form: Do not store invalid False values for required boolean questions (Z#23239887) (#6366) 2026-07-10 16:42:10 +02:00
luelistaandGitHub 78f8830f90 Hotfix: fix order_position_buttons receiver 2026-07-10 15:08:10 +02:00
Raphael Michel eb594266a7 Hotfix: Add missing mark_safe after strip 2026-07-10 14:56:48 +02:00
76e6803eac Fix customer views using wrong csrf middleware (#6027)
* Fix customer views using wrong csrf middleware

This lead to persistent csrf validation errors if the token from the cookie expired, which could only be solved by clearing cookies.

* Remove unneccesary csrf_protect decorators

* Fix typo

Co-authored-by: Raphael Michel <michel@pretix.eu>

---------

Co-authored-by: Raphael Michel <michel@pretix.eu>
2026-07-10 13:25:40 +02:00
Richard Schreiberandpajowu e19908571c Fix delete_cookie for partitioned legacy CSRF cookie 2026-07-10 13:25:40 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
779ab360df Bump django-formtools from 2.6.1 to 2.7 (#6371)
Bumps [django-formtools](https://github.com/jazzband/django-formtools) from 2.6.1 to 2.7.
- [Changelog](https://github.com/jazzband/django-formtools/blob/master/docs/changelog.rst)
- [Commits](https://github.com/jazzband/django-formtools/compare/2.6.1...2.7)

---
updated-dependencies:
- dependency-name: django-formtools
  dependency-version: '2.7'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-10 12:17:12 +02:00
Raphael MichelandGitHub 723c63008d Team invite: Improve error message (Z#23239860) (#6368) 2026-07-10 12:13:44 +02:00
15c194c0a3 Add base class for historical payment providers (#6336)
* Add base class for historical payment providers

* Update src/pretix/base/payment.py

Co-authored-by: pajowu <engelhardt@pretix.eu>

---------

Co-authored-by: pajowu <engelhardt@pretix.eu>
2026-07-10 11:10:32 +02:00
pajowuandGitHub 7f847c3dd2 Fix TypeError if task.request.headers is None (#6367) 2026-07-09 18:52:49 +02:00
luelistaandGitHub 430c6dd269 Use SafeStrings for plugin signals returning HTML that should be rendered (#6343)
As a security precaution, we change the contract of some signals such that a 
SafeString needs to be returned if HTML should be rendered without further 
escaping.

Before, the `{% signal ... %}` and `{% eventsignal ... %}` template tags 
called mark_safe themselves on all strings returned from signals. That could
lead to unsafe coding practices, where untrusted values are interpolated into
HTML format strings. However, such interpolations should usually be performed 
using helpers such Django's format_html, which automatically escapes inputs
and returns a SafeString.
Now, we call conditional_escape on signal results, so that any HTML not explicitly
marked as safe gets escaped.

Most plugins are not affected by this change as they return a SafeString as a 
result of Template.render already.
2026-07-09 17:50:26 +02:00
Raphael Michel 6411648457 Revert "Update redis requirement from ==7.4.* to ==8.0.* (#6226)"
This reverts commit 005b3864b1.
2026-07-09 00:45:32 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Raphael MichelRaphael Michelluelista
005b3864b1 Update redis requirement from ==7.4.* to ==8.0.* (#6226)
* Update redis requirement from ==7.4.* to ==8.0.*

Updates the requirements on [redis](https://github.com/redis/redis-py) to permit the latest version.
- [Release notes](https://github.com/redis/redis-py/releases)
- [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES)
- [Commits](https://github.com/redis/redis-py/compare/v7.4.0...v8.0.0)

---
updated-dependencies:
- dependency-name: redis
  dependency-version: 8.0.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

* Remove setex calls

* Update src/pretix/presale/views/user.py

Co-authored-by: luelista <weller@rami.io>

* Fix tests

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Raphael Michel <michel@pretix.eu>
Co-authored-by: Raphael Michel <michel@rami.io>
Co-authored-by: luelista <weller@rami.io>
2026-07-08 12:07:54 +02:00
Raphael MichelandGitHub 1ee1c604cf Tax rules: Correctly write log when changing custom rules (#6358) 2026-07-08 11:33:06 +02:00
luelistaandGitHub e425105dbf Fix link from voucher tag to filtered voucher list (#6362) 2026-07-08 11:26:37 +02:00
Martin Gross 738b375042 DevDocs: Bump nodejs to 24 2026-07-08 10:53:14 +02:00
sweenuandGitHub d09572d999 Remove leftovers from contact url in quick setup (#6359) 2026-07-07 19:23:48 +02:00
Lukas BockstallerandGitHub 634754aacb repair sendmail rules so we don't send emails to all positions in order independent of checkin status (Z#23235255) (#6340)
* add repro for Z#23235255

* add testcase for fallback to order.email

* only send to orderpositions included in op_qs

* codestyle
2026-07-07 17:46:52 +02:00
14c3baa2aa Drop nullability on Order.organizer and OrderPosition.organizer (#4278)
* Drop nullability on Order.organizer and OrderPosition.organizer

* Rebase migration and add autoclean

* Utilize new relationship for scopes

* Declare reverse noop

* Update src/pretix/base/migrations/0302_resolve_duplicate_codes_and_secrets.py

Co-authored-by: Martin Gross <gross@rami.io>

* Update src/pretix/base/migrations/0302_resolve_duplicate_codes_and_secrets.py

Co-authored-by: Martin Gross <gross@rami.io>

---------

Co-authored-by: Martin Gross <gross@rami.io>
2026-07-07 17:44:19 +02:00
dc1b62fc56 Vouchers: Allow to bulk-update (#6096)
* Vouchers: Allow to bulk-delete larger numbers

* [DRAFT] voucher bulk update

* untested draft

* Minor fixes

* some tests and fixes

* More tests

* Bulk vouchers - refactor (#6353)

* Reuse parse_itemvar from VoucherForm

* Refactor: Method for _bulk update check

* remove unused parameter

* Refactor: Deduplicate get_affected_quotas code

* Remove unused delete button

* Prevent accidental update of *all* vouchers (cf PR #4960)

* Make sure we actually edit the selected items

* Use dataclass for bulk-edit data, deduplicate quota-blocking logic

* Move dataclass to models.py

* Fix linter errors

* Fix tests

* Fix tests

---------

Co-authored-by: luelista <weller@rami.io>
2026-07-07 17:03:25 +02:00
Raphael MichelandGitHub ea2c81e6dc Improve handling of logout during asynchronous tasks (Z#23238978) (#6341)
* Handle logout during async task requests properly

* Handle fragments safely on webcheckin logout

* Remove unnecessary comment

* Revert hash change
2026-07-07 16:14:00 +02:00
Raphael Michel 2bd5e90a86 Fix isort 2026-07-07 15:43:00 +02:00
Raphael Michel 8095134400 Add query tagging for periodic tasks 2026-07-07 14:55:32 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
62f2ed55b2 Update webauthn requirement from ==2.8.* to ==3.0.* (#6350)
Updates the requirements on [webauthn](https://github.com/duo-labs/py_webauthn) to permit the latest version.
- [Release notes](https://github.com/duo-labs/py_webauthn/releases)
- [Changelog](https://github.com/duo-labs/py_webauthn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/duo-labs/py_webauthn/compare/v2.8.0-alpha1...v3.0.0)

---
updated-dependencies:
- dependency-name: webauthn
  dependency-version: 3.0.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-07 12:13:40 +02:00
3533450601 Add trace IDs from request to celery task (#6333)
* Add trace IDs from request to celery task

Celery tasks will log the request ID they were triggered from:

    [2026-07-02 10:33:17,614: INFO/MainProcess] Task pretix.base.services.orders.cancel_order[5f3104b3-0a54-4e49-921e-c866c4dc4c6d] received
    [2026-07-02 10:33:17,614: INFO/MainProcess] Task 5f3104b3-0a54-4e49-921e-c866c4dc4c6d has trace 4d389638-00ab-4c4d-bdec-d73ac322bf44

Nested celery tasks will then contain both the request ID as well as the previous tasks:

    [2026-07-02 10:33:18,354: INFO/MainProcess] Task pretix.base.services.notifications.notify[d52a3a49-9c89-4f67-bdde-9f773586fc07] received
    [2026-07-02 10:33:18,354: INFO/MainProcess] Task d52a3a49-9c89-4f67-bdde-9f773586fc07 has trace 4d389638-00ab-4c4d-bdec-d73ac322bf44 5f3104b3-0a54-4e49-921e-c866c4dc4c6d

* Apply suggestion from @luelista

Co-authored-by: luelista <weller@rami.io>

---------

Co-authored-by: luelista <weller@rami.io>
2026-07-07 12:09:27 +02:00
pajowuandGitHub 5fb827c8f5 CheckInListPDF export: remove double html escaping with PlainTextParagraph (Z#23239571) (#6347) 2026-07-07 12:00:17 +02:00
Raphael MichelandRaphael Michel af6727bbe2 Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (6362 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de_Informal/

powered by weblate
2026-07-07 11:57:51 +02:00
Raphael MichelandRaphael Michel f0d2733e8d Translations: Update German
Currently translated at 100.0% (6362 of 6362 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de/

powered by weblate
2026-07-07 11:57:51 +02:00
Raphael Michel 90bca935de Update po files
[CI skip]

Signed-off-by: Raphael Michel <michel@rami.io>
2026-07-07 11:34:15 +02:00
Raphael Michel 9c752b7263 Translations: Fix typo 2026-07-07 11:29:03 +02:00
CVZ-esandRaphael Michel bfdd61a14c Translations: Update French
Currently translated at 99.9% (6355 of 6360 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/fr/

powered by weblate
2026-07-07 11:28:33 +02:00
CVZ-esandRaphael Michel 6aca806239 Translations: Update Spanish
Currently translated at 100.0% (6360 of 6360 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/es/

powered by weblate
2026-07-07 11:28:33 +02:00
CVZ-esandRaphael Michel 8512a8c4a5 Translations: Update French
Currently translated at 99.9% (6354 of 6360 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/fr/

powered by weblate
2026-07-07 11:28:33 +02:00
Raphael MichelandRaphael Michel ecee6f6c30 Translations: Update German (informal) (de_Informal)
Currently translated at 99.9% (6359 of 6360 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de_Informal/

powered by weblate
2026-07-07 11:28:33 +02:00
Raphael MichelandRaphael Michel 846ec77c50 Translations: Update German
Currently translated at 99.9% (6359 of 6360 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de/

powered by weblate
2026-07-07 11:28:33 +02:00
CVZ-esandRaphael Michel 49c69c816c Translations: Update French
Currently translated at 99.8% (6348 of 6360 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/fr/

powered by weblate
2026-07-07 11:28:33 +02:00
Hijiri UmemotoandRaphael Michel f3868576c5 Translations: Update Japanese
Currently translated at 100.0% (260 of 260 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/ja/

powered by weblate
2026-07-07 11:28:33 +02:00
Hijiri UmemotoandRaphael Michel 3857361559 Translations: Update Japanese
Currently translated at 100.0% (6360 of 6360 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ja/

powered by weblate
2026-07-07 11:28:33 +02:00
CVZ-esandRaphael Michel b0c50de331 Translations: Update Spanish
Currently translated at 100.0% (6360 of 6360 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/es/

powered by weblate
2026-07-07 11:28:33 +02:00
CVZ-esandRaphael Michel 1dad6bf801 Translations: Update French
Currently translated at 99.7% (6347 of 6360 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/fr/

powered by weblate
2026-07-07 11:28:33 +02:00
Raphael MichelandRaphael Michel d94d4bd57e Translations: Update German (informal) (de_Informal)
Currently translated at 99.9% (6358 of 6360 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de_Informal/

powered by weblate
2026-07-07 11:28:33 +02:00
CVZ-esandRaphael Michel 2437f768c9 Translations: Update German (informal) (de_Informal)
Currently translated at 99.9% (6358 of 6360 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de_Informal/

powered by weblate
2026-07-07 11:28:33 +02:00
Raphael MichelandRaphael Michel ab621890a2 Translations: Update German
Currently translated at 99.9% (6359 of 6360 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de/

powered by weblate
2026-07-07 11:28:33 +02:00
Raphael Michel a9135919a1 Translations: Update wordlists 2026-07-07 11:21:59 +02:00
Raphael Michel e2c437fd43 Update confusing verbiage after #6216 2026-07-07 10:58:27 +02:00
Raphael MichelandGitHub ba10fc8041 Event product list: Fix another performance issue for large series (#6331)
This is a follow-up for #6318, basically the same problem but in a
neighboring query.

Performance comparison for real-world event with 13k subevents:

In [15]: %time get_grouped_items(e, subevent=se, channel=e.organizer.sales_channels.get(identifier="web"))
CPU times: user 49.1 ms, sys: 3.79 ms, total: 52.9 ms
Wall time: 1.12 s
Out[15]: ([<Item: xxx>], True

In [16]: %time get_grouped_items_patched(e, subevent=se, channel=e.organizer.sales_channels.get(identifier="web"))
CPU times: user 30.2 ms, sys: 445 μs, total: 30.6 ms
Wall time: 45.3 ms
Out[16]: ([<Item: xxx>], True)
2026-07-07 10:48:50 +02:00
Raphael MichelandGitHub 7732794317 Do not use redis cache at import time (#6321)
During our [2026-06-27 incident](https://pretix.eu/about/en/blog/20260630-pretix-hosted-outage/),
we noticed that pretix is using redis at import time. This means that
gunicorn and celery process were unable to start on servers who could
currently not reach redis. This is kinda mitigated through auto-restart
on systemd or docker level, but that's not really how it is supposed to
work. Celery even has smart retry/reconnect logic that becomes pointless
this way.
2026-07-07 10:47:12 +02:00
156 changed files with 43238 additions and 9703 deletions
+2 -1
View File
@@ -351,7 +351,8 @@ Endpoints
:<json boolean error_reason: One of ``canceled``, ``invalid``, ``unpaid``, ``product``, ``rules``, ``revoked``,
``incomplete``, ``already_redeemed``, ``blocked``, ``invalid_time``, or ``error``. Required.
:<json raw_barcode: The raw barcode you scanned. Required.
:<json raw_barcode: The raw barcode or identifier you scanned. Required.
:<json raw_source_type: The type of medium you scanned, defaults to ``barcode``. Optional.
:<json datetime: Date and time of the scan. Optional.
:<json type: Type of scan, defaults to ``"entry"``.
:<json position: Internal ID of an order position you matched. Optional.
-6
View File
@@ -864,9 +864,6 @@ Generating new secrets
Triggers generation of new ``secret`` and ``web_secret`` attributes for both the order and all order positions.
Ticket secrets of order positions that have been used to issue a gift card can not
be changed. Only the link (``web_secret``) will be changed in this case.
**Example request**:
.. sourcecode:: http
@@ -898,9 +895,6 @@ Generating new secrets
Triggers generation of a new ``secret`` and ``web_secret`` attribute for a single order position.
Ticket secrets of order positions that have been used to issue a gift card can not
be changed. Only the link (``web_secret``) will be changed in this case.
**Example request**:
.. sourcecode:: http
+1 -1
View File
@@ -53,7 +53,7 @@ Working with the code
---------------------
If you do not have a recent installation of ``nodejs``, install it now::
curl -sL https://deb.nodesource.com/setup_17.x | sudo -E bash -
curl -sL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt install nodejs
To make sure it is on your path variable, close and reopen your terminal. Now, install the Python-level dependencies of pretix::
+4 -4
View File
@@ -41,9 +41,9 @@ dependencies = [
"django-bootstrap3==26.1",
"django-compressor==4.6.0",
"django-countries==8.2.*",
"django-filter==25.1",
"django-filter==26.1",
"django-formset-js-improved==0.5.0.5",
"django-formtools==2.6.1",
"django-formtools==2.7",
"django-hierarkey==2.0.*,>=2.0.1",
"django-hijack==3.7.*",
"django-i18nfield==1.11.*",
@@ -94,7 +94,7 @@ dependencies = [
"redis==7.4.*",
"reportlab==5.0.*",
"requests==2.34.*",
"sentry-sdk==2.64.*",
"sentry-sdk==2.65.*",
"sepaxml==2.7.*",
"stripe==7.9.*",
"text-unidecode==1.*",
@@ -102,7 +102,7 @@ dependencies = [
"tqdm==4.*",
"ua-parser==1.0.*",
"vobject==0.9.*",
"webauthn==2.8.*",
"webauthn==3.0.*",
"zeep==4.3.*"
]
+28
View File
@@ -20,6 +20,7 @@
# <https://www.gnu.org/licenses/>.
#
import json
import re
from django.db.models import prefetch_related_objects
from rest_framework import serializers
@@ -135,3 +136,30 @@ class SalesChannelMigrationMixin:
else:
value["sales_channels"] = value["limit_sales_channels"]
return value
class CompatDecimalField(serializers.DecimalField):
"""
Historically, pretix recorded tax rates as decimals with two places. Today, pretix supports tax rates with up to
four places. Since our API outputs decimals with the stored precision, this would have changed the API output from
"19.00" to "19.0000" without warning. While this is semantically the same thing, we need to assume some pretix API
users might run into trouble, either because they treat the value as a string and then map something
(e.g. ``if tax_rate == "19.00"``) or process it with a language where this is a significant difference. For example,
while in Python ``Decimal("19.00") == Decimal("19.0000")`` is true, in Java
``(new BigDecimal("19.00")).equals(new BigDecimal("19.0000"))`` is false and only
``(new BigDecimal("19.00")).compareTo(new BigDecimal("19.0000")) == 0`` is true.
Therefore, we stay backwards compatible by outputting two decimal places *as long as the trailing digits are zero-valued.
"""
regex = re.compile(r"^([0-9]+\.[0-9]{2})0+$")
def to_representation(self, value):
if self.localize:
raise ValueError("localization not supported")
value = super().to_representation(value)
if value and "." not in value:
return f"{value}.00"
if m := self.regex.match(value):
return m.group(1)
return value
+2 -1
View File
@@ -48,7 +48,7 @@ from rest_framework.fields import ChoiceField, Field
from rest_framework.relations import SlugRelatedField
from pretix.api.serializers import (
CompatibleJSONField, SalesChannelMigrationMixin,
CompatDecimalField, CompatibleJSONField, SalesChannelMigrationMixin,
)
from pretix.api.serializers.fields import PluginsField
from pretix.api.serializers.i18n import I18nAwareModelSerializer
@@ -681,6 +681,7 @@ class TaxRuleSerializer(CountryFieldMixin, I18nAwareModelSerializer):
required=False,
allow_null=True,
)
rate = CompatDecimalField(max_digits=7, decimal_places=4)
class Meta:
model = TaxRule
+6 -4
View File
@@ -42,7 +42,9 @@ from django.utils.functional import cached_property, lazy
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from pretix.api.serializers import SalesChannelMigrationMixin
from pretix.api.serializers import (
CompatDecimalField, SalesChannelMigrationMixin,
)
from pretix.api.serializers.event import MetaDataField
from pretix.api.serializers.fields import UploadedFileField
from pretix.api.serializers.i18n import I18nAwareModelSerializer
@@ -276,10 +278,10 @@ class ItemAddOnSerializer(serializers.ModelSerializer):
return value
class ItemTaxRateField(serializers.Field):
class ItemTaxRateField(CompatDecimalField):
def to_representation(self, i):
if i.tax_rule:
return str(Decimal(i.tax_rule.rate))
return super().to_representation(Decimal(i.tax_rule.rate))
else:
return str(Decimal('0.00'))
@@ -289,7 +291,7 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
bundles = InlineItemBundleSerializer(many=True, required=False)
variations = InlineItemVariationSerializer(many=True, required=False)
program_times = InlineItemProgramTimeSerializer(many=True, required=False)
tax_rate = ItemTaxRateField(source='*', read_only=True)
tax_rate = ItemTaxRateField(source='*', read_only=True, max_digits=7, decimal_places=4)
meta_data = MetaDataField(required=False, source='*')
picture = UploadedFileField(required=False, allow_null=True, allowed_types=(
'image/png', 'image/jpeg', 'image/gif'
+9 -2
View File
@@ -41,7 +41,7 @@ from rest_framework.exceptions import ValidationError
from rest_framework.relations import SlugRelatedField
from rest_framework.reverse import reverse
from pretix.api.serializers import CompatibleJSONField
from pretix.api.serializers import CompatDecimalField, CompatibleJSONField
from pretix.api.serializers.event import SubEventSerializer
from pretix.api.serializers.forms import form_field_to_serializer_field
from pretix.api.serializers.i18n import I18nAwareModelSerializer
@@ -52,6 +52,7 @@ from pretix.api.signals import order_api_details, orderposition_api_details
from pretix.base.decimal import round_decimal
from pretix.base.i18n import language
from pretix.base.invoicing.transmission import get_transmission_types
from pretix.base.media import MEDIA_TYPES
from pretix.base.models import (
CachedFile, Checkin, Customer, Device, GiftCard, Invoice, InvoiceAddress,
InvoiceLine, Item, ItemVariation, Order, OrderPosition, Question,
@@ -381,6 +382,7 @@ class PrintLogSerializer(serializers.ModelSerializer):
class FailedCheckinSerializer(I18nAwareModelSerializer):
error_reason = serializers.ChoiceField(choices=Checkin.REASONS, required=True, allow_null=False)
raw_barcode = serializers.CharField(required=True, allow_null=False)
raw_source_type = serializers.ChoiceField(choices=[(k, v) for k, v in MEDIA_TYPES.items()], default='barcode')
position = serializers.PrimaryKeyRelatedField(queryset=OrderPosition.all.none(), required=False, allow_null=True)
raw_item = serializers.PrimaryKeyRelatedField(queryset=Item.objects.none(), required=False, allow_null=True)
raw_variation = serializers.PrimaryKeyRelatedField(queryset=ItemVariation.objects.none(), required=False, allow_null=True)
@@ -390,7 +392,7 @@ class FailedCheckinSerializer(I18nAwareModelSerializer):
class Meta:
model = Checkin
fields = ('error_reason', 'error_explanation', 'raw_barcode', 'raw_item', 'raw_variation',
'raw_subevent', 'nonce', 'datetime', 'type', 'position')
'raw_subevent', 'raw_source_type', 'nonce', 'datetime', 'type', 'position')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
@@ -591,6 +593,7 @@ class OrderPositionSerializer(I18nAwareModelSerializer):
country = CompatibleCountryField(source='*')
attendee_name = serializers.CharField(required=False)
plugin_data = OrderPositionPluginDataField(source='*', allow_null=True, read_only=True)
tax_rate = CompatDecimalField(max_digits=7, decimal_places=4)
class Meta:
list_serializer_class = OrderPositionListSerializer
@@ -747,6 +750,8 @@ class OrderPaymentDateField(serializers.DateField):
class OrderFeeSerializer(I18nAwareModelSerializer):
tax_rate = CompatDecimalField(max_digits=7, decimal_places=4)
class Meta:
model = OrderFee
fields = ('id', 'fee_type', 'value', 'description', 'internal_type', 'tax_rate', 'tax_value', 'tax_rule',
@@ -1911,6 +1916,7 @@ class InlineInvoiceLineSerializer(I18nAwareModelSerializer):
position = LinePositionField(read_only=True)
event_date_from = serializers.DateTimeField(read_only=True, source="period_start")
event_date_to = serializers.DateTimeField(read_only=True, source="period_end")
tax_rate = CompatDecimalField(max_digits=7, decimal_places=4)
class Meta:
model = InvoiceLine
@@ -1994,6 +2000,7 @@ class BlockedTicketSecretSerializer(I18nAwareModelSerializer):
class TransactionSerializer(I18nAwareModelSerializer):
order = serializers.SlugRelatedField(slug_field="code", read_only=True)
tax_rate = CompatDecimalField(max_digits=7, decimal_places=4)
class Meta:
model = Transaction
+22 -9
View File
@@ -53,6 +53,7 @@ from django.db.models import QuerySet
from django.forms import Select, widgets
from django.forms.widgets import FILE_INPUT_CONTRADICTION
from django.utils.formats import date_format
from django.utils.functional import lazy
from django.utils.html import escape
from django.utils.safestring import mark_safe
from django.utils.text import format_lazy
@@ -324,16 +325,21 @@ class WrappedPhonePrefixSelect(Select):
initial = None
def __init__(self, initial=None):
choices = [("", "---------")]
def _get_choices():
choices = [("", "---------")]
if initial:
for prefix, values in COUNTRY_CODE_TO_REGION_CODE.items():
if all(v == REGION_CODE_FOR_NON_GEO_ENTITY for v in values):
continue
if initial in values:
self.initial = "+%d" % prefix
break
choices += get_phone_prefixes_sorted_and_localized()
return choices
choices = lazy(_get_choices, list)()
if initial:
for prefix, values in COUNTRY_CODE_TO_REGION_CODE.items():
if all(v == REGION_CODE_FOR_NON_GEO_ENTITY for v in values):
continue
if initial in values:
self.initial = "+%d" % prefix
break
choices += get_phone_prefixes_sorted_and_localized()
super().__init__(choices=choices, attrs={
'aria-label': pgettext_lazy('phonenumber', 'International area code'),
'autocomplete': 'tel-country-code',
@@ -1110,6 +1116,13 @@ class BaseQuestionsForm(forms.Form):
if q.dependency_question_id and not question_is_visible(q.dependency_question_id, q.dependency_values) and answer is not None:
d['question_%d' % q.pk] = None
# Strip False answers to required yes/no questions even if all_optional is set, as our data model assumes that
# required yes/no questions can only be answered with yes
for q in question_cache.values():
if q.required and q.type == Question.TYPE_BOOLEAN:
if 'question_%d' % q.pk in d and d['question_%d' % q.pk] is False:
del d['question_%d' % q.pk]
return d
@@ -0,0 +1,29 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-today pretix GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/license>.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = "Do nothing. Useful for startup performance testing."
def handle(self, *args, **options):
pass
@@ -40,6 +40,7 @@ from django.core.cache import cache
from django.core.management.base import BaseCommand
from django.db import close_old_connections
from django.dispatch.dispatcher import NO_RECEIVERS
from django_querytagger.tagging import with_tag
from pretix.helpers.periodic import SKIPPED
@@ -82,7 +83,8 @@ class Command(BaseCommand):
try:
# Check if the DB connection is still good, it might be closed if the previous task took too long.
close_old_connections()
r = receiver(signal=periodic_task, sender=self)
with with_tag(f"periodictask={name}"):
r = receiver(signal=periodic_task, sender=self)
except Exception as err:
if isinstance(err, KeyboardInterrupt):
raise err
+22 -1
View File
@@ -266,6 +266,22 @@ def _merge_csp(a, b):
class SecurityMiddleware(MiddlewareMixin):
SAFE_TYPES = (
# CSP policies are only used for:
# - HTML and SVG in top-level contexts
# - SVG or JS Workers delivered in embedded contexts
# See: https://www.w3.org/TR/CSP2/#which-policy-applies
# Therefore, we can save bandwidth on not including our (sometimes huge) policy
# on API responses or CSS. We do however include it with other types as a precaution
# (whitelist instead of blacklist) and we also do not whitelist JavaScript in
# we ever add service workers to not break the protection of this feature:
# https://www.w3.org/TR/CSP2/#sandboxing-and-workers
'application/json',
'text/css',
# We used to skip CSP for PDF since it was necessary for inline previews in Safari,
# but at the moment it does not seem to be an issue to just send it.
)
def process_response(self, request, resp):
if settings.DEBUG and resp.status_code >= 400:
# Don't use CSP on debug error page as it breaks of Django's fancy error
@@ -277,6 +293,11 @@ class SecurityMiddleware(MiddlewareMixin):
# https://github.com/pretix/pretix/issues/765
resp['P3P'] = 'CP=\"ALL DSP COR CUR ADM TAI OUR IND COM NAV INT\"'
if "Content-Type" in resp and resp["Content-Type"].split(";")[0] in self.SAFE_TYPES:
if 'Content-Security-Policy' in resp:
del resp['Content-Security-Policy']
return resp
if not getattr(resp, '_csp_ignore', False):
resp['Content-Security-Policy'] = _render_csp(self._build_csp(request, resp))
elif 'Content-Security-Policy' in resp:
@@ -293,7 +314,7 @@ class SecurityMiddleware(MiddlewareMixin):
'object-src': ["'none'"],
'frame-src': ['{static}'],
'style-src': ["{static}", "{media}"],
'connect-src': ["{dynamic}", "{media}"],
'connect-src': ["{static}", "{dynamic}", "{media}"],
'img-src': ["{static}", "{media}", "data:"],
'font-src': ["{static}"],
'media-src': ["{static}", "data:"],
@@ -0,0 +1,58 @@
# Generated by Django 4.2.8 on 2024-07-01 09:27
import logging
from django.db import migrations
from django.db.models import Count
logger = logging.getLogger(__name__)
def clean_duplicate_secrets(apps, schema_editor):
# This will autofix all possible duplicate Order.code and OrderPosition.secret values,
# unless Order.code is already too long to append something. This would need to be fixed by
# sysadmins manually.
OrderPosition = apps.get_model("pretixbase", "OrderPosition")
Order = apps.get_model("pretixbase", "Order")
qs = OrderPosition.all.values("secret", "order__event__organizer_id").order_by().annotate(c=Count("*")).filter(c__gt=1)
for row in qs:
affected = OrderPosition.all.filter(
**{k: v for k, v in row.items() if k != "c"}
).order_by("pk")
logger.error(f"Found {row['c']} tickets with with the same secret \"{row['secret']}\" in organizer {row['order__event__organizer_id']}, all except one will be changed")
for i, a in enumerate(affected):
if i > 0:
a.secret = a.secret + "__dupl__" + str(a.pk)
logger.info(
f"Ticket {a.pk} has new secret {a.secret}"
)
a.save(update_fields=["organizer_id", "secret"])
qs = Order.objects.values("code", "event__organizer_id").order_by().annotate(c=Count("*")).filter(c__gt=1)
for row in qs:
affected = Order.objects.filter(
**{k: v for k, v in row.items() if k != "c"}
).order_by("pk")
logger.error(f"Found {row['c']} orders with with the same code \"{row['code']}\" in organizer {row['event__organizer_id']}, all except one will be changed")
for i, a in enumerate(affected):
if i > 0:
if len(a.code) > 16 - len(str(a.pk)):
raise ValueError(f"Cannot auto-fix order with duplicate code {a.code}, order code is too long already")
a.code = a.code + str(a.pk).zfill(16 - len(a.code))
logger.info(
f"Order {a.pk} has new code {a.code}"
)
a.save(update_fields=["organizer_id", "code"])
class Migration(migrations.Migration):
dependencies = [
(
"pretixbase",
"0301_reusablemedium_remove_orderposition",
),
]
operations = [
migrations.RunPython(clean_duplicate_secrets, migrations.RunPython.noop),
]
@@ -0,0 +1,46 @@
# Generated by Django 4.2.8 on 2024-07-01 09:27
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
(
"pretixbase",
"0302_resolve_duplicate_codes_and_secrets",
),
]
operations = [
migrations.RunSQL(
"UPDATE pretixbase_order "
"SET organizer_id = (SELECT e.organizer_id FROM pretixbase_event e WHERE e.id = pretixbase_order.event_id) "
"WHERE pretixbase_order.organizer_id IS NULL;",
migrations.RunSQL.noop,
),
migrations.RunSQL(
"UPDATE pretixbase_orderposition "
"SET organizer_id = (SELECT e.organizer_id FROM pretixbase_order o LEFT JOIN pretixbase_event e ON e.id = o.event_id WHERE o.id = pretixbase_orderposition.order_id) "
"WHERE pretixbase_orderposition.organizer_id IS NULL;",
migrations.RunSQL.noop,
),
migrations.AlterField(
model_name="order",
name="organizer",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="orders",
to="pretixbase.organizer",
),
),
migrations.AlterField(
model_name="orderposition",
name="organizer",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="order_positions",
to="pretixbase.organizer",
),
),
]
@@ -0,0 +1,48 @@
# Generated by Django 5.2.12 on 2026-04-15 20:10
from decimal import Decimal
from django.db import migrations, models
import pretix.helpers.models
class Migration(migrations.Migration):
dependencies = [
('pretixbase', '0303_alter_order_organizer_alter_orderposition_organizer'),
]
operations = [
migrations.AlterField(
model_name='cartposition',
name='tax_rate',
field=pretix.helpers.models.NormalizedDecimalField(decimal_places=4, default=Decimal('0'), max_digits=7),
),
migrations.AlterField(
model_name='invoiceline',
name='tax_rate',
field=pretix.helpers.models.NormalizedDecimalField(decimal_places=4, default=Decimal('0'), max_digits=7),
),
migrations.AlterField(
model_name='orderfee',
name='tax_rate',
field=pretix.helpers.models.NormalizedDecimalField(decimal_places=4, max_digits=7),
),
migrations.AlterField(
model_name='orderposition',
name='tax_rate',
field=pretix.helpers.models.NormalizedDecimalField(decimal_places=4, max_digits=7),
),
migrations.AlterField(
model_name='transaction',
name='tax_rate',
field=pretix.helpers.models.NormalizedDecimalField(decimal_places=4, max_digits=7),
),
migrations.AlterField(
model_name='taxrule',
name='rate',
field=pretix.helpers.models.NormalizedDecimalField(decimal_places=4, max_digits=7),
),
]
+7 -10
View File
@@ -649,7 +649,7 @@ class Event(EventMixin, LoggedModel):
is_remote = models.BooleanField(
default=False,
verbose_name=_("This event is remote or partially remote."),
help_text=_("This will be used to let users know if the event is in a different timezone and lets us calculate users local times."),
help_text=_("This will be used to let users know if the event is in a different timezone, and to let us calculate the local time of a user."),
)
geo_lat = models.FloatField(
verbose_name=_("Latitude"),
@@ -1403,15 +1403,12 @@ class Event(EventMixin, LoggedModel):
for mp in self.organizer.meta_properties.all():
if mp.required and not self.meta_data.get(mp.name):
issues.append(
('<a {a_attr}>' + gettext('You need to fill the meta parameter "{property}".') + '</a>').format(
property=mp.name,
a_attr='href="%s#id_prop-%d-value"' % (
reverse('control:event.settings', kwargs={'organizer': self.organizer.slug, 'event': self.slug}),
mp.pk
)
)
)
issues.append(format_html(
'<a href="{href}{href_hash}">{text}</a>',
text=gettext('You need to fill the meta parameter "{property}".').format(property=mp.name),
href=reverse('control:event.settings', kwargs={'organizer': self.organizer.slug, 'event': self.slug}),
href_hash=f'#id_prop-{mp.pk}-value',
))
responses = event_live_issues.send(self)
for receiver, response in sorted(responses, key=lambda r: str(r[0])):
+2 -1
View File
@@ -49,6 +49,7 @@ from django_scopes import ScopedManager
from pretix.base.settings import COUNTRIES_WITH_STATE_IN_ADDRESS
from pretix.helpers.countries import FastCountryField
from pretix.helpers.models import NormalizedDecimalField
def invoice_filename(instance, filename: str) -> str:
@@ -450,7 +451,7 @@ class InvoiceLine(models.Model):
description = models.TextField()
gross_value = models.DecimalField(max_digits=13, decimal_places=2)
tax_value = models.DecimalField(max_digits=13, decimal_places=2, default=Decimal('0.00'))
tax_rate = models.DecimalField(max_digits=7, decimal_places=2, default=Decimal('0.00'))
tax_rate = NormalizedDecimalField(max_digits=7, decimal_places=4, default=Decimal('0'))
tax_name = models.CharField(max_length=190)
tax_code = models.CharField(max_length=190, null=True, blank=True)
subevent = models.ForeignKey('SubEvent', null=True, blank=True, on_delete=models.PROTECT)
+11 -14
View File
@@ -87,6 +87,7 @@ from pretix.base.timemachine import time_machine_now
from ...helpers import OF_SELF
from ...helpers.countries import CachedCountries, FastCountryField
from ...helpers.models import NormalizedDecimalField
from ...helpers.names import build_name
from ...testutils.middleware import debugflags_var
from ._transactions import (
@@ -224,8 +225,6 @@ class Order(LockModel, LoggedModel):
"Organizer",
related_name="orders",
on_delete=models.CASCADE,
null=True,
blank=True,
)
event = models.ForeignKey(
Event,
@@ -329,7 +328,7 @@ class Order(LockModel, LoggedModel):
default="line",
)
objects = ScopedManager(OrderQuerySet.as_manager().__class__, organizer='event__organizer')
objects = ScopedManager(OrderQuerySet.as_manager().__class__, organizer='organizer')
class Meta:
verbose_name = _("Order")
@@ -2356,8 +2355,8 @@ class OrderFee(RoundingCorrectionMixin, models.Model):
)
description = models.CharField(max_length=190, blank=True)
internal_type = models.CharField(max_length=255, blank=True)
tax_rate = models.DecimalField(
max_digits=7, decimal_places=2,
tax_rate = NormalizedDecimalField(
max_digits=7, decimal_places=4,
verbose_name=_('Tax rate')
)
tax_rule = models.ForeignKey(
@@ -2541,8 +2540,6 @@ class OrderPosition(AbstractPosition):
"Organizer",
related_name="order_positions",
on_delete=models.CASCADE,
null=True,
blank=True,
)
order = models.ForeignKey(
Order,
@@ -2555,8 +2552,8 @@ class OrderPosition(AbstractPosition):
max_digits=13, decimal_places=2, null=True, blank=True,
)
tax_rate = models.DecimalField(
max_digits=7, decimal_places=2,
tax_rate = NormalizedDecimalField(
max_digits=7, decimal_places=4,
verbose_name=_('Tax rate')
)
tax_rule = models.ForeignKey(
@@ -2599,7 +2596,7 @@ class OrderPosition(AbstractPosition):
blank=True,
)
all = ScopedManager(organizer='order__event__organizer')
all = ScopedManager(organizer='organizer')
objects = ActivePositionManager()
def __init__(self, *args, **kwargs):
@@ -3074,8 +3071,8 @@ class Transaction(models.Model):
price_includes_rounding_correction = models.DecimalField(
max_digits=13, decimal_places=2, default=Decimal("0.00")
)
tax_rate = models.DecimalField(
max_digits=7, decimal_places=2,
tax_rate = NormalizedDecimalField(
max_digits=7, decimal_places=4,
verbose_name=_('Tax rate')
)
tax_rule = models.ForeignKey(
@@ -3190,8 +3187,8 @@ class CartPosition(AbstractPosition):
verbose_name=_("Limit for extending expiration date"),
null=True
)
tax_rate = models.DecimalField(
max_digits=7, decimal_places=2, default=Decimal('0.00'),
tax_rate = NormalizedDecimalField(
max_digits=7, decimal_places=4, default=Decimal('0'),
verbose_name=_('Tax rate')
)
tax_code = models.CharField(
+4 -3
View File
@@ -40,6 +40,7 @@ from pretix.base.decimal import round_decimal
from pretix.base.models.base import LoggedModel
from pretix.base.templatetags.money import money_filter
from pretix.helpers.countries import FastCountryField
from pretix.helpers.models import NormalizedDecimalField
class TaxedPrice:
@@ -335,9 +336,9 @@ class TaxRule(LoggedModel):
max_length=190,
choices=TAX_CODE_LISTS,
)
rate = models.DecimalField(
max_digits=10,
decimal_places=2,
rate = NormalizedDecimalField(
max_digits=7,
decimal_places=4,
validators=[
MaxValueValidator(
limit_value=Decimal("100.00"),
+45 -38
View File
@@ -32,8 +32,10 @@
# Unless required by applicable law or agreed to in writing, software distributed under the Apache License 2.0 is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License.
import datetime
from dataclasses import dataclass
from decimal import ROUND_HALF_UP, Decimal
from typing import Union
from django.conf import settings
from django.core.exceptions import ValidationError
@@ -421,27 +423,33 @@ class Voucher(LoggedModel):
return False
@staticmethod
def clean_quota_get_ignored(old_instance):
quotas = set()
was_valid = old_instance and (
old_instance.valid_until is None or old_instance.valid_until >= now()
)
if old_instance and old_instance.block_quota and was_valid:
if old_instance.quota:
quotas.add(old_instance.quota)
elif old_instance.variation:
quotas |= set(old_instance.variation.quotas.filter(subevent=old_instance.subevent))
elif old_instance.item:
if old_instance.item.has_variations:
quotas |= set(
Quota.objects.filter(pk__in=Quota.variations.through.objects.filter(
itemvariation__item=old_instance.item,
quota__subevent=old_instance.subevent,
).values('quota_id'))
)
else:
quotas |= set(old_instance.item.quotas.filter(subevent=old_instance.subevent))
return quotas
def get_affected_quotas(quota, item, variation, subevent):
if quota:
return {quota}
elif item and variation:
return set(variation.quotas.filter(subevent=subevent))
elif item and not item.has_variations:
return set(item.quotas.filter(subevent=subevent))
elif item and item.has_variations:
return set(
Quota.objects.filter(
pk__in=Quota.variations.through.objects.filter(
itemvariation__item=item,
quota__subevent=subevent,
).values('quota_id')
)
)
else:
return set()
@staticmethod
def clean_quota_get_ignored(voucher_data: Union["VoucherBulkData", "Voucher"]):
if voucher_data:
valid = voucher_data.valid_until is None or voucher_data.valid_until >= now()
if valid and voucher_data.block_quota and voucher_data.max_usages > voucher_data.redeemed:
return Voucher.get_affected_quotas(voucher_data.quota, voucher_data.item, voucher_data.variation, voucher_data.subevent)
return set()
@staticmethod
def clean_quota_check(data, cnt, old_instance, event, quota, item, variation):
@@ -453,22 +461,8 @@ class Voucher(LoggedModel):
if event.has_subevents and data.get('block_quota') and not data.get('subevent'):
raise ValidationError(_('If you want this voucher to block quota, you need to select a specific date.'))
if quota:
new_quotas = {quota}
elif item and variation:
new_quotas = set(variation.quotas.filter(subevent=data.get('subevent')))
elif item and not item.has_variations:
new_quotas = set(item.quotas.filter(subevent=data.get('subevent')))
elif item and item.has_variations:
new_quotas = set(
Quota.objects.filter(
pk__in=Quota.variations.through.objects.filter(
itemvariation__item=item,
quota__subevent=data.get('subevent'),
).values('quota_id')
)
)
else:
new_quotas = Voucher.get_affected_quotas(quota, item, variation, data.get('subevent'))
if not new_quotas:
raise ValidationError(_('You need to select a specific product or quota if this voucher should reserve '
'tickets.'))
@@ -644,3 +638,16 @@ class Voucher(LoggedModel):
]
).aggregate(s=Sum('voucher_budget_use'))['s'] or Decimal('0.00')
return ops
@dataclass
class VoucherBulkData:
item: object
variation: object
quota: object
block_quota: bool
valid_until: datetime.datetime
subevent: object
redeemed: int
max_usages: int
allow_ignore_quota: bool
+52
View File
@@ -1706,6 +1706,58 @@ class GiftCardPayment(BasePaymentProvider):
)
class BaseHistoricalPaymentProvider(BasePaymentProvider):
"""
Base class for payment providers that no longer exist but can't be deleted to make sure historical
payments are shown correctly.
Subclasses are recommended to only implement:
- identifier
- verbose_name
- public_name
- payment_control_render
- payment_control_render_short
- refund_control_render
- refund_control_render_short
- render_invoice_text
- render_invoice_stamp
- api_payment_details
- api_refund_details
- shred_payment_info
- matching_id
- refund_matching_id
"""
@property
def is_enabled(self) -> bool:
return False
@property
def settings_form_fields(self) -> dict:
return {}
def is_allowed(self, request: HttpRequest, total: Decimal=None) -> bool:
return False
def payment_is_valid_session(self, request: HttpRequest, payment: OrderPayment):
return False
def order_change_allowed(self, order: Order, request: HttpRequest=None) -> bool:
return False
def payment_refund_supported(self, payment: OrderPayment) -> bool:
return False
def payment_partial_refund_supported(self, payment: OrderPayment) -> bool:
return False
def execute_payment(self, request: HttpRequest, payment: OrderPayment):
raise PaymentException(_("This payment provider exists for historical purposes only and is no longer usable."))
def execute_refund(self, refund: OrderRefund):
raise PaymentException(_("This payment provider exists for historical purposes only and is no longer usable."))
@receiver(register_payment_providers, dispatch_uid="payment_free")
def register_payment_provider(sender, **kwargs):
return [FreeOrderProvider, BoxOfficeProvider, OffsettingProvider, ManualPayment, GiftCardPayment]
-3
View File
@@ -245,9 +245,6 @@ def recv_classic(sender, **kwargs):
def assign_ticket_secret(event, position, force_invalidate_if_revokation_list_used=False, force_invalidate=False, save=True):
if position.pk and position.issued_gift_cards.exists():
return
gen = event.ticket_secret_generator
if gen.use_revocation_list and force_invalidate_if_revokation_list_used:
force_invalidate = True
-4
View File
@@ -1599,7 +1599,6 @@ class OrderChangeManager:
'seat_forbidden': gettext_lazy('The selected product does not allow to select a seat.'),
'tax_rule_country_blocked': gettext_lazy('The selected country is blocked by your tax rule.'),
'gift_card_change': gettext_lazy('You cannot change the price of a position that has been used to issue a gift card.'),
'gift_card_secret': gettext_lazy('You cannot change the ticket secret of a position that has been used to issue a gift card.'),
'max_items_per_product': ngettext_lazy(
"You cannot select more than %(max)s item of the product %(product)s.",
"You cannot select more than %(max)s items of the product %(product)s.",
@@ -1757,9 +1756,6 @@ class OrderChangeManager:
self._operations.append(self.RegenerateSecretOperation(position))
def change_ticket_secret(self, position: OrderPosition, new_secret: str):
if position.issued_gift_cards.exists():
raise OrderError(self.error_messages['gift_card_secret'])
self._operations.append(self.ChangeSecretOperation(position, new_secret))
def change_valid_from(self, position: OrderPosition, new_value: datetime):
+3 -2
View File
@@ -535,8 +535,9 @@ EventPluginRegistry = PluginAwareRegistry # for backwards compatibility
event_live_issues = EventPluginSignal()
"""
This signal is sent out to determine whether an event can be taken live. If you want to
prevent the event from going live, return a string that will be displayed to the user
as the error message. If you don't, your receiver should return ``None``.
prevent the event from going live, return an error message to display to the user (either
as a SafeString containing HTML, or a string that will be HTML-escaped). If you don't,
your receiver should return ``None``.
As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
"""
+3 -2
View File
@@ -22,6 +22,7 @@
import importlib
from django import template
from django.utils.html import conditional_escape
from django.utils.safestring import mark_safe
from pretix.base.models import Event
@@ -44,7 +45,7 @@ def eventsignal(event: Event, signame: str, **kwargs):
_html = []
for receiver, response in signal.send(event, **kwargs):
if response:
_html.append(response)
_html.append(conditional_escape(response))
return mark_safe("".join(_html))
@@ -63,5 +64,5 @@ def signal(signame: str, request, **kwargs):
_html = []
for receiver, response in signal.send(request, **kwargs):
if response:
_html.append(response)
_html.append(conditional_escape(response))
return mark_safe("".join(_html))
+18
View File
@@ -26,6 +26,8 @@ from babel.numbers import format_currency
from django import template
from django.conf import settings
from django.template.defaultfilters import floatformat
from django.utils import formats
from django.utils.safestring import mark_safe
from pretix.base.i18n import get_babel_locale
@@ -82,3 +84,19 @@ def money_numberfield_filter(value: Decimal, arg=''):
places = settings.CURRENCY_PLACES.get(arg, 2)
return str(value.quantize(Decimal('1') / 10 ** places, ROUND_HALF_UP))
@register.filter(is_safe=True)
def tax_rate_format(number):
"""
Display a Decimal to its significant decimal places, used for tax rates.
"""
assert isinstance(number, Decimal)
return mark_safe(
formats.number_format(
number.normalize(),
-number.as_tuple().exponent,
use_l10n=True,
force_grouping=False,
)
)
+1 -1
View File
@@ -27,11 +27,11 @@ from django.template import TemplateDoesNotExist, loader
from django.template.loader import get_template
from django.utils.functional import Promise
from django.utils.translation import gettext as _
from django.views.decorators.csrf import requires_csrf_token
from sentry_sdk import last_event_id
from pretix.base.i18n import language
from pretix.base.middleware import get_language_from_request
from pretix.multidomain.middlewares import requires_csrf_token
def csrf_failure(request, reason=""):
+43 -1
View File
@@ -19,14 +19,56 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
import logging
import os
from celery import Celery
from celery import Celery, signals
from django.dispatch import receiver
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pretix.settings")
logger = logging.getLogger(__name__)
from django.conf import settings
app = Celery('pretix')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@receiver(signals.before_task_publish)
def on_before_task_publish(sender, body, exchange, routing_key, headers, properties, declare, retry_policy, **kwargs):
from pretix.helpers.logs import local
trace = getattr(local, 'trace', [])
request_id = getattr(local, 'request_id', None)
if request_id:
trace.append(request_id)
headers["X-Pretix-Trace"] = " ".join(trace)
@receiver(signals.task_received)
def on_task_received(sender, request, **kwargs):
trace = request._request_dict.get("X-Pretix-Trace")
if trace:
logger.info(f"Task {request.id} has trace {trace}")
@receiver(signals.task_prerun)
def on_task_prerun(sender, task_id, task, **kwargs):
from pretix.helpers.logs import local
local.request_id = task_id
if task.request.headers and "X-Pretix-Trace" in task.request.headers:
local.trace = task.request.headers["X-Pretix-Trace"].split(" ")
else:
local.trace = []
local.trace.append(task_id)
@receiver(signals.task_postrun)
def on_task_postrun(sender, task_id, task, **kwargs):
from pretix.helpers.logs import local
local.request_id = None
local.trace = []
+1 -7
View File
@@ -1679,7 +1679,7 @@ class CountriesAndEUAndStates(CountriesAndEU):
class TaxRuleLineForm(I18nForm):
country = LazyTypedChoiceField(
choices=CountriesAndEUAndStates(),
choices=lazy(lambda: CountriesAndEUAndStates(), CountriesAndEUAndStates),
required=False
)
address_type = forms.ChoiceField(
@@ -1905,12 +1905,6 @@ class QuickSetupForm(I18nForm):
required=False,
help_text=_("We'll show this publicly to allow attendees to contact you.")
)
contact_url = forms.URLField(
label=_("Contact URL"),
required=False,
help_text=_("If you set this, the footer contact link will point here instead of using the email address above. "
"Please note that you still need to add a contact email address that will be shared with all emails you send.")
)
total_quota = forms.IntegerField(
label=_("Total capacity"),
min_value=0,
+277 -53
View File
@@ -32,16 +32,20 @@
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License.
import copy
import csv
from collections import namedtuple
from collections import Counter, namedtuple
from io import StringIO
from django import forms
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.core.validators import EmailValidator
from django.db.models import Count, F, Max
from django.db.models.functions import Upper
from django.forms.utils import ErrorDict
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _, pgettext_lazy
from django_scopes.forms import SafeModelChoiceField
from pretix.base.email import get_available_placeholders
@@ -50,7 +54,10 @@ from pretix.base.forms import (
)
from pretix.base.forms.widgets import format_placeholders_help_text
from pretix.base.i18n import language
from pretix.base.models import Item, Voucher
from pretix.base.models import Item, ItemVariation, Quota, SubEvent, Voucher
from pretix.base.models.vouchers import VoucherBulkData
from pretix.base.services.locking import lock_objects
from pretix.base.services.quotas import QuotaAvailability
from pretix.control.forms import SplitDateTimeField, SplitDateTimePickerWidget
from pretix.control.forms.widgets import Select2, Select2ItemVarQuota
from pretix.control.signals import voucher_form_validation
@@ -105,20 +112,22 @@ class VoucherForm(I18nModelForm):
except Item.DoesNotExist:
pass
super().__init__(*args, **kwargs)
if not self.event and self.instance:
self.event = self.instance.event
self.fields['tag'].widget.attrs['data-typeahead-url'] = reverse('control:event.vouchers.tags.typeahead', kwargs={
'event': instance.event.slug,
'organizer': instance.event.organizer.slug,
'event': self.event.slug,
'organizer': self.event.organizer.slug,
})
if instance.event.has_subevents:
self.fields['subevent'].queryset = instance.event.subevents.all()
if self.event.has_subevents:
self.fields['subevent'].queryset = self.event.subevents.all()
self.fields['subevent'].widget = Select2(
attrs={
'data-model-select2': 'event',
'data-select2-url': reverse('control:event.subevents.select2', kwargs={
'event': instance.event.slug,
'organizer': instance.event.organizer.slug,
'event': self.event.slug,
'organizer': self.event.organizer.slug,
}),
}
)
@@ -128,18 +137,19 @@ class VoucherForm(I18nModelForm):
del self.fields['subevent']
choices = []
if 'itemvar' in initial or (self.data and 'itemvar' in self.data):
iv = self.data.get('itemvar') or initial.get('itemvar', '')
prefix = (self.prefix + '-') if self.prefix else ''
if 'itemvar' in initial or (self.data and prefix + 'itemvar' in self.data):
iv = self.data.get(prefix + 'itemvar', '') or initial.get('itemvar', '') or ''
if iv.startswith('q-'):
q = self.instance.event.quotas.get(pk=iv[2:])
q = self.event.quotas.get(pk=iv[2:])
choices.append(('q-%d' % q.pk, _('Any product in quota "{quota}"').format(quota=q)))
elif '-' in iv:
itemid, varid = iv.split('-')
i = self.instance.event.items.get(pk=itemid)
i = self.event.items.get(pk=itemid)
v = i.variations.get(pk=varid)
choices.append(('%d-%d' % (i.pk, v.pk), '%s %s' % (str(i), v.value)))
elif iv:
i = self.instance.event.items.get(pk=iv)
i = self.event.items.get(pk=iv)
if i.variations.exists():
choices.append((str(i.pk), _('{product} Any variation').format(product=i)))
else:
@@ -150,8 +160,8 @@ class VoucherForm(I18nModelForm):
attrs={
'data-model-select2': 'generic',
'data-select2-url': reverse('control:event.vouchers.itemselect2', kwargs={
'event': instance.event.slug,
'organizer': instance.event.organizer.slug,
'event': self.event.slug,
'organizer': self.event.organizer.slug,
}),
'data-placeholder': _('All products')
}
@@ -159,7 +169,7 @@ class VoucherForm(I18nModelForm):
self.fields['itemvar'].required = False
self.fields['itemvar'].widget.choices = self.fields['itemvar'].choices
if self.instance.event.seating_plan or self.instance.event.subevents.filter(seating_plan__isnull=False).exists():
if self.event.seating_plan or self.event.subevents.filter(seating_plan__isnull=False).exists():
self.fields['seat'] = forms.CharField(
label=_("Specific seat ID"),
max_length=255,
@@ -169,40 +179,45 @@ class VoucherForm(I18nModelForm):
help_text=str(self.instance.seat) if self.instance.seat else '',
)
def parse_itemvar(self, data):
try:
itemid = quotaid = None
iv = data.get('itemvar', '')
if iv.startswith('q-'):
quotaid = iv[2:]
elif '-' in iv:
itemid, varid = iv.split('-')
elif iv:
itemid, varid = iv, None
else:
itemid, varid = None, None
if itemid:
item = self.event.items.get(pk=itemid)
if varid:
variation = item.variations.get(pk=varid)
else:
variation = None
quota = None
elif quotaid:
quota = self.event.quotas.get(pk=quotaid)
item = None
variation = None
else:
quota = None
item = None
variation = None
return (item, variation, quota)
except ObjectDoesNotExist:
raise ValidationError(_("Invalid product selected."))
def clean(self):
data = super().clean()
if not self._errors:
try:
itemid = quotaid = None
iv = self.data.get('itemvar', '')
if iv.startswith('q-'):
quotaid = iv[2:]
elif '-' in iv:
itemid, varid = iv.split('-')
elif iv:
itemid, varid = iv, None
else:
itemid, varid = None, None
if itemid:
self.instance.item = self.instance.event.items.get(pk=itemid)
if varid:
self.instance.variation = self.instance.item.variations.get(pk=varid)
else:
self.instance.variation = None
self.instance.quota = None
elif quotaid:
self.instance.quota = self.instance.event.quotas.get(pk=quotaid)
self.instance.item = None
self.instance.variation = None
else:
self.instance.quota = None
self.instance.item = None
self.instance.variation = None
except ObjectDoesNotExist:
raise ValidationError(_("Invalid product selected."))
self.instance.item, self.instance.variation, self.instance.quota = self.parse_itemvar(self.data)
if 'codes' in data:
data['codes'] = [a.strip() for a in data.get('codes', '').strip().split("\n") if a]
@@ -214,7 +229,7 @@ class VoucherForm(I18nModelForm):
try:
Voucher.clean_item_properties(
data, self.instance.event,
data, self.event,
self.instance.quota, self.instance.item, self.instance.variation,
seats_given=data.get('seat') or data.get('seats'),
block_quota=data.get('block_quota')
@@ -234,7 +249,7 @@ class VoucherForm(I18nModelForm):
try:
Voucher.clean_subevent(
data, self.instance.event
data, self.event
)
except ValidationError as e:
raise ValidationError({"subevent": e.message})
@@ -250,19 +265,19 @@ class VoucherForm(I18nModelForm):
if check_quota:
Voucher.clean_quota_check(
data, cnt, self.initial_instance_data,
self.instance.event, self.instance.quota, self.instance.item, self.instance.variation
self.event, self.instance.quota, self.instance.item, self.instance.variation
)
Voucher.clean_voucher_code(data, self.instance.event, self.instance.pk)
Voucher.clean_voucher_code(data, self.event, self.instance.pk)
if 'seat' in self.fields:
if data.get('seat'):
self.instance.seat = Voucher.clean_seat_id(
data, self.instance.item, self.instance.quota, self.instance.event, self.instance.pk
data, self.instance.item, self.instance.quota, self.event, self.instance.pk
)
self.instance.item = self.instance.seat.product
else:
self.instance.seat = None
voucher_form_validation.send(sender=self.instance.event, form=self, data=data)
voucher_form_validation.send(sender=self.event, form=self, data=data)
return data
@@ -270,6 +285,215 @@ class VoucherForm(I18nModelForm):
return super().save(commit)
class VoucherBulkEditForm(VoucherForm):
def __init__(self, *args, **kwargs):
self.mixed_values = kwargs.pop('mixed_values')
self.queryset = kwargs.pop('queryset')
super().__init__(**kwargs)
del self.fields["code"]
self.fields.pop("seat", None)
def is_bulk_checked(self, fieldname):
return self.prefix + fieldname in self.data.getlist('_bulk')
def clean(self):
# We skip the parent class because it's not suited for bulk editing and implement custom validation here.
# This does not validate *everything* we validate in VoucherForm. For example, we skip validation that one does
# not create a voucher for an add-on product or that the seat matches the product to save on complexity.
# This is a UX validation only anyway, since one could first create the voucher and then make the product an
# add-on product. However, we need to validate everything that we don't want violated in the database.
data = super(VoucherForm, self).clean()
if self.is_bulk_checked("itemvar"):
data["item"], data["variation"], data["quota"] = self.parse_itemvar(data)
if self.is_bulk_checked("max_usages") and "max_usages" in data:
max_redeemed = self.queryset.aggregate(m=Max("redeemed"))["m"]
if data["max_usages"] < max_redeemed:
raise ValidationError(_(
"You cannot reduce the maximum number of redemptions to %(max_usages)s, because at least one "
"of the selected vouchers has already been redeemed %(max_redeemed)s times."
) % {"max_usages": data["max_usages"], "max_redeemed": max_redeemed})
# Check diff on product and quota usage based on old groups of vouchers
if any(self.is_bulk_checked(k) for k in ("max_usages", "itemvar", "block_quota", "valid_until", "subevent")):
quota_diff = Counter()
current_vouchers = self.queryset.order_by().values(
"item", "variation", "quota", "block_quota", "valid_until", "subevent", "redeemed", "max_usages",
"allow_ignore_quota",
).annotate(c=Count("*"))
item_cache = {i.pk: i for i in Item.objects.filter(pk__in=[c["item"] for c in current_vouchers])}
var_cache = {v.pk: v for v in ItemVariation.objects.filter(pk__in=[c["variation"] for c in current_vouchers])}
quota_cache = {q.pk: q for q in Quota.objects.filter(pk__in=[c["quota"] for c in current_vouchers])}
subevent_cache = {s.pk: s for s in SubEvent.objects.filter(pk__in=[c["subevent"] for c in current_vouchers])}
for current in current_vouchers:
bulk_count = current.pop('c')
current = VoucherBulkData(**current)
# Get quotas that are currently used
if current.item:
current.item = item_cache[current.item]
if current.variation:
current.variation = var_cache[current.variation]
if current.quota:
current.quota = quota_cache[current.quota]
if current.subevent:
current.subevent = subevent_cache[current.subevent]
old_quotas = Voucher.clean_quota_get_ignored(current)
old_amount = max(current.max_usages - current.redeemed, 0) * bulk_count
# Predict state after change
after_change = copy.copy(current)
if self.is_bulk_checked("itemvar") and "itemvar" in data:
after_change.item = data["item"]
after_change.variation = data["variation"]
after_change.quota = data["quota"]
if self.is_bulk_checked("subevent") and "subevent" in data:
after_change.subevent = data["subevent"]
if self.is_bulk_checked("max_usages") and "max_usages" in data:
after_change.max_usages = data["max_usages"]
if self.is_bulk_checked("block_quota") and "block_quota" in data:
after_change.block_quota = data["block_quota"]
if self.is_bulk_checked("valid_until") and "valid_until" in data:
after_change.valid_until = data["valid_until"]
if self.is_bulk_checked("allow_ignore_quota") and "allow_ignore_quota" in data:
after_change.allow_ignore_quota = data["allow_ignore_quota"]
if after_change.quota and self.event.has_subevents and not after_change.subevent:
raise ValidationError(_("You cannot create a voucher that allows selection of a quota but has no date selected."))
if after_change.quota and after_change.subevent and after_change.quota.subevent_id != after_change.subevent.pk:
raise ValidationError(_("The selected quota does not match the selected subevent."))
if after_change.block_quota and self.event.has_subevents and not after_change.subevent:
raise ValidationError(
_('If you want this voucher to block quota, you need to select a specific date.'))
if after_change.block_quota and not after_change.item and not after_change.quota:
raise ValidationError(
_('You need to select a specific product or quota if this voucher should reserve '
'tickets.')
)
if after_change.allow_ignore_quota:
# todo: is this the most useful way to do this?
continue
new_quotas = Voucher.clean_quota_get_ignored(after_change)
new_amount = max(after_change.max_usages - after_change.redeemed, 0) * bulk_count
if new_quotas != old_quotas or new_amount != old_amount:
for q in old_quotas:
quota_diff[q] -= old_amount
for q in new_quotas:
quota_diff[q] += new_amount
if any(v > 0 for q, v in quota_diff.items()):
lock_objects([q for q, v in quota_diff.items() if q.size is not None and v > 0], shared_lock_objects=[self.event])
qa = QuotaAvailability(count_waitinglist=False)
qa.queue(*(q for q, v in quota_diff.items() if v > 0))
qa.compute()
if any(qa.results[q][0] != Quota.AVAILABILITY_OK or (qa.results[q][1] is not None and qa.results[q][1] < required)
for q, required in quota_diff.items() if required > 0):
raise ValidationError(_(
'There is no sufficient quota available to perform this change.'
))
has_seat = self.queryset.filter(seat__isnull=False).exists()
if has_seat:
if self.is_bulk_checked("max_usages"):
raise ValidationError(_(
'Changing the maximum number of usages in bulk is not supported if any of the selected vouchers '
'is assigned a seat.'
))
if self.is_bulk_checked("subevent"):
raise ValidationError(pgettext_lazy(
'subevent',
'Changing the date in bulk is not supported if any of the selected vouchers '
'is assigned a seat.'
))
if self.is_bulk_checked("itemvar") and data["quota"]:
raise ValidationError(_(
'Changing the product to a quota is not supported if any of the selected vouchers '
'is assigned a seat.'
))
if self.is_bulk_checked("valid_until"):
if data["valid_until"] is None or data["valid_until"] >= now():
currently_not_blocked_seats = self.queryset.filter(
seat__isnull=False,
max_usages__gt=F("redeemed"),
valid_until__lt=now(),
)
if self.event.has_subevents:
subevents = self.event.subevents.filter(pk__in=currently_not_blocked_seats.values_list("subevent"))
for se in subevents:
conflicts = currently_not_blocked_seats.filter(
subevent=se
).exclude(
seat_id__in=se.free_seats().values("pk")
)
if conflicts:
raise ValidationError(_(
'This change cannot be completed because not all assigned seats of the vouchers are '
'still available'
))
else:
conflicts = currently_not_blocked_seats.exclude(
seat_id__in=self.event.free_seats().values("pk")
)
if conflicts:
raise ValidationError(_(
'This change cannot be completed because not all assigned seats of the vouchers are '
'still available'
))
return data
def save(self, commit=True):
objs = list(self.queryset)
fields = set()
check_map = {
'price_mode': '__price',
'value': '__price',
}
for k in self.fields:
if not self.is_bulk_checked(check_map.get(k, k)):
continue
if k == 'itemvar':
fields.add("item")
fields.add("variation")
fields.add("quota")
else:
fields.add(k)
for obj in objs:
if k == 'itemvar':
obj.item = self.cleaned_data["item"]
obj.variation = self.cleaned_data["variation"]
obj.quota = self.cleaned_data["quota"]
else:
setattr(obj, k, self.cleaned_data[k])
fields = [f for f in fields if f != 'itemvars']
if fields:
Voucher.objects.bulk_update(objs, fields, 200)
def full_clean(self):
if len(self.data) == 0:
# form wasn't submitted
self._errors = ErrorDict()
return
super().full_clean()
def _post_clean(self):
pass # skip model-level clean
class VoucherBulkForm(VoucherForm):
codes = forms.CharField(
widget=forms.Textarea,
+17 -4
View File
@@ -37,7 +37,7 @@ from urllib.parse import quote, urljoin, urlparse
from django.conf import settings
from django.contrib.auth import REDIRECT_FIELD_NAME, logout
from django.contrib.auth.views import redirect_to_login
from django.http import Http404
from django.http import Http404, HttpResponse
from django.shortcuts import get_object_or_404, resolve_url
from django.template.response import TemplateResponse
from django.urls import get_script_prefix, resolve, reverse
@@ -98,6 +98,8 @@ class PermissionMiddleware:
super().__init__()
def _login_redirect(self, request):
from django.contrib.auth.views import redirect_to_login
# Taken from django/contrib/auth/decorators.py
path = request.build_absolute_uri()
# urlparse chokes on lazy objects in Python 3, force to str
@@ -110,10 +112,21 @@ class PermissionMiddleware:
if ((not login_scheme or login_scheme == current_scheme) and
(not login_netloc or login_netloc == current_netloc)):
path = request.get_full_path()
from django.contrib.auth.views import redirect_to_login
return redirect_to_login(
path, resolved_login_url, REDIRECT_FIELD_NAME)
if request.headers.get("X-Requested-With") == "XMLHttpRequest":
# It's not useful to return a 302 redirect on a XMLHttpRequest request, because
# the XMLHttpRequest is unable to detect redirects.
return HttpResponse(
"Authentication required",
status=401,
headers={
# Appending ?next= is handled by client, because it should be the top-level context url,
# not the URL called in the background
"X-Login-Url": resolved_login_url,
}
)
return redirect_to_login(path, resolved_login_url, REDIRECT_FIELD_NAME)
def __call__(self, request):
url = resolve(request.path_info)
+12 -4
View File
@@ -39,7 +39,8 @@ from pretix.base.signals import (
html_page_start = GlobalSignal()
"""
This signal allows you to put code in the beginning of the main page for every
page in the backend. You are expected to return HTML.
page in the backend. You are expected to return a SafeString containing HTML, or
a string that will be HTML-escaped.
The ``sender`` keyword argument will contain the request.
"""
@@ -129,7 +130,7 @@ event_dashboard_top = EventPluginSignal()
Arguments: 'request'
This signal is sent out to include custom HTML in the top part of the the event dashboard.
Receivers should return HTML.
Receivers should return a SafeString containing HTML, or a string that will be HTML-escaped.
As with all event plugin signals, the ``sender`` keyword argument will contain the event.
An additional keyword argument ``subevent`` *can* contain a sub-event.
@@ -172,6 +173,7 @@ Arguments: 'form'
This signal allows you to add additional HTML to the form that is used for modifying vouchers.
You receive the form object in the ``form`` keyword argument.
Receivers should return a SafeString containing HTML, or a string that will be HTML-escaped.
As with all event plugin signals, the ``sender`` keyword argument will contain the event.
"""
@@ -209,6 +211,7 @@ Arguments: 'quota'
This signal allows you to append HTML to a Quota's detail view. You receive the
quota as argument in the ``quota`` keyword argument.
Receivers should return a SafeString containing HTML, or a string that will be HTML-escaped.
As with all event plugin signals, the ``sender`` keyword argument will contain the event.
"""
@@ -219,6 +222,7 @@ Arguments: 'subevent'
This signal allows you to append HTML to a SubEvent's detail view. You receive the
subevent as argument in the ``subevent`` keyword argument.
Receivers should return a SafeString containing HTML, or a string that will be HTML-escaped.
As with all event plugin signals, the ``sender`` keyword argument will contain the event.
"""
@@ -265,7 +269,8 @@ order_info = EventPluginSignal()
"""
Arguments: ``order``, ``request``
This signal is sent out to display additional information on the order detail page
This signal is sent out to display additional information on the order detail page.
Receivers should return a SafeString containing HTML, or a string that will be HTML-escaped.
As with all event plugin signals, the ``sender`` keyword argument will contain the event.
Additionally, the argument ``order`` and ``request`` are available.
@@ -275,7 +280,8 @@ order_approve_info = EventPluginSignal()
"""
Arguments: ``order``, ``request``
This signal is sent out to display additional information on the order approve page
This signal is sent out to display additional information on the order approve page.
Receivers should return a SafeString containing HTML, or a string that will be HTML-escaped.
As with all event plugin signals, the ``sender`` keyword argument will contain the event.
Additionally, the argument ``order`` and ``request`` are available.
@@ -286,6 +292,7 @@ order_position_buttons = EventPluginSignal()
Arguments: ``order``, ``position``, ``request``
This signal is sent out to display additional buttons for a single position of an order.
Receivers should return a SafeString containing HTML, or a string that will be HTML-escaped.
As with all event plugin signals, the ``sender`` keyword argument will contain the event.
Additionally, the argument ``order`` and ``request`` are available.
@@ -315,6 +322,7 @@ Arguments: 'request'
This signal is sent out to include template snippets on the settings page of an event
that allows generating a pretix Widget code.
Receivers should return a SafeString containing HTML, or a string that will be HTML-escaped.
As with all event plugin signals, the ``sender`` keyword argument will contain the event.
A second keyword argument ``request`` will contain the request object.
@@ -56,5 +56,4 @@
</form>
<script type="text/plain" id="good_origin">{{ good_origin }}</script>
<script type="text/plain" id="bad_origin_report_url">{{ bad_origin_report_url }}</script>
<!-- pretix-login-marker -->{# marker required for ajax calls to detect that user session is over #}
{% endblock %}
@@ -6,7 +6,7 @@ If this was you, enter the following code in the setup form:
{{ code }}
Don't share this code with anyone. The {{ instance }} team will never ask you for it.
Don't share this code with anyone unless you want to authorize them to use this address for this purpose. The {{ instance }} team will never ask you for it.
If you didn't request this, you can safely ignore this email.
@@ -10,7 +10,7 @@ We noticed a new sign-in to your {{ instance }} account:
{% endif %}
{% blocktrans with url=url|safe %}If it was you, no action is needed.
If you don't recognise this sign-in, please change your password immediately:
If you don't recognize this sign-in, please change your password immediately:
{{ url }}
@@ -50,6 +50,46 @@
{% endblocktrans %}
</div>
{% endif %}
{% if dkim_warning %}
<div class="alert alert-danger">
<p>
{{ dkim_warning }}
</p>
<p>
{% trans "Your new DKIM record should be set up as a CNAME record like this:" %}
</p>
<pre><code>{{ dkim_hostname }} CNAME {{ dkim_cname }}</code></pre>
<p>
{% trans "Please keep in mind that updates to DNS might require multiple hours to take effect." %}
</p>
</div>
{% elif dkim_cname %}
<div class="alert alert-success">
{% blocktrans trimmed %}
We found a DKIM record on your domain for this system. Great!
{% endblocktrans %}
</div>
{% endif %}
{% if dmarc_warning %}
<div class="alert alert-danger">
<p>
{{ dmarc_warning }}
</p>
<p>
{% trans "Your new DMARC record could look like this:" %}
</p>
<pre><code>_dmarc.{{ hostname }} TXT "v=DMARC1; p=quarantine; sp=none; adkim=r; aspf=r;"</code></pre>
<p>
{% trans "Please keep in mind that updates to DNS might require multiple hours to take effect." %}
</p>
</div>
{% elif dkim_cname %}
<div class="alert alert-success">
{% blocktrans trimmed %}
We found a DMARC record on your domain for this system. Great!
{% endblocktrans %}
</div>
{% endif %}
{% if verification %}
<h3>{% trans "Verification" %}</h3>
<p>
@@ -70,7 +110,7 @@
</div>
</div>
{% if spf_warning %}
{% if spf_warning or dkim_warning or dmarc_warning %}
<div class="form-group submit-group">
<a href="" class="btn btn-default btn-save">
{% trans "Cancel" %}
@@ -19,7 +19,7 @@
</p>
<ul>
{% for issue in issues %}
<li>{{ issue|safe }}</li>
<li>{{ issue }}</li>
{% endfor %}
</ul>
</div>
@@ -42,7 +42,7 @@
</p>
<ul>
{% for issue in issues %}
<li>{{ issue|safe }}</li>
<li>{{ issue }}</li>
{% endfor %}
</ul>
</div>
@@ -193,7 +193,6 @@
{% endblocktrans %}
</p>
{% bootstrap_field form.contact_mail layout="control" %}
{% bootstrap_field form.contact_url layout="control" %}
{% bootstrap_field form.imprint_url layout="control" %}
</div>
</fieldset>
@@ -156,11 +156,11 @@
<br/>
<small class="text-muted">
{% if not i.tax_rule.price_includes_tax %}
{% blocktrans trimmed with rate=i.tax_rule.rate|floatformat:-2 taxname=i.tax_rule.name %}
{% blocktrans trimmed with rate=i.tax_rule.rate|tax_rate_format taxname=i.tax_rule.name %}
<strong>plus</strong> {{ rate }}% {{ taxname }}
{% endblocktrans %}
{% else %}
{% blocktrans trimmed with rate=i.tax_rule.rate|floatformat:-2 taxname=i.tax_rule.name|default:s_taxes %}
{% blocktrans trimmed with rate=i.tax_rule.rate|tax_rate_format taxname=i.tax_rule.name|default:s_taxes %}
incl. {{ rate }}% {{ taxname }}
{% endblocktrans %}
{% endif %}
@@ -284,14 +284,6 @@
</div>
<div class="col-sm-4">
{% bootstrap_field position.form.operation_secret layout='inline' %}
{% if position.issued_gift_cards.exists %}
<div class="alert alert-info">
{% blocktrans trimmed %}
Ticket secrets of order positions that have been used to issue a gift card can not
be changed. Only the link will be changed in this case.
{% endblocktrans %}
</div>
{% endif %}
</div>
</div>
@@ -705,7 +705,7 @@
{% if line.tax_rate %}
<br/>
<small>
{% blocktrans trimmed with rate=line.tax_rate|floatformat:-2 taxname=line.tax_rule.name|default:s_taxes %}
{% blocktrans trimmed with rate=line.tax_rate|tax_rate_format taxname=line.tax_rule.name|default:s_taxes %}
<strong>plus</strong> {{ rate }}% {{ taxname }}
{% endblocktrans %}
</small>
@@ -715,7 +715,7 @@
{% if line.tax_rate and line.price %}
<br/>
<small>
{% blocktrans trimmed with rate=line.tax_rate|floatformat:-2 taxname=line.tax_rule.name|default:s_taxes %}
{% blocktrans trimmed with rate=line.tax_rate|tax_rate_format taxname=line.tax_rule.name|default:s_taxes %}
incl. {{ rate }}% {{ taxname }}
{% endblocktrans %}
</small>
@@ -755,7 +755,7 @@
{% if fee.tax_rate %}
<br/>
<small>
{% blocktrans trimmed with rate=fee.tax_rate|floatformat:-2 taxname=fee.tax_rule.name|default:s_taxes %}
{% blocktrans trimmed with rate=fee.tax_rate|tax_rate_format taxname=fee.tax_rule.name|default:s_taxes %}
<strong>plus</strong> {{ rate }}% {{ taxname }}
{% endblocktrans %}
</small>
@@ -765,7 +765,7 @@
{% if fee.tax_rate %}
<br/>
<small>
{% blocktrans trimmed with rate=fee.tax_rate|floatformat:-2 taxname=fee.tax_rule.name|default:s_taxes %}
{% blocktrans trimmed with rate=fee.tax_rate|tax_rate_format taxname=fee.tax_rule.name|default:s_taxes %}
incl. {{ rate }}% {{ taxname }}
{% endblocktrans %}
</small>
@@ -137,6 +137,15 @@
</td>
<td>
{{ d.software_brand|default_if_none:"" }} {{ d.software_version|default_if_none:"" }}
{% if staff_session %}
<details class="admin-only">
<summary>
<i class="fa fa-angle-down collapse-indicator"></i>
{% trans "Details" %}
</summary>
<pre class="admin-only">{{ d.info|pprint }}</pre>
</details>
{% endif %}
</td>
<td>
{% if d.initialized %}
@@ -560,11 +560,10 @@
</div>
</div>
</div>
<script type="text/plain" id="schema-url">{% static "schema/pdf-layout.schema.json" %}</script>
<script type="text/javascript" src="{% static "pdfjs/pdf.js" %}"></script>
<script type="text/javascript" src="{% static "ajv/ajv2020.bundle.min.js" %}"></script>
<script type="text/javascript" src="{% static "fabric/fabric.min.js" %}"></script>
<script type="text/javascript" src="{% static "pretixcontrol/js/ui/editor.js" %}"></script>
<script type="text/javascript" src="{% static "schema/pdf-layout.validate.js" %}"></script>
<img src="{% static 'pretixpresale/pdf/powered_by_pretix_dark.png' %}" id="poweredby-dark" class="sr-only">
<img src="{% static 'pretixpresale/pdf/powered_by_pretix_white.png' %}" id="poweredby-white" class="sr-only">
{% for family, styles in fonts.items %}
@@ -0,0 +1,83 @@
{% extends "pretixcontrol/items/base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% load eventsignal %}
{% load eventurl %}
{% block title %}{% trans "Change multiple vouchers" %}{% endblock %}
{% block inside %}
<h1>
{% trans "Change multiple vouchers" %}
<small>
{% blocktrans trimmed with number=vouchers.count %}
{{ number }} selected
{% endblocktrans %}
</small>
</h1>
<form action="" method="post" class="form-horizontal">
{% csrf_token %}
<div class="hidden">
{% for v in vouchers %}
<input type="hidden" name="voucher" value="{{ v.pk }}">
{% endfor %}
</div>
{% bootstrap_form_errors form %}
<fieldset>
<legend>{% trans "Voucher details" %}</legend>
{% bootstrap_field form.max_usages layout="bulkedit" %}
{% bootstrap_field form.valid_until layout="bulkedit" %}
{% bootstrap_field form.itemvar layout="bulkedit" %}
<div class="bulk-edit-field-group">
<label class="field-toggle">
<input type="checkbox" name="_bulk" value="{{ form.prefix }}__price" {% if form.prefix|add:"__price" in bulk_selected %}checked{% endif %}>
{% trans "change" context "form_bulk" %}
</label>
<div class="field-content">
<div class="form-group">
<label class="col-md-3 control-label" for="id_tag">{% trans "Price effect" %}</label>
<div class="col-md-5">
{% bootstrap_field form.price_mode show_label=False form_group_class="" %}
</div>
<div class="col-md-4">
{% bootstrap_field form.value show_label=False form_group_class="" %}
</div>
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-9 col-md-offset-3">
<div class="controls">
<div class="alert alert-info">
{% blocktrans trimmed %}
If you choose "any product" for a specific quota and choose to reserve quota for this
voucher above, the product can still be unavailable to the voucher holder if another quota
associated with the product is sold out!
{% endblocktrans %}
</div>
</div>
</div>
</div>
{% if form.subevent %}
{% bootstrap_field form.subevent layout="bulkedit" %}
{% endif %}
</fieldset>
<fieldset>
<legend>{% trans "Advanced settings" %}</legend>
{% bootstrap_field form.block_quota layout="bulkedit" %}
{% bootstrap_field form.allow_ignore_quota layout="bulkedit" %}
{% bootstrap_field form.min_usages layout="bulkedit" %}
{% bootstrap_field form.budget addon_after=request.event.currency layout="bulkedit" %}
{% bootstrap_field form.tag layout="bulkedit" %}
{% bootstrap_field form.comment layout="bulkedit" %}
{% bootstrap_field form.show_hidden_items layout="bulkedit" %}
{% bootstrap_field form.all_addons_included layout="bulkedit" %}
{% bootstrap_field form.all_bundles_included layout="bulkedit" %}
</fieldset>
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div>
</form>
{% endblock %}
@@ -99,6 +99,9 @@
</p>
<form action="{% url "control:event.vouchers.bulkaction" organizer=request.event.organizer.slug event=request.event.slug %}" method="post">
{% csrf_token %}
{% for field in filter_form %}
{{ field.as_hidden }}
{% endfor %}
<div class="table-responsive">
<table class="table table-hover table-quotas">
<thead>
@@ -144,6 +147,18 @@
{% endif %}
<th></th>
</tr>
{% if "event.vouchers:write" in request.eventpermset and page_obj.paginator.num_pages > 1 %}
<tr class="table-select-all warning hidden">
<td>
<input type="checkbox" name="__ALL" id="__all" data-results-total="{{ page_obj.paginator.count }}">
</td>
<td colspan="5">
<label for="__all">
{% trans "Select all results on other pages as well" %}
</label>
</td>
</tr>
{% endif %}
</thead>
<tbody>
{% for v in vouchers %}
@@ -211,6 +226,10 @@
<i class="fa fa-trash" aria-hidden="true"></i>
{% trans "Delete selected" %}
</button>
<button type="submit" class="btn btn-primary btn-save" name="action" value="edit"
formaction="{% url "control:event.vouchers.bulkedit" organizer=request.event.organizer.slug event=request.event.slug %}">
<i class="fa fa-edit"></i>{% trans "Edit selected" %}
</button>
</div>
{% endif %}
</form>
@@ -49,11 +49,11 @@
<td>
<strong>
{% if t.tag %}
<a href="{% url "control:event.vouchers" organizer=request.event.organizer.slug event=request.event.slug %}?tag={{ '"'|add:t.tag|add:'"'|urlencode }}">
<a href="{% url "control:event.vouchers" organizer=request.event.organizer.slug event=request.event.slug %}?filter-tag={{ '"'|add:t.tag|add:'"'|urlencode }}">
{{ t.tag }}
</a>
{% else %}
<a href="{% url "control:event.vouchers" organizer=request.event.organizer.slug event=request.event.slug %}?tag={{ '<>'|urlencode }}">
<a href="{% url "control:event.vouchers" organizer=request.event.organizer.slug event=request.event.slug %}?filter-tag={{ '<>'|urlencode }}">
{% trans "Empty tag" %}
</a>
{% endif %}
+1
View File
@@ -383,6 +383,7 @@ urlpatterns = [
re_path(r'^vouchers/bulk_add$', vouchers.VoucherBulkCreate.as_view(), name='event.vouchers.bulk'),
re_path(r'^vouchers/bulk_add/mail_preview$', vouchers.VoucherBulkMailPreview.as_view(), name='event.vouchers.bulk.mail_preview'),
re_path(r'^vouchers/bulk_action$', vouchers.VoucherBulkAction.as_view(), name='event.vouchers.bulkaction'),
re_path(r'^vouchers/bulk_edit$', vouchers.VoucherBulkUpdateView.as_view(), name='event.vouchers.bulkedit'),
re_path(r'^vouchers/import/$', modelimport.VoucherImportView.as_view(), name='event.vouchers.import'),
re_path(r'^vouchers/import/(?P<file>[^/]+)/$', modelimport.VoucherProcessView.as_view(), name='event.vouchers.import.process'),
re_path(r'^orders/(?P<code>[0-9A-Z]+)/transition$', orders.OrderTransition.as_view(),
+2 -1
View File
@@ -243,7 +243,8 @@ def invite(request, token):
if request.user.is_authenticated:
if inv.team.members.filter(pk=request.user.pk).exists():
messages.error(request, _('You cannot accept the invitation for "{}" as you already are part of '
'this team.').format(inv.team.name))
'this team. If you want to add a different user or create a new account, '
'log out and click the invitation link again.').format(inv.team.name))
return redirect('control:index')
else:
with transaction.atomic():
+15 -5
View File
@@ -952,7 +952,12 @@ class MailSettingsRendererPreview(MailSettingsPreview):
context=context,
)
r = HttpResponse(v, content_type='text/html')
r._csp_ignore = True
r['Content-Security-Policy'] = (
# Plugin-provided email templates will contain inline styles or remote images
# but emails should not contain JS
"style-src 'unsafe-inline'; "
"img-src https: data:"
)
return r
else:
raise Http404(_('Unknown email renderer.'))
@@ -1428,11 +1433,16 @@ class TaxUpdate(EventSettingsViewMixin, EventPermissionRequiredMixin, UpdateView
form.instance.custom_rules = json.dumps([
f.cleaned_data for f in self.formset.ordered_forms if f not in self.formset.deleted_forms
], cls=I18nJSONEncoder)
if form.has_changed():
if form.has_changed() or self.formset.has_changed():
change_data = {
k: form.cleaned_data.get(k) for k in form.changed_data
}
if self.formset.has_changed():
change_data["custom_rules"] = [
f.cleaned_data for f in self.formset.ordered_forms if f not in self.formset.deleted_forms
]
self.object.log_action(
'pretix.event.taxrule.changed', user=self.request.user, data={
k: form.cleaned_data.get(k) for k in form.changed_data
}
'pretix.event.taxrule.changed', user=self.request.user, data=change_data
)
return super().form_valid(form)
+75 -4
View File
@@ -41,6 +41,30 @@ from pretix.control.forms.mailsetup import SimpleMailForm, SMTPMailForm
logger = logging.getLogger(__name__)
def get_cname_record(hostname):
try:
r = dns.resolver.Resolver()
answers = r.resolve(hostname, 'CNAME')
answers = list(answers)
if len(answers) != 1:
logger.exception('Found multiple CNAME records for {}'.format(hostname))
return
return str(answers[0].target).lower()
except:
logger.exception('Could not fetch CNAME record for {}'.format(hostname))
def get_dmarc_record(hostname):
try:
r = dns.resolver.Resolver()
for resp in r.resolve("_dmarc." + hostname, 'TXT'):
data = b''.join(resp.strings).decode()
if 'DMARC1' in data.strip():
return data
except:
logger.exception("Could not fetch DMARC record for {}".format(hostname))
def get_spf_record(hostname):
try:
r = dns.resolver.Resolver()
@@ -49,7 +73,7 @@ def get_spf_record(hostname):
if data.lower().strip().startswith('v=spf1 '): # RFC7208, section 4.5
return data
except:
logger.exception("Could not fetch SPF record")
logger.exception("Could not fetch SPF record for {}".format(hostname))
def _check_spf_record(not_found_lookup_parts, spf_record, depth):
@@ -168,10 +192,15 @@ class MailSettingsSetupView(TemplateView):
return super().get(request, *args, **kwargs)
session_key = f'sender_mail_verification_code_{self.request.path}_{self.simple_form.cleaned_data.get("mail_from")}'
verify_dns = (
settings.MAIL_CUSTOM_SENDER_SPF_STRING or
(settings.MAIL_CUSTOM_SENDER_DKIM_CNAME and settings.MAIL_CUSTOM_SENDER_DKIM_SELECTOR) or
settings.MAIL_CUSTOM_SENDER_DMARC_REQUIRED
)
allow_save = (
(not settings.MAIL_CUSTOM_SENDER_VERIFICATION_REQUIRED or
('verification' in self.request.POST and self.request.POST.get('verification', '') == self.request.session.get(session_key, None))) and
(not settings.MAIL_CUSTOM_SENDER_SPF_STRING or self.request.POST.get('state') == 'save')
(not verify_dns or self.request.POST.get('state') == 'save')
)
if allow_save:
@@ -192,8 +221,8 @@ class MailSettingsSetupView(TemplateView):
spf_warning = None
spf_record = None
hostname = self.simple_form.cleaned_data['mail_from'].split('@')[-1]
if settings.MAIL_CUSTOM_SENDER_SPF_STRING:
hostname = self.simple_form.cleaned_data['mail_from'].split('@')[-1]
spf_record = get_spf_record(hostname)
if not spf_record:
spf_warning = _(
@@ -210,7 +239,43 @@ class MailSettingsSetupView(TemplateView):
'this system in the SPF record.'
)
verification = settings.MAIL_CUSTOM_SENDER_VERIFICATION_REQUIRED and not spf_warning
dkim_warning = None
dkim_hostname = None
dkim_cname = None
if settings.MAIL_CUSTOM_SENDER_DKIM_CNAME and settings.MAIL_CUSTOM_SENDER_DKIM_SELECTOR:
dkim_hostname = settings.MAIL_CUSTOM_SENDER_DKIM_SELECTOR + '._domainkey.' + hostname
cname_target = get_cname_record(dkim_hostname)
dkim_cname = settings.MAIL_CUSTOM_SENDER_DKIM_CNAME
if not dkim_cname.endswith("."):
dkim_cname += "."
if "%s" in dkim_cname:
dkim_cname = dkim_cname.replace("%s", hostname.replace(".", "-").lower())
if not cname_target:
dkim_warning = _(
'We could not find a CNAME record pointing to our DKIM key for domain you are trying to use. '
'This means that there is a very high change most of the emails will be rejected or marked as '
'spam. We strongly recommend setting up DKIM through a CNAME record. You can do so through the '
'DNS settings at the provider you registered your domain with.'
)
elif cname_target != dkim_cname:
dkim_warning = _(
'We found a CNAME record for a DKIM key, but it is not pointing to the right location. '
'This means that there is a very high chance most of the emails will be rejected or marked as '
'spam. You should update the DNS settings of your domain.'
)
dmarc_warning = None
dmarc_record = None
if settings.MAIL_CUSTOM_SENDER_DMARC_REQUIRED:
dmarc_record = get_dmarc_record(hostname)
if not dmarc_record:
spf_warning = _(
'We did not find DMARC record for your domain. This means that there is a very high chance '
'most of the emails will be rejected or marked as spam. You should update the DNS settings '
'of your domain.'
)
verification = settings.MAIL_CUSTOM_SENDER_VERIFICATION_REQUIRED and not spf_warning and not dkim_warning and not dmarc_warning
if verification:
if 'verification' in self.request.POST:
messages.error(request, _('The verification code was incorrect, please try again.'))
@@ -241,6 +306,12 @@ class MailSettingsSetupView(TemplateView):
'spf_warning': spf_warning,
'spf_record': spf_record,
'spf_key': settings.MAIL_CUSTOM_SENDER_SPF_STRING,
'dkim_warning': dkim_warning,
'dkim_hostname': dkim_hostname,
'dkim_cname': dkim_cname,
'dmarc_warning': dmarc_warning,
'dmarc_record': dmarc_record,
'hostname': hostname,
'recp': self.simple_form.cleaned_data.get('mail_from')
},
using=self.template_engine,
+3 -9
View File
@@ -64,7 +64,7 @@ from django.urls import reverse
from django.utils import formats
from django.utils.formats import date_format, get_format
from django.utils.functional import cached_property
from django.utils.html import conditional_escape, escape, format_html
from django.utils.html import conditional_escape, escape
from django.utils.http import url_has_allowed_host_and_scheme
from django.utils.safestring import mark_safe
from django.utils.timezone import make_aware, now
@@ -79,7 +79,7 @@ from pretix.base.email import get_email_context
from pretix.base.exporter import MultiSheetListExporter
from pretix.base.i18n import language
from pretix.base.models import (
CachedFile, CachedTicket, Checkin, GiftCard, Invoice, InvoiceAddress, Item,
CachedFile, CachedTicket, Checkin, Invoice, InvoiceAddress, Item,
ItemVariation, LogEntry, Order, QuestionAnswer, Quota,
ScheduledEventExport, generate_secret,
)
@@ -1994,7 +1994,7 @@ class OrderChange(OrderView):
positions = list(self.order.positions.select_related(
'item', 'item__tax_rule', 'used_membership', 'used_membership__membership_type', 'tax_rule',
'seat', 'subevent',
).prefetch_related('granted_memberships', 'issued_gift_cards'))
).prefetch_related('granted_memberships'))
for p in positions:
p.form = OrderPositionChangeForm(prefix='op-{}'.format(p.pk), instance=p, items=self.items,
initial={'seat': p.seat.seat_guid if p.seat else None},
@@ -2261,12 +2261,6 @@ class OrderContactChange(OrderView):
def get_context_data(self, **kwargs):
ctx = super().get_context_data()
ctx['form'] = self.form
if self.order.all_positions.filter(Exists(GiftCard.objects.filter(issued_in=OuterRef('pk')))).exists():
self.form.fields['regenerate_secrets'].help_text = format_html(
'{}<br><br><strong><span class="fa fa-warning"></span> {}</strong>',
self.form.fields['regenerate_secrets'].help_text,
_("Ticket secrets of order positions that have been used to issue a gift card can not be changed. Only the link will be changed in this case."),
)
return ctx
@cached_property
-1
View File
@@ -70,7 +70,6 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView):
if 'placeholders' in request.GET:
return self.get_placeholders_help(request)
resp = super().get(request, *args, **kwargs)
resp._csp_ignore = True
return resp
def get_placeholders_help(self, request):
+168 -27
View File
@@ -40,9 +40,11 @@ import bleach
from defusedcsv import csv
from django.conf import settings
from django.contrib import messages
from django.core.exceptions import PermissionDenied, ValidationError
from django.core.exceptions import (
BadRequest, PermissionDenied, ValidationError,
)
from django.db import connection, transaction
from django.db.models import Exists, OuterRef, Sum
from django.db.models import Count, Exists, OuterRef, Sum
from django.http import (
Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect,
JsonResponse,
@@ -55,7 +57,7 @@ from django.utils.safestring import mark_safe
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from django.views.generic import (
CreateView, ListView, TemplateView, UpdateView, View,
CreateView, FormView, ListView, TemplateView, UpdateView, View,
)
from django_scopes import scopes_disabled
@@ -70,7 +72,9 @@ from pretix.base.services.vouchers import vouchers_send
from pretix.base.templatetags.rich_text import markdown_compile_email
from pretix.base.views.tasks import AsyncFormView
from pretix.control.forms.filter import VoucherFilterForm, VoucherTagFilterForm
from pretix.control.forms.vouchers import VoucherBulkForm, VoucherForm
from pretix.control.forms.vouchers import (
VoucherBulkEditForm, VoucherBulkForm, VoucherForm,
)
from pretix.control.permissions import EventPermissionRequiredMixin
from pretix.control.signals import voucher_form_class
from pretix.control.views import PaginationMixin
@@ -80,7 +84,37 @@ from pretix.helpers.models import modelcopy
from pretix.multidomain.urlreverse import eventreverse_absolute
class VoucherList(PaginationMixin, EventPermissionRequiredMixin, ListView):
class VoucherQueryMixin:
@cached_property
def request_data(self):
if self.request.method == "POST":
return self.request.POST
return self.request.GET
@scopes_disabled() # we have an event check here, and we can save some performance on subqueries
def get_queryset(self):
qs = self.request.event.vouchers.exclude(
Exists(WaitingListEntry.objects.filter(voucher_id=OuterRef('pk')))
)
if 'voucher' in self.request_data and '__ALL' not in self.request_data:
qs = qs.filter(
id__in=self.request_data.getlist('voucher')
)
elif self.request.method == 'GET' or '__ALL' in self.request_data:
if self.filter_form.is_valid():
qs = self.filter_form.filter_qs(qs)
else:
raise BadRequest("No vouchers selected")
return qs
@cached_property
def filter_form(self):
return VoucherFilterForm(data=self.request_data, prefix='filter', event=self.request.event)
class VoucherList(VoucherQueryMixin, PaginationMixin, EventPermissionRequiredMixin, ListView):
model = Voucher
context_object_name = 'vouchers'
template_name = 'pretixcontrol/vouchers/index.html'
@@ -88,25 +122,15 @@ class VoucherList(PaginationMixin, EventPermissionRequiredMixin, ListView):
@scopes_disabled() # we have an event check here, and we can save some performance on subqueries
def get_queryset(self):
qs = Voucher.annotate_budget_used(self.request.event.vouchers.exclude(
Exists(WaitingListEntry.objects.filter(voucher_id=OuterRef('pk')))
).select_related(
return Voucher.annotate_budget_used(super().get_queryset().select_related(
'item', 'variation', 'seat'
))
if self.filter_form.is_valid():
qs = self.filter_form.filter_qs(qs)
return qs
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['filter_form'] = self.filter_form
return ctx
@cached_property
def filter_form(self):
return VoucherFilterForm(data=self.request.GET, event=self.request.event)
def get(self, request, *args, **kwargs):
if request.GET.get("download", "") == "yes":
return self._download_csv()
@@ -293,6 +317,12 @@ class VoucherUpdate(EventPermissionRequiredMixin, UpdateView):
f.disabled = True
return form
def get_form_kwargs(self):
return {
**super().get_form_kwargs(),
"event": self.request.event,
}
def get_object(self, queryset=None) -> VoucherForm:
url = resolve(self.request.path_info)
try:
@@ -603,26 +633,21 @@ class VoucherRNG(EventPermissionRequiredMixin, View):
})
class VoucherBulkAction(EventPermissionRequiredMixin, View):
class VoucherBulkAction(VoucherQueryMixin, EventPermissionRequiredMixin, View):
permission = 'event.vouchers:write'
@cached_property
def objects(self):
return self.request.event.vouchers.filter(
id__in=self.request.POST.getlist('voucher')
)
@transaction.atomic
def post(self, request, *args, **kwargs):
if request.POST.get('action') == 'delete':
return render(request, 'pretixcontrol/vouchers/delete_bulk.html', {
'allowed': self.objects.filter(redeemed=0),
'forbidden': self.objects.exclude(redeemed=0),
'allowed': self.get_queryset().filter(redeemed=0),
'forbidden': self.get_queryset().exclude(redeemed=0),
})
elif request.POST.get('action') == 'delete_confirm':
log_entries = []
to_delete = []
for obj in self.objects:
to_update = []
for obj in self.get_queryset():
if obj.allow_delete():
log_entries.append(obj.log_action('pretix.voucher.deleted', user=self.request.user, save=False))
to_delete.append(obj.pk)
@@ -632,12 +657,14 @@ class VoucherBulkAction(EventPermissionRequiredMixin, View):
'bulk': True
}, save=False))
obj.max_usages = min(obj.redeemed, obj.max_usages)
obj.save(update_fields=['max_usages'])
to_update.append(obj)
if to_delete:
CartPosition.objects.filter(addon_to__voucher_id__in=to_delete).delete()
CartPosition.objects.filter(voucher_id__in=to_delete).delete()
Voucher.objects.filter(pk__in=to_delete).delete()
if to_update:
Voucher.objects.bulk_update(to_update, ['max_usages'])
LogEntry.bulk_create_and_postprocess(log_entries)
messages.success(request, _('The selected vouchers have been deleted or disabled.'))
@@ -648,3 +675,117 @@ class VoucherBulkAction(EventPermissionRequiredMixin, View):
'organizer': self.request.event.organizer.slug,
'event': self.request.event.slug,
})
class VoucherBulkUpdateView(VoucherQueryMixin, EventPermissionRequiredMixin, FormView):
template_name = 'pretixcontrol/vouchers/bulk_edit.html'
permission = 'event.vouchers:write'
context_object_name = 'vouchers'
form_class = VoucherBulkEditForm
def get_queryset(self):
return super().get_queryset().prefetch_related(None).order_by()
def get(self, request, *args, **kwargs):
return HttpResponse(status=405)
@cached_property
def is_submitted(self):
# Usually, django considers a form "bound" / "submitted" on every POST request. However, this view is always
# called with POST method, even if just to pass the selection of objects to work on, so we want to modify
# that behavior
return '_bulk' in self.request.POST
def get_form_kwargs(self):
initial = {}
mixed_values = set()
qs = self.get_queryset().annotate()
fields = (
'valid_until', 'block_quota', 'allow_ignore_quota', 'value', 'tag', 'comment', 'max_usages',
'min_usages', 'price_mode', 'subevent', 'show_hidden_items', 'all_addons_included', 'all_bundles_included',
'budget',
)
for f in fields:
existing_values = list(qs.order_by(f).values(f).annotate(c=Count('*')))
if len(existing_values) == 1:
initial[f] = existing_values[0][f]
elif len(existing_values) > 1:
mixed_values.add(f)
if f == "max_usages":
initial[f] = 1
else:
initial[f] = None
existing_values = list(qs.order_by("item", "variation", "quota").values("item", "variation", "quota").annotate(c=Count('*')))
if len(existing_values) == 1:
i = existing_values[0]
if i["quota"]:
initial["itemvar"] = f'q-{i["quota"]}'
elif i["variation"]:
initial["itemvar"] = f'{i["item"]}-{i["variation"]}'
elif i["item"]:
initial["itemvar"] = f'{i["item"]}'
else:
initial["itemvar"] = None
elif len(existing_values) > 1:
mixed_values.add("itemvar")
initial["itemvar"] = None
kwargs = super().get_form_kwargs()
kwargs['event'] = self.request.event
kwargs['prefix'] = 'bulkedit'
kwargs['initial'] = initial
kwargs['queryset'] = self.get_queryset()
kwargs['mixed_values'] = mixed_values
if not self.is_submitted:
kwargs['data'] = None
kwargs['files'] = None
return kwargs
def get_success_url(self):
return reverse('control:event.vouchers', kwargs={
'organizer': self.request.event.organizer.slug,
'event': self.request.event.slug,
})
def form_valid(self, form):
log_entries = []
# Main form
form.save()
data = {
k: v
for k, v in form.cleaned_data.items()
if k in form.changed_data
}
data['_raw_bulk_data'] = self.request.POST.dict()
for obj in self.get_queryset():
log_entries.append(
obj.log_action('pretix.voucher.changed', data=data, user=self.request.user, save=False)
)
LogEntry.bulk_create_and_postprocess(log_entries)
messages.success(self.request, _('Your changes have been saved.'))
return super().form_valid(form)
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['vouchers'] = self.get_queryset()
ctx['bulk_selected'] = self.request.POST.getlist("_bulk")
return ctx
@transaction.atomic
def post(self, request, *args, **kwargs):
form = self.get_form()
is_valid = (
self.is_submitted and
form.is_valid()
)
if is_valid:
return self.form_valid(form)
else:
if self.is_submitted:
messages.error(self.request, _('We could not save your changes. See below for details.'))
return self.form_invalid(form)
+37
View File
@@ -19,7 +19,9 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
import itertools
import re
from http.cookies import Morsel
from django.conf import settings
@@ -48,6 +50,41 @@ def set_cookie_without_samesite(request, response, key, *args, **kwargs):
response.cookies[key]['Partitioned'] = True
def thoroughly_delete_cookie(response, cookie_name, **kwargs):
""" Deletes different possible versions of a cookie (SameSite, Partitioned) """
properties = {"SameSite": ["", 'None'], "Partitioned": ["", True]}
for i, values in enumerate(itertools.product(*properties.values())):
m = Morsel()
m.set(cookie_name, '', '')
m.update(kwargs)
m.update(zip(properties.keys(), values))
m['expires'] = "Thu, 01 Jan 1970 00:00:00 GMT"
response.cookies[f'___DELETECOOKIE__{i}___{cookie_name}'] = m
# Make sure settings a cookie afterwards will add a new item in the dictionary, placing
# it below our deletion headers.
response.cookies.pop(cookie_name, None)
def get_all_values_of_cookie(cookie_header, cookie_name):
# like django.http.cookie.parse_cookie, but returns all values of duplicated cookies instead of only the last
values = list()
if not cookie_header:
return values
for chunk in cookie_header.split(";"):
if "=" in chunk:
key, val = chunk.split("=", 1)
else:
# Assume an empty name per
# https://bugzilla.mozilla.org/show_bug.cgi?id=169091
key, val = "", chunk
key, val = key.strip(), val.strip()
if key == cookie_name:
values.append(val)
return values
# Based on https://www.chromium.org/updates/same-site/incompatible-clients
# Copyright 2019 Google LLC.
# SPDX-License-Identifier: Apache-2.0
+4 -1
View File
@@ -20,6 +20,7 @@
# <https://www.gnu.org/licenses/>.
#
import logging
import uuid
from django.core.signals import request_finished
from django.dispatch import receiver
@@ -65,7 +66,9 @@ class RequestIdMiddleware:
import sentry_sdk
sentry_sdk.set_tag("request_id", request.request_id)
else:
local.request_id = request.request_id = None
# Web server did not pass a request ID, we still generate one to correlate between django logs and
# celery logs
local.request_id = request.request_id = str(uuid.uuid4())
return self.get_response(request)
+32
View File
@@ -20,9 +20,11 @@
# <https://www.gnu.org/licenses/>.
#
import copy
from decimal import Decimal
from django.core.files import File
from django.db import models
from django.db.models.fields import DecimalField
class Thumbnail(models.Model):
@@ -54,3 +56,33 @@ def flatten_choices(choices):
yield from label_or_nested
else:
yield value_or_group, label_or_nested
def _normalize_decimal(d: Decimal) -> Decimal:
"""
Strips trailing zeros, e.g.
20.000 20
20.010 20.01
20.100 20.1
But unlike of Decimal.normalize(), 20.000 will not become 2e+1. Very small decimals might still be represented
in scientific notation when printed.
"""
normalized = d.normalize()
sign, digit, exponent = normalized.as_tuple()
if exponent > 0:
return normalized.quantize(1)
return normalized
class NormalizedDecimalField(DecimalField):
"""
Variant of DecimalField that never outputs the trailing zeros, so we always have normalized decimals internally.
Use this only for fields where the trailing zeros are pointless (e.g. percentages), not for monetary amounts.
"""
def from_db_value(self, value, expression, connection):
if value is not None:
value = _normalize_decimal(value)
return value
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+16 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -10195,6 +10195,17 @@ msgstr ""
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Contact URL"
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr ""
@@ -17546,8 +17557,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -17614,7 +17626,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
File diff suppressed because it is too large Load Diff
+132 -183
View File
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:52+0000\n"
"PO-Revision-Date: 2021-09-15 11:22+0000\n"
"Last-Translator: Mohamed Tawfiq <mtawfiq@wafyapp.com>\n"
"PO-Revision-Date: 2026-07-13 11:28+0000\n"
"Last-Translator: ahmed badr <ahmedbadr@oma.com.eg>\n"
"Language-Team: Arabic <https://translate.pretix.eu/projects/pretix/pretix-js/"
"ar/>\n"
"Language: ar\n"
@@ -18,7 +18,7 @@ msgstr ""
"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 ? 4 : 5;\n"
"X-Generator: Weblate 4.8\n"
"X-Generator: Weblate 2026.7.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js
msgid "Marked as paid"
@@ -30,112 +30,110 @@ msgstr "تعليق:"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "PayPal"
msgstr ""
msgstr "باي بال"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "Venmo"
msgstr ""
msgstr "Venmo"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
#: pretix/static/pretixpresale/js/walletdetection.js
msgid "Apple Pay"
msgstr ""
msgstr "Apple Pay"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "Itaú"
msgstr ""
msgstr "إيتاو"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "PayPal Credit"
msgstr ""
msgstr "الائتمان من PayPal"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "Credit Card"
msgstr ""
msgstr "بطاقة الائتمان"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "PayPal Pay Later"
msgstr ""
msgstr "الدفع لاحقًا عبر PayPal"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "iDEAL | Wero"
msgstr ""
msgstr "iDEAL | التحدي"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "SEPA Direct Debit"
msgstr ""
msgstr "الخصم المباشر في منطقة الدفع الموحدة (SEPA)"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "Bancontact"
msgstr ""
msgstr "بانكونتاكت"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "giropay"
msgstr ""
msgstr "giropay"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "SOFORT"
msgstr ""
msgstr "فوراً"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
#, fuzzy
#| msgid "Yes"
msgid "eps"
msgstr عم"
msgstr قاط إضافية"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "MyBank"
msgstr ""
msgstr "بنكي"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "Przelewy24"
msgstr ""
msgstr "Przelewy24"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "Verkkopankki"
msgstr ""
msgstr "الخدمات المصرفية عبر الإنترنت"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "PayU"
msgstr ""
msgstr "الدفع لك"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "BLIK"
msgstr ""
msgstr "BLIK"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "Trustly"
msgstr ""
msgstr "Trustly"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "Zimpler"
msgstr ""
msgstr "Zimpler"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "Maxima"
msgstr ""
msgstr "الأعظم"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "OXXO"
msgstr ""
msgstr "OXXO"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "Boleto"
msgstr ""
msgstr "تذكرة"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "WeChat Pay"
msgstr ""
msgstr "WeChat Pay"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "Mercado Pago"
msgstr ""
msgstr "Mercado Pago"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
#: pretix/static/pretixpresale/js/ui/cart.js
msgid "Continue"
msgstr "المتابعة"
msgstr "تابع"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js
@@ -144,7 +142,7 @@ msgstr "جاري تأكيد الدفع الخاص بك …"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
msgid "Payment method unavailable"
msgstr ""
msgstr "طريقة الدفع غير متاحة"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
msgid "Placed orders"
@@ -156,11 +154,11 @@ msgstr "الطلبات المدفوعة"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
msgid "Attendees (ordered)"
msgstr ""
msgstr "الحاضرون (حسب الترتيب)"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
msgid "Attendees (paid)"
msgstr ""
msgstr "الحاضرون (الذين دفعوا رسوم الاشتراك)"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
msgid "Total revenue"
@@ -192,7 +190,7 @@ msgstr "تبديل قائمة الدخول"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Search results"
msgstr "البحث في النتائج"
msgstr "نتائج البحث"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "No tickets found"
@@ -236,15 +234,15 @@ msgstr "غير مدفوع"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Canceled"
msgstr "ملغاة"
msgstr "تم إلغاؤه"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Confirmed"
msgstr ""
msgstr "تم التأكيد"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Approval pending"
msgstr ""
msgstr "في انتظار الموافقة"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Redeemed"
@@ -252,11 +250,11 @@ msgstr "مستخدم"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Cancel"
msgstr "قم بالإلغاء"
msgstr "إلغاء"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Ticket not paid"
msgstr "لم يتم دفع قيمة التذكرة"
msgstr "التذكرة لم يتم دفع ثمنها"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "This ticket is not yet paid. Do you want to continue anyways?"
@@ -276,23 +274,19 @@ msgstr "تم تسجيل الخروج"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Ticket already used"
msgstr "تم استخدام التذكرة مسبقا"
msgstr "تم استخدام التذكرة بالفعل"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Information required"
msgstr "معلومات مطلوبة"
msgstr "المعلومات المطلوبة"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
#, fuzzy
#| msgid "Unknown error."
msgid "Unknown ticket"
msgstr "خطأ غير معروف."
msgstr "تذكرة غير معروفة"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
#, fuzzy
#| msgid "Entry not allowed"
msgid "Ticket type not allowed here"
msgstr "إدخال غير مسموح"
msgstr "نوع تذكرة الدخول غير مسموح به هنا"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Entry not allowed"
@@ -300,17 +294,13 @@ msgstr "إدخال غير مسموح"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Ticket code revoked/changed"
msgstr "تم إلغاء رمز التذكرة أو تبديله"
msgstr "تم إلغاء/تغيير رمز التذكرة"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
#, fuzzy
#| msgid "Ticket not paid"
msgid "Ticket blocked"
msgstr "لم يتم دفع قيمة التذكرة"
msgstr "التذكرة غير محجوبة"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
#, fuzzy
#| msgid "Ticket not paid"
msgid "Ticket not valid at this time"
msgstr "لم يتم دفع قيمة التذكرة"
@@ -320,11 +310,11 @@ msgstr "تم إلغاء الطلب"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Ticket code is ambiguous on list"
msgstr ""
msgstr "رمز التذكرة غير واضح في القائمة"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Order not approved"
msgstr ""
msgstr "لم تتم الموافقة على الطلب"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Checked-in Tickets"
@@ -348,12 +338,9 @@ msgstr "نعم"
#: pretix/static/pretixcontrol/js/ui/question.js
#: pretix/static/pretixpresale/js/ui/questions.js
msgid "No"
msgstr "لا"
msgstr "من"
#: pretix/static/lightbox/js/lightbox.js
#, fuzzy
#| msgctxt "widget"
#| msgid "Close"
msgid "close"
msgstr "إغلاق"
@@ -408,7 +395,7 @@ msgstr ""
#: pretix/static/pretixbase/js/asynctask.js
msgid "We are processing your request …"
msgstr "جاري معالجة طلبك …"
msgstr "نحن نقوم بمعالجة طلبك …"
#: pretix/static/pretixbase/js/asynctask.js
msgid ""
@@ -421,7 +408,7 @@ msgstr ""
#: pretix/static/pretixbase/js/asynctask.js
msgid "If this takes longer than a few minutes, please contact us."
msgstr ""
msgstr "إذا استغرق ذلك أكثر من بضع دقائق، يرجى الاتصال بنا."
#: pretix/static/pretixbase/js/asynctask.js
msgid "Close message"
@@ -437,11 +424,11 @@ msgstr "للنسخ اضغط Ctrl + C!"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
msgid "Edit"
msgstr ""
msgstr "تحرير"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
msgid "Visualize"
msgstr ""
msgstr "تصور"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
msgid ""
@@ -449,10 +436,13 @@ msgid ""
"or variations are not contained in any of your rule parts so people with "
"these tickets will not get in:"
msgstr ""
"تقوم القاعدة الخاصة بك دائمًا بالتصفية حسب المنتج أو النوع، لكن المنتجات أو "
"الأنواع التالية غير مدرجة في أي من أجزاء القاعدة الخاصة بك، لذا لن يتم قبول "
"الأشخاص الذين يحملون هذه التذاكر:"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
msgid "Please double-check if this was intentional."
msgstr ""
msgstr "يرجى التأكد مرة أخرى مما إذا كان ذلك مقصودًا أم لا."
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "All of the conditions below (AND)"
@@ -492,21 +482,21 @@ msgstr "أضف شرطا"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "minutes"
msgstr "الدقائق"
msgstr "دقائق"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "Duplicate"
msgstr ""
msgstr "مكرر"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgctxt "entry_status"
msgid "present"
msgstr ""
msgstr "حاضر"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgctxt "entry_status"
msgid "absent"
msgstr ""
msgstr "غائب"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "is one of"
@@ -522,11 +512,11 @@ msgstr "بعد"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "="
msgstr ""
msgstr "="
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "Product"
msgstr "منتج"
msgstr "المنتج"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "Product variation"
@@ -534,7 +524,7 @@ msgstr "نوع المنتج"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "Gate"
msgstr ""
msgstr "الشارع"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "Current date and time"
@@ -542,11 +532,11 @@ msgstr "التاريخ والوقت الحالي"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "Current day of the week (1 = Monday, 7 = Sunday)"
msgstr ""
msgstr "اليوم الحالي من الأسبوع (1 = الاثنين، 7 = الأحد)"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "Current entry status"
msgstr ""
msgstr "الحالة الحالية للطلب"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "Number of previous entries"
@@ -557,48 +547,40 @@ msgid "Number of previous entries since midnight"
msgstr "عدد المدخلات السابقة قبل منتصف الليل"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
#, fuzzy
#| msgid "Number of previous entries"
msgid "Number of previous entries since"
msgstr "عدد المدخلات السابقة"
msgstr "عدد الإدخالات السابقة منذ"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
#, fuzzy
#| msgid "Number of previous entries"
msgid "Number of previous entries before"
msgstr "عدد المدخلات السابقة"
msgstr "عدد الإدخالات السابقة قبل"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "Number of days with a previous entry"
msgstr "عدد الأيام التي تحتوي على مدخل سابق"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
#, fuzzy
#| msgid "Number of days with a previous entry"
msgid "Number of days with a previous entry since"
msgstr "عدد الأيام التي تحتوي على مدخل سابق"
msgstr "عدد الأيام التي تحتوي على قيد سابق منذ"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
#, fuzzy
#| msgid "Number of days with a previous entry"
msgid "Number of days with a previous entry before"
msgstr "عدد الأيام التي تحتوي على مدخل سابق"
msgstr "عدد الأيام التي يوجد فيها قيد سابق قبل ذلك"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "Minutes since last entry (-1 on first entry)"
msgstr ""
msgstr "عدد الدقائق منذ آخر تسجيل (-1 عند التسجيل الأول)"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "Minutes since first entry (-1 on first entry)"
msgstr ""
msgstr "عدد الدقائق منذ أول دخول (-1 عند أول دخول)"
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts
msgid "Error: Product not found!"
msgstr ""
msgstr "خطأ: لم يتم العثور على المنتج!"
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts
msgid "Error: Variation not found!"
msgstr ""
msgstr "خطأ: لم يتم العثور على النسخة!"
#: pretix/static/pretixcontrol/js/ui/editor.js
msgid "Check-in QR"
@@ -613,16 +595,12 @@ msgid "Group of objects"
msgstr "مجموعة من العناصر"
#: pretix/static/pretixcontrol/js/ui/editor.js
#, fuzzy
#| msgid "Text object"
msgid "Text object (deprecated)"
msgstr "عنصر نص"
msgstr "كائن نصي (مهمل)"
#: pretix/static/pretixcontrol/js/ui/editor.js
#, fuzzy
#| msgid "Text object"
msgid "Text box"
msgstr نصر نص"
msgstr "مربع نصي"
#: pretix/static/pretixcontrol/js/ui/editor.js
msgid "Barcode area"
@@ -669,28 +647,28 @@ msgid "Unknown error."
msgstr "خطأ غير معروف."
#: pretix/static/pretixcontrol/js/ui/main.js
#, fuzzy
#| msgid "Your color has great contrast and is very easy to read!"
msgid "Your color has great contrast and will provide excellent accessibility."
msgstr "اللون يتمتع بتباين كبير وتسهل قراءته!"
msgstr "يتميز لونك بتباين رائع ويسهل قراءته للغاية! وسيوفر إمكانية وصول ممتازة."
#: pretix/static/pretixcontrol/js/ui/main.js
#, fuzzy
#| msgid "Your color has decent contrast and is probably good-enough to read!"
msgid ""
"Your color has decent contrast and is sufficient for minimum accessibility "
"requirements."
msgstr "اللون يحظى بتباين معقول ويمكن أن يكون مناسب للقراءة!"
msgstr ""
"يتميز لونك بتباين جيد، ومن المرجح أنه مناسب للقراءة! وهو كافٍ لتلبية الحد "
"الأدنى من متطلبات سهولة الوصول."
#: pretix/static/pretixcontrol/js/ui/main.js
msgid ""
"Your color has insufficient contrast to white. Accessibility of your site "
"will be impacted."
msgstr ""
"اللون الذي اخترته لا يتمتع بتباين كافٍ مع اللون الأبيض. وسيؤثر ذلك على إمكانية "
"الوصول إلى موقعك."
#: pretix/static/pretixcontrol/js/ui/main.js
msgid "Search query"
msgstr "البحث في الاستفسارات"
msgstr "استعلام البحث"
#: pretix/static/pretixcontrol/js/ui/main.js
msgid "All"
@@ -706,11 +684,11 @@ msgstr "المختارة فقط"
#: pretix/static/pretixcontrol/js/ui/main.js
msgid "Enter page number between 1 and %(max)s."
msgstr ""
msgstr "أدخل رقم الصفحة بين 1 و %(max)s."
#: pretix/static/pretixcontrol/js/ui/main.js
msgid "Invalid page number."
msgstr ""
msgstr "رقم الصفحة غير صحيح."
#: pretix/static/pretixcontrol/js/ui/main.js
msgid "Use a different name internally"
@@ -729,10 +707,8 @@ msgid "Calculating default price…"
msgstr "حساب السعر الافتراضي…"
#: pretix/static/pretixcontrol/js/ui/plugins.js
#, fuzzy
#| msgid "Search results"
msgid "No results"
msgstr "البحث في النتائج"
msgstr "البحث: لا توجد نتائج"
#: pretix/static/pretixcontrol/js/ui/question.js
msgid "Others"
@@ -740,7 +716,7 @@ msgstr "غير ذلك"
#: pretix/static/pretixcontrol/js/ui/question.js
msgid "Count"
msgstr "احسب"
msgstr "العدد"
#: pretix/static/pretixcontrol/js/ui/subevent.js
msgid "(one more date)"
@@ -753,12 +729,12 @@ msgstr[4] "أيام عديدة"
msgstr[5] "أخرى"
#: pretix/static/pretixpresale/js/ui/cart.js
#, fuzzy
#| msgid "The items in your cart are no longer reserved for you."
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as theyre available."
msgstr "لم تعد العناصر الموجودة في عربة التسوق الخاصة بك محجوزة لك."
msgstr ""
"لم تعد المنتجات الموجودة في سلة التسوق محجوزة لك. لا يزال بإمكانك إتمام طلبك "
"طالما كانت هذه المنتجات متوفرة."
#: pretix/static/pretixpresale/js/ui/cart.js
msgid "Cart expired"
@@ -766,13 +742,9 @@ msgstr "انتهت صلاحية عربة التسوق"
#: pretix/static/pretixpresale/js/ui/cart.js
msgid "Your cart is about to expire."
msgstr ""
msgstr "سوف تنتهي صلاحية سلة التسوق الخاصة بك قريبًا."
#: pretix/static/pretixpresale/js/ui/cart.js
#, fuzzy
#| msgid "The items in your cart are reserved for you for one minute."
#| msgid_plural ""
#| "The items in your cart are reserved for you for {num} minutes."
msgid "The items in your cart are reserved for you for one minute."
msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "سيتم حجز العناصر لك في سلة التسوق لمدة {num}."
@@ -783,26 +755,24 @@ msgstr[4] "سيتم حجز العناصر لك في سلة التسوق لدقا
msgstr[5] "سيتم حجز العناصر لك في سلة التسوق لمدة {num}."
#: pretix/static/pretixpresale/js/ui/cart.js
#, fuzzy
#| msgid "Cart expired"
msgid "Your cart has expired."
msgstr "انتهت صلاحية عربة التسوق"
#: pretix/static/pretixpresale/js/ui/cart.js
#, fuzzy
#| msgid "The items in your cart are no longer reserved for you."
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as they're available."
msgstr "لم تعد العناصر الموجودة في عربة التسوق الخاصة بك محجوزة لك."
msgstr ""
"لم تعد المنتجات الموجودة في سلة التسوق محجوزة لك. لا يزال بإمكانك إتمام طلبك "
"طالما كانت هذه المنتجات متوفرة."
#: pretix/static/pretixpresale/js/ui/cart.js
msgid "Do you want to renew the reservation period?"
msgstr ""
msgstr "هل ترغب في تمديد فترة الحجز؟"
#: pretix/static/pretixpresale/js/ui/cart.js
msgid "Renew reservation"
msgstr ""
msgstr "تجديد الحجز"
#: pretix/static/pretixpresale/js/ui/main.js
msgid "The organizer keeps %(currency)s %(amount)s"
@@ -822,82 +792,77 @@ msgstr "التوقيت المحلي:"
#: pretix/static/pretixpresale/js/walletdetection.js
msgid "Google Pay"
msgstr ""
msgstr "Google Pay"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgctxt "widget"
msgid "Quantity"
msgstr ""
msgstr "الكمية"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgctxt "widget"
msgid "Decrease quantity"
msgstr ""
msgstr "تقليل الكمية"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgctxt "widget"
msgid "Increase quantity"
msgstr ""
msgstr "زيادة الكمية"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgctxt "widget"
msgid "Filter events by"
msgstr ""
msgstr "تصفية الأحداث حسب"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgctxt "widget"
msgid "Filter"
msgstr ""
msgstr "فلتر"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgctxt "widget"
msgid "Price"
msgstr ""
msgstr "السعر"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
#, javascript-format
msgctxt "widget"
msgid "Original price: %s"
msgstr ""
msgstr "السعر الأصلي: %s"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
#, javascript-format
msgctxt "widget"
msgid "New price: %s"
msgstr ""
msgstr "السعر الجديد: %s"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
#, fuzzy
#| msgid "Selected only"
msgctxt "widget"
msgid "Select"
msgstr "المختارة فقط"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
#, fuzzy, javascript-format
#| msgid "Selected only"
#, javascript-format
msgctxt "widget"
msgid "Select %s"
msgstr "المختارة فقط"
msgstr "تم اختيار %s فقط"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
#, fuzzy, javascript-format
#| msgctxt "widget"
#| msgid "See variations"
#, javascript-format
msgctxt "widget"
msgid "Select variant %s"
msgstr "أنظر إلى الاختلافات"
msgstr "اختر النوع %s"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
@@ -940,7 +905,7 @@ msgstr "من %(currency) s %(price)s"
#, javascript-format
msgctxt "widget"
msgid "Image of %s"
msgstr ""
msgstr "صورة لـ %s"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
@@ -981,27 +946,21 @@ msgstr "متوفرة مع القسيمة فقط"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
#, fuzzy
#| msgctxt "widget"
#| msgid "currently available: %s"
msgctxt "widget"
msgid "Not yet available"
msgstr "متوفر حاليا: %s"
msgstr "حاليًا غير متوفر: %s"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgctxt "widget"
msgid "Not available anymore"
msgstr ""
msgstr "لم يعد متوفراً"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
#, fuzzy
#| msgctxt "widget"
#| msgid "currently available: %s"
msgctxt "widget"
msgid "Currently not available"
msgstr "متوفر حاليا: %s"
msgstr "غير متوفر حاليًا: %s"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
@@ -1029,24 +988,20 @@ msgid ""
"There are currently a lot of users in this ticket shop. Please open the shop "
"in a new tab to continue."
msgstr ""
"يوجد حالياً عدد كبير من المستخدمين في متجر التذاكر هذا. يرجى فتح المتجر في "
"علامة تبويب جديدة للمتابعة."
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
#, fuzzy
#| msgctxt "widget"
#| msgid "Close ticket shop"
msgctxt "widget"
msgid "Open ticket shop"
msgstr "إغلاق متجر التذاكر"
msgstr "إغلاق/فتح متجر التذاكر"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
#, fuzzy
#| msgctxt "widget"
#| msgid "Resume checkout"
msgctxt "widget"
msgid "Checkout"
msgstr "استئناف الدفع"
msgstr "استئناف عملية الدفع"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
@@ -1061,6 +1016,9 @@ msgid ""
"We could not create your cart, since there are currently too many users in "
"this ticket shop. Please click \"Continue\" to retry in a new tab."
msgstr ""
"لم نتمكن من إنشاء سلة التسوق الخاصة بك، نظرًا لوجود عدد كبير جدًّا من "
"المستخدمين حاليًّا في متجر التذاكر هذا. يرجى النقر على «متابعة» لإعادة المحاولة "
"في علامة تبويب جديدة."
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
@@ -1110,18 +1068,15 @@ msgstr "إغلاق"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
#, fuzzy
#| msgctxt "widget"
#| msgid "Resume checkout"
msgctxt "widget"
msgid "Close checkout"
msgstr "استئناف الدفع"
msgstr "إغلاق عملية الدفع"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr ""
msgstr "لا يمكنك إلغاء هذه العملية. يرجى الانتظار حتى ينتهي التحميل."
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
@@ -1131,21 +1086,15 @@ msgstr "استمرار"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
#, fuzzy
#| msgctxt "widget"
#| msgid "See variations"
msgctxt "widget"
msgid "Show variants"
msgstr "أنظر إلى الاختلافات"
msgstr "انظر الاختلافات"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
#, fuzzy
#| msgctxt "widget"
#| msgid "See variations"
msgctxt "widget"
msgid "Hide variants"
msgstr "أنظر إلى الاختلافات"
msgstr "إخفاء الاختلافات"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
@@ -1203,11 +1152,11 @@ msgid ""
"add yourself to the waiting list. We will then notify if seats are available "
"again."
msgstr ""
"تم بيع جميع فئات التذاكر أو بعضها حاليًا. إذا أردت، يمكنك إضافة اسمك إلى "
"قائمة الانتظار. وسنقوم بإخطارك إذا توفرت مقاعد مرة أخرى."
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
#, fuzzy
#| msgid "Load more"
msgctxt "widget"
msgid "Load more"
msgstr "تحميل المزيد"
@@ -1250,37 +1199,37 @@ msgstr "الأحد"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgid "Monday"
msgstr ""
msgstr "الاثنين"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgid "Tuesday"
msgstr ""
msgstr "الثلاثاء"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgid "Wednesday"
msgstr ""
msgstr "الأربعاء"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgid "Thursday"
msgstr ""
msgstr "الخميس"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgid "Friday"
msgstr ""
msgstr "الجمعة"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgid "Saturday"
msgstr ""
msgstr "السبت"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgid "Sunday"
msgstr ""
msgstr "الأحد"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
@@ -1305,7 +1254,7 @@ msgstr "أبريل"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
msgid "May"
msgstr "مايو"
msgstr "هناك"
#: pretix/static/pretixpresale/js/widget/widget.js
#: pretix/static/pretixpresale/widget/src/i18n.ts
+16 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2024-12-11 01:00+0000\n"
"Last-Translator: Neriman Memmedli <nerim4n@pm.me>\n"
"Language-Team: Azerbaijani <https://translate.pretix.eu/projects/pretix/"
@@ -10197,6 +10197,17 @@ msgstr ""
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Contact URL"
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr ""
@@ -17548,8 +17559,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -17616,7 +17628,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+18 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-06-25 14:00+0000\n"
"Last-Translator: Kim Lozano <joaquim.lozano@upc.edu>\n"
"Language-Team: Catalan <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -11822,6 +11822,19 @@ msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
"Això es mostrarà públicament per permetre que els assistents us contactin."
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Contact address"
msgid "Contact URL"
msgstr "Adreça de contacte"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "Imprimeix l'URL"
@@ -20594,8 +20607,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -20696,7 +20710,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+18 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-01-29 19:42+0000\n"
"Last-Translator: Jiří Pastrňák <jiri@pastrnak.email>\n"
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix/cs/"
@@ -11288,6 +11288,19 @@ msgstr "Kontaktní e-mail"
msgid "We'll show this publicly to allow attendees to contact you."
msgstr "Tento údaj zobrazíme veřejně, aby vás účastníci mohli kontaktovat."
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Contact"
msgid "Contact URL"
msgstr "Kontakt"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "Impressum (adresa URL)"
@@ -19732,8 +19745,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -19851,7 +19865,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+18 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2023-11-14 11:00+0000\n"
"Last-Translator: Charliecoleg <DM229135@colegsirgar.ac.uk>\n"
"Language-Team: Welsh <https://translate.pretix.eu/projects/pretix/pretix/cy/"
@@ -10258,6 +10258,19 @@ msgstr ""
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Content"
msgid "Contact URL"
msgstr "Cynnwys"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr ""
@@ -17649,8 +17662,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -17717,7 +17731,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+18 -4
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-06-20 17:00+0000\n"
"Last-Translator: Nikolai <nikolai@lengefeldt.de>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/da/"
@@ -11339,6 +11339,19 @@ msgstr "Kontaktadresse"
msgid "We'll show this publicly to allow attendees to contact you."
msgstr "Vi vil vise dette offentligt, så deltagerne kan kontakte dig."
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Contact"
msgid "Contact URL"
msgstr "Kontakt"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "URL til kolofon"
@@ -19811,8 +19824,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -19879,7 +19893,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+153 -213
View File
@@ -4,17 +4,17 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"PO-Revision-Date: 2026-06-29 17:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/de/"
">\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-07-15 14:20+0000\n"
"Last-Translator: Jochen Siebert <siebert@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/"
"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: Weblate 2026.6.1\n"
"X-Generator: Weblate 2026.7.1\n"
"X-Poedit-Bookmarks: -1,-1,904,-1,-1,-1,-1,-1,-1,-1\n"
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html
@@ -179,7 +179,7 @@ msgstr "Spanisch (Lateinamerika)"
#: pretix/_base_settings.py
msgid "Thai"
msgstr ""
msgstr "Thailändisch"
#: pretix/_base_settings.py
msgid "Turkish"
@@ -436,7 +436,7 @@ msgstr ""
#: pretix/api/serializers/organizer.py pretix/control/views/organizer.py
#, python-format
msgid "You've been invited to join %(organizer)s"
msgstr ""
msgstr "Sie wurden eingeladen, %(organizer)s beizutreten"
#: pretix/api/serializers/organizer.py pretix/control/views/organizer.py
msgid "This user already has been invited for this team."
@@ -4072,43 +4072,31 @@ msgid "Users"
msgstr "Benutzer"
#: pretix/base/models/auth.py
#, fuzzy
#| msgid "Changes to your account at {organizer}"
msgid "Changes to your account"
msgstr "Änderungen an Ihrem Kundenkonto bei {organizer}"
msgstr "Änderungen an Ihrem Konto"
#: pretix/base/models/auth.py
#, fuzzy, python-brace-format
#| msgid ""
#| "to confirm changing your email address from {old_email}\n"
#| "to {new_email}, use the following code:"
#, python-brace-format
msgid ""
"To change your email address from {old_email} to {new_email}, use the "
"following code:"
msgstr ""
"um zu bestätigen, dass Sie Ihre E-Mail-Adresse von {old_email}\n"
"zu {new_email} ändern möchten, verwenden Sie den folgenden Code:"
"um Ihre E-Mail-Adresse von {old_email} zu {new_email} zu ändern, verwenden "
"Sie den folgenden Code:"
#: pretix/base/models/auth.py
#, fuzzy, python-brace-format
#| msgid ""
#| "to confirm changing your email address from {old_email}\n"
#| "to {new_email}, use the following code:"
#, python-brace-format
msgid ""
"To verify your email address {email} on {instance}, use the following code:"
msgstr ""
"um zu bestätigen, dass Sie Ihre E-Mail-Adresse von {old_email}\n"
"zu {new_email} ändern möchten, verwenden Sie den folgenden Code:"
"um Ihre Absenderadresse {email} für {instance} zu bestätigen, verwenden Sie "
"den folgenden Code:"
#: pretix/base/models/auth.py
#, fuzzy
#| msgid "Enter confirmation code"
msgid "Your confirmation code"
msgstr "Bestätigungs-Code eingeben"
msgstr "Ihr Bestätigungscode"
#: pretix/base/models/auth.py
#, fuzzy
#| msgid "Reset password"
msgid "Reset your password"
msgstr "Passwort zurücksetzen"
@@ -8178,7 +8166,7 @@ msgstr "Zugang zu existierenden Veranstaltungen"
msgctxt "permission_level"
msgid "Access existing and create new events"
msgstr ""
"Zugang zu existieren Veranstaltungen und neue Veranstaltungen erstellen"
"Zugang zu existierenden Veranstaltungen und neue Veranstaltungen erstellen"
#: pretix/base/permissions.py
msgid ""
@@ -8324,7 +8312,7 @@ msgstr "Veranstaltung abgesagt"
#: pretix/base/services/cancelevent.py
msgid "Confirm event cancellation and bulk refund"
msgstr ""
msgstr "Event-Absage und Rückerstattung bestätigen"
#: pretix/base/services/cart.py pretix/base/services/modelimport.py
#: pretix/base/services/orders.py
@@ -8905,10 +8893,8 @@ msgid "Your export did not contain any data."
msgstr "Der Export enthielt keine Daten."
#: pretix/base/services/export.py
#, fuzzy
#| msgid "Scheduled exports"
msgid "Scheduled export failed"
msgstr "Geplante Exporte"
msgstr "Geplanter Export fehlgeschlagen"
#: pretix/base/services/export.py
msgid "Permission denied."
@@ -9244,6 +9230,8 @@ msgstr "Ein Gutschein kann ohne Code nicht erzeugt werden."
msgid ""
"Voucher codes must be unique. Code \"{code}\" already exists in this import."
msgstr ""
"Gutscheincodes müssen einmalig sein. Code \"{code}\" existiert bereits in "
"diesem Import."
#: pretix/base/services/modelimport.py
#, python-brace-format
@@ -9252,13 +9240,19 @@ msgid ""
msgid_plural ""
"Voucher codes must be unique. Import contains existing voucher codes {code}."
msgstr[0] ""
"Gutscheincodes müssen eindeutig sein. Der Import enthält den existierenden "
"Gutscheincode {code}."
msgstr[1] ""
"Gutscheincodes müssen eindeutig sein. Der Import enthält die existierenden "
"Gutscheincodes {code}."
#: pretix/base/services/modelimport.py
msgid ""
"Vouchers could not be imported, probably due to a voucher code already being "
"in use."
msgstr ""
"Die Gutscheine konnten nicht importiert werden, vermutlich weil ein "
"Gutscheincode bereits in Verwendung ist."
#: pretix/base/services/orders.py
msgid ""
@@ -9638,10 +9632,9 @@ msgstr ""
"Bitte erneut versuchen."
#: pretix/base/services/shredder.py
#, fuzzy, python-format
#| msgid "Data shredding completed"
#, python-format
msgid "Data shredding completed for %(event)s"
msgstr "Löschen personenbezogener Daten abgeschlossen"
msgstr "Löschen personenbezogener Daten abgeschlossen für %(event)s"
#: pretix/base/services/stats.py
msgid "Uncategorized"
@@ -11453,6 +11446,21 @@ msgstr ""
"Wir werden diese Adresse veröffentlichen um Teilnehmern zu ermöglichen, Sie "
"zu kontaktieren."
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Contact URL"
msgstr "Kontakt-URL"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
"Wenn Sie diese Option setzen, wird der Kontakt-Link in der Fußzeile auf "
"diese Adresse verweisen statt auf die obige E-Mail-Adresse. Bitte beachten "
"Sie, dass die Kontakt-E-Mail-Adresse trotzdem z.B. mit allen Empfängern von "
"E-Mails geteilt wird."
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "Impressum (URL)"
@@ -13333,26 +13341,16 @@ msgstr ""
"oder kontaktieren Sie uns."
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#, fuzzy
#| msgid ""
#| "You have requested us to cancel an event which includes a larger bulk-"
#| "refund:"
msgid "You requested to cancel an event that involves a large bulk refund:"
msgstr ""
"Sie haben angefordert, dass eine Veranstaltung abgesagt wird, wodurch eine "
"größere Erstattung vorgenommen wird:"
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#, fuzzy
#| msgid "Estimated refund amount"
msgid "Estimated refund"
msgstr "Voraussichtlicher Erstattungsbetrag"
msgstr "Voraussichtliche Erstattung"
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#, fuzzy
#| msgid ""
#| "Please confirm that you want to proceed by coping the following "
#| "confirmation code into the cancellation form:"
msgid "To confirm, paste the following code into the cancellation form:"
msgstr ""
"Bitte bestätigen Sie, dass Sie fortfahren wollen, indem Sie den folgenden "
@@ -13364,6 +13362,8 @@ msgid ""
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it."
msgstr ""
"Teilen Sie den Code mit niemandem. Das Team von %(instance)s wird nie danach "
"fragen."
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#: pretix/base/templates/pretixbase/email/export_failed.txt
@@ -13372,6 +13372,8 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team"
msgstr ""
"Danke, \n"
"Das Team von %(instance)s"
#: pretix/base/templates/pretixbase/email/email_footer.html
#, python-format
@@ -13379,10 +13381,8 @@ msgid "powered by <a %(a_attr)s>pretix</a>"
msgstr "powered by <a %(a_attr)s>pretix</a>"
#: pretix/base/templates/pretixbase/email/export_failed.txt
#, fuzzy
#| msgid "Your export failed."
msgid "Your scheduled export failed."
msgstr "Der Export ist fehlgeschlagen."
msgstr "Ihr geplanter Export ist fehlgeschlagen."
#: pretix/base/templates/pretixbase/email/export_failed.txt
#: pretix/control/templates/pretixcontrol/event/tax_edit.html
@@ -13390,39 +13390,29 @@ msgid "Reason"
msgstr "Grund"
#: pretix/base/templates/pretixbase/email/export_failed.txt
#, fuzzy
#| msgid "If your export fails five times in a row, it will no longer be sent."
msgid "If an export fails five times in a row, we'll stop sending it."
msgstr ""
"Wenn der Export fünf mal in Folge fehlschlägt, wird er nicht mehr verschickt."
#: pretix/base/templates/pretixbase/email/export_failed.txt
#, fuzzy
#| msgid "You can request to cancel this order."
msgid "You can adjust or remove this export here:"
msgstr "Sie können eine Stornierung dieser Bestellung anfragen."
msgstr "Sie können diesen Export hier anpassen oder löschen:"
#: pretix/base/templates/pretixbase/email/notification.html
#: pretix/base/templates/pretixbase/email/notification.txt
#, fuzzy
#| msgid "You receive these emails based on your notification settings."
msgid "You're receiving this email based on your notification settings."
msgstr ""
"Sie erhalten diese E-Mail aufgrund Ihrer Benachrichtigungseinstellungen."
"Sie erhalten diese E-Mail auf Basis Ihrer Benachrichtigungs-Einstellungen."
#: pretix/base/templates/pretixbase/email/notification.html
#: pretix/base/templates/pretixbase/email/notification.txt
#, fuzzy
#| msgid "Change settings"
msgid "Manage settings"
msgstr "Einstellungen bearbeiten"
#: pretix/base/templates/pretixbase/email/notification.html
#: pretix/base/templates/pretixbase/email/notification.txt
#, fuzzy
#| msgid "Disable notifications"
msgid "Disable all notifications"
msgstr "Benachrichtigungen deaktivieren"
msgstr "Alle Benachrichtigungen deaktivieren"
#: pretix/base/templates/pretixbase/email/order_details.html
msgid ""
@@ -13480,25 +13470,7 @@ msgid "Contact"
msgstr "Kontakt"
#: pretix/base/templates/pretixbase/email/shred_completed.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "we hereby confirm that the following data shredding job has been "
#| "completed:\n"
#| "\n"
#| "Organizer: %(organizer)s\n"
#| "\n"
#| "Event: %(event)s\n"
#| "\n"
#| "Data selection: %(shredders)s\n"
#| "\n"
#| "Start time: %(start_time)s (new data added after this time might not have "
#| "been deleted)\n"
#| "\n"
#| "Best regards,\n"
#| "\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -13516,21 +13488,17 @@ msgid ""
msgstr ""
"Hallo,\n"
"\n"
"wir bestätigen hiermit, dass der folgende Lösch-Auftrag abgeschlossen "
"wurde:\n"
"der folgende Lösch-Auftrag wurde abgeschlossen:\n"
"\n"
"Veranstalter: %(organizer)s\n"
"- Veranstalter: %(organizer)s\n"
"- Veranstaltung: %(event)s\n"
"- Datenauswahl: %(shredders)s\n"
"- Startzeit: %(start_time)s\n"
"\n"
"Veranstaltung: %(event)s\n"
"Daten, die nach dieser Startzeit entstanden sind, sind ggf. nicht gelöscht.\n"
"\n"
"Datenauswahl: %(shredders)s\n"
"\n"
"Startzeit: %(start_time)s (Daten, die nach diesem Zeitpunkt entstanden sind, "
"sind ggf. nicht gelöscht)\n"
"\n"
"Freundliche Grüße\n"
"\n"
"Das %(instance)s-Team\n"
"Danke, \n"
"Das Team von %(instance)s\n"
#: pretix/base/templates/pretixbase/forms/widgets/checkbox_sales_channel_option.html
msgid ""
@@ -13567,11 +13535,15 @@ msgstr "Bitte in neuem Tab fortfahren"
#: pretix/base/templates/pretixbase/framebreak.html
msgid "For security reasons, the following step is only possible in a new tab."
msgstr ""
"Aus Sicherheitsgründen ist der folgende Schritt nur in einem neuen Tab "
"möglich."
#: pretix/base/templates/pretixbase/framebreak.html
msgid ""
"If the new tab did not open automatically, please click the following button:"
msgstr ""
"Wenn der neue Tab sich nicht automatisch geöffnet hat, klicken Sie bitte den "
"folgenden Button:"
#: pretix/base/templates/pretixbase/framebreak.html
#: pretix/presale/templates/pretixpresale/event/cookies.html
@@ -19943,21 +19915,7 @@ msgid "Add property"
msgstr "Eigenschaft hinzufügen"
#: pretix/control/templates/pretixcontrol/email/confirmation_code.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "%(reason)s\n"
#| "\n"
#| " %(code)s\n"
#| "\n"
#| "Please do never give this code to another person. Our support team will "
#| "never ask for this code.\n"
#| "\n"
#| "If this code was not requested by you, please contact us immediately.\n"
#| "\n"
#| "Best regards,\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -19979,33 +19937,17 @@ msgstr ""
"\n"
" %(code)s\n"
"\n"
"Bitte geben Sie diesen Code nie an eine andere Person weiter. Unser Support-"
"Team wird nie nach diesem Code fragen.\n"
"Bitte geben Sie diesen Code an niemanden weiter. Das Team von %(instance)s "
"wird nie danach fragen.\n"
"\n"
"Wenn Sie diesen Code nicht angefragt haben, kontaktieren Sie uns bitte "
"sofort.\n"
"\n"
"Viele Grüße,\n"
"Ihr %(instance)s-Team\n"
"Danke, \n"
"Das Team von %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/email_setup.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "someone requested to use %(address)s as a sender address on "
#| "%(instance)s.\n"
#| "This will allow them to send emails that are shown to originate from this "
#| "email address.\n"
#| "If that was you, please enter the following confirmation code:\n"
#| "\n"
#| "%(code)s\n"
#| "\n"
#| "If this was not requested by you, you can safely ignore this email.\n"
#| "\n"
#| "Best regards, \n"
#| "\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -20017,8 +19959,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -20027,19 +19970,21 @@ msgid ""
msgstr ""
"Hallo,\n"
"\n"
"jemand hat angefragt, die Adresse %(address)s als Absenderadresse auf "
"%(instance)s zu nutzen.\n"
"Hierdurch könnten dann E-Mails verschickt werden, die diese Adresse als "
"Absender tragen.\n"
"Wenn Sie das waren, geben Sie bitte folgenden Bestätigungscode ein:\n"
"jemand hat angefragt, die Adresse %(address)s als Absenderadresse auf %"
"(instance)s zu nutzen. Hierdurch könnten dann E-Mails über %(instance)s "
"verschickt werden, die diese Adresse als Absender tragen. Wenn Sie das "
"waren, geben Sie bitte folgenden Bestätigungscode im Formular ein:\n"
"\n"
"%(code)s\n"
"\n"
"Teilen Sie diesen Code mit niemandem, außer Sie möchten die Person dazu "
"berechtigen, diese E-Mail-Adresse zu diesem Zweck zu nutzen. Das Team von %"
"(instance)s wird nie nach diesem Code fragen.\n"
"\n"
"Wenn Sie das nicht waren, können Sie diese E-Mail gefahrlos ignorieren.\n"
"\n"
"Viele Grüße, \n"
"\n"
"Ihr Team von %(instance)s\n"
"Danke, \n"
"Das Team von %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/forgot.txt
#, python-format
@@ -20057,27 +20002,22 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Hallo,\n"
"\n"
"wir haben eine Anfrage erhalten, das Passwort für Ihren Account bei "
"%(instance)s zurückzusetzen. Um ein neues Passwort zu wählen, klicken Sie "
"auf den folgenden Link:\n"
"\n"
"%(url)s\n"
"\n"
"Wenn Sie dies nicht angefordert haben, können Sie diese E-Mail ignorieren "
"Ihr Passwort wird nicht geändert.\n"
"\n"
"Danke, \n"
"Das Team von %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/invitation.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "you have been invited to a team on %(instance)s, a platform to perform "
#| "event\n"
#| "ticket sales.\n"
#| "\n"
#| "Organizer: %(organizer)s\n"
#| "Team: %(team)s\n"
#| "\n"
#| "If you want to join that team, just click on the following link:\n"
#| "%(url)s\n"
#| "\n"
#| "If you do not want to join, you can safely ignore or delete this email.\n"
#| "\n"
#| "Best regards, \n"
#| "\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -20099,23 +20039,18 @@ msgstr ""
"Hallo,\n"
"\n"
"Sie wurden in das Team eines Veranstalters auf %(instance)s eingeladen, "
"einer Plattform zum\n"
"Verkaufen von Veranstaltungstickets.\n"
"einer Plattform zum Verkaufen von Veranstaltungstickets.\n"
"\n"
"Veranstalter: %(organizer)s\n"
"- Veranstalter: %(organizer)s\n"
"- Team: %(team)s\n"
"\n"
"Team: %(team)s\n"
"\n"
"Wenn Sie dem Team beitreten möchten, klicken Sie einfach auf den folgenden "
"Link:\n"
"Zum Akzeptieren klicken Sie auf den folgenden Link:\n"
"%(url)s\n"
"\n"
"Wenn Sie dies nicht möchten, können Sie diese Mail problemlos ignorieren\n"
"oder löschen.\n"
"Wenn Sie dies nicht möchten, können Sie diese Mail ignorieren.\n"
"\n"
"Viele Grüße\n"
"\n"
"Das %(instance)s-Team\n"
"Danke, \n"
"Das Team von %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
#, python-format
@@ -20124,21 +20059,24 @@ msgid ""
"\n"
"We noticed a new sign-in to your %(instance)s account:\n"
msgstr ""
"Hallo,\n"
"\n"
"wir haben einen neuen Login in Ihren Account bei %(instance)s festgestellt:\n"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
msgid "Browser"
msgstr ""
msgstr "Browser"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
msgid "Operating system"
msgstr ""
msgstr "Betriebssystem"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
#, python-format
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
@@ -20146,26 +20084,18 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Wenn Sie dies waren, ist keine Aktion erforderlich.\n"
"\n"
"Wenn Sie diesen Login nicht wiedererkennen, ändern Sie bitte sofort Ihr "
"Passwort:\n"
"\n"
"%(url)s\n"
"\n"
"Danke, \n"
"Das Team von %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/security_notice.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "this is to inform you that the account information of your %(instance)s "
#| "account has been\n"
#| "changed. In particular, the following changes have been performed:\n"
#| "\n"
#| "%(messages)s\n"
#| "\n"
#| "If this change was not performed by you, please contact us immediately.\n"
#| "\n"
#| "You can review and change your account settings here:\n"
#| "\n"
#| "%(url)s\n"
#| "\n"
#| "Best regards, \n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -20185,21 +20115,19 @@ msgid ""
msgstr ""
"Hallo,\n"
"\n"
"die Einstellungen Ihres %(instance)s-Kontos wurden verändert. Es wurden die "
"folgenden Änderungen\n"
"vorgenommen:\n"
"die folgenden Einstellungen Ihres Kontos bei %(instance)s wurden verändert:\n"
"\n"
"%(messages)s\n"
"\n"
"Wenn diese Änderung nicht von Ihnen vorgenommen wurde, kontaktieren Sie uns "
"bitte unverzüglich.\n"
"Wenn diese Änderung nicht von Ihnen vorgenommen wurde, kontaktieren Sie das "
"Team von %(instance)s bitte unverzüglich.\n"
"\n"
"Sie können Ihre Kontoeinstellungen hier einsehen und verändern:\n"
"\n"
"%(url)s\n"
"\n"
"Viele Grüße\n"
"Ihr %(instance)s-Team\n"
"Danke, \n"
"Das Team von %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email_setup.html
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
@@ -28817,7 +28745,7 @@ msgstr "Der Bestätigungscode war falsch, bitte erneut versuchen."
#: pretix/control/views/mailsetup.py
#, python-format
msgid "Confirm %(address)s as a sender address"
msgstr ""
msgstr "Bestätigen Sie %(address)s als Absenderadresse"
#: pretix/control/views/mailsetup.py
#, python-format
@@ -30042,10 +29970,8 @@ msgid "Open BezahlCode in your banking app to start the payment process."
msgstr "BezahlCode in Banking-App öffnen um den Zahlungsvorgang zu starten."
#: pretix/helpers/security.py
#, fuzzy
#| msgid "Sign in to your account at %(org)s"
msgid "New sign-in to your account"
msgstr "Log-in in Ihr Kundenkonto bei %(org)s"
msgstr "Neue Anmeldung in Ihrem Konto"
#: pretix/multidomain/models.py
msgid "Organizer domain"
@@ -36167,10 +36093,8 @@ msgstr[0] "%(count)s Veranstaltung"
msgstr[1] "%(count)s Veranstaltungen"
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
#, fuzzy
#| msgid "No event"
msgid "No events"
msgstr "Keine Veranstaltung"
msgstr "Keine Veranstaltungen"
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
#: pretix/presale/templates/pretixpresale/fragment_day_calendar.html
@@ -36516,10 +36440,8 @@ msgid "Create account"
msgstr "Konto erstellen"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
#, fuzzy
#| msgid "The invoice could not be generated."
msgid "Login could not be completed"
msgstr "Die Rechnung konnte nicht erstellt werden."
msgstr "Login konnte nicht durchgeführt werden"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
@@ -36528,43 +36450,54 @@ msgid ""
"process.\n"
" "
msgstr ""
"\n"
" Wir konnten Ihren Login nicht durchführen, da der Prozess "
"unterbrochen wurde.\n"
" "
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "Possible reasons for this:"
msgstr ""
msgstr "Mögliche Gründe:"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
"You started logging in from a link opened inside an app (such as Instagram "
"or an email app), and then continued the login in your main browser."
msgstr ""
"Sie haben den Login von einem Link in einer App (wie z.B. Instagram oder "
"einer E-Mail-App) gestartet und dann in Ihrem normalen Browser fortgesetzt."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "You refreshed the page or used the back button during login."
msgstr ""
"Sie haben während des Logins die Seite neu geladen oder den Zurück-Button "
"betätigt."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "The site was opened in more than one tab or window at the same time."
msgstr ""
"Die Seite war in mehr als einem Tab oder Fenster gleichzeitig geöffnet."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
"There was a long delay between starting and completing the login process."
msgstr ""
msgstr "Es gab eine lange Pause zwischen Start und Ende des Loginvorgangs."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "How to fix this:"
msgstr ""
msgstr "Wie Sie dies beheben können:"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "Close this page."
msgstr ""
msgstr "Schließen Sie diese Seite."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
"Open this website again directly in your main browser (for example Safari or "
"Chrome)."
msgstr ""
"Öffnen Sie die Website erneut direkt mit Ihrem bevorzugten Browser (z.B. "
"Safari oder Chrome)."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
@@ -36572,6 +36505,9 @@ msgid ""
"browser window, without refreshing the page, opening new tabs, or switching "
"apps part-way through."
msgstr ""
"Beginnen Sie den Kauf- oder Login-Vorgang erneut und führen Sie ihn im "
"selben Browserfenster durch, ohne die Seite neu zu laden, neue Tabs zu "
"öffnen oder zwischendurch Apps zu wechseln."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
@@ -36579,6 +36515,10 @@ msgid ""
"before retrying can help. As a last step, try using a different browser or "
"another device (for example, a desktop or laptop computer)."
msgstr ""
"Wenn das Problem fortbesteht, kann es helfen, alle Browser-Fenster zu "
"schließen und Cookies zu löschen. Als letzten Schritt können Sie einen "
"anderen Browser oder ein andres Gerät (z.B. ein Laptop oder Desktop-"
"Computer) verwenden."
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
msgid "Your membership"
+6
View File
@@ -74,6 +74,7 @@ Bokmål
Boleto
Branding-Informationen
Browsereinstellungen
Browserfenster
BSD-Lizenz
bspw
Bundles
@@ -134,6 +135,7 @@ Einlasskontrolle
Einmalpasswörter
einzuchecken
email
E-Mail-App
E-Mail-Renderer
Enterprise-Lizenz
Enterprise-Lizenzen
@@ -152,6 +154,7 @@ erstmalig
etc
EU-USt-ID-Nr
Event
Event-Absage
Event-Eigenschaft
Eventeingang
Event-Erstellung
@@ -206,6 +209,7 @@ innenname
innennamen
innergemeinschaftliche
Innergemeinschaftlicher
Instagram
Installations-ID
Integrationen
invalidieren
@@ -227,6 +231,7 @@ Linktext
lit
Log-ID
Logindaten
Loginvorgangs
Macau
MapQuest-API-Key
max
@@ -450,6 +455,7 @@ Strong
Swish
systemweiten
Tab
Tabs
tag
Teammitglied
Teamname
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"PO-Revision-Date: 2026-06-28 15:19+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-07-07 09:55+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix/de_Informal/>\n"
@@ -181,7 +181,7 @@ msgstr "Spanisch (Lateinamerika)"
#: pretix/_base_settings.py
msgid "Thai"
msgstr ""
msgstr "Thailändisch"
#: pretix/_base_settings.py
msgid "Turkish"
@@ -438,7 +438,7 @@ msgstr ""
#: pretix/api/serializers/organizer.py pretix/control/views/organizer.py
#, python-format
msgid "You've been invited to join %(organizer)s"
msgstr ""
msgstr "Du wurdest eingeladen, %(organizer)s beizutreten"
#: pretix/api/serializers/organizer.py pretix/control/views/organizer.py
msgid "This user already has been invited for this team."
@@ -4072,43 +4072,31 @@ msgid "Users"
msgstr "Benutzer"
#: pretix/base/models/auth.py
#, fuzzy
#| msgid "Changes to your account at {organizer}"
msgid "Changes to your account"
msgstr "Änderungen an deinem Kundenkonto bei {organizer}"
msgstr "Änderungen an deinem Konto"
#: pretix/base/models/auth.py
#, fuzzy, python-brace-format
#| msgid ""
#| "to confirm changing your email address from {old_email}\n"
#| "to {new_email}, use the following code:"
#, python-brace-format
msgid ""
"To change your email address from {old_email} to {new_email}, use the "
"following code:"
msgstr ""
"um zu bestätigen, dass du deine E-Mail-Adresse von {old_email}\n"
"zu {new_email} ändern möchtest, verwende den folgenden Code:"
"um deine E-Mail-Adresse von {old_email} zu {new_email} zu ändern, verwende "
"den folgenden Code:"
#: pretix/base/models/auth.py
#, fuzzy, python-brace-format
#| msgid ""
#| "to confirm changing your email address from {old_email}\n"
#| "to {new_email}, use the following code:"
#, python-brace-format
msgid ""
"To verify your email address {email} on {instance}, use the following code:"
msgstr ""
"um zu bestätigen, dass du deine E-Mail-Adresse von {old_email}\n"
"zu {new_email} ändern möchtest, verwende den folgenden Code:"
"um deine Absenderadresse {email} für {instance} zu bestätigen, verwende den "
"folgenden Code:"
#: pretix/base/models/auth.py
#, fuzzy
#| msgid "Enter confirmation code"
msgid "Your confirmation code"
msgstr "Bestätigungs-Code eingeben"
msgstr "Dein Bestätigungscode"
#: pretix/base/models/auth.py
#, fuzzy
#| msgid "Reset password"
msgid "Reset your password"
msgstr "Passwort zurücksetzen"
@@ -8317,7 +8305,7 @@ msgstr "Veranstaltung abgesagt"
#: pretix/base/services/cancelevent.py
msgid "Confirm event cancellation and bulk refund"
msgstr ""
msgstr "Event-Absage und Rückerstattung bestätigen"
#: pretix/base/services/cart.py pretix/base/services/modelimport.py
#: pretix/base/services/orders.py
@@ -8895,10 +8883,8 @@ msgid "Your export did not contain any data."
msgstr "Der Export enthielt keine Daten."
#: pretix/base/services/export.py
#, fuzzy
#| msgid "Scheduled exports"
msgid "Scheduled export failed"
msgstr "Geplante Exporte"
msgstr "Geplanter Export fehlgeschlagen"
#: pretix/base/services/export.py
msgid "Permission denied."
@@ -9233,6 +9219,8 @@ msgstr "Ein Gutschein kann ohne Code nicht erzeugt werden."
msgid ""
"Voucher codes must be unique. Code \"{code}\" already exists in this import."
msgstr ""
"Gutscheincodes müssen einmalig sein. Code \"{code}\" existiert bereits in "
"diesem Import."
#: pretix/base/services/modelimport.py
#, python-brace-format
@@ -9241,13 +9229,19 @@ msgid ""
msgid_plural ""
"Voucher codes must be unique. Import contains existing voucher codes {code}."
msgstr[0] ""
"Gutscheincodes müssen eindeutig sein. Der Import enthält den existierenden "
"Gutscheincode {code}."
msgstr[1] ""
"Gutscheincodes müssen eindeutig sein. Der Import enthält die existierenden "
"Gutscheincodes {code}."
#: pretix/base/services/modelimport.py
msgid ""
"Vouchers could not be imported, probably due to a voucher code already being "
"in use."
msgstr ""
"Die Gutscheine konnten nicht importiert werden, vermutlich weil ein "
"Gutscheincode bereits in Verwendung ist."
#: pretix/base/services/orders.py
msgid ""
@@ -9626,10 +9620,9 @@ msgstr ""
"bitte erneut versuchen."
#: pretix/base/services/shredder.py
#, fuzzy, python-format
#| msgid "Data shredding completed"
#, python-format
msgid "Data shredding completed for %(event)s"
msgstr "Löschen personenbezogener Daten abgeschlossen"
msgstr "Löschen personenbezogener Daten abgeschlossen für %(event)s"
#: pretix/base/services/stats.py
msgid "Uncategorized"
@@ -11439,6 +11432,21 @@ msgstr ""
"Wir werden diese Adresse veröffentlichen um Teilnehmer*innen zu ermöglichen, "
"dich zu kontaktieren."
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Contact URL"
msgstr "Kontakt-URL"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
"Wenn du diese Option setzt, wird der Kontakt-Link in der Fußzeile auf diese "
"Adresse verweisen statt auf die obige E-Mail-Adresse. Bitte beachte, dass "
"die Kontakt-E-Mail-Adresse trotzdem z.B. mit allen Empfängern von E-Mails "
"geteilt wird."
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "Impressum (URL)"
@@ -13311,26 +13319,16 @@ msgstr ""
"kontaktiere uns."
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#, fuzzy
#| msgid ""
#| "You have requested us to cancel an event which includes a larger bulk-"
#| "refund:"
msgid "You requested to cancel an event that involves a large bulk refund:"
msgstr ""
"Du hast angefordert, dass eine Veranstaltung abgesagt wird, wodurch eine "
"größere Erstattung vorgenommen wird:"
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#, fuzzy
#| msgid "Estimated refund amount"
msgid "Estimated refund"
msgstr "Voraussichtlicher Erstattungsbetrag"
msgstr "Voraussichtliche Erstattung"
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#, fuzzy
#| msgid ""
#| "Please confirm that you want to proceed by coping the following "
#| "confirmation code into the cancellation form:"
msgid "To confirm, paste the following code into the cancellation form:"
msgstr ""
"Bitte bestätige, dass du fortfahren willst, indem du den folgenden "
@@ -13342,6 +13340,8 @@ msgid ""
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it."
msgstr ""
"Teilen den Code mit niemandem. Das Team von %(instance)s wird nie danach "
"fragen."
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#: pretix/base/templates/pretixbase/email/export_failed.txt
@@ -13350,6 +13350,8 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team"
msgstr ""
"Danke, \n"
"Das Team von %(instance)s"
#: pretix/base/templates/pretixbase/email/email_footer.html
#, python-format
@@ -13357,10 +13359,8 @@ msgid "powered by <a %(a_attr)s>pretix</a>"
msgstr "powered by <a %(a_attr)s>pretix</a>"
#: pretix/base/templates/pretixbase/email/export_failed.txt
#, fuzzy
#| msgid "Your export failed."
msgid "Your scheduled export failed."
msgstr "Der Export ist fehlgeschlagen."
msgstr "Dein geplanter Export ist fehlgeschlagen."
#: pretix/base/templates/pretixbase/email/export_failed.txt
#: pretix/control/templates/pretixcontrol/event/tax_edit.html
@@ -13368,39 +13368,29 @@ msgid "Reason"
msgstr "Grund"
#: pretix/base/templates/pretixbase/email/export_failed.txt
#, fuzzy
#| msgid "If your export fails five times in a row, it will no longer be sent."
msgid "If an export fails five times in a row, we'll stop sending it."
msgstr ""
"Wenn der Export fünf mal in Folge fehlschlägt, wird er nicht mehr verschickt."
#: pretix/base/templates/pretixbase/email/export_failed.txt
#, fuzzy
#| msgid "You can request to cancel this order."
msgid "You can adjust or remove this export here:"
msgstr "Du kannst eine Stornierung dieser Bestellung anfragen."
msgstr "Du kannst diesen Export hier anpassen oder löschen:"
#: pretix/base/templates/pretixbase/email/notification.html
#: pretix/base/templates/pretixbase/email/notification.txt
#, fuzzy
#| msgid "You receive these emails based on your notification settings."
msgid "You're receiving this email based on your notification settings."
msgstr ""
"Du erhältst diese E-Mail aufgrund deiner Benachrichtigungseinstellungen."
"Du erhältst diese E-Mail auf Basis deiner Benachrichtigungs-Einstellungen."
#: pretix/base/templates/pretixbase/email/notification.html
#: pretix/base/templates/pretixbase/email/notification.txt
#, fuzzy
#| msgid "Change settings"
msgid "Manage settings"
msgstr "Einstellungen bearbeiten"
#: pretix/base/templates/pretixbase/email/notification.html
#: pretix/base/templates/pretixbase/email/notification.txt
#, fuzzy
#| msgid "Disable notifications"
msgid "Disable all notifications"
msgstr "Benachrichtigungen deaktivieren"
msgstr "Alle Benachrichtigungen deaktivieren"
#: pretix/base/templates/pretixbase/email/order_details.html
msgid ""
@@ -13458,25 +13448,7 @@ msgid "Contact"
msgstr "Kontakt"
#: pretix/base/templates/pretixbase/email/shred_completed.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "we hereby confirm that the following data shredding job has been "
#| "completed:\n"
#| "\n"
#| "Organizer: %(organizer)s\n"
#| "\n"
#| "Event: %(event)s\n"
#| "\n"
#| "Data selection: %(shredders)s\n"
#| "\n"
#| "Start time: %(start_time)s (new data added after this time might not have "
#| "been deleted)\n"
#| "\n"
#| "Best regards,\n"
#| "\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -13494,21 +13466,17 @@ msgid ""
msgstr ""
"Hallo,\n"
"\n"
"wir bestätigen hiermit, dass der folgende Lösch-Auftrag abgeschlossen "
"wurde:\n"
"der folgende Lösch-Auftrag wurde abgeschlossen:\n"
"\n"
"Veranstalter: %(organizer)s\n"
"- Veranstalter: %(organizer)s\n"
"- Veranstaltung: %(event)s\n"
"- Datenauswahl: %(shredders)s\n"
"- Startzeit: %(start_time)s\n"
"\n"
"Veranstaltung: %(event)s\n"
"Daten, die nach dieser Startzeit entstanden sind, sind ggf. nicht gelöscht.\n"
"\n"
"Datenauswahl: %(shredders)s\n"
"\n"
"Startzeit: %(start_time)s (Daten, die nach diesem Zeitpunkt entstanden sind, "
"sind ggf. nicht gelöscht)\n"
"\n"
"Freundliche Grüße\n"
"\n"
"Das %(instance)s-Team\n"
"Danke, \n"
"Das Team von %(instance)s\n"
#: pretix/base/templates/pretixbase/forms/widgets/checkbox_sales_channel_option.html
msgid ""
@@ -13545,11 +13513,15 @@ msgstr "Bitte in neuem Tab fortfahren"
#: pretix/base/templates/pretixbase/framebreak.html
msgid "For security reasons, the following step is only possible in a new tab."
msgstr ""
"Aus Sicherheitsgründen ist der folgende Schritt nur in einem neuen Tab "
"möglich."
#: pretix/base/templates/pretixbase/framebreak.html
msgid ""
"If the new tab did not open automatically, please click the following button:"
msgstr ""
"Wenn der neue Tab sich nicht automatisch geöffnet hat, klicke bitte den "
"folgenden Button:"
#: pretix/base/templates/pretixbase/framebreak.html
#: pretix/presale/templates/pretixpresale/event/cookies.html
@@ -19917,21 +19889,7 @@ msgid "Add property"
msgstr "Eigenschaft hinzufügen"
#: pretix/control/templates/pretixcontrol/email/confirmation_code.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "%(reason)s\n"
#| "\n"
#| " %(code)s\n"
#| "\n"
#| "Please do never give this code to another person. Our support team will "
#| "never ask for this code.\n"
#| "\n"
#| "If this code was not requested by you, please contact us immediately.\n"
#| "\n"
#| "Best regards,\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -19953,32 +19911,16 @@ msgstr ""
"\n"
" %(code)s\n"
"\n"
"Bitte gib diesen Code nie an eine andere Person weiter. Unser Support-Team "
"wird nie nach diesem Code fragen.\n"
"Bitte gib diesen Code an niemanden weiter. Das Team von %(instance)s wird "
"nie danach fragen.\n"
"\n"
"Wenn du diesen Code nicht angefragt hast, kontaktiere uns bitte sofort.\n"
"\n"
"Viele Grüße,\n"
"Dein %(instance)s-Team\n"
"Danke, \n"
"Das Team von %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/email_setup.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "someone requested to use %(address)s as a sender address on "
#| "%(instance)s.\n"
#| "This will allow them to send emails that are shown to originate from this "
#| "email address.\n"
#| "If that was you, please enter the following confirmation code:\n"
#| "\n"
#| "%(code)s\n"
#| "\n"
#| "If this was not requested by you, you can safely ignore this email.\n"
#| "\n"
#| "Best regards, \n"
#| "\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -19990,8 +19932,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -20000,19 +19943,21 @@ msgid ""
msgstr ""
"Hallo,\n"
"\n"
"jemand hat angefragt, die Adresse %(address)s als Absenderadresse auf "
"%(instance)s zu nutzen.\n"
"Hierdurch könnten dann E-Mails verschickt werden, die diese Adresse als "
"Absender tragen.\n"
"Wenn du das warst, gib bitte folgenden Bestätigungscode ein:\n"
"jemand hat angefragt, die Adresse %(address)s als Absenderadresse auf %"
"(instance)s zu nutzen. Hierdurch könnten dann E-Mails über %(instance)s "
"verschickt werden, die diese Adresse als Absender tragen. Wenn du das warst, "
"gib bitte folgenden Bestätigungscode im Formular ein:\n"
"\n"
"%(code)s\n"
"\n"
"Teile diesen Code mit niemandem, außer du möchtest die Person dazu "
"berechtigen, diese E-Mail-Adresse zu diesem Zweck zu nutzen. Das Team von %"
"(instance)s wird nie nach diesem Code fragen.\n"
"\n"
"Wenn du das nicht warst, kannst du diese E-Mail gefahrlos ignorieren.\n"
"\n"
"Viele Grüße, \n"
"\n"
"Dein Team von %(instance)s\n"
"Danke, \n"
"Das Team von %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/forgot.txt
#, python-format
@@ -20030,27 +19975,22 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Hallo,\n"
"\n"
"wir haben eine Anfrage erhalten, das Passwort für deinen Account bei "
"%(instance)s zurückzusetzen. Um ein neues Passwort zu wählen, klicke auf den "
"folgenden Link:\n"
"\n"
"%(url)s\n"
"\n"
"Wenn du dies nicht angefordert hast, kannst du diese E-Mail ignorieren "
"dein Passwort wird nicht geändert.\n"
"\n"
"Danke, \n"
"Das Team von %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/invitation.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "you have been invited to a team on %(instance)s, a platform to perform "
#| "event\n"
#| "ticket sales.\n"
#| "\n"
#| "Organizer: %(organizer)s\n"
#| "Team: %(team)s\n"
#| "\n"
#| "If you want to join that team, just click on the following link:\n"
#| "%(url)s\n"
#| "\n"
#| "If you do not want to join, you can safely ignore or delete this email.\n"
#| "\n"
#| "Best regards, \n"
#| "\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -20072,22 +20012,18 @@ msgstr ""
"Hallo,\n"
"\n"
"du wurdest in das Team eines Veranstalters auf %(instance)s eingeladen, "
"einer Plattform zum\n"
"Verkaufen von Veranstaltungstickets.\n"
"einer Plattform zum Verkaufen von Veranstaltungstickets.\n"
"\n"
"Veranstalter: %(organizer)s\n"
"- Veranstalter: %(organizer)s\n"
"- Team: %(team)s\n"
"\n"
"Team: %(team)s\n"
"\n"
"Wenn du dem Team beitreten möchtest, klicke einfach auf den folgenden Link:\n"
"Zum Akzeptieren klicke auf den folgenden Link:\n"
"%(url)s\n"
"\n"
"Wenn du dies nicht möchtest, kannst du diese Mail problemlos ignorieren\n"
"oder löschen.\n"
"Wenn du dies nicht möchtest, kannst du diese Mail ignorieren.\n"
"\n"
"Viele Grüße\n"
"\n"
"Das %(instance)s-Team\n"
"Danke, \n"
"Das Team von %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
#, python-format
@@ -20096,21 +20032,25 @@ msgid ""
"\n"
"We noticed a new sign-in to your %(instance)s account:\n"
msgstr ""
"Hallo,\n"
"\n"
"wir haben einen neuen Login in deinen Account bei %(instance)s "
"festgestellt:\n"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
msgid "Browser"
msgstr ""
msgstr "Browser"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
msgid "Operating system"
msgstr ""
msgstr "Betriebssystem"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
#, python-format
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
@@ -20118,26 +20058,18 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Wenn du dies warst, ist keine Aktion erforderlich.\n"
"\n"
"Wenn du diesen Login nicht wiedererkennst, ändere bitte sofort dein "
"Passwort:\n"
"\n"
"%(url)s\n"
"\n"
"Danke, \n"
"Das Team von %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/security_notice.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "this is to inform you that the account information of your %(instance)s "
#| "account has been\n"
#| "changed. In particular, the following changes have been performed:\n"
#| "\n"
#| "%(messages)s\n"
#| "\n"
#| "If this change was not performed by you, please contact us immediately.\n"
#| "\n"
#| "You can review and change your account settings here:\n"
#| "\n"
#| "%(url)s\n"
#| "\n"
#| "Best regards, \n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -20157,21 +20089,20 @@ msgid ""
msgstr ""
"Hallo,\n"
"\n"
"die Einstellungen deines %(instance)s-Kontos wurden verändert. Es wurden die "
"folgenden Änderungen\n"
"vorgenommen:\n"
"die folgenden Einstellungen deines Kontos bei %(instance)s wurden "
"verändert:\n"
"\n"
"%(messages)s\n"
"\n"
"Wenn diese Änderung nicht von dir vorgenommen wurden, kontaktiere uns bitte "
"unverzüglich.\n"
"Wenn diese Änderung nicht von dir vorgenommen wurden, kontaktiere das Team "
"von %(instance)s bitte unverzüglich.\n"
"\n"
"Du kannst deine Kontoeinstellungen hier einsehen und verändern:\n"
"\n"
"%(url)s\n"
"\n"
"Viele Grüße\n"
"Dein %(instance)s-Team\n"
"Danke, \n"
"Das Team von %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email_setup.html
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
@@ -28773,7 +28704,7 @@ msgstr "Der Bestätigungscode war falsch, bitte erneut versuchen."
#: pretix/control/views/mailsetup.py
#, python-format
msgid "Confirm %(address)s as a sender address"
msgstr ""
msgstr "Bestätige %(address)s als Absenderadresse"
#: pretix/control/views/mailsetup.py
#, python-format
@@ -29995,10 +29926,8 @@ msgid "Open BezahlCode in your banking app to start the payment process."
msgstr "BezahlCode in Banking-App öffnen um den Zahlungsvorgang zu starten."
#: pretix/helpers/security.py
#, fuzzy
#| msgid "Sign in to your account at %(org)s"
msgid "New sign-in to your account"
msgstr "Log-in in dein Kundenkonto bei %(org)s"
msgstr "Neue Anmeldung in deinem Konto"
#: pretix/multidomain/models.py
msgid "Organizer domain"
@@ -36109,10 +36038,8 @@ msgstr[0] "%(count)s Veranstaltung"
msgstr[1] "%(count)s Veranstaltungen"
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
#, fuzzy
#| msgid "No event"
msgid "No events"
msgstr "Veranstaltung aufrufen"
msgstr "Keine Veranstaltungen"
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
#: pretix/presale/templates/pretixpresale/fragment_day_calendar.html
@@ -36458,10 +36385,8 @@ msgid "Create account"
msgstr "Konto erstellen"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
#, fuzzy
#| msgid "The invoice could not be generated."
msgid "Login could not be completed"
msgstr "Die Rechnung konnte nicht erstellt werden."
msgstr "Login konnte nicht durchgeführt werden"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
@@ -36470,43 +36395,54 @@ msgid ""
"process.\n"
" "
msgstr ""
"\n"
" Wir konnten deinen Login nicht durchführen, da der Prozess "
"unterbrochen wurde.\n"
" "
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "Possible reasons for this:"
msgstr ""
msgstr "Mögliche Gründe:"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
"You started logging in from a link opened inside an app (such as Instagram "
"or an email app), and then continued the login in your main browser."
msgstr ""
"Du hast den Login von einem Link in einer App (wie z.B. Instagram oder einer "
"E-Mail-App) gestartet und dann in Ihrem normalen Browser fortgesetzt."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "You refreshed the page or used the back button during login."
msgstr ""
"Du hast während des Logins die Seite neu geladen oder den Zurück-Button "
"betätigt."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "The site was opened in more than one tab or window at the same time."
msgstr ""
"Die Seite war in mehr als einem Tab oder Fenster gleichzeitig geöffnet."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
"There was a long delay between starting and completing the login process."
msgstr ""
msgstr "Es gab eine lange Pause zwischen Start und Ende des Loginvorgangs."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "How to fix this:"
msgstr ""
msgstr "Wie du dies beheben kannst:"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "Close this page."
msgstr ""
msgstr "Schließe diese Seite."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
"Open this website again directly in your main browser (for example Safari or "
"Chrome)."
msgstr ""
"Öffne die Website erneut direkt mit deinem bevorzugten Browser (z.B. Safari "
"oder Chrome)."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
@@ -36514,6 +36450,9 @@ msgid ""
"browser window, without refreshing the page, opening new tabs, or switching "
"apps part-way through."
msgstr ""
"Beginne den Kauf- oder Login-Vorgang erneut und führe ihn im selben "
"Browserfenster durch, ohne die Seite neu zu laden, neue Tabs zu öffnen oder "
"zwischendurch Apps zu wechseln."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
@@ -36521,6 +36460,10 @@ msgid ""
"before retrying can help. As a last step, try using a different browser or "
"another device (for example, a desktop or laptop computer)."
msgstr ""
"Wenn das Problem fortbesteht, kann es helfen, alle Browser-Fenster zu "
"schließen und Cookies zu löschen. Als letzten Schritt kannst du einen "
"anderen Browser oder ein andres Gerät (z.B. ein Laptop oder Desktop-"
"Computer) verwenden."
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
msgid "Your membership"
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:52+0000\n"
"PO-Revision-Date: 2026-05-04 07:42+0000\n"
"Last-Translator: Martin Gross <gross@rami.io>\n"
"PO-Revision-Date: 2026-07-13 11:28+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix-js/de_Informal/>\n"
"Language: de_Informal\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.17\n"
"X-Generator: Weblate 2026.7.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js
msgid "Marked as paid"
@@ -430,11 +430,11 @@ msgstr "Drücke Strg+C zum kopieren!"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
msgid "Edit"
msgstr ""
msgstr "Bearbeiten"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
msgid "Visualize"
msgstr ""
msgstr "Visualisieren"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
msgid ""
@@ -442,10 +442,13 @@ msgid ""
"or variations are not contained in any of your rule parts so people with "
"these tickets will not get in:"
msgstr ""
"Deine Regeln filtern immer nach Produkt oder Variation, jedoch sind die "
"folgenden Produkte oder Variationen nicht in einer Ihrer Regeln enthalten, "
"sodass Kunden mit diesen Tickets keinen Eintritt erhalten werden:"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
msgid "Please double-check if this was intentional."
msgstr ""
msgstr "Bitte überprüfe, ob dies beabsichtigt war."
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "All of the conditions below (AND)"
@@ -74,6 +74,7 @@ Bokmål
Boleto
Branding-Informationen
Browsereinstellungen
Browserfenster
BSD-Lizenz
bspw
Bundles
@@ -134,6 +135,7 @@ Einlasskontrolle
Einmalpasswörter
einzuchecken
email
E-Mail-App
E-Mail-Renderer
Enterprise-Lizenz
Enterprise-Lizenzen
@@ -152,6 +154,7 @@ erstmalig
etc
EU-USt-ID-Nr
Event
Event-Absage
Event-Eigenschaft
Eventeingang
Event-Erstellung
@@ -206,6 +209,7 @@ innenname
innennamen
innergemeinschaftliche
Innergemeinschaftlicher
Instagram
Installations-ID
Integrationen
invalidieren
@@ -227,6 +231,7 @@ Linktext
lit
Log-ID
Logindaten
Loginvorgangs
Macau
MapQuest-API-Key
max
@@ -450,6 +455,7 @@ Strong
Swish
systemweiten
Tab
Tabs
tag
Teammitglied
Teamname
+16 -4
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -10196,6 +10196,17 @@ msgstr ""
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Contact URL"
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr ""
@@ -17547,8 +17558,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -17615,7 +17627,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+1 -1
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:52+0000\n"
"POT-Creation-Date: 2026-07-07 09:33+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
+18 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-02-25 23:00+0000\n"
"Last-Translator: David Ibáñez Cerdeira <dibanez@gmail.com>\n"
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix/el/"
@@ -12225,6 +12225,19 @@ msgstr ""
"Θα το δείξουμε δημοσίως για να επιτρέψουμε στους συμμετέχοντες να "
"επικοινωνήσουν μαζί σας."
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Bancontact"
msgid "Contact URL"
msgstr "Bancontact"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "Διεύθυνση URL αποτύπωσης"
@@ -21415,8 +21428,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -21518,7 +21532,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+16 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -10195,6 +10195,17 @@ msgstr ""
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Contact URL"
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr ""
@@ -17546,8 +17557,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -17614,7 +17626,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+163 -219
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"PO-Revision-Date: 2026-06-29 17:00+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-07-08 16:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
"es/>\n"
@@ -181,7 +181,7 @@ msgstr "Español (Latinoamérica)"
#: pretix/_base_settings.py
msgid "Thai"
msgstr ""
msgstr "Tailandés"
#: pretix/_base_settings.py
msgid "Turkish"
@@ -441,7 +441,7 @@ msgstr ""
#: pretix/api/serializers/organizer.py pretix/control/views/organizer.py
#, python-format
msgid "You've been invited to join %(organizer)s"
msgstr ""
msgstr "Ha sido invitado a unirse a %(organizer)s"
#: pretix/api/serializers/organizer.py pretix/control/views/organizer.py
msgid "This user already has been invited for this team."
@@ -4088,45 +4088,31 @@ msgid "Users"
msgstr "Usuarios"
#: pretix/base/models/auth.py
#, fuzzy
#| msgid "Changes to your account at {organizer}"
msgid "Changes to your account"
msgstr "Cambios en su cuenta en {organizer}"
msgstr "Cambios en su cuenta"
#: pretix/base/models/auth.py
#, fuzzy, python-brace-format
#| msgid ""
#| "to confirm changing your email address from {old_email}\n"
#| "to {new_email}, use the following code:"
#, python-brace-format
msgid ""
"To change your email address from {old_email} to {new_email}, use the "
"following code:"
msgstr ""
"para confirmar el cambio de tu dirección de correo electrónico de "
"{old_email}\n"
"a {new_email}, utiliza el siguiente código:"
"Para cambiar su dirección de correo electrónico de {old_email} a "
"{new_email}, utilice el siguiente código:"
#: pretix/base/models/auth.py
#, fuzzy, python-brace-format
#| msgid ""
#| "to confirm changing your email address from {old_email}\n"
#| "to {new_email}, use the following code:"
#, python-brace-format
msgid ""
"To verify your email address {email} on {instance}, use the following code:"
msgstr ""
"para confirmar el cambio de tu dirección de correo electrónico de "
"{old_email}\n"
"a {new_email}, utiliza el siguiente código:"
"Para verificar su dirección de correo electrónico {email} en {instance}, "
"utilice el siguiente código:"
#: pretix/base/models/auth.py
#, fuzzy
#| msgid "Enter confirmation code"
msgid "Your confirmation code"
msgstr "Introduzca el código de confirmación"
msgstr "Su código de confirmación"
#: pretix/base/models/auth.py
#, fuzzy
#| msgid "Reset password"
msgid "Reset your password"
msgstr "Restablecer contraseña"
@@ -8329,7 +8315,7 @@ msgstr "Evento cancelado"
#: pretix/base/services/cancelevent.py
msgid "Confirm event cancellation and bulk refund"
msgstr ""
msgstr "Confirmar la cancelación del evento y el reembolso masivo"
#: pretix/base/services/cart.py pretix/base/services/modelimport.py
#: pretix/base/services/orders.py
@@ -8910,10 +8896,8 @@ msgid "Your export did not contain any data."
msgstr "Su exportación no contenía ningún dato."
#: pretix/base/services/export.py
#, fuzzy
#| msgid "Scheduled exports"
msgid "Scheduled export failed"
msgstr "Exportaciones programadas"
msgstr "La exportación programada ha fallado"
#: pretix/base/services/export.py
msgid "Permission denied."
@@ -9249,6 +9233,8 @@ msgstr "No se puede crear un vale de compra sin un código."
msgid ""
"Voucher codes must be unique. Code \"{code}\" already exists in this import."
msgstr ""
"Los códigos promocionales deben ser únicos. El código «{code}» ya existe en "
"esta importación."
#: pretix/base/services/modelimport.py
#, python-brace-format
@@ -9257,13 +9243,19 @@ msgid ""
msgid_plural ""
"Voucher codes must be unique. Import contains existing voucher codes {code}."
msgstr[0] ""
"Los códigos promocionales deben ser únicos. La importación incluye el código "
"promocional ya existente {code}."
msgstr[1] ""
"Los códigos promocionales deben ser únicos. La importación incluye códigos "
"promocionales ya existentes {code}."
#: pretix/base/services/modelimport.py
msgid ""
"Vouchers could not be imported, probably due to a voucher code already being "
"in use."
msgstr ""
"No se han podido importar los vales, probablemente porque ya se estaba "
"utilizando un código de vale."
#: pretix/base/services/orders.py
msgid ""
@@ -9630,10 +9622,9 @@ msgstr ""
"nuevo."
#: pretix/base/services/shredder.py
#, fuzzy, python-format
#| msgid "Data shredding completed"
#, python-format
msgid "Data shredding completed for %(event)s"
msgstr "Destrucción de datos completada"
msgstr "Se ha completado la destrucción de datos de %(event)s"
#: pretix/base/services/stats.py
msgid "Uncategorized"
@@ -11461,6 +11452,21 @@ msgstr ""
"Lo mostraremos públicamente para que los asistentes puedan ponerse en "
"contacto con usted."
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Contact URL"
msgstr "URL de contacto"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
"Si activas esta opción, el enlace de contacto del pie de página redirigirá "
"aquí, en lugar de utilizar la dirección de correo electrónico indicada más "
"arriba. Ten en cuenta que aún así tendrás que añadir una dirección de correo "
"electrónico de contacto que se incluirá en todos los correos que envíes."
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "Pie de imprenta URL"
@@ -13324,30 +13330,18 @@ msgstr ""
"póngase en contacto con nosotros."
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#, fuzzy
#| msgid ""
#| "You have requested us to cancel an event which includes a larger bulk-"
#| "refund:"
msgid "You requested to cancel an event that involves a large bulk refund:"
msgstr ""
"Nos ha solicitado cancelar un evento que incluye un reembolso masivo de "
"mayor importe:"
"Has solicitado cancelar un evento que conlleva un reembolso a gran escala:"
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#, fuzzy
#| msgid "Estimated refund amount"
msgid "Estimated refund"
msgstr "Importe estimado del reembolso"
msgstr "Reembolso estimado"
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#, fuzzy
#| msgid ""
#| "Please confirm that you want to proceed by coping the following "
#| "confirmation code into the cancellation form:"
msgid "To confirm, paste the following code into the cancellation form:"
msgstr ""
"Confirme que desea continuar copiando el siguiente código de confirmación en "
"el formulario de cancelación:"
"Para confirmarlo, pegue el siguiente código en el formulario de cancelación:"
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#, python-format
@@ -13355,6 +13349,8 @@ msgid ""
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it."
msgstr ""
"No comparta este código con nadie. El equipo de %(instance)s nunca se lo "
"pedirá."
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#: pretix/base/templates/pretixbase/email/export_failed.txt
@@ -13363,6 +13359,8 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team"
msgstr ""
"Gracias, \n"
"El equipo de %(instance)s"
#: pretix/base/templates/pretixbase/email/email_footer.html
#, python-format
@@ -13370,10 +13368,8 @@ msgid "powered by <a %(a_attr)s>pretix</a>"
msgstr "creado por <a %(a_attr)s>pretix</a>"
#: pretix/base/templates/pretixbase/email/export_failed.txt
#, fuzzy
#| msgid "Your export failed."
msgid "Your scheduled export failed."
msgstr "Su exportación falló."
msgstr "La exportación programada ha fallado."
#: pretix/base/templates/pretixbase/email/export_failed.txt
#: pretix/control/templates/pretixcontrol/event/tax_edit.html
@@ -13381,39 +13377,29 @@ msgid "Reason"
msgstr "Razón"
#: pretix/base/templates/pretixbase/email/export_failed.txt
#, fuzzy
#| msgid "If your export fails five times in a row, it will no longer be sent."
msgid "If an export fails five times in a row, we'll stop sending it."
msgstr "Si su exportación falla cinco veces seguidas, ya no se enviará."
msgstr "Si una exportación falla cinco veces seguidas, dejaremos de enviarla."
#: pretix/base/templates/pretixbase/email/export_failed.txt
#, fuzzy
#| msgid "You can request to cancel this order."
msgid "You can adjust or remove this export here:"
msgstr "Puede solicitar cancelar este pedido."
msgstr "Puede ajustar o eliminar esta exportación aquí:"
#: pretix/base/templates/pretixbase/email/notification.html
#: pretix/base/templates/pretixbase/email/notification.txt
#, fuzzy
#| msgid "You receive these emails based on your notification settings."
msgid "You're receiving this email based on your notification settings."
msgstr ""
"Recibirá estos mensajes de correo electrónico en función de su configuración "
"de notificación."
"Está recibiendo este correo electrónico según su configuración de "
"notificaciones."
#: pretix/base/templates/pretixbase/email/notification.html
#: pretix/base/templates/pretixbase/email/notification.txt
#, fuzzy
#| msgid "Change settings"
msgid "Manage settings"
msgstr "Modificar la configuración"
msgstr "Gestionar la configuración"
#: pretix/base/templates/pretixbase/email/notification.html
#: pretix/base/templates/pretixbase/email/notification.txt
#, fuzzy
#| msgid "Disable notifications"
msgid "Disable all notifications"
msgstr "Desactivar notificaciones"
msgstr "Desactivar todas las notificaciones"
#: pretix/base/templates/pretixbase/email/order_details.html
msgid ""
@@ -13471,25 +13457,7 @@ msgid "Contact"
msgstr "Contacto"
#: pretix/base/templates/pretixbase/email/shred_completed.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "we hereby confirm that the following data shredding job has been "
#| "completed:\n"
#| "\n"
#| "Organizer: %(organizer)s\n"
#| "\n"
#| "Event: %(event)s\n"
#| "\n"
#| "Data selection: %(shredders)s\n"
#| "\n"
#| "Start time: %(start_time)s (new data added after this time might not have "
#| "been deleted)\n"
#| "\n"
#| "Best regards,\n"
#| "\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -13507,20 +13475,17 @@ msgid ""
msgstr ""
"Hola,\n"
"\n"
"Por la presente confirmamos que se ha completado el siguiente trabajo de "
"destrucción de datos:\n"
"Se ha completado la siguiente tarea de eliminación de datos:\n"
"\n"
"Organizador: %(organizer)s\n"
"- Organizador: %(organizer)s\n"
"- Evento: %(event)s\n"
"- Selección de datos: %(shredders)s\n"
"- Hora de inicio: %(start_time)s\n"
"\n"
"Evento: %(event)s\n"
"\n"
"Selección de datos: %(shredders)s\n"
"\n"
"Hora de inicio: %(start_time)s (es posible que los nuevos datos agregados "
"después de esta hora no se hayan eliminado)\n"
"\n"
"Atentamente,\n"
"Es posible que los datos añadidos al evento después de la hora de inicio no "
"se hayan eliminado.\n"
"\n"
"Gracias, \n"
"El equipo de %(instance)s\n"
#: pretix/base/templates/pretixbase/forms/widgets/checkbox_sales_channel_option.html
@@ -13558,11 +13523,15 @@ msgstr "Por favor, continúe en una nueva pestaña"
#: pretix/base/templates/pretixbase/framebreak.html
msgid "For security reasons, the following step is only possible in a new tab."
msgstr ""
"Por motivos de seguridad, el siguiente paso solo se puede realizar en una "
"nueva pestaña."
#: pretix/base/templates/pretixbase/framebreak.html
msgid ""
"If the new tab did not open automatically, please click the following button:"
msgstr ""
"Si la nueva pestaña no se ha abierto automáticamente, haga clic en el "
"siguiente botón:"
#: pretix/base/templates/pretixbase/framebreak.html
#: pretix/presale/templates/pretixpresale/event/cookies.html
@@ -19947,21 +19916,7 @@ msgid "Add property"
msgstr "Añadir propiedad"
#: pretix/control/templates/pretixcontrol/email/confirmation_code.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "%(reason)s\n"
#| "\n"
#| " %(code)s\n"
#| "\n"
#| "Please do never give this code to another person. Our support team will "
#| "never ask for this code.\n"
#| "\n"
#| "If this code was not requested by you, please contact us immediately.\n"
#| "\n"
#| "Best regards,\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -19981,35 +19936,19 @@ msgstr ""
"\n"
"%(reason)s\n"
"\n"
"   \t%(code)s\n"
" %(code)s\n"
"\n"
"Por favor, nunca compartas este código con otra persona. Nuestro equipo de "
"asistencia nunca te pedirá este código.\n"
"No comparta este código con nadie. El equipo de %(instance)s nunca se lo "
"pedirá.\n"
"\n"
"Si no fuiste tú quien solicitó este código, contacta con nosotros de "
"inmediato.\n"
"Si no ha solicitado este código, póngase en contacto con nosotros "
"inmediatamente.\n"
"\n"
"Atentamente,\n"
"Gracias, \n"
"El equipo de %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/email_setup.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "someone requested to use %(address)s as a sender address on "
#| "%(instance)s.\n"
#| "This will allow them to send emails that are shown to originate from this "
#| "email address.\n"
#| "If that was you, please enter the following confirmation code:\n"
#| "\n"
#| "%(code)s\n"
#| "\n"
#| "If this was not requested by you, you can safely ignore this email.\n"
#| "\n"
#| "Best regards, \n"
#| "\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -20021,8 +19960,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -20031,20 +19971,23 @@ msgid ""
msgstr ""
"Hola,\n"
"\n"
"alguien solicitó usar %(address)s como dirección de remitente en "
"%(instance)s.\n"
"Esto les permitirá enviar correos electrónicos que se muestren originados en "
"esta dirección de correo electrónico.\n"
"Si ese era usted, ingrese el siguiente código de confirmación:\n"
"Alguien ha solicitado utilizar %(address)s como dirección de remitente en %"
"(instance)s. Una vez verificado, los correos electrónicos enviados desde %"
"(instance)s podrán mostrar esta dirección como remitente.\n"
"\n"
"%(code)s\n"
"Si ha sido usted quien lo ha solicitado, introduzca el siguiente código en "
"el formulario de configuración:\n"
"\n"
"Si usted no lo solicitó, puede ignorar este correo electrónico con "
"seguridad.\n"
" %(code)s\n"
"\n"
"Atentamente,\n"
"No comparta este código con nadie a menos que quiera autorizarle a utilizar "
"esta dirección para este fin. El equipo de %(instance)s nunca se lo pedirá.\n"
"\n"
"Tu equipo de %(instance)s\n"
"Si no ha solicitado esto, puede ignorar este correo electrónico sin ningún "
"problema.\n"
"\n"
"Gracias, \n"
"El equipo de %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/forgot.txt
#, python-format
@@ -20062,27 +20005,22 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Hola,\n"
"\n"
"Hemos recibido una solicitud para restablecer la contraseña de su cuenta de "
"%(instance)s. Para elegir una nueva contraseña, siga el enlace que aparece a "
"continuación:\n"
"\n"
"%(url)s\n"
"\n"
"Si no ha solicitado este restablecimiento, puede ignorar este correo "
"electrónico sin ningún problema: su contraseña no cambiará.\n"
"\n"
"Gracias, \n"
"El equipo de %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/invitation.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "you have been invited to a team on %(instance)s, a platform to perform "
#| "event\n"
#| "ticket sales.\n"
#| "\n"
#| "Organizer: %(organizer)s\n"
#| "Team: %(team)s\n"
#| "\n"
#| "If you want to join that team, just click on the following link:\n"
#| "%(url)s\n"
#| "\n"
#| "If you do not want to join, you can safely ignore or delete this email.\n"
#| "\n"
#| "Best regards, \n"
#| "\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -20101,22 +20039,22 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Hola, \n"
"Hola,\n"
"\n"
"usted ha sido invitado a un equipo de %(instance)s, una plataforma para "
"realizar \n"
"ventas de entradas de eventos. \n"
"Ha sido invitado a unirse a un equipo en %(instance)s, una plataforma de "
"venta de entradas para eventos.\n"
"\n"
"Organizador: %(organizer)s\n"
"Team : %(team)s \n"
"- Organizador: %(organizer)s\n"
"- Equipo: %(team)s\n"
"\n"
"Si quieres formar parte de este equipo, haz clic en el siguiente enlace :\n"
"%(url)s \n"
"Para aceptar, siga el enlace que aparece a continuación:\n"
"\n"
"Si no quieres unirte, puedes ignorar o eliminar este correo electrónico. \n"
"%(url)s\n"
"\n"
"Saludos cordiales, \n"
"Si no desea unirse, puede ignorar este correo electrónico sin ningún "
"problema.\n"
"\n"
"Gracias, \n"
"El equipo de %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
@@ -20126,21 +20064,24 @@ msgid ""
"\n"
"We noticed a new sign-in to your %(instance)s account:\n"
msgstr ""
"Hola,\n"
"\n"
"Hemos detectado un nuevo inicio de sesión en su cuenta de %(instance)s:\n"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
msgid "Browser"
msgstr ""
msgstr "Navegador"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
msgid "Operating system"
msgstr ""
msgstr "Sistema operativo"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
#, python-format
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
@@ -20148,26 +20089,17 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Si no ha sido usted, no es necesario que haga nada.\n"
"\n"
"Si no reconoce este inicio de sesión, cambie su contraseña inmediatamente:\n"
"\n"
"%(url)s\n"
"\n"
"Gracias, \n"
"El equipo de %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/security_notice.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "this is to inform you that the account information of your %(instance)s "
#| "account has been\n"
#| "changed. In particular, the following changes have been performed:\n"
#| "\n"
#| "%(messages)s\n"
#| "\n"
#| "If this change was not performed by you, please contact us immediately.\n"
#| "\n"
#| "You can review and change your account settings here:\n"
#| "\n"
#| "%(url)s\n"
#| "\n"
#| "Best regards, \n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -20185,22 +20117,20 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Hola, \n"
"Hola,\n"
"\n"
"esto es para informarle que la información de su cuenta del equipo de "
"%(instance)s ha sido cambiada. \n"
"En particular, se han realizado las siguientes modificaciones: \n"
"Se han realizado los siguientes cambios en su cuenta de %(instance)s:\n"
"\n"
"%(messages)s\n"
"\n"
"Si este cambio no fue realizado por usted, por favor contáctenos "
"inmediatamente.\n"
"Si usted no ha realizado estos cambios, póngase en contacto con el equipo de "
"asistencia de %(instance)s inmediatamente.\n"
"\n"
"Puede revisar y cambiar la configuración de su cuenta aquí: \n"
"Puede consultar la configuración de su cuenta aquí:\n"
"\n"
"%(url)s \n"
"%(url)s\n"
"\n"
"Saludos cordiales, \n"
"Gracias, \n"
"El equipo de %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email_setup.html
@@ -28827,7 +28757,7 @@ msgstr "El código de verificación es incorrecto, por favor inténtelo de nuevo
#: pretix/control/views/mailsetup.py
#, python-format
msgid "Confirm %(address)s as a sender address"
msgstr ""
msgstr "Confirmar %(address)s como dirección de remitente"
#: pretix/control/views/mailsetup.py
#, python-format
@@ -30048,10 +29978,8 @@ msgstr ""
"Abra BezahlCode en su aplicación bancaria para iniciar el proceso de pago."
#: pretix/helpers/security.py
#, fuzzy
#| msgid "Sign in to your account at %(org)s"
msgid "New sign-in to your account"
msgstr "Inicie sesión en su cuenta en %(org)s"
msgstr "Nuevo inicio de sesión en su cuenta"
#: pretix/multidomain/models.py
msgid "Organizer domain"
@@ -36170,8 +36098,6 @@ msgstr[0] "%(count)s elemento"
msgstr[1] "%(count)s elementos"
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
#, fuzzy
#| msgid "No event"
msgid "No events"
msgstr "No hay eventos"
@@ -36515,10 +36441,8 @@ msgid "Create account"
msgstr "Crear una cuenta"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
#, fuzzy
#| msgid "The invoice could not be generated."
msgid "Login could not be completed"
msgstr "No se ha podido generar la factura."
msgstr "No se ha podido realizar el inicio de sesión"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
@@ -36527,43 +36451,56 @@ msgid ""
"process.\n"
" "
msgstr ""
"\n"
" No hemos podido completar el inicio de sesión porque se ha producido "
"una interrupción en el proceso.\n"
" "
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "Possible reasons for this:"
msgstr ""
msgstr "Posibles razones para ello:"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
"You started logging in from a link opened inside an app (such as Instagram "
"or an email app), and then continued the login in your main browser."
msgstr ""
"Ha iniciado sesión a través de un enlace abierto dentro de una aplicación "
"(como Instagram o una aplicación de correo electrónico) y, a continuación, "
"ha continuado el proceso de inicio de sesión en su navegador principal."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "You refreshed the page or used the back button during login."
msgstr ""
"Ha actualizado la página o ha utilizado el botón «Atrás» durante el proceso "
"de inicio de sesión."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "The site was opened in more than one tab or window at the same time."
msgstr ""
msgstr "La página estaba abierta en más de una pestaña o ventana a la vez."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
"There was a long delay between starting and completing the login process."
msgstr ""
"Hubo un tiempo importante entre el inicio y la finalización del proceso de "
"inicio de sesión."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "How to fix this:"
msgstr ""
msgstr "Cómo solucionarlo:"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "Close this page."
msgstr ""
msgstr "Cerrar esta página."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
"Open this website again directly in your main browser (for example Safari or "
"Chrome)."
msgstr ""
"Vuelva a abrir esta página web directamente en su navegador principal (por "
"ejemplo, Safari o Chrome)."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
@@ -36571,6 +36508,9 @@ msgid ""
"browser window, without refreshing the page, opening new tabs, or switching "
"apps part-way through."
msgstr ""
"Vuelva a iniciar el proceso de pago o de inicio de sesión y complételo en la "
"misma ventana del navegador, sin actualizar la página, sin abrir nuevas "
"pestañas ni cambiar de aplicación mientras lo realiza."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
@@ -36578,6 +36518,10 @@ msgid ""
"before retrying can help. As a last step, try using a different browser or "
"another device (for example, a desktop or laptop computer)."
msgstr ""
"Si el problema persiste, puede ser útil cerrar todas las ventanas del "
"navegador y borrar las cookies antes de volver a intentarlo. Como último "
"recurso, prueba a utilizar otro navegador u otro dispositivo (por ejemplo, "
"un ordenador de sobremesa o portátil)."
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
msgid "Your membership"
+16 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2025-07-18 01:00+0000\n"
"Last-Translator: Zona Vip <contacto@zonavip.mx>\n"
"Language-Team: Spanish (Latin America) <https://translate.pretix.eu/projects/"
@@ -10382,6 +10382,17 @@ msgstr ""
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Contact URL"
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr ""
@@ -17762,8 +17773,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -17830,7 +17842,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+16 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2025-12-24 00:00+0000\n"
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
"Language-Team: Estonian <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -10197,6 +10197,17 @@ msgstr ""
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Contact URL"
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr ""
@@ -17548,8 +17559,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -17616,7 +17628,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+18 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2024-09-23 18:00+0000\n"
"Last-Translator: Albizuri <oier@puntu.eus>\n"
"Language-Team: Basque <https://translate.pretix.eu/projects/pretix/pretix/eu/"
@@ -11536,6 +11536,19 @@ msgstr ""
"Publikoki erakutsiko dugu, bertaratzen direnak zurekin harremanetan jar "
"daitezen."
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Contact:"
msgid "Contact URL"
msgstr "Kontaktua:"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "Inprimatze-oinaren URLa"
@@ -19618,8 +19631,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -19686,7 +19700,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+18 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2025-10-04 10:10+0000\n"
"Last-Translator: Sebastian Bożek <sebastian@log-mar.pl>\n"
"Language-Team: Finnish <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -11450,6 +11450,19 @@ msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
"Näytämme tämän julkisesti, jotta osallistujat voivat ottaa sinuun yhteyttä."
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Contact:"
msgid "Contact URL"
msgstr "Kontakti:"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "URL jälki"
@@ -19547,8 +19560,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -19615,7 +19629,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+16 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2025-02-13 22:00+0000\n"
"Last-Translator: Andrias Magnussen <andrias.magnussen@om.org>\n"
"Language-Team: Faroese <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -10265,6 +10265,17 @@ msgstr ""
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Contact URL"
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr ""
@@ -17632,8 +17643,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -17700,7 +17712,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+165 -218
View File
@@ -3,11 +3,11 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"PO-Revision-Date: 2026-06-29 17:00+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-07-08 16:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/fr/"
">\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/"
"fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -177,7 +177,7 @@ msgstr "Espagnol (Amérique latine)"
#: pretix/_base_settings.py
msgid "Thai"
msgstr ""
msgstr "Thaï"
#: pretix/_base_settings.py
msgid "Turkish"
@@ -442,7 +442,7 @@ msgstr ""
#: pretix/api/serializers/organizer.py pretix/control/views/organizer.py
#, python-format
msgid "You've been invited to join %(organizer)s"
msgstr ""
msgstr "Vous avez été invité(e) à rejoindre %(organizer)s"
#: pretix/api/serializers/organizer.py pretix/control/views/organizer.py
msgid "This user already has been invited for this team."
@@ -1933,7 +1933,7 @@ msgid ""
"redeemed."
msgstr ""
"Ce produit ne sera affiché que si un bon de réduction correspondant au "
"produit est échangé."
"produit est validé."
#: pretix/base/exporters/items.py pretix/base/models/items.py
msgid "Buying this product requires approval"
@@ -4092,45 +4092,33 @@ msgid "Users"
msgstr "Utilisateurs"
#: pretix/base/models/auth.py
#, fuzzy
#| msgid "Changes to your account at {organizer}"
msgid "Changes to your account"
msgstr "Modifications apportées à votre compte {organizer}"
msgstr "Modifications apportées à votre compte"
#: pretix/base/models/auth.py
#, fuzzy, python-brace-format
#| msgid ""
#| "to confirm changing your email address from {old_email}\n"
#| "to {new_email}, use the following code:"
#, python-brace-format
msgid ""
"To change your email address from {old_email} to {new_email}, use the "
"following code:"
msgstr ""
"Pour confirmer le changement de votre adresse e-mail de {old_email}\n"
"à {new_email}, utiliser le code suivant :"
"Pour modifier votre adresse e-mail et passer de {old_email} à {new_email}, "
"utilisez le code suivant :"
#: pretix/base/models/auth.py
#, fuzzy, python-brace-format
#| msgid ""
#| "to confirm changing your email address from {old_email}\n"
#| "to {new_email}, use the following code:"
#, python-brace-format
msgid ""
"To verify your email address {email} on {instance}, use the following code:"
msgstr ""
"Pour confirmer le changement de votre adresse e-mail de {old_email}\n"
"à {new_email}, utiliser le code suivant :"
"Pour valider votre adresse e-mail {email} sur {instance}, utilisez le code "
"suivant :"
#: pretix/base/models/auth.py
#, fuzzy
#| msgid "Enter confirmation code"
msgid "Your confirmation code"
msgstr "Entrez le code de confirmation"
msgstr "Votre code de confirmation"
#: pretix/base/models/auth.py
#, fuzzy
#| msgid "Reset password"
msgid "Reset your password"
msgstr "Réinitialiser le mot de passe"
msgstr "Réinitialiser mon mot de passe"
#: pretix/base/models/checkin.py
msgid "All products (including newly created ones)"
@@ -6987,7 +6975,7 @@ msgstr "Nombre de fois que ce bon peut être utilisé."
#: pretix/base/models/vouchers.py pretix/control/views/vouchers.py
msgid "Redeemed"
msgstr "Échangé"
msgstr "Validé"
#: pretix/base/models/vouchers.py
msgid ""
@@ -8378,6 +8366,7 @@ msgstr "Événement annulé"
#: pretix/base/services/cancelevent.py
msgid "Confirm event cancellation and bulk refund"
msgstr ""
"Confirmer l'annulation de l'événement et procéder à un remboursement groupé"
#: pretix/base/services/cart.py pretix/base/services/modelimport.py
#: pretix/base/services/orders.py
@@ -8964,10 +8953,8 @@ msgid "Your export did not contain any data."
msgstr "Votre exportation ne contenait aucune donnée."
#: pretix/base/services/export.py
#, fuzzy
#| msgid "Scheduled exports"
msgid "Scheduled export failed"
msgstr "Exportations planifiées"
msgstr "Échec de l'exportation planifiée"
#: pretix/base/services/export.py
msgid "Permission denied."
@@ -9302,6 +9289,8 @@ msgstr "Un bon ne peut être créé sans code."
msgid ""
"Voucher codes must be unique. Code \"{code}\" already exists in this import."
msgstr ""
"Les codes promotionnels doivent être uniques. Le code « {code} » existe déjà "
"dans cette importation."
#: pretix/base/services/modelimport.py
#, python-brace-format
@@ -9310,13 +9299,19 @@ msgid ""
msgid_plural ""
"Voucher codes must be unique. Import contains existing voucher codes {code}."
msgstr[0] ""
"Les codes promotionnels doivent être uniques. L'importation contient un code "
"promotionnel existant : {code}."
msgstr[1] ""
"Les codes promotionnels doivent être uniques. L'importation contient des "
"codes promotionnels existants {code}."
#: pretix/base/services/modelimport.py
msgid ""
"Vouchers could not be imported, probably due to a voucher code already being "
"in use."
msgstr ""
"Les coupons n'ont pas pu être importés, probablement parce qu'un code de "
"coupon était déjà utilisé."
#: pretix/base/services/orders.py
msgid ""
@@ -9688,10 +9683,9 @@ msgstr ""
"réessayer."
#: pretix/base/services/shredder.py
#, fuzzy, python-format
#| msgid "Data shredding completed"
#, python-format
msgid "Data shredding completed for %(event)s"
msgstr "Déchiquetage de données terminé"
msgstr "La destruction des données est terminée pour %(event)s"
#: pretix/base/services/stats.py
msgid "Uncategorized"
@@ -11547,6 +11541,21 @@ msgstr ""
"Nous le montrerons publiquement pour permettre aux participants de vous "
"contacter."
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Contact URL"
msgstr "URL de contact"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
"Si vous activez cette option, le lien de contact figurant dans le pied de "
"page redirigera vers cette page au lieu d'utiliser l'adresse e-mail indiquée "
"ci-dessus. Veuillez noter que vous devrez tout de même ajouter une adresse e-"
"mail de contact qui sera mentionnée dans tous les e-mails que vous enverrez."
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "URL des Mentions légales"
@@ -13445,30 +13454,19 @@ msgstr ""
"nous contacter."
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#, fuzzy
#| msgid ""
#| "You have requested us to cancel an event which includes a larger bulk-"
#| "refund:"
msgid "You requested to cancel an event that involves a large bulk refund:"
msgstr ""
"Vous nous avez demandé d'annuler un événement qui implique un remboursement "
"groupé important :"
"Vous avez demandé l'annulation d'un événement donnant lieu à un "
"remboursement groupé important :"
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#, fuzzy
#| msgid "Estimated refund amount"
msgid "Estimated refund"
msgstr "Montant estimé du remboursement"
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#, fuzzy
#| msgid ""
#| "Please confirm that you want to proceed by coping the following "
#| "confirmation code into the cancellation form:"
msgid "To confirm, paste the following code into the cancellation form:"
msgstr ""
"Veuillez confirmer que vous souhaitez poursuivre en copiant le code de "
"confirmation suivant dans le formulaire d'annulation :"
"Pour confirmer, collez le code suivant dans le formulaire d'annulation :"
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#, python-format
@@ -13476,6 +13474,8 @@ msgid ""
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it."
msgstr ""
"Ne communiquez ce code à personne. L'équipe %(instance)s ne vous le "
"demandera jamais."
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#: pretix/base/templates/pretixbase/email/export_failed.txt
@@ -13484,6 +13484,8 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team"
msgstr ""
"Merci, \n"
"L'équipe %(instance)s"
#: pretix/base/templates/pretixbase/email/email_footer.html
#, python-format
@@ -13491,10 +13493,8 @@ msgid "powered by <a %(a_attr)s>pretix</a>"
msgstr "propulsé par <a %(a_attr)s>pretix</a>"
#: pretix/base/templates/pretixbase/email/export_failed.txt
#, fuzzy
#| msgid "Your export failed."
msgid "Your scheduled export failed."
msgstr "Votre exportation a échoué."
msgstr "Votre exportation planifiée a échoué."
#: pretix/base/templates/pretixbase/email/export_failed.txt
#: pretix/control/templates/pretixcontrol/event/tax_edit.html
@@ -13502,39 +13502,28 @@ msgid "Reason"
msgstr "Raison"
#: pretix/base/templates/pretixbase/email/export_failed.txt
#, fuzzy
#| msgid "If your export fails five times in a row, it will no longer be sent."
msgid "If an export fails five times in a row, we'll stop sending it."
msgstr ""
"Si votre exportation échoue cinq fois de suite, elle ne sera plus envoyée."
"Si une exportation échoue cinq fois d'affilée, nous cesserons de l'envoyer."
#: pretix/base/templates/pretixbase/email/export_failed.txt
#, fuzzy
#| msgid "You can request to cancel this order."
msgid "You can adjust or remove this export here:"
msgstr "Vous pouvez demander lannulation de cette commande."
msgstr "Vous pouvez modifier ou supprimer cette exportation ici :"
#: pretix/base/templates/pretixbase/email/notification.html
#: pretix/base/templates/pretixbase/email/notification.txt
#, fuzzy
#| msgid "You receive these emails based on your notification settings."
msgid "You're receiving this email based on your notification settings."
msgstr ""
"Vous recevez ces e-mails en fonction de vos paramètres de notification."
msgstr "Vous recevez cet e-mail conformément à vos paramètres de notification."
#: pretix/base/templates/pretixbase/email/notification.html
#: pretix/base/templates/pretixbase/email/notification.txt
#, fuzzy
#| msgid "Change settings"
msgid "Manage settings"
msgstr "Changer les réglages"
msgstr "Gérer les paramètres"
#: pretix/base/templates/pretixbase/email/notification.html
#: pretix/base/templates/pretixbase/email/notification.txt
#, fuzzy
#| msgid "Disable notifications"
msgid "Disable all notifications"
msgstr "Désactiver les notifications"
msgstr "Désactiver toutes les notifications"
#: pretix/base/templates/pretixbase/email/order_details.html
msgid ""
@@ -13592,25 +13581,7 @@ msgid "Contact"
msgstr "Contact"
#: pretix/base/templates/pretixbase/email/shred_completed.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "we hereby confirm that the following data shredding job has been "
#| "completed:\n"
#| "\n"
#| "Organizer: %(organizer)s\n"
#| "\n"
#| "Event: %(event)s\n"
#| "\n"
#| "Data selection: %(shredders)s\n"
#| "\n"
#| "Start time: %(start_time)s (new data added after this time might not have "
#| "been deleted)\n"
#| "\n"
#| "Best regards,\n"
#| "\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -13626,23 +13597,20 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Bonjour\n"
"Bonjour,\n"
"\n"
"Nous confirmons par la présente que le travail de déchiquetage de données "
"suivant a été effectué :\n"
"La tâche de suppression des données suivante a été effectuée :\n"
"\n"
"Organisateur: %(organizer)s\n"
"- Organisateur : %(organizer)s\n"
"- Événement : %(event)s\n"
"- Sélection des données : %(shredders)s\n"
"- Heure de début : %(start_time)s\n"
"\n"
"Evénement: %(event)s\n"
"Il est possible que les données ajoutées à l'événement après l'heure de "
"début n'aient pas été supprimées.\n"
"\n"
"Sélection des données: %(shredders)s\n"
"\n"
"Heure de début: %(start_time)s (les nouvelles données ajoutées après cette "
"heure nont peut-être pas été supprimées)\n"
"\n"
"Sinceres salutations\n"
"\n"
"Votre équipe pretix%(instance)s\n"
"Merci, \n"
"L'équipe %(instance)s\n"
#: pretix/base/templates/pretixbase/forms/widgets/checkbox_sales_channel_option.html
msgid ""
@@ -13679,11 +13647,15 @@ msgstr "Veuillez continuer dans un nouvel onglet"
#: pretix/base/templates/pretixbase/framebreak.html
msgid "For security reasons, the following step is only possible in a new tab."
msgstr ""
"Pour des raisons de sécurité, l'étape suivante ne peut être effectuée que "
"dans un nouvel onglet."
#: pretix/base/templates/pretixbase/framebreak.html
msgid ""
"If the new tab did not open automatically, please click the following button:"
msgstr ""
"Si le nouvel onglet ne s'est pas ouvert automatiquement, veuillez cliquer "
"sur le bouton ci-dessous :"
#: pretix/base/templates/pretixbase/framebreak.html
#: pretix/presale/templates/pretixpresale/event/cookies.html
@@ -20093,21 +20065,7 @@ msgid "Add property"
msgstr "Ajouter une propriété"
#: pretix/control/templates/pretixcontrol/email/confirmation_code.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "%(reason)s\n"
#| "\n"
#| " %(code)s\n"
#| "\n"
#| "Please do never give this code to another person. Our support team will "
#| "never ask for this code.\n"
#| "\n"
#| "If this code was not requested by you, please contact us immediately.\n"
#| "\n"
#| "Best regards,\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -20123,39 +20081,22 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Hello,\n"
"Bonjour,\n"
"\n"
"%(reason)s\n"
"\n"
" %(code)s\n"
"\n"
"Veuillez ne jamais communiquer ce code à une autre personne. Notre équipe "
"dassistance ne vous demandera jamais ce code.\n"
"Ne communiquez ce code à personne. L'équipe %(instance)s ne vous le "
"demandera jamais.\n"
"\n"
"Si vous n’êtes pas à lorigine de cette demande, contactez-nous "
"immédiatement.\n"
"Si vous n'avez pas demandé ce code, veuillez nous contacter immédiatement.\n"
"\n"
"Cordialement,\n"
"Votre équipe pretix%(instance)s\n"
"Merci, \n"
"L'équipe %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/email_setup.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "someone requested to use %(address)s as a sender address on "
#| "%(instance)s.\n"
#| "This will allow them to send emails that are shown to originate from this "
#| "email address.\n"
#| "If that was you, please enter the following confirmation code:\n"
#| "\n"
#| "%(code)s\n"
#| "\n"
#| "If this was not requested by you, you can safely ignore this email.\n"
#| "\n"
#| "Best regards, \n"
#| "\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -20167,30 +20108,35 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Bonjour\n"
"Bonjour,\n"
"\n"
"quelquun a demandé à utiliser %(address)s comme adresse dexpéditeur sur "
"%(instance)s.\n"
"Cela leur permettra denvoyer des e-mails dont il est démontré quils "
"proviennent de cette adresse e-mail.\n"
"Si c’était vous, veuillez entrer le code de confirmation suivant:\n"
"Une personne a demandé à utiliser %(address)s comme adresse d'expéditeur sur "
"%(instance)s. Une fois cette demande validée, les e-mails envoyés depuis %"
"(instance)s pourront afficher cette adresse comme expéditeur.\n"
"\n"
"%(code)s\n"
"Si c'est bien vous qui en avez fait la demande, veuillez saisir le code "
"suivant dans le formulaire de configuration :\n"
"\n"
"Si vous ne lavez pas demandé, vous pouvez ignorer cet e-mail en toute "
"sécurité.\n"
" %(code)s\n"
"\n"
"Sinceres salutations \n"
"Ne communiquez ce code à personne, sauf si vous souhaitez autoriser cette "
"personne à utiliser cette adresse à cette fin. L'équipe de %(instance)s ne "
"vous le demandera jamais.\n"
"\n"
"Votre équipe %(instance)s\n"
"Si vous n'en avez pas fait la demande, vous pouvez ignorer cet e-mail en "
"toute sécurité.\n"
"\n"
"Merci, \n"
"L'équipe de %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/forgot.txt
#, python-format
@@ -20208,27 +20154,22 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Bonjour,\n"
"\n"
"Nous avons reçu une demande de réinitialisation du mot de passe de votre "
"compte %(instance)s. Pour choisir un nouveau mot de passe, cliquez sur le "
"lien ci-dessous :\n"
"\n"
"%(url)s\n"
"\n"
"Si vous n'avez pas effectué cette demande, vous pouvez ignorer cet e-mail en "
"toute sécurité : votre mot de passe ne changera pas.\n"
"\n"
"Merci, \n"
"L'équipe %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/invitation.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "you have been invited to a team on %(instance)s, a platform to perform "
#| "event\n"
#| "ticket sales.\n"
#| "\n"
#| "Organizer: %(organizer)s\n"
#| "Team: %(team)s\n"
#| "\n"
#| "If you want to join that team, just click on the following link:\n"
#| "%(url)s\n"
#| "\n"
#| "If you do not want to join, you can safely ignore or delete this email.\n"
#| "\n"
#| "Best regards, \n"
#| "\n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -20250,13 +20191,12 @@ msgstr ""
"Bonjour,\n"
"\n"
"vous avez été invité à faire partie de l'équipe pretix%(instance)s, une "
"plateforme pour réaliser un événement\n"
"de vente de billets.\n"
"plateforme pour réaliser un événement de vente de billets.\n"
"\n"
"Organisateur: %(organizer)s\n"
"Équipe: %(team)s\n"
"Organisateur : %(organizer)s\n"
"Équipe : %(team)s\n"
"\n"
"Si vous souhaitez rejoindre cette équipe, cliquez sur le lien suivant:\n"
"Si vous souhaitez rejoindre cette équipe, cliquez sur le lien suivant :\n"
"%(url)s\n"
"\n"
"Si vous ne souhaitez pas adhérer, vous pouvez ignorer ou supprimer cet e-"
@@ -20273,21 +20213,24 @@ msgid ""
"\n"
"We noticed a new sign-in to your %(instance)s account:\n"
msgstr ""
"Bonjour,\n"
"\n"
"Nous avons détecté une nouvelle connexion à votre compte %(instance)s :\n"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
msgid "Browser"
msgstr ""
msgstr "Navigateur"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
msgid "Operating system"
msgstr ""
msgstr "Système d'exploitation"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
#, python-format
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
@@ -20295,26 +20238,18 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Si c'est vous, aucune action n'est nécessaire.\n"
"\n"
"Si vous ne reconnaissez pas cette connexion, veuillez changer votre mot de "
"passe immédiatement :\n"
"\n"
"%(url)s\n"
"\n"
"Merci, \n"
"L'équipe %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/security_notice.txt
#, fuzzy, python-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "this is to inform you that the account information of your %(instance)s "
#| "account has been\n"
#| "changed. In particular, the following changes have been performed:\n"
#| "\n"
#| "%(messages)s\n"
#| "\n"
#| "If this change was not performed by you, please contact us immediately.\n"
#| "\n"
#| "You can review and change your account settings here:\n"
#| "\n"
#| "%(url)s\n"
#| "\n"
#| "Best regards, \n"
#| "Your %(instance)s team\n"
#, python-format
msgid ""
"Hello,\n"
"\n"
@@ -20334,21 +20269,19 @@ msgid ""
msgstr ""
"Bonjour,\n"
"\n"
"Ceci est pour vous informer que les informations de votre compte "
"%(instance)s ont été\n"
"modifié. Les modifications suivantes ont été apportées:\n"
"Les modifications suivantes ont été apportées à votre compte %(instance)s :\n"
"\n"
"%(messages)s\n"
"\n"
"Si vous n'avez pas effectué ce changement, veuillez nous contacter "
"immédiatement.\n"
"Si vous n'êtes pas à l'origine de ces modifications, veuillez contacter "
"immédiatement l'équipe d'assistance de %(instance)s.\n"
"\n"
"Vous pouvez consulter et modifier les paramètres de votre compte ici:\n"
"Vous pouvez consulter les paramètres de votre compte ici :\n"
"\n"
"%(url)s\n"
"\n"
"Sincères salutations, \n"
"Votre équipe pretix%(instance)s\n"
"Merci, \n"
"L'équipe %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email_setup.html
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
@@ -29046,7 +28979,7 @@ msgstr "Le code de vérification était incorrect, veuillez réessayer."
#: pretix/control/views/mailsetup.py
#, python-format
msgid "Confirm %(address)s as a sender address"
msgstr ""
msgstr "Confirmer %(address)s comme adresse d'expéditeur"
#: pretix/control/views/mailsetup.py
#, python-format
@@ -30282,10 +30215,8 @@ msgstr ""
"de paiement."
#: pretix/helpers/security.py
#, fuzzy
#| msgid "Sign in to your account at %(org)s"
msgid "New sign-in to your account"
msgstr "Connectez-vous à votre compte à ladresse %(org)s"
msgstr "Nouvelle connexion à votre compte"
#: pretix/multidomain/models.py
msgid "Organizer domain"
@@ -36489,8 +36420,6 @@ msgstr[0] "%(count)s élement"
msgstr[1] "%(count)s élements"
#: pretix/presale/templates/pretixpresale/fragment_calendar.html
#, fuzzy
#| msgid "No event"
msgid "No events"
msgstr "Aucun événement"
@@ -36839,10 +36768,8 @@ msgid "Create account"
msgstr "Créer un compte"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
#, fuzzy
#| msgid "The invoice could not be generated."
msgid "Login could not be completed"
msgstr "La facture n'a pas pu être générée."
msgstr "La connexion n'a pas pu être établie"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
@@ -36851,43 +36778,56 @@ msgid ""
"process.\n"
" "
msgstr ""
"\n"
" Nous n'avons pas pu finaliser votre connexion car une interruption "
"est survenue au cours du processus.\n"
" "
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "Possible reasons for this:"
msgstr ""
msgstr "Raisons possibles :"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
"You started logging in from a link opened inside an app (such as Instagram "
"or an email app), and then continued the login in your main browser."
msgstr ""
"Vous avez commencé à vous connecter à partir d'un lien ouvert dans une "
"application (comme Instagram ou une application de messagerie), puis vous "
"avez poursuivi la procédure de connexion dans votre navigateur principal."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "You refreshed the page or used the back button during login."
msgstr ""
"Vous avez actualisé la page ou utilisé le bouton « Retour » pendant la "
"procédure de connexion."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "The site was opened in more than one tab or window at the same time."
msgstr ""
msgstr "Le site a été ouvert dans plusieurs onglets ou fenêtres en même temps."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
"There was a long delay between starting and completing the login process."
msgstr ""
"Il y a eu un long délai entre le début et la fin de la procédure de "
"connexion."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "How to fix this:"
msgstr ""
msgstr "Comment résoudre ce problème :"
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid "Close this page."
msgstr ""
msgstr "Fermer cette page."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
"Open this website again directly in your main browser (for example Safari or "
"Chrome)."
msgstr ""
"Rouvrez ce site directement dans votre navigateur principal (par exemple "
"Safari ou Chrome)."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
@@ -36895,6 +36835,9 @@ msgid ""
"browser window, without refreshing the page, opening new tabs, or switching "
"apps part-way through."
msgstr ""
"Recommencez la procédure de paiement ou de connexion et menez-la à son terme "
"dans la même fenêtre de navigateur, sans actualiser la page, ouvrir de "
"nouveaux onglets ni changer d'application en cours de route."
#: pretix/presale/templates/pretixpresale/organizers/customer_login_interrupted_message.html
msgid ""
@@ -36902,6 +36845,10 @@ msgid ""
"before retrying can help. As a last step, try using a different browser or "
"another device (for example, a desktop or laptop computer)."
msgstr ""
"Si le problème persiste, il peut être utile de fermer toutes les fenêtres du "
"navigateur et d'effacer les cookies avant de réessayer. En dernier recours, "
"essayez d'utiliser un autre navigateur ou un autre appareil (par exemple, un "
"ordinateur de bureau ou un ordinateur portable)."
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
msgid "Your membership"
+3 -3
View File
@@ -7,8 +7,8 @@ msgstr ""
"Project-Id-Version: French\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:52+0000\n"
"PO-Revision-Date: 2026-06-29 17:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"PO-Revision-Date: 2026-07-08 16:00+0000\n"
"Last-Translator: Joram Schwartzmann <schwartzmann@pretix.eu>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
"fr/>\n"
"Language: fr\n"
@@ -244,7 +244,7 @@ msgstr "En attente d'approbation"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Redeemed"
msgstr "Échangé"
msgstr "Validé"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
msgid "Cancel"
+17 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-04-21 11:05+0000\n"
"Last-Translator: Sandra Rial Pérez <sandrarial@gestiontickets.online>\n"
"Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -11723,6 +11723,18 @@ msgstr ""
"Lo mostraremos públicamente para que los asistentes puedan ponerse en "
"contacto con usted."
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
msgid "Contact URL"
msgstr "Bancontact"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
msgid "Imprint URL"
@@ -20738,8 +20750,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -20822,7 +20835,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+18 -4
View File
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: HE PRETIX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-02-09 21:00+0000\n"
"Last-Translator: roi belotsercovsky <rbelotsercovsky@gmail.com>\n"
"Language-Team: Hebrew <https://translate.pretix.eu/projects/pretix/pretix/he/"
@@ -11041,6 +11041,19 @@ msgstr "כתובת ליצירת קשר"
msgid "We'll show this publicly to allow attendees to contact you."
msgstr "נציג זאת בפומבי כדי לאפשר למשתתפים ליצור איתך קשר."
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Contact:"
msgid "Contact URL"
msgstr "איש קשר:"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "קישור לעמוד פרטי יצירת קשר/ח.פ."
@@ -19338,8 +19351,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -19449,7 +19463,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+18 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2025-03-04 16:16+0000\n"
"Last-Translator: Martin Gross <gross@rami.io>\n"
"Language-Team: Croatian <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -11033,6 +11033,19 @@ msgstr "Kontakt adresa"
msgid "We'll show this publicly to allow attendees to contact you."
msgstr "Prikazat ćemo ovo javno kako bi sudionici mogli kontaktirati vas."
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Contact:"
msgid "Contact URL"
msgstr "Kontakt:"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "URL impresuma"
@@ -18622,8 +18635,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -18690,7 +18704,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+18 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2023-11-18 15:00+0000\n"
"Last-Translator: liimee <git.taaa@fedora.email>\n"
"Language-Team: Indonesian <https://translate.pretix.eu/projects/pretix/"
@@ -11625,6 +11625,19 @@ msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
"Kami akan menampilkannya secara publik agar peserta dapat menghubungi kamu."
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Contact:"
msgid "Contact URL"
msgstr "Kontak:"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "URL cetak"
@@ -20265,8 +20278,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -20383,7 +20397,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+17 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-05-12 04:00+0000\n"
"Last-Translator: Stefano Campus <stefano.campus@regione.piemonte.it>\n"
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -11516,6 +11516,18 @@ msgstr ""
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
msgid "Contact URL"
msgstr "Continua"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr ""
@@ -19519,8 +19531,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -19587,7 +19600,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
File diff suppressed because it is too large Load Diff
+9 -6
View File
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:52+0000\n"
"PO-Revision-Date: 2026-05-12 06:34+0000\n"
"Last-Translator: Yasunobu YesNo Kawaguchi <kawaguti@gmail.com>\n"
"PO-Revision-Date: 2026-07-07 09:17+0000\n"
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix-"
"js/ja/>\n"
"Language: ja\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.17.1\n"
"X-Generator: Weblate 2026.6.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js
msgid "Marked as paid"
@@ -426,11 +426,11 @@ msgstr "Ctrl-Cを押してコピー!"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
msgid "Edit"
msgstr ""
msgstr "編集"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
msgid "Visualize"
msgstr ""
msgstr "ビジュアライズ"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
msgid ""
@@ -438,10 +438,13 @@ msgid ""
"or variations are not contained in any of your rule parts so people with "
"these tickets will not get in:"
msgstr ""
"あなたのルールは常に製品またはバリエーションでフィルタリングされますが、以下"
"の製品やバリエーションはいずれのルール部分にも含まれていないため、これらの"
"チケットをお持ちの方は入れません。"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
msgid "Please double-check if this was intentional."
msgstr ""
msgstr "意図的かどうか、再度ご確認ください。"
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
msgid "All of the conditions below (AND)"
+18 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-06-01 09:00+0000\n"
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
"Language-Team: Korean <https://translate.pretix.eu/projects/pretix/pretix/ko/"
@@ -11126,6 +11126,19 @@ msgstr "연락처 주소"
msgid "We'll show this publicly to allow attendees to contact you."
msgstr "참석자들이 연락할 수 있도록 공개적으로 보여드리겠습니다."
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Contact:"
msgid "Contact URL"
msgstr "연락처:"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "URL 각인"
@@ -19495,8 +19508,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -19582,7 +19596,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+18 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2025-10-28 17:00+0000\n"
"Last-Translator: Sven Muhlen <sven.muhlen@bnl.etat.lu>\n"
"Language-Team: Luxembourgish <https://translate.pretix.eu/projects/pretix/"
@@ -10486,6 +10486,19 @@ msgstr "Kontakt-E-Mail"
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Contact"
msgid "Contact URL"
msgstr "Kontakt"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "Impressum (URL)"
@@ -17866,8 +17879,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -17934,7 +17948,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+16 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -10201,6 +10201,17 @@ msgstr ""
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Contact URL"
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr ""
@@ -17555,8 +17566,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -17623,7 +17635,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+18 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2025-02-21 19:00+0000\n"
"Last-Translator: anonymous <noreply@weblate.org>\n"
"Language-Team: Latvian <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -11282,6 +11282,19 @@ msgstr ""
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Contact:"
msgid "Contact URL"
msgstr "Kontaktpersona:"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr ""
@@ -19263,8 +19276,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -19331,7 +19345,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+16 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -10195,6 +10195,17 @@ msgstr ""
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Contact URL"
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr ""
@@ -17546,8 +17557,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -17614,7 +17626,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+18 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-05-02 23:00+0000\n"
"Last-Translator: Daniel Musketa <daniel@musketa.de>\n"
"Language-Team: Norwegian Bokmål <https://translate.pretix.eu/projects/pretix/"
@@ -11676,6 +11676,19 @@ msgstr ""
"Vi vil vise dette offentlig for å gi deltakerne muligheten til å kontakte "
"deg."
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Contact:"
msgid "Contact URL"
msgstr "Kontakt:"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "URL for imprint: URL for imprint:"
@@ -20343,8 +20356,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -20460,7 +20474,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+18 -4
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-05-05 13:26+0000\n"
"Last-Translator: Ruud Hendrickx <ruud@leckxicon.eu>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/"
@@ -11466,6 +11466,19 @@ msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
"We zullen dit openbaar tonen zodat deelnemers contact met u kunnen opnemen."
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Contact"
msgid "Contact URL"
msgstr "Contact"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "Link naar colofon"
@@ -20001,8 +20014,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -20117,7 +20131,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"
+18 -4
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-06 15:48+0000\n"
"POT-Creation-Date: 2026-07-07 09:30+0000\n"
"PO-Revision-Date: 2026-05-05 13:26+0000\n"
"Last-Translator: Ruud Hendrickx <ruud@leckxicon.eu>\n"
"Language-Team: Dutch (Belgium) <https://translate.pretix.eu/projects/pretix/"
@@ -11460,6 +11460,19 @@ msgstr "Contactadres"
msgid "We'll show this publicly to allow attendees to contact you."
msgstr "We tonen dit, zodat deelnemers contact met u kunnen opnemen."
#: pretix/base/settings.py pretix/control/forms/event.py
#, fuzzy
#| msgid "Contact"
msgid "Contact URL"
msgstr "Contact"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid ""
"If you set this, the footer contact link will point here instead of using "
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
msgstr "Link naar colofon"
@@ -19995,8 +20008,9 @@ msgid ""
"\n"
" %(code)s\n"
"\n"
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it.\n"
"Don't share this code with anyone unless you want to authorize them to use "
"this address for this purpose. The %(instance)s team will never ask you for "
"it.\n"
"\n"
"If you didn't request this, you can safely ignore this email.\n"
"\n"
@@ -20111,7 +20125,7 @@ msgstr ""
msgid ""
"If it was you, no action is needed.\n"
"\n"
"If you don't recognise this sign-in, please change your password "
"If you don't recognize this sign-in, please change your password "
"immediately:\n"
"\n"
"%(url)s\n"

Some files were not shown because too many files have changed in this diff Show More