diff --git a/.dockerignore b/.dockerignore index bdcd52c3a4..4b80bc2d1b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,6 @@ doc/ env/ +node_modules/ res/ local/ .git/ diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..be3fd7a2bc --- /dev/null +++ b/.editorconfig @@ -0,0 +1,5 @@ +[*.{js,jsx,ts,tsx,vue}] +indent_style = tab +indent_size = 2 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e2ab2c390f..381e679df2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,4 +46,7 @@ jobs: - name: Run build run: python -m build - name: Check files - run: unzip -l dist/pretix*whl | grep node_modules || exit 1 + run: | + for pat in 'static.dist/vite/widget/widget.js' 'static.dist/vite/control/assets/checkinrules/main-' 'static.dist/vite/control/assets/webcheckin/main-'; do + unzip -l dist/pretix*whl | grep -q "$pat" || { echo "Missing: $pat"; exit 1; } + done diff --git a/.github/workflows/style-js.yml b/.github/workflows/style-js.yml new file mode 100644 index 0000000000..64e35fecce --- /dev/null +++ b/.github/workflows/style-js.yml @@ -0,0 +1,43 @@ +name: JS Code Style + +on: + push: + branches: [ master ] + paths: + - 'src/pretix/static/pretixpresale/widget/**' + - 'src/pretix/static/pretixcontrol/js/ui/checkinrules/**' + - 'src/pretix/plugins/webcheckin/**' + - 'eslint.config.mjs' + - 'package.json' + - 'package-lock.json' + pull_request: + branches: [ master ] + paths: + - 'src/pretix/static/pretixpresale/widget/**' + - 'src/pretix/static/pretixcontrol/js/ui/checkinrules/**' + - 'src/pretix/plugins/webcheckin/**' + - 'eslint.config.mjs' + - 'package.json' + - 'package-lock.json' + +permissions: + contents: read + +env: + FORCE_COLOR: 1 + +jobs: + eslint: + name: eslint + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + - name: Set up Node.js 24 + uses: actions/setup-node@v4 + with: + node-version: 24 + cache: npm + - name: Install Dependencies + run: npm ci + - name: Run ESLint + run: npm run lint:eslint diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c1d228e28a..a1c1ba2977 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -72,7 +72,7 @@ jobs: run: make all compress - name: Run tests working-directory: ./src - run: PRETIX_CONFIG_FILE=tests/ci_${{ matrix.database }}.cfg py.test -n 3 -p no:sugar --cov=./ --cov-report=xml tests --maxfail=100 + run: PRETIX_CONFIG_FILE=tests/ci_${{ matrix.database }}.cfg py.test -n 3 -p no:sugar --cov=./ --cov-report=xml tests --ignore=tests/e2e --maxfail=100 - name: Run concurrency tests working-directory: ./src run: PRETIX_CONFIG_FILE=tests/ci_${{ matrix.database }}.cfg py.test tests/concurrency_tests/ --reuse-db @@ -84,3 +84,46 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: false if: matrix.database == 'postgres' && matrix.python-version == '3.13' + e2e: + runs-on: ubuntu-22.04 + name: E2E Tests + services: + postgres: + image: postgres:15 + env: + POSTGRES_PASSWORD: postgres + POSTGRES_DB: pretix + options: >- + --health-cmd "pg_isready -U postgres -d pretix" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.13" + - uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + - name: Install system dependencies + run: sudo apt update && sudo apt install -y gettext + - name: Install Python dependencies + run: pip3 install uv && uv pip install --system -e ".[dev]" psycopg2-binary + - name: Install JS dependencies + working-directory: ./src + run: make npminstall + - name: Compile + working-directory: ./src + run: make all compress + - name: Install Playwright browsers + run: playwright install + - name: Run E2E tests + working-directory: ./src + run: PRETIX_CONFIG_FILE=tests/ci_postgres.cfg py.test tests/e2e/ -v --maxfail=10 diff --git a/.gitignore b/.gitignore index 7a1321ee43..d5a3a0e522 100644 --- a/.gitignore +++ b/.gitignore @@ -24,5 +24,7 @@ local/ .project .pydevproject .DS_Store +node_modules/ +.vite/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b354c958f8..377bbfe970 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,9 +10,9 @@ tests: - cd src - python manage.py check - make all compress - - PRETIX_CONFIG_FILE=tests/ci_sqlite.cfg py.test -n 3 tests --maxfail=100 + - PRETIX_CONFIG_FILE=tests/ci_sqlite.cfg py.test -n 3 tests --ignore=tests/e2e --maxfail=100 except: - - pypi + - '/^v.*$/' pypi: stage: release image: @@ -35,7 +35,7 @@ pypi: - twine check dist/* - twine upload dist/* only: - - pypi + - '/^v.*$/' artifacts: paths: - src/dist/ diff --git a/.node-version b/.node-version index 98d9bcb75a..a45fd52cc5 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -17 +24 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000000..33662f5545 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +/* diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ada91ce8a8..729172afa7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,11 +1,16 @@ Contributing to pretix ====================== -Hey there and welcome to pretix! +Welcome to pretix, we are happy that you would like to contribute. +Before you do so, please make sure to read the following documents: -* We've got a contributors guide in [our documentation](https://docs.pretix.eu/dev/development/contribution/) together with notes on the [development setup](https://docs.pretix.eu/dev/development/setup.html). +- [Contribution workflow](https://docs.pretix.eu/dev/development/contribution/general.html) +- [AI-assisted contribution policy](https://docs.pretix.eu/dev/development/contribution/ai.html) +- [Coding style and quality](https://docs.pretix.eu/dev/development/contribution/style.html) +- [Development setup](https://docs.pretix.eu/dev/development/setup.html) +- [Code of Conduct](https://docs.pretix.eu/dev/development/contribution/codeofconduct.html) -* Please note that we have a [Code of Conduct](https://docs.pretix.eu/dev/development/contribution/codeofconduct.html) in place that applies to all project contributions, including issues, pull requests, etc. - -* Before we can accept a PR from you we'll need you to sign [our CLA](https://pretix.eu/about/en/cla). You can find more information about the how and why in our [License FAQ](https://docs.pretix.eu/trust/licensing/faq/) and in our [license change blog post](https://pretix.eu/about/en/blog/20210412-license/). +Before we can accept your first PR we'll need you to sign [our **Contributor License Agreement** (CLA)](https://pretix.eu/about/en/cla). +You can find more information about the how and why in our [License FAQ](https://docs.pretix.eu/trust/licensing/faq/) and in our [license change blog post](https://pretix.eu/about/en/blog/20210412-license/). +**Before contributing new functionality, always open a discussion first.** \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 6ad99226a2..871d04d9b7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,7 @@ FROM python:3.13-trixie -RUN apt-get update && \ +RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \ + apt-get update && \ apt-get install -y --no-install-recommends \ build-essential \ gettext \ @@ -21,8 +22,7 @@ RUN apt-get update && \ libmaxminddb0 \ libmaxminddb-dev \ zlib1g-dev \ - nodejs \ - npm && \ + nodejs && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ dpkg-reconfigure locales && \ @@ -31,6 +31,7 @@ RUN apt-get update && \ mkdir /etc/pretix && \ mkdir /data && \ useradd -ms /bin/bash -d /pretix -u 15371 pretixuser && \ + chmod 0755 /pretix && \ echo 'pretixuser ALL=(ALL) NOPASSWD:SETENV: /usr/bin/supervisord' >> /etc/sudoers && \ mkdir /static && \ mkdir /etc/supervisord @@ -49,11 +50,14 @@ COPY deployment/docker/production_settings.py /pretix/src/production_settings.py COPY pyproject.toml /pretix/pyproject.toml COPY _build /pretix/_build COPY src /pretix/src +COPY package.json /pretix/package.json +COPY package-lock.json /pretix/package-lock.json +COPY tsconfig.json /pretix/tsconfig.json +COPY vite.config.ts /pretix/vite.config.ts RUN pip3 install -U \ pip \ - setuptools \ - wheel && \ + setuptools && \ cd /pretix && \ PRETIX_DOCKER_BUILD=TRUE pip3 install \ -e ".[memcached]" \ diff --git a/MANIFEST.in b/MANIFEST.in index adf0476f8d..c497bff7d0 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -48,3 +48,8 @@ recursive-include src Makefile recursive-exclude doc * recursive-exclude deployment * recursive-exclude res * + +include package.json +include package-lock.json +include tsconfig.json +include vite.config.ts diff --git a/doc/api/resources/carts.rst b/doc/api/resources/carts.rst index 74afdc4565..b725cc5a75 100644 --- a/doc/api/resources/carts.rst +++ b/doc/api/resources/carts.rst @@ -192,7 +192,7 @@ Cart position endpoints * ``attendee_email`` (optional) * ``subevent`` (optional) * ``expires`` (optional) - * ``includes_tax`` (optional, **deprecated**, do not use, will be removed) + * ``includes_tax`` (optional, **DEPRECATED**, do not use, will be removed) * ``sales_channel`` (optional) * ``voucher`` (optional, expect a voucher code) * ``addons`` (optional, expect a list of nested objects of cart positions) diff --git a/doc/api/resources/checkin.rst b/doc/api/resources/checkin.rst index 479fa28a37..c4571ade22 100644 --- a/doc/api/resources/checkin.rst +++ b/doc/api/resources/checkin.rst @@ -46,12 +46,14 @@ Checking a ticket in this request twice with the same nonce, the second request will also succeed but will always create only one check-in object even when the previous request was successful as well. This allows for a certain level of idempotency and enables you to re-try after a connection failure. + :json string status: ``"ok"``, ``"incomplete"``, or ``"error"`` + :>json string status: ``"ok"``, ``"incomplete"``, ``"exchange"``, or ``"error"`` :>json string reason: Reason code, only set on status ``"error"``, see below for possible values. :>json string reason_explanation: Human-readable explanation, only set on status ``"error"`` and reason ``"rules"``, can be null. :>json object position: Copy of the matching order position (if any was found). The contents are the same as the @@ -67,6 +69,8 @@ Checking a ticket in :>json object list: Excerpt of information about the matching :ref:`check-in list ` (if any was found), including the attributes ``id``, ``name``, ``event``, ``subevent``, and ``include_pending``. :>json object questions: List of questions to be answered for check-in, only set on status ``"incomplete"``. + :>json object media_policy: Reusable media policy (see documentation on items), only set on status ``"exchange"``. + :>json object media_type: Reusable media type (see documentation on items), only set on status ``"exchange"``. **Example request**: @@ -224,6 +228,9 @@ Checking a ticket in * ``ambiguous`` - Multiple tickets match scan, rejected. * ``revoked`` - Ticket code has been revoked. * ``unapproved`` - Order has not yet been approved. + * ``already_exchanged`` - Ticket already has been exchanged for a reusable medium that must now be used for check-in. + * ``medium_invalid`` - Reusable medium identifier given was not found or is not valid. + * ``medium_exists`` - Reusable medium identifier already exists, but expected to be new. * ``error`` - Internal error. In case of reason ``rules`` and ``invalid_time``, there might be an additional response field ``reason_explanation`` diff --git a/doc/api/resources/checkinlists.rst b/doc/api/resources/checkinlists.rst index 6090772b58..3b6f506f4e 100644 --- a/doc/api/resources/checkinlists.rst +++ b/doc/api/resources/checkinlists.rst @@ -602,7 +602,8 @@ Order position endpoints We no longer recommend using this API if you're building a ticket scanning application, as it has a few design flaws that can lead to `security issues`_ or compatibility issues due to barcode content characters that are not - URL-safe. We recommend to use our new :ref:`check-in API ` instead. + URL-safe. We recommend to use our new :ref:`check-in API ` instead. Advanced features like medium + exchange are only supported on the new API. :query boolean untrusted_input: If set to true, the lookup parameter is **always** interpreted as a ``secret``, never as an ``id``. This should be always set if you are passing through untrusted, scanned @@ -741,6 +742,9 @@ Order position endpoints * ``ambiguous`` - Multiple tickets match scan, rejected. * ``revoked`` - Ticket code has been revoked. * ``unapproved`` - Order has not yet been approved. + * ``already_exchanged`` - Ticket already has been exchanged for a reusable medium that must now be used for check-in. + * ``medium_invalid`` - Reusable medium identifier given was not found and could not be automatically created. + * ``medium_exists`` - Reusable medium identifier already exists, but expected to be new. In case of reason ``rules`` or ``invalid_time``, there might be an additional response field ``reason_explanation`` with a human-readable description of the violated rules. However, that field can also be missing or be ``null``. diff --git a/doc/api/resources/exhibitors.rst b/doc/api/resources/exhibitors.rst index 8f6a89a08b..6fe2d73045 100644 --- a/doc/api/resources/exhibitors.rst +++ b/doc/api/resources/exhibitors.rst @@ -844,3 +844,187 @@ You can also fetch existing leads (if you are authorized to do so): :statuscode 200: No error :statuscode 401: Invalid authentication code :statuscode 403: Not permitted to access bulk data + +Retrieving Vouchers +""""""""""""""""""" + +Vouchers returned by the App API use a different format than described in :ref:`rest-vouchers`. + +.. rst-class:: rest-resource-table + +===================================== ========================== ======================================================= +Field Type Description +===================================== ========================== ======================================================= +id integer Internal ID of the voucher +code string The voucher code that is required to redeem the voucher +max_usages integer The maximum number of times this voucher can be + redeemed (default: 1). +redeemed integer The number of times this voucher already has been + redeemed. +valid_until datetime The voucher expiration date (or ``null``). +subevent string Name of the date inside an event series this voucher belongs to (or ``null``). +tag string A string that is used for grouping vouchers +comment string An internal exhibitor comment on the voucher. +items list of strings A list of items this voucher is restricted to (or ``null``). +price_mode string Determines how this voucher affects product prices. + Possible values: + + * ``none`` – No effect on price + * ``set`` – The product price is set to the given ``value`` + * ``subtract`` – The product price is determined by the original price *minus* the given ``value`` + * ``percent`` – The product price is determined by the original price reduced by the percentage given in ``value`` +value decimal (string) The value (see ``price_mode``) +redemptions list of objects A list of objects, where each object represents an order position that has been purchased using the voucher. + Each entry will contains the fields ``attendee_fields``, ``redemption_date`` and ``subevent``. + + The attendee data in the ``attendee_fields`` that is shown is based on the event's configuration, and each entry + contains the fields ``id``, ``label``, ``value``, and ``details``. ``details`` is usually empty + except in a few cases where it contains an additional list of objects + with ``value`` and ``label`` keys (e.g. splitting of names). +===================================== ========================== ======================================================= + + +.. http:get:: /exhibitors/api/v1/vouchers/ + + Returns a list of all vouchers connected to the exhibitor. + + Note that the ``attendee_fields`` array can contain any number of dynamic keys! + Depending on the exhibitors permission and event configuration this might be empty, or contain lots of details. + The app should dynamically show these values (read-only) with the labels sent by the server. + + + **Example request**: + + .. sourcecode:: http + + GET /exhibitors/api/v1/vouchers/ HTTP/1.1 + Host: pretix.eu + Accept: application/json, text/javascript + + **Example response**: + + .. sourcecode:: http + + HTTP/1.1 200 OK + Vary: Accept + Content-Type: application/json + + { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "code": "43K6LKM37FBVR2YG", + "max_usages": 1, + "redeemed": 0, + "valid_until": null, + "subevent": null, + "tag": "testvoucher", + "comment": "", + "items": [ + "All" + ], + "price_mode": "set", + "value": "12.00", + "redemptions": [ + { + "attendee_fields": [ + { + "id": "attendee_name", + "label": "Name", + "value": "Jon Doe", + "details": [ + {"label": "Given name", "value": "John"}, + {"label": "Family name", "value": "Doe"}, + ] + }, + { + "id": "attendee_email", + "label": "Email", + "value": "test@example.com", + "details": [] + } + ], + "redemption_date": "2026-05-06", + "subevent": null + }, + ] + } + ] + } + + :statuscode 200: No error + :statuscode 401: Invalid authentication code + :statuscode 403: Not permitted to access bulk data + +.. http:get:: /exhibitors/api/v1/vouchers/(id)/ + + Returns the details of a single, specific voucher connected to the exhibitor. + + Note that the ``attendee_fields`` array can contain any number of dynamic keys! + Depending on the exhibitors permission and event configuration this might be empty, or contain lots of details. + The app should dynamically show these values (read-only) with the labels sent by the server. + + + **Example request**: + + .. sourcecode:: http + + GET /exhibitors/api/v1/vouchers/1/ HTTP/1.1 + Host: pretix.eu + Accept: application/json, text/javascript + + **Example response**: + + .. sourcecode:: http + + HTTP/1.1 200 OK + Vary: Accept + Content-Type: application/json + + { + "id": 1, + "code": "43K6LKM37FBVR2YG", + "max_usages": 1, + "redeemed": 0, + "valid_until": null, + "subevent": null, + "tag": "testvoucher", + "comment": "", + "items": [ + "All" + ], + "price_mode": "set", + "value": "12.00", + "redemptions": [ + { + "attendee_fields": [ + { + "id": "attendee_name", + "label": "Name", + "value": "Jon Doe", + "details": [ + {"label": "Given name", "value": "John"}, + {"label": "Family name", "value": "Doe"}, + ] + }, + { + "id": "attendee_email", + "label": "Email", + "value": "test@example.com", + "details": [] + } + ], + "redemption_date": "2026-05-06", + "subevent": null + }, + ] + } + + :param id: The ``id`` field of the voucher to fetch + :statuscode 200: No error + :statuscode 401: Invalid authentication code + :statuscode 403: Not permitted to access bulk data + :statuscode 404: Voucher not found in system \ No newline at end of file diff --git a/doc/api/resources/item_program_times.rst b/doc/api/resources/item_program_times.rst index db8a6d3368..19a1885183 100644 --- a/doc/api/resources/item_program_times.rst +++ b/doc/api/resources/item_program_times.rst @@ -16,6 +16,7 @@ Field Type Description id integer Internal ID of the program time start datetime The start date time for this program time slot. end datetime The end date time for this program time slot. +location multi-lingual string The program time slot's location (or ``null``) ===================================== ========================== ======================================================= .. versionchanged:: TODO @@ -54,17 +55,20 @@ Endpoints { "id": 2, "start": "2025-08-14T22:00:00Z", - "end": "2025-08-15T00:00:00Z" + "end": "2025-08-15T00:00:00Z", + "location": null }, { "id": 3, "start": "2025-08-12T22:00:00Z", - "end": "2025-08-13T22:00:00Z" + "end": "2025-08-13T22:00:00Z", + "location": null }, { "id": 14, "start": "2025-08-15T22:00:00Z", - "end": "2025-08-17T22:00:00Z" + "end": "2025-08-17T22:00:00Z", + "location": null } ] } @@ -99,7 +103,8 @@ Endpoints { "id": 1, "start": "2025-08-15T22:00:00Z", - "end": "2025-10-27T23:00:00Z" + "end": "2025-10-27T23:00:00Z", + "location": null } :param organizer: The ``slug`` field of the organizer to fetch @@ -125,7 +130,8 @@ Endpoints { "start": "2025-08-15T10:00:00Z", - "end": "2025-08-15T22:00:00Z" + "end": "2025-08-15T22:00:00Z", + "location": null } **Example response**: @@ -139,7 +145,8 @@ Endpoints { "id": 17, "start": "2025-08-15T10:00:00Z", - "end": "2025-08-15T22:00:00Z" + "end": "2025-08-15T22:00:00Z", + "location": null } :param organizer: The ``slug`` field of the organizer of the event/item to create a program time for diff --git a/doc/api/resources/items.rst b/doc/api/resources/items.rst index a8a5a14822..ed81af0fed 100644 --- a/doc/api/resources/items.rst +++ b/doc/api/resources/items.rst @@ -131,7 +131,7 @@ allow_waitinglist boolean If ``false``, product when it is sold out. issue_giftcard boolean If ``true``, buying this product will yield a gift card. media_policy string Policy on how to handle reusable media (experimental feature). - Possible values are ``null``, ``"new"``, ``"reuse"``, and ``"reuse_or_new"``. + Possible values are ``null``, ``"new"``, ``"reuse"``, ``"reuse_or_new"``, ``"append"``, and ``"append_or_new"``. media_type string Type of reusable media to work on (experimental feature). See :ref:`rest-reusablemedia` for possible choices. show_quota_left boolean Publicly show how many tickets are still available. If this is ``null``, the event default is used. diff --git a/doc/api/resources/orders.rst b/doc/api/resources/orders.rst index fe98d93e98..8f0ff758a0 100644 --- a/doc/api/resources/orders.rst +++ b/doc/api/resources/orders.rst @@ -1069,7 +1069,7 @@ Creating orders * ``valid_from`` (optional, if both ``valid_from`` and ``valid_until`` are **missing** (not ``null``) the availability will be computed from the given product) * ``valid_until`` (optional, if both ``valid_from`` and ``valid_until`` are **missing** (not ``null``) the availability will be computed from the given product) * ``requested_valid_from`` (optional, can be set **instead** of ``valid_from`` and ``valid_until`` to signal a user choice for the start time that may or may not be respected) - * ``use_reusable_medium`` (optional, causes the new ticket to take over the given reusable medium, identified by its ID) + * ``use_reusable_medium`` (optional, causes the new ticket to be connected to the given reusable medium, identified by its ID) * ``discount`` (optional, only possible if ``price`` is set; attention: if this is set to not-``null`` on any position, automatic calculation of discounts will not run) * ``answers`` diff --git a/doc/api/resources/reusablemedia.rst b/doc/api/resources/reusablemedia.rst index e0618a5b41..666a4f2c40 100644 --- a/doc/api/resources/reusablemedia.rst +++ b/doc/api/resources/reusablemedia.rst @@ -21,12 +21,16 @@ id integer Internal ID of type string Type of medium, e.g. ``"barcode"``, ``"nfc_uid"`` or ``"nfc_mf0aes"``. organizer string Organizer slug of the organizer who "owns" this medium. identifier string Unique identifier of the medium. The format depends on the ``type``. +claim_token string Secret token to claim ownership of the medium (or ``null``) +label string Label to identify the medium, usually something human readable (or ``null``) active boolean Whether this medium may be used. created datetime Date of creation updated datetime Date of last modification expires datetime Expiry date (or ``null``) customer string Identifier of a customer account this medium belongs to. -linked_orderposition integer Internal ID of a ticket this medium is linked to. +linked_orderpositions list of integers Internal IDs of tickets this medium is linked to. +linked_orderposition integer **DEPRECATED.** ID of the ticket the medium is linked to, if it is linked to + only one ticket. ``null``, if the medium is linked to none or multiple tickets. linked_giftcard integer Internal ID of a gift card this medium is linked to. info object Additional data, content depends on the ``type``. Consider this internal to the system and don't use it for your own data. @@ -39,6 +43,14 @@ Existing media types are: - ``nfc_uid`` - ``nfc_mf0aes`` + +.. versionchanged:: 2026.5 + + The ``claim_token``, ``label``, ``linked_orderpositions`` attributes have been added, the ``linked_orderposition`` attribute has been + deprecated. Note: To maintain backwards compatibility ``linked_orderposition`` contains the internal ID of the linked order position + if the medium has exactly one order position in ``linked_orderpositions``. + + Endpoints --------- @@ -77,6 +89,7 @@ Endpoints "active": True, "expires": None, "customer": None, + "linked_orderpositions": [], "linked_orderposition": None, "linked_giftcard": None, "notes": None, @@ -92,10 +105,13 @@ Endpoints :query string customer: Only show media linked to the given customer. :query string created_since: Only show media created since a given date. :query string updated_since: Only show media updated since a given date. + :query integer linked_orderpositions: Only show media linked to the given tickets. Note: you can pass multiple ticket IDs by passing + ``linked_orderpositions`` multiple times. Any medium matching any linked orderposition will be returned. :query integer linked_orderposition: Only show media linked to the given ticket. :query integer linked_giftcard: Only show media linked to the given gift card. - :query string expand: If you pass ``"linked_giftcard"``, ``"linked_giftcard.owner_ticket"``, ``"linked_orderposition"``, - or ``"customer"``, the respective field will be shown as a nested value instead of just an ID. + :query string expand: If you pass ``"linked_giftcard"``, ``"linked_giftcard.owner_ticket"``, ``"linked_orderpositions"``, + ``"linked_orderposition"`` (**DEPRECATED**), or ``"customer"``, the respective field will be shown + as a nested value instead of just an ID. The nested objects are identical to the respective resources, except that order positions will have an attribute of the format ``"order": {"code": "ABCDE", "event": "eventslug"}`` to make matching easier. The parameter can be given multiple times. @@ -134,6 +150,7 @@ Endpoints "active": True, "expires": None, "customer": None, + "linked_orderpositions": [], "linked_orderposition": None, "linked_giftcard": None, "notes": None, @@ -191,6 +208,7 @@ Endpoints "active": True, "expires": None, "customer": None, + "linked_orderpositions": [], "linked_orderposition": None, "linked_giftcard": None, "notes": None, @@ -198,9 +216,9 @@ Endpoints } :param organizer: The ``slug`` field of the organizer to look up a medium for - :query string expand: If you pass ``"linked_giftcard"``, ``"linked_orderposition"``, oder ``"customer"``, the respective + :query string expand: If you pass ``"linked_giftcard"``, ``"linked_orderpositions"``, or ``"customer"``, the respective field will be shown as a nested value instead of just an ID. The nested objects are identical to - the respective resources, except that the ``linked_orderposition`` will have an attribute of the + the respective resources, except that the ``linked_orderpositions`` each will have an attribute of the format ``"order": {"code": "ABCDE", "event": "eventslug"}`` to make matching easier. The parameter can be given multiple times. :statuscode 201: no error @@ -227,6 +245,7 @@ Endpoints "active": True, "expires": None, "customer": None, + "linked_orderpositions": [], "linked_orderposition": None, "linked_giftcard": None, "notes": None, @@ -251,6 +270,7 @@ Endpoints "active": True, "expires": None, "customer": None, + "linked_orderpositions": [], "linked_orderposition": None, "linked_giftcard": None, "notes": None, @@ -258,7 +278,7 @@ Endpoints } :param organizer: The ``slug`` field of the organizer to create a medium for - :query string expand: If you pass ``"linked_giftcard"``, ``"linked_orderposition"``, oder ``"customer"``, the respective + :query string expand: If you pass ``"linked_giftcard"``, ``"linked_orderpositions"``, or ``"customer"``, the respective field will be shown as a nested value instead of just an ID. The nested objects are identical to the respective resources, except that the ``linked_orderposition`` will have an attribute of the format ``"order": {"code": "ABCDE", "event": "eventslug"}`` to make matching easier. The parameter @@ -287,7 +307,7 @@ Endpoints Content-Length: 94 { - "linked_orderposition": 13 + "linked_orderpositions": [13, 29] } **Example response**: @@ -308,7 +328,8 @@ Endpoints "active": True, "expires": None, "customer": None, - "linked_orderposition": 13, + "linked_orderpositions": [13, 29], + "linked_orderposition": None, "linked_giftcard": None, "notes": None, "info": {} @@ -316,7 +337,7 @@ Endpoints :param organizer: The ``slug`` field of the organizer to modify :param id: The ``id`` field of the medium to modify - :query string expand: If you pass ``"linked_giftcard"``, ``"linked_orderposition"``, oder ``"customer"``, the respective + :query string expand: If you pass ``"linked_giftcard"``, ``"linked_orderpositions"``, or ``"customer"``, the respective field will be shown as a nested value instead of just an ID. The nested objects are identical to the respective resources, except that the ``linked_orderposition`` will have an attribute of the format ``"order": {"code": "ABCDE", "event": "eventslug"}`` to make matching easier. The parameter diff --git a/doc/api/resources/webhooks.rst b/doc/api/resources/webhooks.rst index 8568d50679..465582b046 100644 --- a/doc/api/resources/webhooks.rst +++ b/doc/api/resources/webhooks.rst @@ -70,6 +70,7 @@ The following values for ``action_types`` are valid with pretix core: * ``pretix.subevent.changed`` * ``pretix.subevent.deleted`` * ``pretix.event.item.*`` + * ``pretix.event.quota.*`` * ``pretix.event.live.activated`` * ``pretix.event.live.deactivated`` * ``pretix.event.testmode.activated`` diff --git a/doc/development/api/general.rst b/doc/development/api/general.rst index f565da5c1a..37d6ed2248 100644 --- a/doc/development/api/general.rst +++ b/doc/development/api/general.rst @@ -64,8 +64,8 @@ Backend .. automodule:: pretix.control.signals :members: nav_event, html_head, html_page_start, quota_detail_html, nav_topbar, nav_global, nav_organizer, nav_event_settings, - order_info, event_settings_widget, oauth_application_registered, order_position_buttons, subevent_forms, - item_formsets, order_search_filter_q, order_search_forms + order_info, order_approve_info, event_settings_widget, oauth_application_registered, + order_position_buttons, subevent_forms, item_formsets, order_search_filter_q, order_search_forms, subevent_detail_html .. automodule:: pretix.base.signals :no-index: diff --git a/doc/development/contribution/ai.rst b/doc/development/contribution/ai.rst new file mode 100644 index 0000000000..eb9f22d22f --- /dev/null +++ b/doc/development/contribution/ai.rst @@ -0,0 +1,24 @@ +.. _`aipolicy`: + +AI-assisted contribution policy +=============================== + +pretix is maintained by humans. +Every discussion, issue, and pull request is read and reviewed by humans (and sometimes machines, too). +We ask you to respect the time and effort put in by these humans by not sending low-effort, unqualified work, since it puts the burden of validation on the maintainer. + +Therefore, the pretix project has strict rules for AI usage: + +- **All AI usage in any form must be disclosed.** You must state the tool you used (e.g. Claude Code, Cursor, Amp) along with the extent that the work was AI-assisted. + +- **The human-in-the-loop must fully understand all code.** If you can't explain what your changes do and how they interact with the greater system without the aid of AI tools, do not contribute to this project. + +- **Issues and discussions can use AI assistance but must have a full human-in-the-loop.** This means that any content generated with AI must have been reviewed and edited by a human before submission. AI is very good at being overly verbose and including noise that distracts from the main point. Humans must do their research and trim this down. + +- **No AI-generated media is allowed (art, images, videos, audio, etc.).** Text and code are the only acceptable AI-generated content, per the other rules in this policy. + +- **Bad AI drivers will be excluded from the project.** People who produce bad contributions that are clearly AI (slop) will be blocked from our organization without warning. + +This policy was inspired by the `ghostty project`_. + +.. _ghostty project: https://github.com/ghostty-org/ghostty/blob/main/AI_POLICY.md \ No newline at end of file diff --git a/doc/development/contribution/general.rst b/doc/development/contribution/general.rst index 50024e2397..c6c535d3b6 100644 --- a/doc/development/contribution/general.rst +++ b/doc/development/contribution/general.rst @@ -1,23 +1,39 @@ -General remarks -=============== +Contribution workflow +===================== You are interested in contributing to pretix? That is awesome! If you’re new to contributing to open source software, don’t be afraid. We’ll happily review your code and give you -constructive and friendly feedback on your changes. +constructive and friendly feedback on your changes. Every contribution should go through the following steps. -First of all, you'll need pretix running locally on your machine. Head over to :ref:`devsetup` to learn how to do this. +Discussion & Design +------------------- + +pretix is a large and mature project with more of a decade of history and hopefully many more decades to come. +Keeping pretix in good shape over long timeframes is first and foremost a fight against complexity. +With every additional feature, complexity grows, and both features and complexity are hard to remove. + +Even if you are doing the initial work of the contribution, accepting the contribution is not free for us. +Not only will we need to maintain the feature, but every feature adds cost to the maintenance of every other feature it interacts with, and every feature adds effort for users to understand how pretix works. +Therefore, we must carefully select what features we add, based on how well they fit the system in general and of how much use they will be to our larger user base. + +We strongly ask you to **create a discussion on GitHub for every new feature idea** outlining the use case and the proposed implementation design. +Pull requests without prior discussion will likely just be closed. + +For bug fixes and very minor changes, you can skip this step and open a PR right away. + +Development +----------- + +To develop your contribution, you'll need pretix running locally on your machine. Head over to :ref:`devsetup` to learn how to do this. If you run into any problems on your way, please do not hesitate to ask us anytime! -Please note that we bound ourselves to a :ref:`coc` that applies to all communication around the project. You can be -assured that we will not tolerate any form of harassment. +While developing, please have a look at our :ref:`aipolicy` and our guidelines on :ref:`codestyle`. Sending a patch --------------- -If you improved pretix in any way, we'd be very happy if you contribute it -back to the main code base! The easiest way to do so is to `create a pull request`_ -on our `GitHub repository`_. +Once you have a first draft of your changes, please `create a pull request`_ on our `GitHub repository`_. We recommend that you create a feature branch for every issue you work on so the changes can be reviewed individually. @@ -25,14 +41,17 @@ Please use the test suite to check whether your changes break any existing featu the code style checks to confirm you are consistent with pretix's coding style. You'll find instructions on this in the :ref:`checksandtests` section of the development setup guide. -We automatically run the tests and the code style check on every pull request on Travis CI and we won’t +We automatically run the tests and the code style check on every pull request through GitHub Actions and we won’t accept any pull requests without all tests passing. However, if you don't find out *why* they are not passing, just send the pull request and tell us – we'll be glad to help. If you add a new feature, please include appropriate documentation into your patch. If you fix a bug, please include a regression test, i.e. a test that fails without your changes and passes after applying your changes. -Again: If you get stuck, do not hesitate to contact any of us, or Raphael personally at mail@raphaelmichel.de. +Again: If you get stuck, do not hesitate to contact us through GitHub discussions. + +Please note that we bound ourselves to a :ref:`coc` that applies to all communication around the project. You can be +assured that we will not tolerate any form of harassment. .. _create a pull request: https://help.github.com/articles/creating-a-pull-request/ .. _GitHub repository: https://github.com/pretix/pretix diff --git a/doc/development/contribution/index.rst b/doc/development/contribution/index.rst index 7f698eac6c..f8a1d65f37 100644 --- a/doc/development/contribution/index.rst +++ b/doc/development/contribution/index.rst @@ -6,4 +6,5 @@ Contributing to pretix general style + ai codeofconduct diff --git a/doc/development/contribution/style.rst b/doc/development/contribution/style.rst index e91bb48d06..d6065a019e 100644 --- a/doc/development/contribution/style.rst +++ b/doc/development/contribution/style.rst @@ -1,5 +1,7 @@ .. spelling:word-list:: Rebase rebasing +.. _`codestyle`: + Coding style and quality ======================== @@ -28,8 +30,6 @@ Code Commits and Pull Requests ------------------------- - - Most commits should start as pull requests, therefore this applies to the titles of pull requests as well since the pull request title will become the commit message on merge. We prefer merging with GitHub's "Squash and merge" feature if the PR contains multiple commits that do not carry value to keep. If there is value in keeping the @@ -86,7 +86,7 @@ individual commits, we use "Rebase and merge" instead. Merge commits should be a .. _PEP 8: https://legacy.python.org/dev/peps/pep-0008/ .. _flake8: https://pypi.python.org/pypi/flake8 .. _Django Coding Style: https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/ -.. _translation: https://docs.djangoproject.com/en/1.11/topics/i18n/translation/ -.. _class-based views: https://docs.djangoproject.com/en/1.11/topics/class-based-views/ +.. _translation: https://docs.djangoproject.com/en/6.0/topics/i18n/translation/ +.. _class-based views: https://docs.djangoproject.com/en/6.0/topics/class-based-views/ .. _pytest-style: https://docs.pytest.org/en/latest/assert.html .. _fixtures: https://docs.pytest.org/en/latest/fixture.html diff --git a/doc/development/implementation/urlconfig.rst b/doc/development/implementation/urlconfig.rst index e1f5b86417..881d7c147d 100644 --- a/doc/development/implementation/urlconfig.rst +++ b/doc/development/implementation/urlconfig.rst @@ -81,7 +81,7 @@ is a python method that emulates a behavior similar to ``reverse``: If you need to communicate the URL externally, you can use a different method to ensure that it is always an absolute URL: -.. autofunction:: pretix.multidomain.urlreverse.build_absolute_uri +.. autofunction:: pretix.multidomain.urlreverse.eventreverse_absolute In addition, there is a template tag that works similar to ``url`` but takes an event or organizer object as its first argument and can be used like this:: diff --git a/doc/development/setup.rst b/doc/development/setup.rst index 9d34aa4d49..f9988d2585 100644 --- a/doc/development/setup.rst +++ b/doc/development/setup.rst @@ -110,6 +110,56 @@ process:: However, beware that code changes will not auto-reload within Celery. +Running the local development server will also automatically start a vite dev server for all control vue components. + +Run the widget development server +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To locally develop the presale widget you need to start a separate vite dev server using:: + + npm run dev:widget + +You can control the org, event and much more via query parameters like this:: + + http://localhost:5180/?org=testorg&event=testevent + +The following query parameters are supported: + +.. list-table:: + :header-rows: 1 + :widths: 20 20 60 + + * - Parameter + - Default + - Description + * - ``org`` + - ``testorg`` + - Organization slug + * - ``event`` + - ``testevent`` + - Event slug + * - ``host`` + - ``http://localhost:8000`` + - Backend host URL + * - ``type`` + - ``widget`` + - Element type: ``widget`` or ``button`` + * - ``mode`` + - ``dev`` + - ``dev`` loads the Vite dev source, ``prod`` loads the built ``v2.{lang}.js`` + * - ``lang`` + - ``de`` + - Language code for the prod script + * - ``button-text`` + - ``Buy tickets!`` + - Text content for the button (only used when ``type=button``) + +Any other query parameter is passed through as an attribute on the widget/button element. +For example, ``?skip-ssl-check&list-type=calendar&items=123`` adds those attributes directly. + + + + .. _`checksandtests`: Code checks and unit tests diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000000..cf85b9cbe1 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,108 @@ +import { defineConfig, globalIgnores } from 'eslint/config' +import globals from 'globals' +import js from '@eslint/js' +import ts from 'typescript-eslint' +import stylistic from '@stylistic/eslint-plugin' +import vue from 'eslint-plugin-vue' +import vuePug from 'eslint-plugin-vue-pug' + +const ignores = globalIgnores([ + '**/node_modules', + '**/dist' +]) + +export default defineConfig([ + ignores, + ...ts.config( + js.configs.recommended, + ts.configs.recommended + ), + stylistic.configs.customize({ + indent: 'tab', + braceStyle: '1tbs', + quoteProps: 'as-needed' + }), + ...vue.configs['flat/recommended'], + ...vuePug.configs['flat/recommended'], + { + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, + localStorage: false, + $: 'readonly', + $$: 'readonly', + $ref: 'readonly', + $computed: 'readonly', + }, + parserOptions: { + parser: '@typescript-eslint/parser' + } + }, + + rules: { + 'no-debugger': 'off', + curly: 0, + 'no-return-assign': 0, + 'no-console': 'off', + 'vue/require-default-prop': 0, + 'vue/require-v-for-key': 0, + 'vue/valid-v-for': 'warn', + 'vue/no-reserved-keys': 0, + 'vue/no-setup-props-destructure': 0, + 'vue/multi-word-component-names': 0, + 'vue/max-attributes-per-line': 0, + 'vue/attribute-hyphenation': ['warn', 'never'], + 'vue/v-on-event-hyphenation': ['warn', 'never'], + 'import/first': 0, + '@typescript-eslint/ban-ts-comment': 0, + '@typescript-eslint/no-explicit-any': 0, + 'no-use-before-define': 'off', + 'no-var': 'error', + + '@typescript-eslint/no-use-before-define': ['error', { + typedefs: false, + functions: false, + }], + + '@typescript-eslint/no-unused-vars': ['error', { + args: 'all', + argsIgnorePattern: '^_', + caughtErrors: 'all', + caughtErrorsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + varsIgnorePattern: '^_', + ignoreRestSiblings: true + }], + + '@stylistic/comma-dangle': 0, + '@stylistic/space-before-function-paren': ['error', 'always'], + '@stylistic/max-statements-per-line': ['error', { max: 1, ignoredNodes: ['BreakStatement'] }], + '@stylistic/member-delimiter-style': 0, + '@stylistic/arrow-parens': 0, + '@stylistic/generator-star-spacing': 0, + '@stylistic/yield-star-spacing': ['error', 'after'], + }, + }, + { + files: [ + 'src/pretix/static/pretixcontrol/js/ui/checkinrules/**/*.vue', + 'src/pretix/plugins/webcheckin/**/*.vue', + ], + languageOptions: { + globals: { + moment: 'readonly', + }, + }, + }, + { + files: [ + 'src/pretix/static/pretixpresale/widget/**/*.{ts,vue}', + ], + languageOptions: { + globals: { + LANG: 'readonly', + }, + }, + }, +]) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..d4134776fd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4799 @@ +{ + "name": "pretix", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pretix", + "version": "1.0.0", + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "vue": "^3.5.30" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@stylistic/eslint-plugin": "^5.10.0", + "@types/jquery": "^3.5.33", + "@types/moment": "^2.11.29", + "@types/node": "^25.5.0", + "@vitejs/plugin-vue": "^6.0.5", + "@vue/eslint-config-typescript": "^14.7.0", + "@vue/language-plugin-pug": "^3.2.5", + "eslint": "^10.0.3", + "eslint-plugin-vue": "^10.8.0", + "eslint-plugin-vue-pug": "^1.0.0-alpha.5", + "globals": "^17.4.0", + "pug": "^3.0.3", + "sass-embedded": "^1.98.0", + "smol-toml": "^1.6.1", + "stylus": "^0.64.0", + "typescript-eslint": "^8.57.0", + "vite": "^8.0.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.11.0.tgz", + "integrity": "sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==", + "dev": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.3", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", + "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.3", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", + "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", + "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", + "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", + "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@stylistic/eslint-plugin": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/types": "^8.56.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.0.0 || ^10.0.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jquery": { + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.33.tgz", + "integrity": "sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sizzle": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/moment": { + "version": "2.11.29", + "resolved": "https://registry.npmjs.org/@types/moment/-/moment-2.11.29.tgz", + "integrity": "sha512-D5WIgbLYQzvgfsDnBhZFSTnt/BjGPOE+Jsh3k1BYYijJAkrn7ceeLvU4jtjKKXXuXN42O3ARlU4D/P9ezbQYFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/sizzle": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz", + "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz", + "integrity": "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/type-utils": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.0.tgz", + "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.0.tgz", + "integrity": "sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.0", + "@typescript-eslint/types": "^8.57.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.0.tgz", + "integrity": "sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz", + "integrity": "sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz", + "integrity": "sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.0.tgz", + "integrity": "sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.0.tgz", + "integrity": "sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.0", + "@typescript-eslint/tsconfig-utils": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz", + "integrity": "sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.0.tgz", + "integrity": "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.5.tgz", + "integrity": "sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.30", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "14.7.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.7.0.tgz", + "integrity": "sha512-iegbMINVc+seZ/QxtzWiOBozctrHiF2WvGedruu2EbLujg9VuU0FQiNcN2z1ycuaoKKpF4m2qzB5HDEMKbxtIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.56.0", + "fast-glob": "^3.3.3", + "typescript-eslint": "^8.56.0", + "vue-eslint-parser": "^10.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.10.0 || ^10.0.0", + "eslint-plugin-vue": "^9.28.0 || ^10.0.0", + "typescript": ">=4.8.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-plugin-pug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@vue/language-plugin-pug/-/language-plugin-pug-3.2.5.tgz", + "integrity": "sha512-E98NSmXmlYd5HIrv2f3IbPE1dgKjKABlDCdySqMxrlQ/kh4fAf91mUoxQKsEKhikE62QIylFDts8S84/du5dfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28", + "muggle-string": "^0.4.1", + "pug-lexer": "^5.0.1", + "pug-parser": "^6.0.0", + "vscode-languageserver-textdocument": "^1.0.11" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.30.tgz", + "integrity": "sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.30.tgz", + "integrity": "sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.30.tgz", + "integrity": "sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/runtime-core": "3.5.30", + "@vue/shared": "3.5.30", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.30.tgz", + "integrity": "sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "vue": "3.5.30" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/assert-never": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.4.0.tgz", + "integrity": "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.9.6" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-regex": "^1.0.3" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.3.tgz", + "integrity": "sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.3", + "@eslint/config-helpers": "^0.5.2", + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.1.1", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.8.0.tgz", + "integrity": "sha512-f1J/tcbnrpgC8suPN5AtdJ5MQjuXbSU9pGRSSYAuF3SHoiYCOdEX6O22pLaRyLHXvDcOe+O5ENgc1owQ587agA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^7.1.0", + "semver": "^7.6.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "vue-eslint-parser": "^10.0.0" + }, + "peerDependenciesMeta": { + "@stylistic/eslint-plugin": { + "optional": true + }, + "@typescript-eslint/parser": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue-pug": { + "version": "1.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue-pug/-/eslint-plugin-vue-pug-1.0.0-alpha.5.tgz", + "integrity": "sha512-afj+jrA5WA42BIwtrtPdo0KIBx4wQntkuL7fh4siA461Q9Hg9NhVuYWnFneCLA0ICuC9WmEzuSB+/MqVOh2oXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue-eslint-parser-template-tokenizer-pug": "^1.0.0" + }, + "peerDependencies": { + "eslint-plugin-vue": ">=10.7.0" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/is-expression/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/pug": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", + "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pug-code-gen": "^3.0.3", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "node_modules/pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "node_modules/pug-code-gen": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", + "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.1.0", + "pug-runtime": "^3.0.1", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "node_modules/pug-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", + "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "node_modules/pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "node_modules/pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/sass": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.98.0.tgz", + "integrity": "sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-embedded": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.98.0.tgz", + "integrity": "sha512-Do7u6iRb6K+lrllcTkB1BXcHwOxcKe3rEfOF/GcCLE2w3WpddakRAosJOHFUR37DpsvimQXEt5abs3NzUjEIqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^2.5.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.1.5", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-all-unknown": "1.98.0", + "sass-embedded-android-arm": "1.98.0", + "sass-embedded-android-arm64": "1.98.0", + "sass-embedded-android-riscv64": "1.98.0", + "sass-embedded-android-x64": "1.98.0", + "sass-embedded-darwin-arm64": "1.98.0", + "sass-embedded-darwin-x64": "1.98.0", + "sass-embedded-linux-arm": "1.98.0", + "sass-embedded-linux-arm64": "1.98.0", + "sass-embedded-linux-musl-arm": "1.98.0", + "sass-embedded-linux-musl-arm64": "1.98.0", + "sass-embedded-linux-musl-riscv64": "1.98.0", + "sass-embedded-linux-musl-x64": "1.98.0", + "sass-embedded-linux-riscv64": "1.98.0", + "sass-embedded-linux-x64": "1.98.0", + "sass-embedded-unknown-all": "1.98.0", + "sass-embedded-win32-arm64": "1.98.0", + "sass-embedded-win32-x64": "1.98.0" + } + }, + "node_modules/sass-embedded-all-unknown": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.98.0.tgz", + "integrity": "sha512-6n4RyK7/1mhdfYvpP3CClS3fGoYqDvRmLClCESS6I7+SAzqjxvGG6u5Fo+cb1nrPNbbilgbM4QKdgcgWHO9NCA==", + "cpu": [ + "!arm", + "!arm64", + "!riscv64", + "!x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "sass": "1.98.0" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.98.0.tgz", + "integrity": "sha512-LjGiMhHgu7VL1n7EJxTCre1x14bUsWd9d3dnkS2rku003IWOI/fxc7OXgaKagoVzok1kv09rzO3vFXJR5ZeONQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.98.0.tgz", + "integrity": "sha512-M9Ra98A6vYJHpwhoC/5EuH1eOshQ9ZyNwC8XifUDSbRl/cGeQceT1NReR9wFj3L7s1pIbmes1vMmaY2np0uAKQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.98.0.tgz", + "integrity": "sha512-WPe+0NbaJIZE1fq/RfCZANMeIgmy83x4f+SvFOG7LhUthHpZWcOcrPTsCKKmN3xMT3iw+4DXvqTYOCYGRL3hcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.98.0.tgz", + "integrity": "sha512-zrD25dT7OHPEgLWuPEByybnIfx4rnCtfge4clBgjZdZ3lF6E7qNLRBtSBmoFflh6Vg0RlEjJo5VlpnTMBM5MQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.98.0.tgz", + "integrity": "sha512-cgr1z9rBnCdMf8K+JabIaYd9Rag2OJi5mjq08XJfbJGMZV/TA6hFJCLGkr5/+ZOn4/geTM5/3aSfQ8z5EIJAOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.98.0.tgz", + "integrity": "sha512-OLBOCs/NPeiMqTdOrMFbVHBQFj19GS3bSVSxIhcCq16ZyhouUkYJEZjxQgzv9SWA2q6Ki8GCqp4k6jMeUY9dcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.98.0.tgz", + "integrity": "sha512-03baQZCxVyEp8v1NWBRlzGYrmVT/LK7ZrHlF1piscGiGxwfdxoLXVuxsylx3qn/dD/4i/rh7Bzk7reK1br9jvQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.98.0.tgz", + "integrity": "sha512-axOE3t2MTBwCtkUCbrdM++Gj0gC0fdHJPrgzQ+q1WUmY9NoNMGqflBtk5mBZaWUeha2qYO3FawxCB8lctFwCtw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.98.0.tgz", + "integrity": "sha512-OBkjTDPYR4hSaueOGIM6FDpl9nt/VZwbSRpbNu9/eEJcxE8G/vynRugW8KRZmCFjPy8j/jkGBvvS+k9iOqKV3g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.98.0.tgz", + "integrity": "sha512-LeqNxQA8y4opjhe68CcFvMzCSrBuJqYVFbwElEj9bagHXQHTp9xVPJRn6VcrC+0VLEDq13HVXMv7RslIuU0zmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.98.0.tgz", + "integrity": "sha512-7w6hSuOHKt8FZsmjRb3iGSxEzM87fO9+M8nt5JIQYMhHTj5C+JY/vcske0v715HCVj5e1xyTnbGXf8FcASeAIw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.98.0.tgz", + "integrity": "sha512-QikNyDEJOVqPmxyCFkci8ZdCwEssdItfjQFJB+D+Uy5HFqcS5Lv3d3GxWNX/h1dSb23RPyQdQc267ok5SbEyJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.98.0.tgz", + "integrity": "sha512-E7fNytc/v4xFBQKzgzBddV/jretA4ULAPO6XmtBiQu4zZBdBozuSxsQLe2+XXeb0X4S2GIl72V7IPABdqke/vA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.98.0.tgz", + "integrity": "sha512-VsvP0t/uw00mMNPv3vwyYKUrFbqzxQHnRMO+bHdAMjvLw4NFf6mscpym9Bzf+NXwi1ZNKnB6DtXjmcpcvqFqYg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-unknown-all": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.98.0.tgz", + "integrity": "sha512-C4MMzcAo3oEDQnW7L8SBgB9F2Fq5qHPnaYTZRMOH3Mp/7kM4OooBInXpCiiFjLnjY95hzP4KyctVx0uYR6MYlQ==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "!android", + "!darwin", + "!linux", + "!win32" + ], + "dependencies": { + "sass": "1.98.0" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.98.0.tgz", + "integrity": "sha512-nP/10xbAiPbhQkMr3zQfXE4TuOxPzWRQe1Hgbi90jv2R4TbzbqQTuZVOaJf7KOAN4L2Bo6XCTRjK5XkVnwZuwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.98.0.tgz", + "integrity": "sha512-/lbrVsfbcbdZQ5SJCWcV0NVPd6YRs+FtAnfedp4WbCkO/ZO7Zt/58MvI4X2BVpRY/Nt5ZBo1/7v2gYcQ+J4svQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/sax": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/smol-toml": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz", + "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylus": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.64.0.tgz", + "integrity": "sha512-ZIdT8eUv8tegmqy1tTIdJv9We2DumkNZFdCF5mz/Kpq3OcTaxSuCAYZge6HKK2CmNC02G1eJig2RV7XTw5hQrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "~4.3.3", + "debug": "^4.3.2", + "glob": "^10.4.5", + "sax": "~1.4.1", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://opencollective.com/stylus" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", + "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.0.tgz", + "integrity": "sha512-W8GcigEMEeB07xEZol8oJ26rigm3+bfPHxHvwbYUlu1fUDsGuQ7Hiskx5xGW/xM4USc9Ephe3jtv7ZYPQntHeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.57.0", + "@typescript-eslint/parser": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", + "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz", + "integrity": "sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "eslint-scope": "^8.2.0 || ^9.0.0", + "eslint-visitor-keys": "^4.2.0 || ^5.0.0", + "espree": "^10.3.0 || ^11.0.0", + "esquery": "^1.6.0", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/vue-eslint-parser-template-tokenizer-pug": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser-template-tokenizer-pug/-/vue-eslint-parser-template-tokenizer-pug-1.0.0.tgz", + "integrity": "sha512-kBNkXTDvxb0K4KScHOfMdVGngHAQxE1VqCeQmGyhgUOO1VgrDBWW2nb4mhHvAZhX7dIS8f2S48YI1MdjFboNEg==", + "dev": true, + "license": "ISC", + "dependencies": { + "pug-lexer": "^5.0.1" + }, + "peerDependencies": { + "vue-eslint-parser": "^10.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000..c20749c4eb --- /dev/null +++ b/package.json @@ -0,0 +1,52 @@ +{ + "name": "pretix", + "version": "1.0.0", + "description": "", + "homepage": "https://github.com/pretix/pretix#readme", + "bugs": { + "url": "https://github.com/pretix/pretix/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/pretix/pretix.git" + }, + "license": "SEE LICENSE IN LICENSE", + "author": "", + "type": "module", + "main": "index.js", + "directories": { + "doc": "doc" + }, + "scripts": { + "dev:control": "vite", + "dev:widget": "vite src/pretix/static/pretixpresale/widget", + "build": "npm run build:control -s && npm run build:widget -s", + "build:control": "vite build", + "build:widget": "vite build src/pretix/static/pretixpresale/widget", + "lint:eslint": "eslint src/pretix/static/pretixpresale/widget src/pretix/static/pretixcontrol/js/ui/checkinrules src/pretix/plugins/webcheckin", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "vue": "^3.5.30" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@stylistic/eslint-plugin": "^5.10.0", + "@types/jquery": "^3.5.33", + "@types/moment": "^2.11.29", + "@types/node": "^25.5.0", + "@vitejs/plugin-vue": "^6.0.5", + "@vue/eslint-config-typescript": "^14.7.0", + "@vue/language-plugin-pug": "^3.2.5", + "eslint": "^10.0.3", + "eslint-plugin-vue": "^10.8.0", + "eslint-plugin-vue-pug": "^1.0.0-alpha.5", + "globals": "^17.4.0", + "pug": "^3.0.3", + "sass-embedded": "^1.98.0", + "smol-toml": "^1.6.1", + "stylus": "^0.64.0", + "typescript-eslint": "^8.57.0", + "vite": "^8.0.0" + } +} diff --git a/pyproject.toml b/pyproject.toml index f6989f4950..251b561e3f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,15 +27,15 @@ classifiers = [ ] dependencies = [ - "arabic-reshaper==3.0.0", # Support for Arabic in reportlab + "arabic-reshaper==3.0.1", # Support for Arabic in reportlab "babel", - "BeautifulSoup4==4.14.*", - "bleach==6.3.*", + "BeautifulSoup4==4.15.*", + "bleach==6.4.*", "celery==5.6.*", "chardet==5.2.*", - "cryptography>=44.0.0", - "css-inline==0.20.*", - "defusedcsv>=1.1.0", + "cryptography>=49.0.0", + "css-inline==0.21.*", + "defusedcsv>=3.0.0", "dnspython==2.*", "Django[argon2]==5.2.*", "django-bootstrap3==26.1", @@ -43,7 +43,7 @@ dependencies = [ "django-countries==8.2.*", "django-filter==25.1", "django-formset-js-improved==0.5.0.5", - "django-formtools==2.5.1", + "django-formtools==2.6.1", "django-hierarkey==2.0.*,>=2.0.1", "django-hijack==3.7.*", "django-i18nfield==1.11.*", @@ -53,10 +53,11 @@ dependencies = [ "django-oauth-toolkit==2.3.*", "django-otp==1.7.*", "django-phonenumber-field==8.4.*", + "django-querytagger==0.0.3", "django-redis==6.0.*", "django-scopes==2.0.*", "django-statici18n==2.7.*", - "djangorestframework==3.16.*", + "djangorestframework==3.17.*", "dnspython==2.8.*", "drf_ujson2==1.7.*", "geoip2==5.*", @@ -74,11 +75,11 @@ dependencies = [ "packaging", "paypalrestsdk==1.13.*", "paypal-checkout-serversdk==1.0.*", - "PyJWT==2.12.*", + "PyJWT==2.13.*", "phonenumberslite==9.0.*", - "Pillow==12.2.*", + "Pillow==12.3.*", "pretix-plugin-build", - "protobuf==7.34.*", + "protobuf==7.35.*", "psycopg2-binary", "pycountry", "pycparser==3.0", @@ -91,40 +92,42 @@ dependencies = [ "pyuca", "qrcode==8.2", "redis==7.4.*", - "reportlab==4.4.*", + "reportlab==4.5.*", "requests==2.32.*", - "sentry-sdk==2.57.*", + "sentry-sdk==2.64.*", "sepaxml==2.7.*", "stripe==7.9.*", "text-unidecode==1.*", - "tlds>=2020041600", + "tlds>=2026041800", "tqdm==4.*", "ua-parser==1.0.*", "vobject==0.9.*", - "webauthn==2.7.*", + "webauthn==2.8.*", "zeep==4.3.*" ] [project.optional-dependencies] memcached = ["pylibmc"] dev = [ - "aiohttp==3.13.*", + "aiohttp==3.14.*", "coverage", "coveralls", - "fakeredis==2.34.*", + "fakeredis==2.36.*", "flake8==7.3.*", "freezegun", "isort==8.0.*", "pep8-naming==0.15.*", "potypo", - "pytest-asyncio>=0.24", + "pytest-asyncio>=1.4.0", "pytest-cache", "pytest-cov", "pytest-django==4.*", "pytest-mock==3.15.*", "pytest-sugar", "pytest-xdist==3.8.*", - "pytest==9.0.*", + "pytest-playwright", + "pytest==9.1.*", + "playwright", "responses", ] @@ -137,8 +140,6 @@ build-backend = "backend" backend-path = ["_build"] requires = [ "setuptools", - "setuptools-rust", - "wheel", "importlib_metadata", "tomli", ] diff --git a/setup.cfg b/setup.cfg index 25c167e732..e7cdae97ca 100644 --- a/setup.cfg +++ b/setup.cfg @@ -37,4 +37,9 @@ ignore = CONTRIBUTING.md Dockerfile SECURITY.md + eslint.config.mjs + package-lock.json + package.json + tsconfig.json + vite.config.js diff --git a/src/Makefile b/src/Makefile index 7834612fac..b91b0eb7a2 100644 --- a/src/Makefile +++ b/src/Makefile @@ -6,13 +6,13 @@ localecompile: ./manage.py compilemessages localegen: - ./manage.py makemessages --keep-pot --ignore "pretix/static/npm_dir/*" $(LNGS) - ./manage.py makemessages --keep-pot -d djangojs --ignore "pretix/static/npm_dir/*" --ignore "pretix/helpers/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static.dist/*" --ignore "data/*" --ignore "pretix/static/rrule/*" --ignore "build/*" $(LNGS) + ./manage.py makemessages --keep-pot --add-location file --ignore "pretix/static/npm_dir/*" $(LNGS) + ./manage.py makemessages --keep-pot --add-location file -e js,ts,vue -d djangojs --ignore "pretix/static/npm_dir/*" --ignore "pretix/helpers/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static.dist/*" --ignore "data/*" --ignore "pretix/static/rrule/*" --ignore "build/*" $(LNGS) -staticfiles: jsi18n +staticfiles: npminstall npmbuild jsi18n ./manage.py collectstatic --noinput -compress: npminstall +compress: ./manage.py compress jsi18n: localecompile @@ -25,8 +25,8 @@ coverage: coverage run -m py.test npminstall: - # keep this in sync with pretix/_build.py! - mkdir -p pretix/static.dist/node_prefix/ - cp -r pretix/static/npm_dir/* pretix/static.dist/node_prefix/ - npm ci --prefix=pretix/static.dist/node_prefix + npm ci + +npmbuild: + npm run build diff --git a/src/pretix/__init__.py b/src/pretix/__init__.py index 0c34967698..62bd3cf63e 100644 --- a/src/pretix/__init__.py +++ b/src/pretix/__init__.py @@ -19,4 +19,4 @@ # You should have received a copy of the GNU Affero General Public License along with this program. If not, see # . # -__version__ = "2026.4.0.dev0" +__version__ = "2026.7.0.dev0" diff --git a/src/pretix/_base_settings.py b/src/pretix/_base_settings.py index 2931c7e413..50d248386d 100644 --- a/src/pretix/_base_settings.py +++ b/src/pretix/_base_settings.py @@ -37,9 +37,11 @@ INSTALLED_APPS = [ 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', - 'django.contrib.staticfiles', 'django.contrib.humanize', + # pretix needs to go before staticfiles + # so we can override the runserver command 'pretix.base', + 'django.contrib.staticfiles', 'pretix.control', 'pretix.presale', 'pretix.multidomain', @@ -116,6 +118,7 @@ ALL_LANGUAGES = [ ('sv', _('Swedish')), ('es', _('Spanish')), ('es-419', _('Spanish (Latin America)')), + ('th', _('Thai')), ('tr', _('Turkish')), ('uk', _('Ukrainian')), ] @@ -243,7 +246,6 @@ STORAGES = { COMPRESS_PRECOMPILERS = ( ('text/x-scss', 'django_libsass.SassCompiler'), - ('text/vue', 'pretix.helpers.compressor.VueCompiler'), ) COMPRESS_OFFLINE_CONTEXT = { diff --git a/src/pretix/_build.py b/src/pretix/_build.py index de9e2900c3..3b6baa7e34 100644 --- a/src/pretix/_build.py +++ b/src/pretix/_build.py @@ -21,13 +21,13 @@ # import os -import shutil import subprocess from setuptools.command.build import build from setuptools.command.build_ext import build_ext here = os.path.abspath(os.path.dirname(__file__)) +project_root = os.path.abspath(os.path.join(here, '..', '..')) npm_installed = False @@ -35,14 +35,14 @@ def npm_install(): global npm_installed if not npm_installed: - # keep this in sync with Makefile! - node_prefix = os.path.join(here, 'static.dist', 'node_prefix') - os.makedirs(node_prefix, exist_ok=True) - shutil.copytree(os.path.join(here, 'static', 'npm_dir'), node_prefix, dirs_exist_ok=True) - subprocess.check_call('npm ci', shell=True, cwd=node_prefix) + subprocess.check_call('npm ci', shell=True, cwd=project_root) npm_installed = True +def npm_build(): + subprocess.check_call('npm run build', shell=True, cwd=project_root) + + class CustomBuild(build): def run(self): if "src" not in os.listdir(".") or "pretix" not in os.listdir("src"): @@ -62,6 +62,7 @@ class CustomBuild(build): settings.COMPRESS_OFFLINE = True npm_install() + npm_build() management.call_command('compilemessages', verbosity=1) management.call_command('compilejsi18n', verbosity=1) management.call_command('collectstatic', verbosity=1, interactive=False) diff --git a/src/pretix/_build_settings.py b/src/pretix/_build_settings.py index 5c04e511d7..859a7f912f 100644 --- a/src/pretix/_build_settings.py +++ b/src/pretix/_build_settings.py @@ -47,3 +47,5 @@ HAS_MEMCACHED = False HAS_CELERY = False HAS_GEOIP = False SENTRY_ENABLED = False +VITE_DEV_MODE = False +VITE_IGNORE = False diff --git a/src/pretix/api/auth/devicesecurity.py b/src/pretix/api/auth/devicesecurity.py index 18a99336bd..7fc06e9522 100644 --- a/src/pretix/api/auth/devicesecurity.py +++ b/src/pretix/api/auth/devicesecurity.py @@ -110,6 +110,8 @@ class PretixScanSecurityProfile(AllowListSecurityProfile): ('POST', 'api-v1:checkinrpc.redeem'), ('GET', 'api-v1:checkinrpc.search'), ('GET', 'api-v1:reusablemedium-list'), + ('POST', 'api-v1:reusablemedium-lookup'), + ('PATCH', 'api-v1:reusablemedium-detail') ) diff --git a/src/pretix/api/serializers/checkin.py b/src/pretix/api/serializers/checkin.py index 63759c0160..db716a3154 100644 --- a/src/pretix/api/serializers/checkin.py +++ b/src/pretix/api/serializers/checkin.py @@ -88,11 +88,19 @@ class CheckinRPCRedeemInputSerializer(serializers.Serializer): nonce = serializers.CharField(required=False, allow_null=True) datetime = serializers.DateTimeField(required=False, allow_null=True) answers = serializers.JSONField(required=False, allow_null=True) + exchange_medium_type = serializers.ChoiceField(required=False, choices=MEDIA_TYPES) + exchange_medium_identifier = serializers.CharField(required=False) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['lists'].child_relation.queryset = CheckinList.objects.filter(event__in=self.context['events']).select_related('event') + def validate(self, attrs): + exchange_fields = ["exchange_medium_type", "exchange_medium_identifier"] + if any(attrs.get(k) is None for k in exchange_fields) and not all(attrs.get(k) is None for k in exchange_fields): + raise ValidationError("If you set any of exchange_medium_type or exchange_medium_identifier, you need to set both of them.") + return attrs + class MiniCheckinListSerializer(I18nAwareModelSerializer): event = serializers.SlugRelatedField(slug_field='slug', read_only=True) diff --git a/src/pretix/api/serializers/event.py b/src/pretix/api/serializers/event.py index ca163f0d33..c6fef3d69c 100644 --- a/src/pretix/api/serializers/event.py +++ b/src/pretix/api/serializers/event.py @@ -73,7 +73,7 @@ from pretix.base.settings import ( LazyI18nStringList, validate_event_settings, ) from pretix.base.signals import api_event_settings_fields -from pretix.multidomain.urlreverse import build_absolute_uri +from pretix.multidomain.urlreverse import eventreverse_absolute logger = logging.getLogger(__name__) @@ -173,7 +173,7 @@ class EventSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer): ) def get_event_url(self, event): - return build_absolute_uri(event, 'presale:event.index') + return eventreverse_absolute(event, 'presale:event.index') class Meta: model = Event @@ -871,6 +871,7 @@ class EventSettingsSerializer(SettingsSerializer): 'og_image', 'name_scheme', 'reusable_media_active', + 'reusable_media_usage_enforced', 'reusable_media_type_barcode', 'reusable_media_type_barcode_identifier_length', 'reusable_media_type_nfc_uid', @@ -885,6 +886,7 @@ class EventSettingsSerializer(SettingsSerializer): readonly_fields = [ # These are read-only since they are currently only settable on organizers, not events 'reusable_media_active', + 'reusable_media_usage_enforced', 'reusable_media_type_barcode', 'reusable_media_type_barcode_identifier_length', 'reusable_media_type_nfc_uid', @@ -970,6 +972,7 @@ class DeviceEventSettingsSerializer(EventSettingsSerializer): 'reusable_media_type_nfc_uid', 'reusable_media_type_nfc_mf0aes', 'reusable_media_type_nfc_mf0aes_random_uid', + 'reusable_media_usage_enforced', 'system_question_order', 'tax_rule_payment', 'tax_rule_cancellation', diff --git a/src/pretix/api/serializers/exporters.py b/src/pretix/api/serializers/exporters.py index f541f758a1..ff1bb6464c 100644 --- a/src/pretix/api/serializers/exporters.py +++ b/src/pretix/api/serializers/exporters.py @@ -133,37 +133,43 @@ class JobRunSerializer(serializers.Serializer): return not bool(self._errors) +class ExportFormDataField(serializers.Field): + def get_attribute(self, instance): + return (instance.export_identifier, instance.export_form_data) + + def to_representation(self, value): + export_identifier, export_form_data = value + exporter = self.context['exporters'].get(export_identifier) + if exporter: + return JobRunSerializer(exporter=exporter).to_representation(export_form_data) + else: + return export_form_data + + def get_value(self, dictionary): + return dictionary + + def to_internal_value(self, data): + if "export_form_data" in data: + identifier = data.get('export_identifier', self.parent.instance.export_identifier if self.parent.instance else None) + exporter = self.context['exporters'].get(identifier) + if exporter: + return JobRunSerializer(exporter=exporter).to_internal_value(data["export_form_data"]) + else: + return data['export_form_data'] + + class ScheduledExportSerializer(serializers.ModelSerializer): schedule_next_run = serializers.DateTimeField(read_only=True) export_identifier = serializers.ChoiceField(choices=[]) locale = serializers.ChoiceField(choices=settings.LANGUAGES, default='en') owner = serializers.SlugRelatedField(slug_field='email', read_only=True) error_counter = serializers.IntegerField(read_only=True) + export_form_data = ExportFormDataField() def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['export_identifier'].choices = [(e, e) for e in self.context['exporters']] - def validate(self, attrs): - if attrs.get("export_form_data"): - identifier = attrs.get('export_identifier', self.instance.export_identifier if self.instance else None) - exporter = self.context['exporters'].get(identifier) - if exporter: - try: - attrs["export_form_data"] = JobRunSerializer(exporter=exporter).to_internal_value(attrs["export_form_data"]) - except ValidationError as e: - raise ValidationError({"export_form_data": e.detail}) - else: - raise ValidationError({"export_identifier": ["Unknown exporter."]}) - return attrs - - def to_representation(self, instance): - repr = super().to_representation(instance) - exporter = self.context['exporters'].get(instance.export_identifier) - if exporter: - repr["export_form_data"] = JobRunSerializer(exporter=exporter).to_representation(repr["export_form_data"]) - return repr - def validate_mail_additional_recipients(self, value): d = value.replace(' ', '') if len(d.split(',')) > 25: diff --git a/src/pretix/api/serializers/fields.py b/src/pretix/api/serializers/fields.py index d3cc5f1b8a..d877028ab7 100644 --- a/src/pretix/api/serializers/fields.py +++ b/src/pretix/api/serializers/fields.py @@ -115,10 +115,10 @@ class PluginsField(serializers.Field): def to_representation(self, obj): from pretix.base.plugins import get_all_plugins - + active_plugins = set(obj.get_plugins()) return sorted([ p.module for p in get_all_plugins() - if not p.name.startswith('.') and getattr(p, 'visible', True) and p.module in obj.get_plugins() + if not p.name.startswith('.') and getattr(p, 'visible', True) and p.module in active_plugins ]) def to_internal_value(self, data): diff --git a/src/pretix/api/serializers/forms.py b/src/pretix/api/serializers/forms.py index 00459016c6..08ec53a5b1 100644 --- a/src/pretix/api/serializers/forms.py +++ b/src/pretix/api/serializers/forms.py @@ -45,6 +45,12 @@ class PrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField): return value return super().to_representation(value) + def to_internal_value(self, data): + value = super().to_internal_value(data) + if value is not None: + return value.pk + return value + class FormFieldWrapperField(serializers.Field): def __init__(self, *args, **kwargs): diff --git a/src/pretix/api/serializers/item.py b/src/pretix/api/serializers/item.py index a2c6258f5e..35750c02df 100644 --- a/src/pretix/api/serializers/item.py +++ b/src/pretix/api/serializers/item.py @@ -191,7 +191,7 @@ class InlineItemAddOnSerializer(serializers.ModelSerializer): class InlineItemProgramTimeSerializer(serializers.ModelSerializer): class Meta: model = ItemProgramTime - fields = ('start', 'end') + fields = ('start', 'end', 'location') class ItemBundleSerializer(serializers.ModelSerializer): @@ -222,7 +222,7 @@ class ItemBundleSerializer(serializers.ModelSerializer): class ItemProgramTimeSerializer(serializers.ModelSerializer): class Meta: model = ItemProgramTime - fields = ('id', 'start', 'end') + fields = ('id', 'start', 'end', 'location') def validate(self, data): data = super().validate(data) diff --git a/src/pretix/api/serializers/media.py b/src/pretix/api/serializers/media.py index 894c1bcf0b..cce6e86183 100644 --- a/src/pretix/api/serializers/media.py +++ b/src/pretix/api/serializers/media.py @@ -31,7 +31,9 @@ from pretix.api.serializers.order import OrderPositionSerializer from pretix.api.serializers.organizer import ( CustomerSerializer, GiftCardSerializer, ) -from pretix.base.models import Order, OrderPosition, ReusableMedium +from pretix.base.models import ( + Device, Order, OrderPosition, ReusableMedium, TeamAPIToken, +) logger = logging.getLogger(__name__) @@ -64,13 +66,14 @@ class ReusableMediaSerializer(I18nAwareModelSerializer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + expand_nested = self.context['request'].query_params.getlist('expand') - if 'linked_giftcard' in self.context['request'].query_params.getlist('expand'): + if 'linked_giftcard' in expand_nested: if not self.context["can_read_giftcards"]: raise PermissionDenied("No permission to access gift card details.") self.fields['linked_giftcard'] = NestedGiftCardSerializer(read_only=True, context=self.context) - if 'linked_giftcard.owner_ticket' in self.context['request'].query_params.getlist('expand'): + if 'linked_giftcard.owner_ticket' in expand_nested: self.fields['linked_giftcard'].fields['owner_ticket'] = NestedOrderPositionSerializer(read_only=True, context=self.context) else: self.fields['linked_giftcard'] = serializers.PrimaryKeyRelatedField( @@ -79,18 +82,27 @@ class ReusableMediaSerializer(I18nAwareModelSerializer): queryset=self.context['organizer'].issued_gift_cards.all() ) - if 'linked_orderposition' in self.context['request'].query_params.getlist('expand'): - # No additional permission check performed, documented limitation of the permission system - # Would get to complex/unusable otherwise since the permission depends on the event - self.fields['linked_orderposition'] = NestedOrderPositionSerializer(read_only=True) + # keep linked_orderposition (singular) for backwards compatibility, will be overwritten in self.validate + self.fields['linked_orderposition'] = serializers.PrimaryKeyRelatedField( + required=False, + allow_null=True, + queryset=OrderPosition.all.filter(order__event__organizer=self.context['organizer']), + ) + + if 'linked_orderposition' in expand_nested or 'linked_orderpositions' in expand_nested: + self.fields['linked_orderpositions'] = NestedOrderPositionSerializer( + many=True, + read_only=True + ) else: - self.fields['linked_orderposition'] = serializers.PrimaryKeyRelatedField( + self.fields['linked_orderpositions'] = serializers.PrimaryKeyRelatedField( + many=True, required=False, allow_null=True, queryset=OrderPosition.all.filter(order__event__organizer=self.context['organizer']), ) - if 'customer' in self.context['request'].query_params.getlist('expand'): + if 'customer' in expand_nested: if not self.context["can_read_customers"]: raise PermissionDenied("No permission to access customer details.") @@ -105,6 +117,21 @@ class ReusableMediaSerializer(I18nAwareModelSerializer): def validate(self, data): data = super().validate(data) + if 'linked_orderposition' in data: + linked_orderposition = data['linked_orderposition'] + # backwards-compatibility + if 'linked_orderpositions' in data: + raise ValidationError({ + 'linked_orderposition': 'You cannot use linked_orderposition and linked_orderpositions at the same time.' + }) + if self.instance and self.instance.linked_orderpositions.count() > 1: + raise ValidationError({ + 'linked_orderposition': 'There are more than one linked_orderposition. You need to use linked_orderpositions.' + }) + + data['linked_orderpositions'] = [linked_orderposition] if linked_orderposition else [] + del data['linked_orderposition'] + if 'type' in data and 'identifier' in data: qs = self.context['organizer'].reusable_media.filter( identifier=data['identifier'], type=data['type'] @@ -117,6 +144,41 @@ class ReusableMediaSerializer(I18nAwareModelSerializer): ) return data + def to_representation(self, instance): + r = super().to_representation(instance) + request = self.context.get('request') + + ops = r.get('linked_orderpositions', []) + # late permission evaluations for checks that depend on the actual linked events + expand_nested = self.context['request'].query_params.getlist('expand') + perm_holder = request.auth if isinstance(request.auth, (Device, TeamAPIToken)) else request.user + if ops and 'linked_orderposition' in expand_nested or 'linked_orderpositions' in expand_nested: + ops_noperm = [] + for lop in instance.linked_orderpositions.all(): + event = lop.order.event + if not perm_holder.has_event_permission(event.organizer, event, 'event.orders:read', request): + ops_noperm.append(lop.id) + if ops_noperm: + ops = [ + {'id': op['id']} if op['id'] in ops_noperm + else op + for op in ops + ] + r['linked_orderpositions'] = ops + + # add linked_orderposition (singular) for backwards compatibility + if len(ops) < 2: + r['linked_orderposition'] = ops[0] if ops else None + + if 'linked_giftcard.owner_ticket' in expand_nested: + gc = instance.linked_giftcard + if gc is not None and gc.owner_ticket is not None: + event = gc.owner_ticket.order.event + if not perm_holder.has_event_permission(event.organizer, event, 'event.orders:read', request): + r['linked_giftcard']['owner_ticket'] = {'id': instance.linked_giftcard.owner_ticket.id} + + return r + class Meta: model = ReusableMedium fields = ( @@ -126,10 +188,12 @@ class ReusableMediaSerializer(I18nAwareModelSerializer): 'updated', 'type', 'identifier', + 'claim_token', + 'label', 'active', 'expires', 'customer', - 'linked_orderposition', + 'linked_orderpositions', 'linked_giftcard', 'info', 'notes', diff --git a/src/pretix/api/serializers/order.py b/src/pretix/api/serializers/order.py index f402e7fc99..83533a73c6 100644 --- a/src/pretix/api/serializers/order.py +++ b/src/pretix/api/serializers/order.py @@ -76,7 +76,7 @@ from pretix.base.settings import ( ) from pretix.base.signals import register_ticket_outputs from pretix.helpers.countries import CachedCountries -from pretix.multidomain.urlreverse import build_absolute_uri +from pretix.multidomain.urlreverse import eventreverse_absolute logger = logging.getLogger(__name__) @@ -757,7 +757,7 @@ class PaymentURLField(serializers.URLField): def to_representation(self, instance: OrderPayment): if instance.state != OrderPayment.PAYMENT_STATE_CREATED: return None - return build_absolute_uri(instance.order.event, 'presale:event.order.pay', kwargs={ + return eventreverse_absolute(instance.order.event, 'presale:event.order.pay', kwargs={ 'order': instance.order.code, 'secret': instance.order.secret, 'payment': instance.pk, @@ -806,7 +806,7 @@ class OrderRefundSerializer(I18nAwareModelSerializer): class OrderURLField(serializers.URLField): def to_representation(self, instance: Order): - return build_absolute_uri(instance.event, 'presale:event.order', kwargs={ + return eventreverse_absolute(instance.event, 'presale:event.order', kwargs={ 'order': instance.code, 'secret': instance.secret, }) @@ -1149,6 +1149,7 @@ class OrderPositionCreateSerializer(I18nAwareModelSerializer): raise ValidationError( {'discount': ['You can only specify a discount if you do the price computation, but price is not set.']} ) + return data @@ -1416,6 +1417,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer): qa = QuotaAvailability() qa.queue(*[q for q, d in quota_diff_for_locking.items() if d > 0]) qa.compute() + v_avail = {} # These are not technically correct as diff use due to the time offset applied above, so let's prevent accidental # use further down @@ -1445,11 +1447,13 @@ class OrderCreateSerializer(I18nAwareModelSerializer): voucher_usage[v] += 1 if voucher_usage[v] > 0: - redeemed_in_carts = CartPosition.objects.filter( - Q(voucher=pos_data['voucher']) & Q(event=self.context['event']) & Q(expires__gte=now_dt) - ).exclude(pk__in=[cp.pk for cp in delete_cps]) - v_avail = v.max_usages - v.redeemed - redeemed_in_carts.count() - if v_avail < voucher_usage[v]: + if v not in v_avail: + v.refresh_from_db(fields=['redeemed']) + redeemed_in_carts = CartPosition.objects.filter( + Q(voucher=v) & Q(event=self.context['event']) & Q(expires__gte=now_dt) + ).exclude(pk__in=[cp.pk for cp in delete_cps]) + v_avail[v] = v.max_usages - v.redeemed - redeemed_in_carts.count() + if v_avail[v] < voucher_usage[v]: errs[i]['voucher'] = [ 'The voucher has already been used the maximum number of times.' ] @@ -1585,7 +1589,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer): pos_data['attendee_name_parts'] = { '_legacy': attendee_name } - pos = OrderPosition(**{k: v for k, v in pos_data.items() if k != 'answers' and k != '_quotas' and k != 'use_reusable_medium'}) + pos = OrderPosition(**{k: v for k, v in pos_data.items() if k not in ('answers', '_quotas', 'use_reusable_medium')}) if simulate: pos.order = order._wrapped else: @@ -1700,15 +1704,25 @@ class OrderCreateSerializer(I18nAwareModelSerializer): answ.options.add(*options) if use_reusable_medium: - use_reusable_medium.linked_orderposition = pos - use_reusable_medium.save(update_fields=['linked_orderposition']) + if pos.item.media_policy not in (Item.MEDIA_POLICY_APPEND, Item.MEDIA_POLICY_APPEND_OR_NEW): + for op_pk in use_reusable_medium.linked_orderpositions.values_list('pk', flat=True): + use_reusable_medium.log_action( + 'pretix.reusable_medium.linked_orderposition.removed', + data={ + 'linked_orderposition': op_pk, + } + ) + use_reusable_medium.linked_orderpositions.set([pos]) + else: + use_reusable_medium.linked_orderpositions.add(pos) use_reusable_medium.log_action( - 'pretix.reusable_medium.linked_orderposition.changed', + 'pretix.reusable_medium.linked_orderposition.added', data={ 'by_order': order.code, 'linked_orderposition': pos.pk, } ) + use_reusable_medium.touch() if not simulate: for cp in delete_cps: diff --git a/src/pretix/api/serializers/organizer.py b/src/pretix/api/serializers/organizer.py index 05f25976a8..754dc2d657 100644 --- a/src/pretix/api/serializers/organizer.py +++ b/src/pretix/api/serializers/organizer.py @@ -58,8 +58,8 @@ from pretix.helpers.permission_migration import ( OLD_TO_NEW_EVENT_COMPAT, OLD_TO_NEW_EVENT_MIGRATION, OLD_TO_NEW_ORGANIZER_COMPAT, OLD_TO_NEW_ORGANIZER_MIGRATION, ) -from pretix.helpers.urls import build_absolute_uri as build_global_uri -from pretix.multidomain.urlreverse import build_absolute_uri +from pretix.helpers.urls import mainreverse_absolute +from pretix.multidomain.urlreverse import eventreverse_absolute logger = logging.getLogger(__name__) @@ -71,7 +71,7 @@ class OrganizerSerializer(I18nAwareModelSerializer): slug = serializers.CharField(read_only=True) def get_organizer_url(self, organizer): - return build_absolute_uri(organizer, 'presale:organizer.index') + return eventreverse_absolute(organizer, 'presale:organizer.index') class Meta: model = Organizer @@ -286,6 +286,19 @@ class GiftCardSerializer(I18nAwareModelSerializer): ) return data + def to_representation(self, instance): + r = super().to_representation(instance) + request = self.context.get('request') + # late permission evaluations for checks that depend on the actual linked events + if 'owner_ticket' in self.context['request'].query_params.getlist('expand'): + owner_ticket = instance.owner_ticket + if owner_ticket: + event = owner_ticket.order.event + perm_holder = request.auth if isinstance(request.auth, (Device, TeamAPIToken)) else request.user + if not perm_holder.has_event_permission(event.organizer, event, 'event.orders:read', request): + r['owner_ticket'] = {'id': instance.owner_ticket.id} + return r + class Meta: model = GiftCard fields = ('id', 'secret', 'issuance', 'value', 'currency', 'testmode', 'expires', 'conditions', 'owner_ticket', @@ -486,7 +499,7 @@ class TeamInviteSerializer(serializers.ModelSerializer): 'user': self, 'organizer': self.context['organizer'].name, 'team': instance.team.name, - 'url': build_global_uri('control:auth.invite', kwargs={ + 'url': mainreverse_absolute('control:auth.invite', kwargs={ 'token': instance.token }) }, @@ -592,6 +605,7 @@ class OrganizerSettingsSerializer(SettingsSerializer): 'cookie_consent_dialog_button_yes', 'cookie_consent_dialog_button_no', 'reusable_media_active', + 'reusable_media_usage_enforced', 'reusable_media_type_barcode', 'reusable_media_type_barcode_identifier_length', 'reusable_media_type_nfc_uid', diff --git a/src/pretix/api/views/checkin.py b/src/pretix/api/views/checkin.py index c6567a4d5c..7bafddd3a3 100644 --- a/src/pretix/api/views/checkin.py +++ b/src/pretix/api/views/checkin.py @@ -69,8 +69,10 @@ from pretix.base.models import ( from pretix.base.models.orders import PrintLog from pretix.base.permissions import AnyPermissionOf from pretix.base.services.checkin import ( - CheckInError, RequiredQuestionsError, SQLLogic, perform_checkin, + CheckInError, RequiredMediaExchangeError, RequiredQuestionsError, SQLLogic, + perform_checkin, ) +from pretix.base.services.media import perform_media_exchange from pretix.base.signals import checkin_annulled from pretix.helpers import OF_SELF @@ -454,7 +456,8 @@ def _checkin_list_position_queryset(checkinlists, ignore_status=False, ignore_pr def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force, checkin_type, ignore_unpaid, nonce, untrusted_input, user, auth, expand, pdf_data, request, questions_supported, canceled_supported, - source_type='barcode', legacy_url_support=False, simulate=False, gate=None, use_order_locale=False): + source_type='barcode', legacy_url_support=False, simulate=False, gate=None, use_order_locale=False, + exchange_medium_type=None, exchange_medium_identifier=None): if not checkinlists: raise ValidationError('No check-in list passed.') @@ -463,6 +466,7 @@ def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force, device = auth if isinstance(auth, Device) else None gate = gate or (auth.gate if isinstance(auth, Device) else None) + medium = None context = { 'request': request, @@ -491,6 +495,7 @@ def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force, ) raw_barcode_for_checkin = None from_revoked_secret = False + reusable_medium_used = None if simulate: common_checkin_args['__fake_arg_to_prevent_this_from_being_saved'] = True @@ -521,11 +526,12 @@ def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force, # with respecting the force option), or it's a reusable medium (-> proceed with that) if not op_candidates: try: - media = ReusableMedium.objects.select_related('linked_orderposition').active().get( + medium = ReusableMedium.objects.active().filter( + Exists(ReusableMedium.linked_orderpositions.through.objects.filter(reusablemedium_id=OuterRef('pk'))) + ).get( organizer_id=checkinlists[0].event.organizer_id, type=source_type, identifier=raw_barcode, - linked_orderposition__isnull=False, ) raw_barcode_for_checkin = raw_barcode except ReusableMedium.DoesNotExist: @@ -628,7 +634,9 @@ def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force, 'list': MiniCheckinListSerializer(list_by_event[revoked_matches[0].event_id]).data, }, status=400) else: - if media.linked_orderposition.order.event_id not in list_by_event: + linked_ops = medium.linked_orderpositions.all().select_related("order").prefetch_related("addons") + linked_event_ids = {op.order.event_id for op in linked_ops} + if not any(event_id in list_by_event for event_id in linked_event_ids): # Medium exists but connected ticket is for the wrong event if not simulate: checkinlists[0].event.log_action('pretix.event.checkin.unknown', data={ @@ -654,28 +662,91 @@ def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force, 'checkin_texts': [], 'list': MiniCheckinListSerializer(checkinlists[0]).data, }, status=404) - op_candidates = [media.linked_orderposition] - if list_by_event[media.linked_orderposition.order.event_id].addon_match: - op_candidates += list(media.linked_orderposition.addons.all()) + op_candidates = [] + for op in linked_ops: + if op.order.event_id in list_by_event: + reusable_medium_used = medium + op_candidates.append(op) + if list_by_event[op.order.event_id].addon_match: + op_candidates += list(op.addons.all()) # 3. Handle the "multiple options found" case: Except for the unlikely case of a secret being also a valid primary - # key on the same list, we're probably dealing with the ``addon_match`` case here and need to figure out - # which add-on has the right product. + # key on the same list, we're probably dealing with multiple linked_orderpositions or the ``addon_match`` case + # here and need to figure out which op has the right product. This basically is a valid-for-checkin-test on every op. if len(op_candidates) > 1: - op_candidates_matching_product = [ - op for op in op_candidates - if ( - (list_by_event[op.order.event_id].addon_match or op.secret == raw_barcode or legacy_url_support) and - (list_by_event[op.order.event_id].all_products or op.item_id in {i.pk for i in list_by_event[op.order.event_id].limit_products.all()}) - ) - ] - if len(op_candidates_matching_product) == 0: - # None of the found add-ons has the correct product, too bad! We could just error out here, but + if not reusable_medium_used: + # 3a. First, we clean up that we made an imprecise query above. If a scan is made for multiple check-in lists, + # we have queried ``addon_to__secret=raw_barcode``, even if some of the lists in question do not allow addon + # matching. So we accept all candidates that match one of these cases: + # - Exactly the ticket secret we scanned (because that's always a possible result) + # - Exactly the ticket pk we scanned (on legacy endpoints) + # - An add-on on a list that allows add-on matching + # This is not necessary when a reusable media was used, since in that case we already obeyed list.addon_match + # correctly above. + op_candidates_filtered = [ + op for op in op_candidates + if ( + op.secret == raw_barcode or + list_by_event[op.order.event_id].addon_match or + (str(op.pk) == raw_barcode and legacy_url_support and not untrusted_input) + ) + ] + else: + op_candidates_filtered = op_candidates + + if len(op_candidates_filtered) > 1: + # 3b. If we still have multiple candidates, we filter by product based on the check-in list configuration. + # This is relevant for the addon_match scenario where the scanned ticket has multiple add-ons, but only + # one is contained in the check-in list used to scan. It makes sense to filter this first, since it is a + # "static" check, i.e. scanning the same QR code on the same check-in list will always do the same, no matter + # when I scan it, and it is "intentional" filtering in the sense that the admin configured this behaviour + # into the check-in list. + op_candidates_filtered = [ + op for op in op_candidates_filtered + if list_by_event[op.order.event_id].all_products or op.item_id in {i.pk for i in list_by_event[op.order.event_id].limit_products.all()} + ] + + if len(op_candidates_filtered) > 1: + # 3c. If we still have multiple candidates, we filter by validity date. This was introduced for the case where + # a reusable media refers to two tickets, one currently valid and one expired or in the future. Howeer, + # it could in theory also happen with two add-ons being on the same check-in list but without overlapping + # validity. It makes sense to filter this "after" the previous checks since it is not "intentional" filtering + # configured by the admin but "accidental" filtering that depends on the time of execution. + op_candidates_filtered = [ + op for op in op_candidates_filtered + if ( + (not op.valid_from or op.valid_from <= datetime) and + (not op.valid_until or op.valid_until > datetime) + ) + ] + + if len(op_candidates_filtered) == 0: + # None of the ops is valid today or has the correct product, too bad! We could just error out here, but # instead we just continue with *any* product and have it rejected by the check in perform_checkin. - # This has the advantage of a better error message. - op_candidates = [op_candidates[0]] - elif len(op_candidates_matching_product) > 1: + # To improve the error message, we select the op that will "work next" or - if none matches - "worked last". + op_candidate = None + for op in op_candidates: + if ( + op.valid_from and op.valid_from > datetime and + (not op_candidate or op.valid_from < op_candidate.valid_from) + ): + op_candidate = op + + if not op_candidate: + # no candidate in the future, get closest in the past + for op in op_candidates: + if ( + op.valid_until and op.valid_until < datetime and + (not op_candidate or op.valid_until > op_candidate.valid_until) + ): + op_candidate = op + + if not op_candidate: + op_candidate = op_candidates[0] + + op_candidates = [op_candidate] + elif len(op_candidates_filtered) > 1: # It's still ambiguous, we'll error out. # We choose the first match (regardless of product) for the logging since it's most likely to be the # base product according to our order_by above. @@ -709,7 +780,7 @@ def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force, 'list': MiniCheckinListSerializer(list_by_event[op.order.event_id]).data, }, status=400) else: - op_candidates = op_candidates_matching_product + op_candidates = op_candidates_filtered op = op_candidates[0] common_checkin_args['list'] = list_by_event[op.order.event_id] @@ -721,7 +792,10 @@ def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force, if str(q.pk) in answers_data: try: if q.type == Question.TYPE_FILE: - given_answers[q] = _handle_file_upload(answers_data[str(q.pk)], user, auth) + if answers_data[str(q.pk)]: + given_answers[q] = _handle_file_upload(answers_data[str(q.pk)], user, auth) + else: + given_answers[q] = None else: given_answers[q] = q.clean_answer(answers_data[str(q.pk)]) except (ValidationError, BaseValidationError): @@ -734,7 +808,14 @@ def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force, locale = op.order.event.settings.locale with language(locale): try: - perform_checkin( + if exchange_medium_identifier and medium: + # Cannot scan a medium and then request to exchange it + raise CheckInError( + gettext('You cannot exchange a medium for a medium.'), + 'error' + ) + + checkin_args = dict( op=op, clist=list_by_event[op.order.event_id], given_answers=given_answers, @@ -752,7 +833,25 @@ def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force, from_revoked_secret=from_revoked_secret, simulate=simulate, gate=gate, + reusable_medium=medium, ) + + if exchange_medium_identifier: # other fields are filled, see CheckinRPCRedeemInputSerializer.validate + with transaction.atomic(): + # Do exchange and check-in atomically, i.e. both succeed or both fail + medium = perform_media_exchange( + organizer=request.organizer, + media_type=exchange_medium_type, + identifier=exchange_medium_identifier, + link_orderposition=op, + user=user, + auth=auth, + ) + source_type = medium.media_type.identifier + checkin_args['reusable_medium'] = medium + perform_checkin(**checkin_args) + else: + perform_checkin(**checkin_args) except RequiredQuestionsError as e: return Response({ 'status': 'incomplete', @@ -764,6 +863,18 @@ def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force, ], 'list': MiniCheckinListSerializer(list_by_event[op.order.event_id]).data, }, status=400) + except RequiredMediaExchangeError as e: + return Response({ + 'status': 'exchange', + 'require_attention': op.require_checkin_attention, + 'checkin_texts': op.checkin_texts, + 'position': CheckinListOrderPositionSerializer(op, context=_make_context(context, op.order.event)).data, + 'media_policy': e.media_policy, + 'media_type': e.media_type, + 'list': MiniCheckinListSerializer(list_by_event[op.order.event_id]).data, + 'reason': e.code, + 'reason_explanation': e.msg, + }, status=400) except CheckInError as e: if not simulate: op.order.log_action('pretix.event.checkin.denied', data={ @@ -951,6 +1062,8 @@ class CheckinRPCRedeemView(views.APIView): canceled_supported=True, request=self.request, # this is not clean, but we need it in the serializers for URL generation legacy_url_support=False, + exchange_medium_type=s.validated_data.get('exchange_medium_type'), + exchange_medium_identifier=s.validated_data.get('exchange_medium_identifier'), ) diff --git a/src/pretix/api/views/media.py b/src/pretix/api/views/media.py index 7b3be781f6..5c20079303 100644 --- a/src/pretix/api/views/media.py +++ b/src/pretix/api/views/media.py @@ -53,10 +53,12 @@ with scopes_disabled(): customer = django_filters.CharFilter(field_name='customer__identifier') updated_since = django_filters.IsoDateTimeFilter(field_name='updated', lookup_expr='gte') created_since = django_filters.IsoDateTimeFilter(field_name='created', lookup_expr='gte') + # backwards-compatible + linked_orderposition = django_filters.NumberFilter(field_name='linked_orderpositions__id') class Meta: model = ReusableMedium - fields = ['identifier', 'type', 'active', 'customer', 'linked_orderposition', 'linked_giftcard'] + fields = ['identifier', 'type', 'active', 'customer', 'linked_orderpositions', 'linked_giftcard'] class ReusableMediaViewSet(viewsets.ModelViewSet): @@ -75,7 +77,7 @@ class ReusableMediaViewSet(viewsets.ModelViewSet): ).order_by().values('card').annotate(s=Sum('value')).values('s') return self.request.organizer.reusable_media.prefetch_related( Prefetch( - 'linked_orderposition', + 'linked_orderpositions', queryset=OrderPosition.objects.select_related( 'order', 'order__event', 'order__event__organizer', 'seat', ).prefetch_related( @@ -117,14 +119,38 @@ class ReusableMediaViewSet(viewsets.ModelViewSet): @transaction.atomic() def perform_update(self, serializer): - ReusableMedium.objects.select_for_update(of=OF_SELF).get(pk=self.get_object().pk) + rm = ReusableMedium.objects.select_for_update(of=OF_SELF).get(pk=self.get_object().pk) + prev_linked_ops_pks = list(rm.linked_orderpositions.values_list("pk", flat=True)) inst = serializer.save(identifier=serializer.instance.identifier, type=serializer.instance.type) - inst.log_action( - 'pretix.reusable_medium.changed', - user=self.request.user, - auth=self.request.auth, - data=self.request.data, - ) + linked_ops_pks = inst.linked_orderpositions.values_list("pk", flat=True) + for op_pk in prev_linked_ops_pks: + if op_pk not in linked_ops_pks: + inst.log_action( + 'pretix.reusable_medium.linked_orderposition.removed', + user=self.request.user, + auth=self.request.auth, + data={ + 'linked_orderposition': op_pk, + } + ) + for op_pk in linked_ops_pks: + if op_pk not in prev_linked_ops_pks: + inst.log_action( + 'pretix.reusable_medium.linked_orderposition.added', + user=self.request.user, + auth=self.request.auth, + data={ + 'linked_orderposition': op_pk, + } + ) + data = {k: v for k, v in self.request.data.items() if k not in ('linked_orderposition', 'linked_orderpositions')} + if data: + inst.log_action( + 'pretix.reusable_medium.changed', + user=self.request.user, + auth=self.request.auth, + data=data, + ) return inst def perform_destroy(self, instance): @@ -157,7 +183,6 @@ class ReusableMediaViewSet(viewsets.ModelViewSet): type=s.validated_data["type"], identifier=s.validated_data["identifier"], ) - m.linked_orderposition = None # not relevant for cross-organizer m.customer = None # not relevant for cross-organizer s = self.get_serializer(m) return Response({"result": s.data}) @@ -171,7 +196,7 @@ class ReusableMediaViewSet(viewsets.ModelViewSet): return Response({"result": None}) - @scopes_disabled() # we are sure enough that get_queryset() is correct, so we save some perforamnce + @scopes_disabled() # we are sure enough that get_queryset() is correct, so we save some performance def list(self, request, **kwargs): date = serializers.DateTimeField().to_representation(now()) queryset = self.filter_queryset(self.get_queryset()) diff --git a/src/pretix/api/views/order.py b/src/pretix/api/views/order.py index 850ff06615..31a81ed0bb 100644 --- a/src/pretix/api/views/order.py +++ b/src/pretix/api/views/order.py @@ -194,7 +194,7 @@ with scopes_disabled(): ) ).values('id') - matching_media = ReusableMedium.objects.filter(identifier=u).values_list('linked_orderposition__order_id', flat=True) + matching_media = ReusableMedium.objects.filter(identifier=u).values_list('linked_orderpositions__order_id', flat=True) mainq = ( code @@ -1034,7 +1034,7 @@ with scopes_disabled(): search = django_filters.CharFilter(method='search_qs') def search_qs(self, queryset, name, value): - matching_media = ReusableMedium.objects.filter(identifier=value).values_list('linked_orderposition', flat=True) + matching_media = ReusableMedium.objects.filter(identifier=value).values_list('linked_orderpositions', flat=True) return queryset.filter( Q(secret__istartswith=value) | Q(attendee_name_cached__icontains=value) diff --git a/src/pretix/api/webhooks.py b/src/pretix/api/webhooks.py index 39a5a613bd..680807294c 100644 --- a/src/pretix/api/webhooks.py +++ b/src/pretix/api/webhooks.py @@ -408,6 +408,12 @@ def register_default_webhook_events(sender, **kwargs): _('This includes product added or deleted and changes to nested objects like ' 'variations or bundles.'), ), + ParametrizedItemWebhookEvent( + 'pretix.event.quota.*', + _('Quota changed'), + _('This includes related events like creation, deletion, opening or closing of quotas. ' + 'No webhook is sent for changes to the resulting availability.'), + ), ParametrizedEventWebhookEvent( 'pretix.event.live.activated', _('Shop taken live'), diff --git a/src/pretix/base/customersso/oidc.py b/src/pretix/base/customersso/oidc.py index 638f0be2a3..0e2d6e417e 100644 --- a/src/pretix/base/customersso/oidc.py +++ b/src/pretix/base/customersso/oidc.py @@ -36,7 +36,7 @@ from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from requests import RequestException -from pretix.multidomain.urlreverse import build_absolute_uri +from pretix.multidomain.urlreverse import eventreverse_absolute logger = logging.getLogger(__name__) @@ -313,7 +313,7 @@ def _get_or_create_server_keypair(organizer): def generate_id_token(customer, client, auth_time, nonce, scope, expires: datetime, scope_claims=False, with_code=None, with_access_token=None): payload = { - 'iss': build_absolute_uri(client.organizer, 'presale:organizer.index').rstrip('/'), + 'iss': eventreverse_absolute(client.organizer, 'presale:organizer.index').rstrip('/'), 'aud': client.client_id, 'exp': int(expires.timestamp()), 'iat': int(time.time()), diff --git a/src/pretix/base/datasync/sourcefields.py b/src/pretix/base/datasync/sourcefields.py index 156145cb8d..426604d66e 100644 --- a/src/pretix/base/datasync/sourcefields.py +++ b/src/pretix/base/datasync/sourcefields.py @@ -28,7 +28,7 @@ from django.utils.translation import gettext_lazy as _, pgettext_lazy from pretix.base.models import Checkin, InvoiceAddress, Order, Question from pretix.base.settings import PERSON_NAME_SCHEMES -from pretix.multidomain.urlreverse import build_absolute_uri +from pretix.multidomain.urlreverse import eventreverse_absolute def get_answer(op, question_identifier=None): @@ -545,7 +545,7 @@ def get_data_fields(event, for_model=None): _("Order link"), Question.TYPE_STRING, None, - lambda order: build_absolute_uri( + lambda order: eventreverse_absolute( event, 'presale:event.order', kwargs={ 'order': order.code, @@ -560,7 +560,7 @@ def get_data_fields(event, for_model=None): _("Ticket link"), Question.TYPE_STRING, None, - lambda op: build_absolute_uri( + lambda op: eventreverse_absolute( event, 'presale:event.order.position', kwargs={ 'order': op.order.code, diff --git a/src/pretix/base/email.py b/src/pretix/base/email.py index b6a61e8a97..db3ee6299a 100644 --- a/src/pretix/base/email.py +++ b/src/pretix/base/email.py @@ -57,6 +57,8 @@ logger = logging.getLogger('pretix.base.email') T = TypeVar("T", bound=EmailBackend) +_cgnat_net = ipaddress.ip_network('100.64.0.0/10') + def test_custom_smtp_backend(backend: T, from_addr: str) -> None: try: @@ -253,12 +255,15 @@ def create_connection(address, timeout=socket.getdefaulttimeout(), if not getattr(settings, "MAIL_CUSTOM_SMTP_ALLOW_PRIVATE_NETWORKS", False): ip_addr = ipaddress.ip_address(sa[0]) + check_ip4 = ip_addr.ipv4_mapped if getattr(ip_addr, "ipv4_mapped", None) else ip_addr if ip_addr.is_multicast: raise socket.error(f"Request to multicast address {sa[0]} blocked") if ip_addr.is_loopback or ip_addr.is_link_local: raise socket.error(f"Request to local address {sa[0]} blocked") if ip_addr.is_private: raise socket.error(f"Request to private address {sa[0]} blocked") + if check_ip4 in _cgnat_net: + raise socket.error(f"Request to RFC 6598 address {sa[0]} blocked") sock = None try: diff --git a/src/pretix/base/exporters/orderlist.py b/src/pretix/base/exporters/orderlist.py index e05935898f..bf96145ec4 100644 --- a/src/pretix/base/exporters/orderlist.py +++ b/src/pretix/base/exporters/orderlist.py @@ -68,7 +68,7 @@ from ...control.forms.filter import get_all_payment_providers from ...helpers import GroupConcat from ...helpers.iter import chunked_iterable from ...helpers.safe_openpyxl import remove_invalid_excel_chars -from ...multidomain.urlreverse import build_absolute_uri +from ...multidomain.urlreverse import eventreverse_absolute from ..exporter import ( ListExporter, MultiSheetListExporter, OrganizerLevelExportMixin, ) @@ -160,7 +160,7 @@ class OrderListExporter(MultiSheetListExporter): def _get_all_payment_methods(self, qs): pps = dict(get_all_payment_providers()) - return sorted([(pp, pps[pp]) for pp in set( + return sorted([(pp, pps.get(pp, pp)) for pp in set( OrderPayment.objects.exclude(provider='free').filter(order__event__in=self.events).values_list( 'provider', flat=True ).distinct() @@ -330,6 +330,7 @@ class OrderListExporter(MultiSheetListExporter): taxsum=Sum('tax_value'), grosssum=Sum('value') ) } + payment_methods = None if form_data.get('include_payment_amounts'): payment_sum_cache = { (o['order__id'], o['provider']): o['grosssum'] for o in @@ -347,6 +348,7 @@ class OrderListExporter(MultiSheetListExporter): grosssum=Sum('amount') ) } + payment_methods = self._get_all_payment_methods(qs) sum_cache = { (o['order__id'], o['tax_rate']): o for o in OrderPosition.objects.values('tax_rate', 'order__id').order_by().annotate( @@ -427,14 +429,13 @@ class OrderListExporter(MultiSheetListExporter): ])) row.append( - build_absolute_uri(order.event, 'presale:event.order', kwargs={ + eventreverse_absolute(order.event, 'presale:event.order', kwargs={ 'order': order.code, 'secret': order.secret, }) ) if form_data.get('include_payment_amounts'): - payment_methods = self._get_all_payment_methods(qs) for id, vn in payment_methods: row.append( payment_sum_cache.get((order.id, id), Decimal('0.00')) - @@ -854,7 +855,7 @@ class OrderListExporter(MultiSheetListExporter): ])) row.append( - build_absolute_uri(order.event, 'presale:event.order.position', kwargs={ + eventreverse_absolute(order.event, 'presale:event.order.position', kwargs={ 'order': order.code, 'secret': op.web_secret, 'position': op.positionid @@ -1103,13 +1104,25 @@ class PaymentListExporter(ListExporter): def iterate_list(self, form_data): provider_names = dict(get_all_payment_providers()) + i_numbers = Invoice.objects.filter( + order=OuterRef('order_id'), + ).values('order').annotate( + m=GroupConcat('full_invoice_no', delimiter=', ') + ).values( + 'm' + ).order_by() + payments = OrderPayment.objects.filter( order__event__in=self.events, state__in=form_data.get('payment_states', []) + ).annotate( + order_invoice_numbers=Subquery(i_numbers, output_field=CharField()), ).select_related('order').prefetch_related('order__event').order_by('created') refunds = OrderRefund.objects.filter( order__event__in=self.events, state__in=form_data.get('refund_states', []) + ).annotate( + order_invoice_numbers=Subquery(i_numbers, output_field=CharField()), ).select_related('order').prefetch_related('order__event').order_by('created') if form_data.get('end_date_range'): @@ -1135,6 +1148,7 @@ class PaymentListExporter(ListExporter): headers = [ _('Event slug'), _('Order'), _('Payment ID'), _('Creation date'), _('Completion date'), _('Status'), _('Status code'), _('Amount'), _('Payment method'), _('Comment'), _('Matching ID'), _('Payment details'), + _('Invoice numbers'), ] yield headers @@ -1172,6 +1186,7 @@ class PaymentListExporter(ListExporter): obj.comment if isinstance(obj, OrderRefund) else "", matching_id, payment_details, + obj.order_invoice_numbers, ] yield row diff --git a/src/pretix/base/exporters/reusablemedia.py b/src/pretix/base/exporters/reusablemedia.py index fbc6005908..207d62306e 100644 --- a/src/pretix/base/exporters/reusablemedia.py +++ b/src/pretix/base/exporters/reusablemedia.py @@ -20,12 +20,13 @@ # . # +from django.db.models import Prefetch from django.dispatch import receiver from django.utils.formats import date_format from django.utils.translation import gettext_lazy as _, pgettext, pgettext_lazy from ..exporter import ListExporter, OrganizerLevelExportMixin -from ..models import ReusableMedium +from ..models import OrderPosition, ReusableMedium from ..signals import register_multievent_data_exporters @@ -44,7 +45,9 @@ class ReusableMediaExporter(OrganizerLevelExportMixin, ListExporter): media = ReusableMedium.objects.filter( organizer=self.organizer, ).select_related( - 'customer', 'linked_orderposition', 'linked_giftcard', + 'customer', 'linked_giftcard', + ).prefetch_related( + Prefetch('linked_orderpositions', queryset=OrderPosition.objects.select_related("order")) ).order_by('created') headers = [ @@ -61,18 +64,23 @@ class ReusableMediaExporter(OrganizerLevelExportMixin, ListExporter): yield headers yield self.ProgressSetTotal(total=media.count()) + can_read_giftcards = self.permission_holder.has_organizer_permission(self.organizer, 'organizer.giftcards:read') + for medium in media.iterator(chunk_size=1000): - row = [ + giftcard_secret = medium.linked_giftcard.secret if medium.linked_giftcard_id else '' + if giftcard_secret and not can_read_giftcards: + giftcard_secret = giftcard_secret[:3] + "…" + + yield [ medium.type, medium.identifier, _('Yes') if medium.active else _('No'), date_format(medium.expires, 'SHORT_DATETIME_FORMAT') if medium.expires else '', medium.customer.identifier if medium.customer_id else '', - f"{medium.linked_orderposition.order.code}-{medium.linked_orderposition.positionid}" if medium.linked_orderposition_id else '', - medium.linked_giftcard.secret if medium.linked_giftcard_id else '', + ', '.join([f"{op.order.code}-{op.positionid}" for op in medium.linked_orderpositions.all()]), + giftcard_secret, medium.notes, ] - yield row def get_filename(self): return f'{self.organizer.slug}_media' diff --git a/src/pretix/base/forms/questions.py b/src/pretix/base/forms/questions.py index 0dec88e90c..d390dfc04d 100644 --- a/src/pretix/base/forms/questions.py +++ b/src/pretix/base/forms/questions.py @@ -35,6 +35,7 @@ import copy import json import logging +import re from datetime import timedelta from decimal import Decimal from io import BytesIO @@ -47,9 +48,7 @@ from django.conf import settings from django.contrib import messages from django.core.exceptions import ValidationError from django.core.files.uploadedfile import SimpleUploadedFile -from django.core.validators import ( - MaxValueValidator, MinValueValidator, RegexValidator, -) +from django.core.validators import MaxValueValidator, MinValueValidator from django.db.models import QuerySet from django.forms import Select, widgets from django.forms.widgets import FILE_INPUT_CONTRADICTION @@ -90,7 +89,7 @@ from pretix.base.settings import ( COUNTRIES_WITH_STATE_IN_ADDRESS, COUNTRY_STATE_LABEL, PERSON_NAME_SALUTATIONS, PERSON_NAME_SCHEMES, PERSON_NAME_TITLE_GROUPS, ) -from pretix.base.templatetags.rich_text import rich_text +from pretix.base.templatetags.rich_text import URL_RE, rich_text from pretix.base.timemachine import time_machine_now from pretix.control.forms import ( ExtFileField, ExtValidationMixin, SizeValidationMixin, SplitDateTimeField, @@ -220,16 +219,8 @@ class NamePartsFormField(forms.MultiValueField): defaults = { 'widget': self.widget, 'max_length': kwargs.pop('max_length', None), - 'validators': [ - RegexValidator( - # The following characters should never appear in a name anywhere of - # the world. However, they commonly appear in inputs generated by spam - # bots. - r'^[^$€/%§{}<>~]*$', - message=_('Please do not use special characters in names.') - ) - ] } + self.max_length = defaults['max_length'] self.scheme_name = kwargs.pop('scheme') self.titles = kwargs.pop('titles') self.scheme = PERSON_NAME_SCHEMES.get(self.scheme_name) @@ -249,7 +240,6 @@ class NamePartsFormField(forms.MultiValueField): if fname == 'title' and self.scheme_titles: d = dict(defaults) d.pop('max_length', None) - d.pop('validators', None) field = forms.ChoiceField( **d, choices=[('', '')] + [(d, d) for d in self.scheme_titles[1]] @@ -258,7 +248,6 @@ class NamePartsFormField(forms.MultiValueField): elif fname == 'salutation': d = dict(defaults) d.pop('max_length', None) - d.pop('validators', None) field = forms.ChoiceField( **d, choices=[ @@ -287,9 +276,40 @@ class NamePartsFormField(forms.MultiValueField): if self.require_all_fields and not all(v for v in value): raise forms.ValidationError(self.error_messages['incomplete'], code='required') - if sum(len(v) for v in value.values() if v) > 250: + if sum(len(v) for v in value.values() if v) > (self.max_length or 250): raise forms.ValidationError(_('Please enter a shorter name.'), code='max_length') + for fname, label, size in self.scheme['fields']: + if fname == 'salutation' or (fname == 'title' and self.scheme_titles): + continue + v = value.get(fname) + if not v: + continue + special_chars = re.findall('[$€/%§{}<>~]', v) + if special_chars: + raise forms.ValidationError( + _('The field "%(label)s" may not contain special characters such as "%(chars)s".'), + code='name_special_chars', + params={ + "label": label, + "chars": "".join(special_chars), + }, + ) + # URL_RE checks for valid domain names, including one special TLD med, which can be part of a title + if ".med" in v: + v = v.replace(".med", ". med") + value[fname] = v + url_matched = URL_RE.search(v) + if url_matched: + raise forms.ValidationError( + _('The field "%(label)s" may not contain an URL (%(url)s).'), + code='url_in_title', + params={ + "label": label, + "url": url_matched.group(0), + } + ) + if value.get("salutation") == "empty": value["salutation"] = "" @@ -1378,7 +1398,7 @@ class BaseInvoiceAddressForm(forms.ModelForm): elif self.validate_vat_id and vat_id_applicable: try: normalized_id = validate_vat_id(data.get('vat_id'), str(data.get('country'))) - self.instance.vat_id_validated = True + self.instance.vat_id_validated = bool(normalized_id) self.instance.vat_id = data['vat_id'] = normalized_id except VATIDFinalError as e: if self.all_optional: diff --git a/src/pretix/base/invoicing/pdf.py b/src/pretix/base/invoicing/pdf.py index 21765a629e..ca464cb508 100644 --- a/src/pretix/base/invoicing/pdf.py +++ b/src/pretix/base/invoicing/pdf.py @@ -22,9 +22,7 @@ import datetime import logging import math -import re import textwrap -import unicodedata from collections import defaultdict from decimal import Decimal from io import BytesIO @@ -58,8 +56,8 @@ from pretix.base.services.currencies import SOURCE_NAMES from pretix.base.signals import register_invoice_renderers from pretix.base.templatetags.money import money_filter from pretix.helpers.reportlab import ( - FontFallbackParagraph, ThumbnailingImageReader, register_ttf_font_if_new, - reshaper, + FontFallbackParagraph, PlainTextParagraph, ThumbnailingImageReader, + normalize_text, register_ttf_font_if_new, reshaper, ) from pretix.presale.style import get_fonts @@ -259,18 +257,8 @@ class BaseReportlabInvoiceRenderer(BaseInvoiceRenderer): register_ttf_font_if_new(family + ' B I', finders.find(styles['bolditalic']['truetype'])) def _normalize(self, text): - # reportlab does not support unicode combination characters - # It's important we do this before we use ArabicReshaper - text = unicodedata.normalize("NFKC", text) - - # reportlab does not support RTL, ligature-heavy scripts like Arabic. Therefore, we use ArabicReshaper - # to resolve all ligatures and python-bidi to switch RTL texts. - try: - text = "
".join(get_display(reshaper.reshape(l)) for l in re.split("
", text)) - except: - logger.exception('Reshaping/Bidi fixes failed on string {}'.format(repr(text))) - - return text + # alias kept for plugin compatibility + return normalize_text(text) def _upper(self, val): # We uppercase labels, but not in every language @@ -351,10 +339,15 @@ class BaseReportlabInvoiceRenderer(BaseInvoiceRenderer): return 'invoice.pdf', 'application/pdf', buffer.read() def _clean_text(self, text, tags=None): - return self._normalize(bleach.clean( - text, - tags=set(tags) if tags else set() - ).strip().replace('
', '
').replace('\n', '
\n')) + # For backwards compatibility with customer content, we need to support tags like
and in a few text + # fields. Therefore, we can't use PlainTextParagraph for these, but run bleach instead to limit the allowed + # tags. + return self._normalize( + bleach.clean( + text, + tags=set(tags) if tags else set() + ).strip().replace('
', '
').replace('\n', '
\n') + ) class PaidMarker(Flowable): @@ -405,8 +398,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): invoice_to_top = 52 * mm def _draw_invoice_to(self, canvas): - p = FontFallbackParagraph(self._clean_text(self.invoice.address_invoice_to), - style=self.stylesheet['Normal']) + p = PlainTextParagraph(self.invoice.address_invoice_to, style=self.stylesheet['Normal']) p.wrapOn(canvas, self.invoice_to_width, self.invoice_to_height) p_size = p.wrap(self.invoice_to_width, self.invoice_to_height) p.drawOn(canvas, self.invoice_to_left, self.pagesize[1] - p_size[1] - self.invoice_to_top) @@ -417,8 +409,8 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): invoice_from_top = 17 * mm def _draw_invoice_from(self, canvas): - p = FontFallbackParagraph( - self._clean_text(self.invoice.full_invoice_from), + p = PlainTextParagraph( + self.invoice.full_invoice_from, style=self.stylesheet['InvoiceFrom'] ) p.wrapOn(canvas, self.invoice_from_width, self.invoice_from_height) @@ -548,13 +540,12 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): def _draw_event(self, canvas): def shorten(txt): txt = str(txt) - txt = bleach.clean(txt, tags=set()).strip() - p = FontFallbackParagraph(self._normalize(txt.strip().replace('\n', '
\n')), style=self.stylesheet['Normal']) + p = PlainTextParagraph(txt, style=self.stylesheet['Normal']) p_size = p.wrap(self.event_width, self.event_height) while p_size[1] > 2 * self.stylesheet['Normal'].leading: txt = ' '.join(txt.replace('…', '').split()[:-1]) + '…' - p = FontFallbackParagraph(self._normalize(txt.strip().replace('\n', '
\n')), style=self.stylesheet['Normal']) + p = PlainTextParagraph(txt, style=self.stylesheet['Normal']) p_size = p.wrap(self.event_width, self.event_height) return txt @@ -572,7 +563,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): else: p_str = shorten(self.invoice.event.name) - p = FontFallbackParagraph(self._normalize(p_str.strip().replace('\n', '
\n')), style=self.stylesheet['Normal']) + p = PlainTextParagraph(p_str, style=self.stylesheet['Normal']) p.wrapOn(canvas, self.event_width, self.event_height) p_size = p.wrap(self.event_width, self.event_height) p.drawOn(canvas, self.event_left, self.pagesize[1] - self.event_top - p_size[1]) @@ -645,39 +636,37 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): type_info_text = self.invoice.transmission_type_instance.pdf_info_text() if type_info_text: - story.append(FontFallbackParagraph( + story.append(PlainTextParagraph( type_info_text, self.stylesheet['WarningBlock'] )) if self.invoice.custom_field: - story.append(FontFallbackParagraph( + story.append(PlainTextParagraph( '{}: {}'.format( - self._clean_text(str(self.invoice.event.settings.invoice_address_custom_field)), - self._clean_text(self.invoice.custom_field), + str(self.invoice.event.settings.invoice_address_custom_field), + self.invoice.custom_field, ), self.stylesheet['Normal'] )) if self.invoice.internal_reference: - story.append(FontFallbackParagraph( - self._normalize(pgettext('invoice', 'Customer reference: {reference}').format( - reference=self._clean_text(self.invoice.internal_reference), - )), + story.append(PlainTextParagraph( + pgettext('invoice', 'Customer reference: {reference}').format( + reference=self.invoice.internal_reference, + ), self.stylesheet['Normal'] )) if self.invoice.invoice_to_vat_id: - story.append(FontFallbackParagraph( - self._normalize(pgettext('invoice', 'Customer VAT ID')) + ': ' + - self._clean_text(self.invoice.invoice_to_vat_id), + story.append(PlainTextParagraph( + pgettext('invoice', 'Customer VAT ID') + ': ' + self.invoice.invoice_to_vat_id, self.stylesheet['Normal'] )) if self.invoice.invoice_to_beneficiary: - story.append(FontFallbackParagraph( - self._normalize(pgettext('invoice', 'Beneficiary')) + ':
' + - self._clean_text(self.invoice.invoice_to_beneficiary), + story.append(PlainTextParagraph( + pgettext('invoice', 'Beneficiary') + ':\n' + self.invoice.invoice_to_beneficiary, self.stylesheet['Normal'] )) @@ -707,11 +696,11 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): story = [ NextPageTemplate('FirstPage'), - FontFallbackParagraph( - self._normalize( + PlainTextParagraph( + ( pgettext('invoice', 'Tax Invoice') if str(self.invoice.invoice_from_country) == 'AU' else pgettext('invoice', 'Invoice') - ) if not self.invoice.is_cancellation else self._normalize(pgettext('invoice', 'Cancellation')), + ) if not self.invoice.is_cancellation else pgettext('invoice', 'Cancellation'), self.stylesheet['Heading1'] ), Spacer(1, 5 * mm), @@ -733,17 +722,17 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): ] if has_taxes: tdata = [( - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Description')), self.stylesheet['Bold']), - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Qty')), self.stylesheet['BoldRightNoSplit']), - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Tax rate')), self.stylesheet['BoldRightNoSplit']), - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Net')), self.stylesheet['BoldRightNoSplit']), - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Gross')), self.stylesheet['BoldRightNoSplit']), + PlainTextParagraph(pgettext('invoice', 'Description'), self.stylesheet['Bold']), + PlainTextParagraph(pgettext('invoice', 'Qty'), self.stylesheet['BoldRightNoSplit']), + PlainTextParagraph(pgettext('invoice', 'Tax rate'), self.stylesheet['BoldRightNoSplit']), + PlainTextParagraph(pgettext('invoice', 'Net'), self.stylesheet['BoldRightNoSplit']), + PlainTextParagraph(pgettext('invoice', 'Gross'), self.stylesheet['BoldRightNoSplit']), )] else: tdata = [( - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Description')), self.stylesheet['Bold']), - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Qty')), self.stylesheet['BoldRightNoSplit']), - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Amount')), self.stylesheet['BoldRightNoSplit']), + PlainTextParagraph(pgettext('invoice', 'Description'), self.stylesheet['Bold']), + PlainTextParagraph(pgettext('invoice', 'Qty'), self.stylesheet['BoldRightNoSplit']), + PlainTextParagraph(pgettext('invoice', 'Amount'), self.stylesheet['BoldRightNoSplit']), )] def _group_key(line): @@ -780,8 +769,8 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): max_height = self.stylesheet['Normal'].leading * 5 p_style = self.stylesheet['Normal'] for __ in range(1000): - p = FontFallbackParagraph( - self._clean_text(curr_description, tags=['br']), + p = PlainTextParagraph( + curr_description, p_style ) h = p.wrap(max_width, doc.height)[1] @@ -862,7 +851,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): # Group together at the end of the invoice request_show_service_date = period_line elif period_line: - description_p_list.append(FontFallbackParagraph( + description_p_list.append(PlainTextParagraph( period_line, self.stylesheet['Fineprint'] )) @@ -874,7 +863,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): net_price=money_filter(net_value, self.invoice.event.currency), gross_price=money_filter(gross_value, self.invoice.event.currency), ) - description_p_list.append(FontFallbackParagraph( + description_p_list.append(PlainTextParagraph( single_price_line, self.stylesheet['Fineprint'] )) @@ -883,11 +872,11 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): description_p_list.pop(0), str(len(lines)), localize(tax_rate) + " %", - FontFallbackParagraph( + PlainTextParagraph( money_filter(net_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '), self.stylesheet['NormalRight'] ), - FontFallbackParagraph( + PlainTextParagraph( money_filter(gross_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '), self.stylesheet['NormalRight'] ), @@ -904,14 +893,14 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): single_price_line = pgettext('invoice', 'Single price: {price}').format( price=money_filter(gross_value, self.invoice.event.currency), ) - description_p_list.append(FontFallbackParagraph( + description_p_list.append(PlainTextParagraph( single_price_line, self.stylesheet['Fineprint'] )) tdata.append(( description_p_list.pop(0), str(len(lines)), - FontFallbackParagraph( + PlainTextParagraph( money_filter(gross_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '), self.stylesheet['NormalRight'] ), @@ -944,12 +933,12 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): if has_taxes: tdata.append([ - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Invoice total')), self.stylesheet['Bold']), '', '', '', + PlainTextParagraph(pgettext('invoice', 'Invoice total'), self.stylesheet['Bold']), '', '', '', money_filter(total, self.invoice.event.currency) ]) else: tdata.append([ - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Invoice total')), self.stylesheet['Bold']), '', + PlainTextParagraph(pgettext('invoice', 'Invoice total'), self.stylesheet['Bold']), '', money_filter(total, self.invoice.event.currency) ]) @@ -958,12 +947,12 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): pending_sum = self.invoice.order.pending_sum if pending_sum != total: tdata.append( - [FontFallbackParagraph(self._normalize(pgettext('invoice', 'Received payments')), self.stylesheet['Normal'])] + + [PlainTextParagraph(pgettext('invoice', 'Received payments'), self.stylesheet['Normal'])] + (['', '', ''] if has_taxes else ['']) + [money_filter(pending_sum - total, self.invoice.event.currency)] ) tdata.append( - [FontFallbackParagraph(self._normalize(pgettext('invoice', 'Outstanding payments')), self.stylesheet['Bold'])] + + [PlainTextParagraph(pgettext('invoice', 'Outstanding payments'), self.stylesheet['Bold'])] + (['', '', ''] if has_taxes else ['']) + [money_filter(pending_sum, self.invoice.event.currency)] ) @@ -980,12 +969,12 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): s=Sum('amount') )['s'] or Decimal('0.00') tdata.append( - [FontFallbackParagraph(self._normalize(pgettext('invoice', 'Paid by gift card')), self.stylesheet['Normal'])] + + [PlainTextParagraph(pgettext('invoice', 'Paid by gift card'), self.stylesheet['Normal'])] + (['', '', ''] if has_taxes else ['']) + [money_filter(giftcard_sum, self.invoice.event.currency)] ) tdata.append( - [FontFallbackParagraph(self._normalize(pgettext('invoice', 'Remaining amount')), self.stylesheet['Bold'])] + + [PlainTextParagraph(pgettext('invoice', 'Remaining amount'), self.stylesheet['Bold'])] + (['', '', ''] if has_taxes else ['']) + [money_filter(total - giftcard_sum, self.invoice.event.currency)] ) @@ -1008,14 +997,14 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): story.append(Spacer(1, 10 * mm)) if request_show_service_date: - story.append(FontFallbackParagraph( - self._normalize(pgettext('invoice', 'Invoice period: {daterange}').format(daterange=request_show_service_date)), + story.append(PlainTextParagraph( + pgettext('invoice', 'Invoice period: {daterange}').format(daterange=request_show_service_date), self.stylesheet['Normal'] )) if self.invoice.payment_provider_text: story.append(FontFallbackParagraph( - self._normalize(self.invoice.payment_provider_text), + self._clean_text(self.invoice.payment_provider_text, tags=['br', 'b']), self.stylesheet['Normal'] )) @@ -1039,10 +1028,10 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): ('FONTNAME', (0, 0), (-1, -1), self.font_regular), ] thead = [ - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Tax rate')), self.stylesheet['Fineprint']), - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Net value')), self.stylesheet['FineprintRight']), - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Gross value')), self.stylesheet['FineprintRight']), - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Tax')), self.stylesheet['FineprintRight']), + PlainTextParagraph(pgettext('invoice', 'Tax rate'), self.stylesheet['Fineprint']), + PlainTextParagraph(pgettext('invoice', 'Net value'), self.stylesheet['FineprintRight']), + PlainTextParagraph(pgettext('invoice', 'Gross value'), self.stylesheet['FineprintRight']), + PlainTextParagraph(pgettext('invoice', 'Tax'), self.stylesheet['FineprintRight']), '' ] tdata = [thead] @@ -1053,7 +1042,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): continue tax = taxvalue_map[idx] tdata.append([ - FontFallbackParagraph(self._normalize(localize(rate) + " % " + name), self.stylesheet['Fineprint']), + PlainTextParagraph(localize(rate) + " % " + name, self.stylesheet['Fineprint']), money_filter(gross - tax, self.invoice.event.currency), money_filter(gross, self.invoice.event.currency), money_filter(tax, self.invoice.event.currency), @@ -1072,7 +1061,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): table.setStyle(TableStyle(tstyledata)) story.append(Spacer(5 * mm, 5 * mm)) story.append(KeepTogether([ - FontFallbackParagraph(self._normalize(pgettext('invoice', 'Included taxes')), self.stylesheet['FineprintHeading']), + PlainTextParagraph(pgettext('invoice', 'Included taxes'), self.stylesheet['FineprintHeading']), table ])) @@ -1089,7 +1078,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): net = gross - tax tdata.append([ - FontFallbackParagraph(self._normalize(localize(rate) + " % " + name), self.stylesheet['Fineprint']), + PlainTextParagraph(localize(rate) + " % " + name, self.stylesheet['Fineprint']), fmt(net), fmt(gross), fmt(tax), '' ]) @@ -1098,13 +1087,13 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): story.append(KeepTogether([ Spacer(1, height=2 * mm), - FontFallbackParagraph( - self._normalize(pgettext( + PlainTextParagraph( + pgettext( 'invoice', 'Using the conversion rate of 1:{rate} as published by the {authority} on ' '{date}, this corresponds to:' ).format(rate=localize(self.invoice.foreign_currency_rate), authority=SOURCE_NAMES.get(self.invoice.foreign_currency_source, "?"), - date=date_format(self.invoice.foreign_currency_rate_date, "SHORT_DATE_FORMAT"))), + date=date_format(self.invoice.foreign_currency_rate_date, "SHORT_DATE_FORMAT")), self.stylesheet['Fineprint'] ), Spacer(1, height=3 * mm), @@ -1113,14 +1102,14 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): elif self.invoice.foreign_currency_display and self.invoice.foreign_currency_rate: foreign_total = round_decimal(total * self.invoice.foreign_currency_rate) story.append(Spacer(1, 5 * mm)) - story.append(FontFallbackParagraph(self._normalize( + story.append(PlainTextParagraph( pgettext( 'invoice', 'Using the conversion rate of 1:{rate} as published by the {authority} on ' '{date}, the invoice total corresponds to {total}.' ).format(rate=localize(self.invoice.foreign_currency_rate), date=date_format(self.invoice.foreign_currency_rate_date, "SHORT_DATE_FORMAT"), authority=SOURCE_NAMES.get(self.invoice.foreign_currency_source, "?"), - total=fmt(foreign_total))), + total=fmt(foreign_total)), self.stylesheet['Fineprint'] )) @@ -1160,13 +1149,10 @@ class Modern1Renderer(ClassicInvoiceRenderer): return stylesheet def _draw_invoice_from(self, canvas): - if not self.invoice.invoice_from: + if not self.invoice.address_invoice_from: return - c = [ - self._clean_text(l) - for l in self.invoice.address_invoice_from.strip().split('\n') - ] - p = FontFallbackParagraph(self._normalize(' · '.join(c)), style=self.stylesheet['Sender']) + c = self.invoice.address_invoice_from.strip().split('\n') + p = PlainTextParagraph(' · '.join(c), style=self.stylesheet['Sender']) p.wrapOn(canvas, self.invoice_to_width, 15.7 * mm) p.drawOn(canvas, self.invoice_to_left, self.pagesize[1] - self.invoice_to_top + 2 * mm) super()._draw_invoice_from(canvas) @@ -1225,8 +1211,8 @@ class Modern1Renderer(ClassicInvoiceRenderer): _draw(pgettext('invoice', 'Order code'), self.invoice.order.full_code, value_size, self.left_margin, 45 * mm, **kwargs) ] - p = FontFallbackParagraph( - self._normalize(date_format(self.invoice.date, "DATE_FORMAT")), + p = PlainTextParagraph( + date_format(self.invoice.date, "DATE_FORMAT"), style=ParagraphStyle(name=f'Normal{value_size}', fontName=self.font_regular, fontSize=value_size, leading=value_size * 1.2) ) w = stringWidth(p.text, p.frags[0].fontName, p.frags[0].fontSize) @@ -1283,7 +1269,7 @@ class Modern1SimplifiedRenderer(Modern1Renderer): i = [] if not self.invoice.event.has_subevents and self.invoice.event.settings.show_dates_on_frontpage: - i.append(FontFallbackParagraph( + i.append(PlainTextParagraph( pgettext('invoice', 'Event date: {date_range}').format( date_range=self.invoice.event.get_date_range_display(), ), diff --git a/src/pretix/base/management/commands/runserver.py b/src/pretix/base/management/commands/runserver.py new file mode 100644 index 0000000000..09e8442f70 --- /dev/null +++ b/src/pretix/base/management/commands/runserver.py @@ -0,0 +1,60 @@ +# +# 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 . +# +# 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 +# . +# + +"""This command supersedes the Django-inbuilt runserver command. + +It runs the local frontend server, if node is installed and the setting +is set. +""" +import atexit +import os +import subprocess +from pathlib import Path + +from django.conf import settings +from django.contrib.staticfiles.management.commands.runserver import ( + Command as Parent, +) +from django.utils.autoreload import DJANGO_AUTORELOAD_ENV + + +class Command(Parent): + def handle(self, *args, **options): + # Only start Vite in the non-main process of the autoreloader + if settings.VITE_DEV_MODE and os.environ.get(DJANGO_AUTORELOAD_ENV) != "true": + # Start the vite server in the background + vite_server = subprocess.Popen( + ["npm", "run", "dev:control"], + cwd=Path(__file__).parent.parent.parent.parent.parent, + stdin=subprocess.DEVNULL + ) + + def cleanup(): + vite_server.terminate() + try: + vite_server.wait(timeout=5) + except subprocess.TimeoutExpired: + vite_server.kill() + + atexit.register(cleanup) + + super().handle(*args, **options) diff --git a/src/pretix/base/media.py b/src/pretix/base/media.py index 47a1be987e..f6a4b24fdf 100644 --- a/src/pretix/base/media.py +++ b/src/pretix/base/media.py @@ -26,6 +26,7 @@ from django.utils.translation import gettext_lazy as _ class BaseMediaType: medium_created_by_server = False + medium_created_from_unknown_supported = False supports_orderposition = False supports_giftcard = False @@ -56,7 +57,7 @@ class BaseMediaType: def is_active(self, organizer): return organizer.settings.get(f'reusable_media_type_{self.identifier}', as_type=bool, default=False) - def handle_unknown(self, organizer, identifier, user, auth): + def handle_unknown(self, organizer, identifier, user, auth, force_create=False): pass def handle_new(self, organizer, medium, user, auth): @@ -88,23 +89,32 @@ class NfcUidMediaType(BaseMediaType): verbose_name = _('NFC UID-based') icon = 'pretixbase/img/media/nfc_uid.svg' medium_created_by_server = False + medium_created_from_unknown_supported = True supports_giftcard = True - supports_orderposition = False + supports_orderposition = True - def handle_unknown(self, organizer, identifier, user, auth): + def handle_unknown(self, organizer, identifier, user, auth, force_create=False): from pretix.base.models import GiftCard, ReusableMedium - if organizer.settings.get(f'reusable_media_type_{self.identifier}_autocreate_giftcard', as_type=bool): + create_giftcard = organizer.settings.get(f'reusable_media_type_{self.identifier}_autocreate_giftcard', as_type=bool) + if create_giftcard or force_create: if identifier.startswith("08"): # Don't create gift cards for NFC UIDs that start with 08, which represents NFC cards that issue random # UIDs on every read, so they won't be useful. return with transaction.atomic(): - gc = GiftCard.objects.create( - issuer=organizer, - expires=organizer.default_gift_card_expiry, - currency=organizer.settings.get(f'reusable_media_type_{self.identifier}_autocreate_giftcard_currency'), - ) + if create_giftcard: + gc = GiftCard.objects.create( + issuer=organizer, + expires=organizer.default_gift_card_expiry, + currency=organizer.settings.get(f'reusable_media_type_{self.identifier}_autocreate_giftcard_currency'), + ) + gc.log_action( + 'pretix.giftcards.created', + user=user, auth=auth, + ) + else: + gc = None m = ReusableMedium.objects.create( type=self.identifier, identifier=identifier, @@ -116,10 +126,6 @@ class NfcUidMediaType(BaseMediaType): 'pretix.reusable_medium.created.auto', user=user, auth=auth, ) - gc.log_action( - 'pretix.giftcards.created', - user=user, auth=auth, - ) return m @@ -129,7 +135,7 @@ class NfcMf0aesMediaType(BaseMediaType): icon = 'pretixbase/img/media/nfc_secure.svg' medium_created_by_server = False supports_giftcard = True - supports_orderposition = False + supports_orderposition = True def handle_new(self, organizer, medium, user, auth): from pretix.base.models import GiftCard diff --git a/src/pretix/base/metrics.py b/src/pretix/base/metrics.py index 8454098f86..ceecd894e4 100755 --- a/src/pretix/base/metrics.py +++ b/src/pretix/base/metrics.py @@ -282,10 +282,12 @@ def metric_values(): # Throwaway metrics exact_tables = [ - Order, OrderPosition, Invoice, Event, Organizer + Order, Invoice, Event, Organizer ] for m in apps.get_models(): # Count all models - if any(issubclass(m, p) for p in exact_tables): + if issubclass(m, OrderPosition): + metrics['pretix_model_instances']['{model="%s"}' % m._meta] = m.all.count() + elif any(issubclass(m, p) for p in exact_tables): metrics['pretix_model_instances']['{model="%s"}' % m._meta] = m.objects.count() else: metrics['pretix_model_instances']['{model="%s"}' % m._meta] = estimate_count_fast(m) diff --git a/src/pretix/base/middleware.py b/src/pretix/base/middleware.py index 677816723d..1c38347046 100644 --- a/src/pretix/base/middleware.py +++ b/src/pretix/base/middleware.py @@ -19,11 +19,14 @@ # You should have received a copy of the GNU Affero General Public License along with this program. If not, see # . # +import logging +import re from collections import OrderedDict from urllib.parse import urlparse, urlsplit from zoneinfo import ZoneInfo, ZoneInfoNotFoundError from django.conf import settings +from django.core.exceptions import BadRequest from django.http import Http404, HttpRequest, HttpResponse from django.middleware.common import CommonMiddleware from django.urls import get_script_prefix, resolve @@ -42,6 +45,8 @@ from pretix.multidomain.urlreverse import ( ) from pretix.presale.style import get_fonts +logger = logging.getLogger(__name__) + _supported = None @@ -73,6 +78,7 @@ class LocaleMiddleware(MiddlewareMixin): def process_request(self, request: HttpRequest): language = get_language_from_request(request) + region = None # Normally, this middleware runs *before* the event is set. However, on event frontend pages it # might be run a second time by pretix.presale.EventMiddleware and in this case the event is already # set and can be taken into account for the decision. @@ -93,15 +99,16 @@ class LocaleMiddleware(MiddlewareMixin): if '-' not in language and settings_holder.settings.region: language += '-' + settings_holder.settings.region if settings_holder.settings.region: - set_region(settings_holder.settings.region) + region = settings_holder.settings.region else: gs = global_settings_object(request) if '-' not in language and gs.settings.region: language += '-' + gs.settings.region if gs.settings.region: - set_region(gs.settings.region) + region = gs.settings.region translation.activate(language) + set_region(region) request.LANGUAGE_CODE = get_language_without_region() tzname = None @@ -220,7 +227,26 @@ def _parse_csp(header): return h +VALID_CSP_DIRECTIVES = [ + "child-src", "connect-src", "default-src", "fenced-frame-src", "font-src", "form-action", "frame-src", "img-src", + "manifest-src", "media-src", "object-src", "prefetch-src", "report-uri", "script-src", "script-src-elem", + "script-src-attr", "style-src", "style-src-elem", "style-src-attr", "worker-src", +] + +CSP_ILLEGAL_CHARS = re.compile(r'[\s,;]') + + +def _sanitize_csp(h): + for k, v in h.items(): + if k not in VALID_CSP_DIRECTIVES: + raise ValueError("Invalid CSP directive " + k) + if any(CSP_ILLEGAL_CHARS.search(el) for el in v): + logger.warning("Stripping invalid component from CSP: %r", h) + h[k] = [el for el in v if not CSP_ILLEGAL_CHARS.search(el)] + + def _render_csp(h): + _sanitize_csp(h) return "; ".join(k + ' ' + ' '.join(v) for k, v in h.items() if v) @@ -240,21 +266,7 @@ def _merge_csp(a, b): class SecurityMiddleware(MiddlewareMixin): - CSP_EXEMPT = ( - '/api/v1/docs/', - ) - def process_response(self, request, resp): - def nested_dict_values(d): - for v in d.values(): - if isinstance(v, dict): - yield from nested_dict_values(v) - else: - if isinstance(v, str): - yield v - - url = resolve(request.path_info) - if settings.DEBUG and resp.status_code >= 400: # Don't use CSP on debug error page as it breaks of Django's fancy error # pages @@ -265,28 +277,25 @@ class SecurityMiddleware(MiddlewareMixin): # https://github.com/pretix/pretix/issues/765 resp['P3P'] = 'CP=\"ALL DSP COR CUR ADM TAI OUR IND COM NAV INT\"' - img_src = [] - gs = global_settings_object(request) - if gs.settings.leaflet_tiles: - img_src.append(gs.settings.leaflet_tiles[:gs.settings.leaflet_tiles.index("/", 10)].replace("{s}", "*")) + if not getattr(resp, '_csp_ignore', False): + resp['Content-Security-Policy'] = _render_csp(self._build_csp(request, resp)) + elif 'Content-Security-Policy' in resp: + del resp['Content-Security-Policy'] - font_src = set() - if hasattr(request, 'event'): - for font in get_fonts(request.event, pdf_support_required=False).values(): - for path in list(nested_dict_values(font)): - font_location = urlparse(path) - if font_location.scheme and font_location.netloc: - font_src.add('{}://{}'.format(font_location.scheme, font_location.netloc)) + return resp + + def _build_csp(self, request, resp): + url = resolve(request.path_info) h = { 'default-src': ["{static}"], - 'script-src': ['{static}'], + 'script-src': ["{static}"], 'object-src': ["'none'"], 'frame-src': ['{static}'], 'style-src': ["{static}", "{media}"], 'connect-src': ["{dynamic}", "{media}"], - 'img-src': ["{static}", "{media}", "data:"] + img_src, - 'font-src': ["{static}"] + list(font_src), + 'img-src': ["{static}", "{media}", "data:"], + 'font-src': ["{static}"], 'media-src': ["{static}", "data:"], # form-action is not only used to match on form actions, but also on URLs # form-actions redirect to. In the context of e.g. payment providers or @@ -294,6 +303,26 @@ class SecurityMiddleware(MiddlewareMixin): # this. However, we'll restrict it to HTTPS. 'form-action': ["{dynamic}", "https:"] + (['http:'] if settings.SITE_URL.startswith('http://') else []), } + + gs = global_settings_object(request) + if gs.settings.leaflet_tiles: + h['img-src'].append(gs.settings.leaflet_tiles[:gs.settings.leaflet_tiles.index("/", 10)].replace("{s}", "*")) + + if hasattr(request, 'event'): + h['font-src'] += list(self._get_font_origins(request.event)) + + if settings.VITE_DEV_MODE: + h['script-src'] += ["http://localhost:5173", "ws://localhost:5173"] + h['style-src'] += ["'unsafe-inline'"] + h['connect-src'] += ["http://localhost:5173", "ws://localhost:5173"] + + if hasattr(request, 'csp_nonce'): + nonce = f"'nonce-{request.csp_nonce}'" + h['script-src'].append(nonce) + if not settings.VITE_DEV_MODE: + # can't have 'unsafe-inline' and nonce at the same time + h['style-src'].append(nonce) + # Only include pay.google.com for wallet detection purposes on the Payment selection page if ( url.url_name == "event.order.pay.change" or @@ -302,27 +331,32 @@ class SecurityMiddleware(MiddlewareMixin): h['script-src'].append('https://pay.google.com') h['frame-src'].append('https://pay.google.com') h['connect-src'].append('https://google.com/pay') + if settings.LOG_CSP: h['report-uri'] = ["/csp_report/"] + if 'Content-Security-Policy' in resp: _merge_csp(h, _parse_csp(resp['Content-Security-Policy'])) + if settings.CSP_ADDITIONAL_HEADER: _merge_csp(h, _parse_csp(settings.CSP_ADDITIONAL_HEADER)) - staticdomain = "'self'" - dynamicdomain = "'self'" - mediadomain = "'self'" + placeholders = { + "{static}": ["'self'"], + "{dynamic}": ["'self'"], + "{media}": ["'self'"], + } if settings.MEDIA_URL.startswith('http'): - mediadomain += " " + settings.MEDIA_URL[:settings.MEDIA_URL.find('/', 9)] + placeholders["{media}"].append(settings.MEDIA_URL[:settings.MEDIA_URL.find('/', 9)]) if settings.STATIC_URL.startswith('http'): - staticdomain += " " + settings.STATIC_URL[:settings.STATIC_URL.find('/', 9)] + placeholders["{static}"].append(settings.STATIC_URL[:settings.STATIC_URL.find('/', 9)]) if settings.SITE_URL.startswith('http'): if settings.SITE_URL.find('/', 9) > 0: - staticdomain += " " + settings.SITE_URL[:settings.SITE_URL.find('/', 9)] - dynamicdomain += " " + settings.SITE_URL[:settings.SITE_URL.find('/', 9)] + placeholders["{static}"].append(settings.SITE_URL[:settings.SITE_URL.find('/', 9)]) + placeholders["{dynamic}"].append(settings.SITE_URL[:settings.SITE_URL.find('/', 9)]) else: - staticdomain += " " + settings.SITE_URL - dynamicdomain += " " + settings.SITE_URL + placeholders["{static}"].append(settings.SITE_URL) + placeholders["{dynamic}"].append(settings.SITE_URL) if hasattr(request, 'organizer') and request.organizer: if hasattr(request, 'event') and request.event: @@ -333,18 +367,41 @@ class SecurityMiddleware(MiddlewareMixin): siteurlsplit = urlsplit(settings.SITE_URL) if siteurlsplit.port and siteurlsplit.port not in (80, 443): domain = '%s:%d' % (domain, siteurlsplit.port) - dynamicdomain += " " + domain + placeholders["{dynamic}"].append(domain) - if request.path not in self.CSP_EXEMPT and not getattr(resp, '_csp_ignore', False): - resp['Content-Security-Policy'] = _render_csp(h).format(static=staticdomain, dynamic=dynamicdomain, - media=mediadomain) - for k, v in h.items(): - h[k] = sorted(set(' '.join(v).format(static=staticdomain, dynamic=dynamicdomain, media=mediadomain).split(' '))) - resp['Content-Security-Policy'] = _render_csp(h) - elif 'Content-Security-Policy' in resp: - del resp['Content-Security-Policy'] + for k, v in h.items(): + h[k] = sorted(set(result for part in v for result in placeholders.get(part, [part]))) - return resp + return h + + def _get_font_origins(self, event): + def nested_dict_values(d): + for v in d.values(): + if isinstance(v, dict): + yield from nested_dict_values(v) + else: + if isinstance(v, str): + yield v + + font_src = set() + for font in get_fonts(event, pdf_support_required=False).values(): + for path in list(nested_dict_values(font)): + font_location = urlparse(path) + if font_location.scheme and font_location.netloc: + font_src.add('{}://{}'.format(font_location.scheme, font_location.netloc)) + return font_src + + +class RejectInvalidInputMiddleware(MiddlewareMixin): + + def process_request(self, request): + # Nullbytes in GET/POST parameters are mostly harmless, as they will later fail on database insertion, but it + # keeps spamming our error logs whenever someone tries to run a vulnerability scanner. + if "\x00" in request.META['QUERY_STRING'] or "%00" in request.META['QUERY_STRING']: + raise BadRequest("Invalid characters in input.") + if request.method in ('POST', 'PUT', 'PATCH') and request.content_type == "application/x-www-form-urlencoded": + if any("\x00" in value for key, value_list in request.POST.lists() for value in value_list): + raise BadRequest("Invalid characters in input.") class CustomCommonMiddleware(CommonMiddleware): diff --git a/src/pretix/base/migrations/0299_itemprogramtime_location.py b/src/pretix/base/migrations/0299_itemprogramtime_location.py new file mode 100644 index 0000000000..390b33d72d --- /dev/null +++ b/src/pretix/base/migrations/0299_itemprogramtime_location.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.27 on 2026-01-21 12:06 + +import i18nfield.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("pretixbase", "0298_pluggable_permissions"), + ] + + operations = [ + migrations.AddField( + model_name="itemprogramtime", + name="location", + field=i18nfield.fields.I18nTextField(max_length=200, null=True), + ) + ] diff --git a/src/pretix/base/migrations/0300_add_reusablemedium_label.py b/src/pretix/base/migrations/0300_add_reusablemedium_label.py new file mode 100644 index 0000000000..0352c50b81 --- /dev/null +++ b/src/pretix/base/migrations/0300_add_reusablemedium_label.py @@ -0,0 +1,35 @@ +# Generated by Django 4.2.26 on 2025-11-24 11:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("pretixbase", "0299_itemprogramtime_location"), + ] + + operations = [ + migrations.AddField( + model_name="reusablemedium", + name="claim_token", + field=models.CharField(max_length=200, null=True), + ), + migrations.AddField( + model_name="reusablemedium", + name="label", + field=models.CharField(max_length=200, null=True), + ), + # use temporary related_name "linked_mediums" for ManyToManyField, so we can migrate existing data + migrations.AddField( + model_name="reusablemedium", + name="linked_orderpositions", + field=models.ManyToManyField( + related_name="linked_mediums", to="pretixbase.orderposition" + ), + ), + migrations.RunSQL( + sql="INSERT INTO pretixbase_reusablemedium_linked_orderpositions (reusablemedium_id, orderposition_id) SELECT id, linked_orderposition_id FROM pretixbase_reusablemedium WHERE linked_orderposition_id IS NOT NULL;", + reverse_sql="DELETE FROM pretixbase_reusablemedium_linked_orderpositions;", + ), + ] diff --git a/src/pretix/base/migrations/0301_reusablemedium_remove_orderposition.py b/src/pretix/base/migrations/0301_reusablemedium_remove_orderposition.py new file mode 100644 index 0000000000..8ba0a64b8a --- /dev/null +++ b/src/pretix/base/migrations/0301_reusablemedium_remove_orderposition.py @@ -0,0 +1,44 @@ +# Generated by Django 4.2.26 on 2025-11-24 11:32 + +from django.db import migrations, models + + +def reverse(apps, schema_editor): + ReusableMedium = apps.get_model('pretixbase', 'ReusableMedium') + + qs = ReusableMedium.linked_orderpositions.through.objects + objs = [] + # get last added orderposition from linked_orderpositions + for rm_id, op_id in qs.filter(id__in=qs.values("reusablemedium_id").annotate(max_id=models.Max('id')).values('max_id')).values_list("reusablemedium_id", "orderposition_id"): + obj = ReusableMedium( + id=rm_id, + linked_orderposition_id=op_id, + ) + objs.append(obj) + + ReusableMedium.objects.bulk_update(objs, ['linked_orderposition_id']) + + +class Migration(migrations.Migration): + + dependencies = [ + ("pretixbase", "0300_add_reusablemedium_label"), + ] + + operations = [ + # according to the docs, UPDATE FROM should run similarly on sqlite and postgres, but I could not get it to work + # so roll back the data migration with code before deleting data from through-table in 0297 + migrations.RunPython(migrations.RunPython.noop, reverse), + migrations.RemoveField( + model_name="reusablemedium", + name="linked_orderposition", + ), + # change related_name for new ManyToManyField to previously used linked_media + migrations.AlterField( + model_name="reusablemedium", + name="linked_orderpositions", + field=models.ManyToManyField( + related_name="linked_media", to="pretixbase.orderposition" + ), + ), + ] diff --git a/src/pretix/base/modelimport_orders.py b/src/pretix/base/modelimport_orders.py index 144cdf613d..11ddc18d43 100644 --- a/src/pretix/base/modelimport_orders.py +++ b/src/pretix/base/modelimport_orders.py @@ -442,7 +442,7 @@ class AttendeeState(ImportColumn): @property def verbose_name(self): - return _('Attendee address') + ': ' + _('State') + return _('Attendee address') + ': ' + pgettext('address', 'State') def clean(self, value, previous_values): if value: diff --git a/src/pretix/base/models/auth.py b/src/pretix/base/models/auth.py index d783f7290c..f8295877aa 100644 --- a/src/pretix/base/models/auth.py +++ b/src/pretix/base/models/auth.py @@ -57,7 +57,7 @@ from django_otp.models import Device from django_scopes import scopes_disabled from pretix.base.i18n import language -from pretix.helpers.urls import build_absolute_uri +from pretix.helpers.urls import mainreverse_absolute from ...helpers.countries import FastCountryField from ...helpers.u2f import pub_key_from_der, websafe_decode @@ -378,7 +378,7 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin): { 'user': self, 'messages': msg, - 'url': build_absolute_uri('control:user.settings'), + 'url': mainreverse_absolute('control:user.settings'), 'instance': settings.PRETIX_INSTANCE_NAME, }, event=None, @@ -466,7 +466,7 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin): { 'instance': settings.PRETIX_INSTANCE_NAME, 'user': self, - 'url': (build_absolute_uri('control:auth.forgot.recover') + 'url': (mainreverse_absolute('control:auth.forgot.recover') + '?id=%d&token=%s' % (self.id, default_token_generator.make_token(self))) }, None, locale=self.locale, user=self @@ -647,25 +647,22 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin): id__in=self.teams.filter(TeamQuerySet.organizer_permission_q(permission)).values_list('organizer', flat=True) ) - def has_active_staff_session(self, session_key=None): + def has_active_staff_session(self, session_key): """ Returns whether or not a user has an active staff session (formerly known as superuser session) with the given session key. """ return self.get_active_staff_session(session_key) is not None - def get_active_staff_session(self, session_key=None): - if not self.is_staff: + def get_active_staff_session(self, session_key): + if not self.is_staff or not session_key: return None if not hasattr(self, '_staff_session_cache'): self._staff_session_cache = {} if session_key not in self._staff_session_cache: - qs = StaffSession.objects.filter( - user=self, date_end__isnull=True - ) - if session_key: - qs = qs.filter(session_key=session_key) - sess = qs.first() + sess = StaffSession.objects.filter( + user=self, date_end__isnull=True, session_key=session_key + ).first() if sess: if sess.date_start < now() - timedelta(seconds=settings.PRETIX_SESSION_TIMEOUT_ABSOLUTE): sess.date_end = now() diff --git a/src/pretix/base/models/base.py b/src/pretix/base/models/base.py index dd95ad03b0..64e37088f7 100644 --- a/src/pretix/base/models/base.py +++ b/src/pretix/base/models/base.py @@ -125,7 +125,7 @@ class LoggingMixin: elif isinstance(self, Event): event = self organizer_id = self.organizer_id - elif hasattr(self, 'event'): + elif hasattr(self, 'event') and self.event: event = self.event organizer_id = self.event.organizer_id elif hasattr(self, 'organizer_id'): diff --git a/src/pretix/base/models/checkin.py b/src/pretix/base/models/checkin.py index 0926cedee4..bd06bb11e0 100644 --- a/src/pretix/base/models/checkin.py +++ b/src/pretix/base/models/checkin.py @@ -346,11 +346,14 @@ class Checkin(models.Model): REASON_INCOMPLETE = 'incomplete' REASON_ALREADY_REDEEMED = 'already_redeemed' REASON_AMBIGUOUS = 'ambiguous' + REASON_MEDIUM_INVALID = 'medium_invalid' + REASON_MEDIUM_EXISTS = 'medium_exists' REASON_ERROR = 'error' REASON_BLOCKED = 'blocked' REASON_UNAPPROVED = 'unapproved' REASON_INVALID_TIME = 'invalid_time' REASON_ANNULLED = 'annulled' + REASON_ALREADY_EXCHANGED = 'already_exchanged' REASONS = ( (REASON_CANCELED, _('Order canceled')), (REASON_INVALID, _('Unknown ticket')), @@ -366,6 +369,9 @@ class Checkin(models.Model): (REASON_UNAPPROVED, _('Order not approved')), (REASON_INVALID_TIME, _('Ticket not valid at this time')), (REASON_ANNULLED, _('Check-in annulled')), + (REASON_ALREADY_EXCHANGED, _('Ticket already exchanged')), + (REASON_MEDIUM_INVALID, _('Reusable medium invalid')), + (REASON_MEDIUM_EXISTS, _('Reusable medium already exists')), ) successful = models.BooleanField( diff --git a/src/pretix/base/models/customers.py b/src/pretix/base/models/customers.py index ef9a3b26be..4dd436d63f 100644 --- a/src/pretix/base/models/customers.py +++ b/src/pretix/base/models/customers.py @@ -167,7 +167,7 @@ class Customer(LoggedModel): def send_security_notice(self, message, email=None): from pretix.base.services.mail import SendMailException, mail - from pretix.multidomain.urlreverse import build_absolute_uri + from pretix.multidomain.urlreverse import eventreverse_absolute try: with language(self.locale): @@ -178,7 +178,7 @@ class Customer(LoggedModel): { **self.get_email_context(), 'message': str(message), - 'url': build_absolute_uri(self.organizer, 'presale:organizer.customer.index') + 'url': eventreverse_absolute(self.organizer, 'presale:organizer.customer.index') }, customer=self, organizer=self.organizer, @@ -299,12 +299,12 @@ class Customer(LoggedModel): def send_activation_mail(self): from pretix.base.services.mail import mail - from pretix.multidomain.urlreverse import build_absolute_uri + from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.presale.forms.customer import TokenGenerator ctx = self.get_email_context() token = TokenGenerator().make_token(self) - ctx['url'] = build_absolute_uri( + ctx['url'] = eventreverse_absolute( self.organizer, 'presale:organizer.customer.activate' ) + '?id=' + self.identifier + '&token=' + token @@ -395,7 +395,7 @@ class AttendeeProfile(models.Model): self.company, self.street, (self.zipcode or '') + ' ' + (self.city or '') + ' ' + (self.state_for_address or ''), - self.country.name, + self.country.name if self.country else None, ] for a in self.answers: value = a.get('value') diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index aee0df1a7b..f8116bf578 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -40,6 +40,7 @@ import warnings from collections import Counter, OrderedDict, defaultdict from datetime import datetime, time, timedelta from operator import attrgetter +from typing import TYPE_CHECKING from urllib.parse import urljoin from zoneinfo import ZoneInfo @@ -79,10 +80,16 @@ from pretix.helpers.thumb import get_thumbnail from ..settings import settings_hierarkey from .organizer import Organizer, Team +if TYPE_CHECKING: + from hierarkey.proxy import HierarkeyProxy + logger = logging.getLogger(__name__) class EventMixin: + if TYPE_CHECKING: + settings: HierarkeyProxy + def clean(self): if self.presale_start and self.presale_end and self.presale_start > self.presale_end: raise ValidationError({'presale_end': _('The end of the presale period has to be later than its start.')}) @@ -715,10 +722,16 @@ class Event(EventMixin, LoggedModel): self.settings.name_scheme = 'given_family' self.settings.payment_banktransfer_invoice_immediately = True self.settings.low_availability_percentage = 10 + self.settings.mail_send_order_free_attendee = True + self.settings.mail_send_order_placed_attendee = True + self.settings.mail_send_order_paid_attendee = True + self.settings.mail_send_order_approved_attendee = True + self.settings.mail_send_order_approved_free_attendee = True + self.settings.mail_text_download_reminder_attendee = True @property def social_image(self): - from pretix.multidomain.urlreverse import build_absolute_uri + from pretix.multidomain.urlreverse import eventreverse_absolute img = None logo_file = self.settings.get('logo_image', as_type=str, default='')[7:] @@ -736,7 +749,7 @@ class Event(EventMixin, LoggedModel): logger.exception(f'Failed to create thumbnail of {logo_file}') img = default_storage.url(logo_file) if img: - return urljoin(build_absolute_uri(self, 'presale:event.index'), img) + return urljoin(eventreverse_absolute(self, 'presale:event.index'), img) def _seats(self, ignore_voucher=None): from .seating import Seat @@ -877,6 +890,8 @@ class Event(EventMixin, LoggedModel): ItemProgramTime, ItemVariationMetaValue, Question, Quota, ) + is_cross_organizer = other.organizer_id != self.organizer_id + # Note: avoid self.set_active_plugins(), it causes trouble e.g. for the badges plugin. # Plugins can create data in installed() hook based on existing data of the event. # Calling set_active_plugins() results in defaults being created while actually data @@ -891,7 +906,7 @@ class Event(EventMixin, LoggedModel): self.save() self.log_action('pretix.object.cloned', data={'source': other.slug, 'source_id': other.pk}) - if hasattr(other, 'alternative_domain_assignment'): + if hasattr(other, 'alternative_domain_assignment') and not is_cross_organizer: other.alternative_domain_assignment.domain.event_assignments.create(event=self) if not self.all_sales_channels: @@ -905,6 +920,15 @@ class Event(EventMixin, LoggedModel): for emv in EventMetaValue.objects.filter(event=other): emv.pk = None emv.event = self + if is_cross_organizer: + try: + emv.property = self.organizer.meta_properties.get(name=emv.property.name) + except EventMetaProperty.DoesNotExist: + meta_prop = emv.property + meta_prop.pk = None + meta_prop.organizer = self.organizer + meta_prop.save(force_insert=True) + emv.property = meta_prop emv.save(force_insert=True) for fl in EventFooterLink.objects.filter(event=other): @@ -958,13 +982,13 @@ class Event(EventMixin, LoggedModel): if i.tax_rule_id: i.tax_rule = tax_map[i.tax_rule_id] - if i.grant_membership_type and other.organizer_id != self.organizer_id: + if i.grant_membership_type and is_cross_organizer: i.grant_membership_type = None i.save() # no force_insert since i.picture.save could have already inserted i.log_action('pretix.object.cloned') - if require_membership_types and other.organizer_id == self.organizer_id: + if require_membership_types and not is_cross_organizer: i.require_membership_types.set(require_membership_types) if not i.all_sales_channels: @@ -979,7 +1003,7 @@ class Event(EventMixin, LoggedModel): v._prefetched_objects_cache = {} v.save(force_insert=True) - if require_membership_types and other.organizer_id == self.organizer_id: + if require_membership_types and not is_cross_organizer: v.require_membership_types.set(require_membership_types) if not v.all_sales_channels: v.limit_sales_channels.set(self.organizer.sales_channels.filter(identifier__in=[s.identifier for s in limit_sales_channels])) @@ -1863,6 +1887,8 @@ class EventMetaValue(LoggedModel): self.event.cache.clear() def save(self, *args, **kwargs): + if self.event and self.event.organizer != self.property.organizer: + raise ValidationError(_("Property and event must belong to the same organizer.")) super().save(*args, **kwargs) if self.event: self.event.cache.clear() diff --git a/src/pretix/base/models/items.py b/src/pretix/base/models/items.py index 339ad45014..79f1229d15 100644 --- a/src/pretix/base/models/items.py +++ b/src/pretix/base/models/items.py @@ -452,11 +452,16 @@ class Item(LoggedModel): MEDIA_POLICY_REUSE = 'reuse' MEDIA_POLICY_NEW = 'new' MEDIA_POLICY_REUSE_OR_NEW = 'reuse_or_new' + MEDIA_POLICY_APPEND = 'append' + MEDIA_POLICY_APPEND_OR_NEW = 'append_or_new' MEDIA_POLICIES = ( - (None, _("Don't use re-usable media, use regular one-off tickets")), - (MEDIA_POLICY_REUSE, _('Require an existing medium to be re-used')), + (None, _("Don't use reusable media, use regular one-off tickets")), (MEDIA_POLICY_NEW, _('Require a previously unknown medium to be newly added')), - (MEDIA_POLICY_REUSE_OR_NEW, _('Require either an existing or a new medium to be used')), + (MEDIA_POLICY_REUSE, _('Require an existing medium to be reused, replacing any previous tickets')), + (MEDIA_POLICY_REUSE_OR_NEW, _('Require either an existing or a new medium to be used, replacing any previous tickets')), + (MEDIA_POLICY_APPEND, _('Require an existing medium to be reused, adding to any previous tickets')), + (MEDIA_POLICY_APPEND_OR_NEW, + _('Require either an existing or a new medium to be used, adding to any previous tickets')), ) objects = ItemQuerySetManager() @@ -769,7 +774,7 @@ class Item(LoggedModel): null=True, blank=True, max_length=16, verbose_name=_('Reusable media policy'), help_text=_( - 'If this product should be stored on a re-usable physical medium, you can attach a physical media policy. ' + 'If this product should be stored on a reusable physical medium, you can attach a physical media policy. ' 'This is not required for regular tickets, which just use a one-time barcode, but only for products like ' 'renewable season tickets or re-chargeable gift card wristbands. ' 'This is an advanced feature that also requires specific configuration of ticketing and printing settings.' @@ -778,7 +783,7 @@ class Item(LoggedModel): media_type = models.CharField( max_length=100, null=True, blank=True, - choices=[(None, _("Don't use re-usable media, use regular one-off tickets"))] + [(k, v) for k, v in MEDIA_TYPES.items()], + choices=[(None, _("Don't use reusable media, use regular one-off tickets"))] + [(k, v) for k, v in MEDIA_TYPES.items()], verbose_name=_('Reusable media type'), help_text=_( 'Select the type of physical medium that should be used for this product. Note that not all media types ' @@ -995,6 +1000,11 @@ class Item(LoggedModel): raise ValidationError(_('The selected media type does not support usage for tickets currently.')) if not mt.supports_giftcard and issue_giftcard: raise ValidationError(_('The selected media type does not support usage for gift cards currently.')) + if media_policy in (Item.MEDIA_POLICY_NEW, Item.MEDIA_POLICY_APPEND_OR_NEW, Item.MEDIA_POLICY_REUSE_OR_NEW): + if not mt.medium_created_by_server and not mt.medium_created_from_unknown_supported: + raise ValidationError(_('The selected media type requires all media to be registered in the system ' + 'prior to their usage. Therefore, the selected media policy does not make ' + 'sense for this media type.')) if issue_giftcard: raise ValidationError(_('You currently cannot create gift cards with a reusable media policy. Instead, ' 'gift cards for some reusable media types can be created or re-charged directly ' @@ -2220,7 +2230,7 @@ class Quota(LoggedModel): class ItemMetaProperty(LoggedModel): """ An event can have ItemMetaProperty objects attached to define meta information fields - for its items. This information can be re-used for example in ticket layouts. + for its items. This information can be reused for example in ticket layouts. :param event: The event this property is defined for. :type event: Event @@ -2306,10 +2316,17 @@ class ItemProgramTime(models.Model): :type start: datetime :param end: The date and time this program time ends :type end: datetime + :param location: venue + :type location: str """ item = models.ForeignKey('Item', related_name='program_times', on_delete=models.CASCADE) start = models.DateTimeField(verbose_name=_("Start")) end = models.DateTimeField(verbose_name=_("End")) + location = I18nTextField( + null=True, blank=True, + max_length=200, + verbose_name=_("Location"), + ) def clean(self): if hasattr(self, 'item') and self.item and self.item.event.has_subevents: diff --git a/src/pretix/base/models/media.py b/src/pretix/base/models/media.py index d14dbdcc10..097c7803f4 100644 --- a/src/pretix/base/models/media.py +++ b/src/pretix/base/models/media.py @@ -72,6 +72,16 @@ class ReusableMedium(LoggedModel): max_length=200, verbose_name=pgettext_lazy('reusable_medium', 'Identifier'), ) + claim_token = models.CharField( + max_length=200, + verbose_name=pgettext_lazy('reusable_medium', 'Claim token'), + null=True, blank=True + ) + label = models.CharField( + max_length=200, + verbose_name=pgettext_lazy('reusable_medium', 'Label'), + null=True, blank=True + ) active = models.BooleanField( verbose_name=_('Active'), @@ -89,12 +99,14 @@ class ReusableMedium(LoggedModel): on_delete=models.SET_NULL, verbose_name=_('Customer account'), ) - linked_orderposition = models.ForeignKey( + linked_orderpositions = models.ManyToManyField( OrderPosition, - null=True, blank=True, related_name='linked_media', - on_delete=models.SET_NULL, - verbose_name=_('Linked ticket'), + verbose_name=_('Linked tickets'), + help_text=_( + 'If you link to more than one ticket, make sure there is no overlap in validity. ' + 'If multiple tickets are valid at once, this will lead to failed check-ins.' + ) ) linked_giftcard = models.ForeignKey( GiftCard, @@ -117,7 +129,10 @@ class ReusableMedium(LoggedModel): @property def is_expired(self): - return self.expires and self.expires > now() + return self.expires and self.expires < now() + + def touch(self): + self.save(update_fields=['updated']) class Meta: unique_together = (("identifier", "type", "organizer"),) diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index e74e450e8c..a58b5014a3 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -354,38 +354,60 @@ class Order(LockModel, LoggedModel): def _transaction_key_reset(self): self.__initial_status_paid_or_pending = self.status in (Order.STATUS_PENDING, Order.STATUS_PAID) and not self.require_approval - def gracefully_delete(self, user=None, auth=None): - from . import GiftCard, GiftCardTransaction, Membership, Voucher - - if not self.testmode: - raise TypeError("Only test mode orders can be deleted.") - self.log_action( - 'pretix.event.order.deleted', user=user, auth=auth, - data={ - 'code': self.code, - } + @classmethod + def gracefully_delete_bulk(cls, event, orders, user=None, auth=None): + # Expects to be called in a transaction + from . import ( + GiftCard, GiftCardTransaction, LogEntry, Membership, Voucher, ) - order_gracefully_delete.send(self.event, order=self) + if not transaction.get_connection().in_atomic_block: + raise Exception('gracefully_delete_bulk should only be called in atomic transaction!') - if self.status != Order.STATUS_CANCELED: - for position in self.positions.all(): - if position.voucher: - Voucher.objects.filter(pk=position.voucher.pk).update(redeemed=Greatest(0, F('redeemed') - 1)) + logs_create = [] + for o in orders: + if not o.testmode: + raise TypeError("Only test mode orders can be deleted.") + order_gracefully_delete.send(event, order=o) + logs_create.append(o.log_action( + 'pretix.event.order.deleted', user=user, auth=auth, + data={ + 'code': o.code, + }, + save=False, + )) + LogEntry.bulk_create_and_postprocess(logs_create) - GiftCardTransaction.objects.filter(payment__in=self.payments.all()).update(payment=None) - GiftCardTransaction.objects.filter(refund__in=self.refunds.all()).update(refund=None) - GiftCardTransaction.objects.filter(order=self).update(order=None) - GiftCard.objects.filter(issued_in__in=self.positions.all()).update(issued_in=None) - Membership.objects.filter(granted_in__order=self, testmode=True).update(granted_in=None) - OrderPosition.all.filter(order=self, addon_to__isnull=False).delete() - OrderPosition.all.filter(order=self).delete() - OrderFee.all.filter(order=self).delete() - Transaction.objects.filter(order=self).delete() - self.refunds.all().delete() - self.payments.all().delete() - self.event.cache.delete('complain_testmode_orders') - self.delete() + voucher_ids = OrderPosition.objects.filter( + order__in=orders, + voucher__isnull=False + ).exclude(order__status=Order.STATUS_CANCELED).values_list("voucher_id", flat=True) + voucher_usages = Counter(voucher_ids) + for v_id, usage_count in voucher_usages.items(): + Voucher.objects.filter(pk=v_id).update(redeemed=Greatest(0, F('redeemed') - usage_count)) + + GiftCardTransaction.objects.filter(payment__order__in=orders).update(payment=None) + GiftCardTransaction.objects.filter(refund__order__in=orders).update(refund=None) + GiftCardTransaction.objects.filter(order__in=orders).update(order=None) + GiftCard.objects.filter(issued_in__order__in=orders).update(issued_in=None) + Membership.objects.filter(granted_in__order__in=orders, testmode=True).update(granted_in=None) + OrderPosition.all.filter(order__in=orders, addon_to__isnull=False).delete() + OrderPosition.all.filter(order__in=orders).delete() + OrderFee.all.filter(order__in=orders).delete() + Transaction.objects.filter(order__in=orders).delete() + OrderRefund.objects.filter(order__in=orders).delete() + OrderPayment.objects.filter(order__in=orders).delete() + if isinstance(orders, models.QuerySet): + orders.delete() + else: + Order.objects.filter(pk__in=[o.pk for o in orders]).delete() + event.cache.delete('complain_testmode_orders') + + def gracefully_delete(self, user=None, auth=None): + if not self.testmode: + raise TypeError("Only test mode orders can be deleted.") + + Order.gracefully_delete_bulk(self.event, Order.objects.filter(pk=self.pk), user, auth) def email_confirm_secret(self): return self.tagged_secret("email_confirm", 9) @@ -1675,7 +1697,7 @@ class AbstractPosition(RoundingCorrectionMixin, models.Model): self.company, self.street, (self.zipcode or '') + ' ' + (self.city or '') + ' ' + (self.state_for_address or ''), - self.country.name + self.country.name if self.country else '' ] lines = [r.strip() for r in lines if r] return '\n'.join(lines).strip() @@ -3416,7 +3438,7 @@ class InvoiceAddress(models.Model): self.name, self.street, (self.zipcode or '') + ' ' + (self.city or '') + ' ' + (self.state_for_address or ''), - self.country.name, + self.country.name if self.country else '', self.vat_id, self.custom_field, self.internal_reference, diff --git a/src/pretix/base/models/organizer.py b/src/pretix/base/models/organizer.py index 65cff5edf3..37608d3dad 100644 --- a/src/pretix/base/models/organizer.py +++ b/src/pretix/base/models/organizer.py @@ -35,6 +35,7 @@ import operator import string from datetime import date, datetime, time from functools import reduce +from typing import TYPE_CHECKING import pytz_deprecation_shim from django.conf import settings @@ -61,6 +62,9 @@ from ...helpers.permission_migration import ( from ..settings import settings_hierarkey from .auth import User +if TYPE_CHECKING: + from hierarkey.proxy import HierarkeyProxy + @settings_hierarkey.add(cache_namespace='organizer') class Organizer(LoggedModel): @@ -78,6 +82,9 @@ class Organizer(LoggedModel): """ settings_namespace = 'organizer' + if TYPE_CHECKING: + settings: HierarkeyProxy + name = models.CharField(max_length=200, verbose_name=_("Name")) slug = models.CharField( diff --git a/src/pretix/base/models/seating.py b/src/pretix/base/models/seating.py index 49b7c4b5f8..133e6c85af 100644 --- a/src/pretix/base/models/seating.py +++ b/src/pretix/base/models/seating.py @@ -118,7 +118,10 @@ class SeatingPlan(LoggedModel): for zi, z in enumerate(self.layout_data['zones']): zpos = (z['position']['x'], z['position']['y']) for ri, r in enumerate(z['rows']): - rpos = (zpos[0] + r['position']['x'], zpos[1] + r['position']['y']) + rpos = ( + zpos[0] + r.get('position', {}).get('x', 0), + zpos[1] + r.get('position', {}).get('y', 0), + ) row_label = None if r.get('row_label'): row_label = r['row_label'].replace("%s", r.get('row_number', str(ri))) @@ -147,8 +150,8 @@ class SeatingPlan(LoggedModel): zone=z['name'], category=s['category'], sorting_rank=rank, - x=rpos[0] + s['position']['x'], - y=rpos[1] + s['position']['y'], + x=rpos[0] + s.get('position', {}).get('x', 0), + y=rpos[1] + s.get('position', {}).get('y', 0), ) diff --git a/src/pretix/base/notifications.py b/src/pretix/base/notifications.py index e29b947235..b254304761 100644 --- a/src/pretix/base/notifications.py +++ b/src/pretix/base/notifications.py @@ -43,7 +43,7 @@ from django.utils.translation import gettext_lazy as _, pgettext_lazy from pretix.base.models import Event, LogEntry from pretix.base.signals import register_notification_types from pretix.base.templatetags.money import money_filter -from pretix.helpers.urls import build_absolute_uri +from pretix.helpers.urls import mainreverse_absolute logger = logging.getLogger(__name__) _ALL_TYPES = None @@ -170,7 +170,7 @@ class ParametrizedOrderNotificationType(NotificationType): def build_notification(self, logentry: LogEntry): order = logentry.content_object - order_url = build_absolute_uri( + order_url = mainreverse_absolute( 'control:event.order', kwargs={ 'organizer': logentry.event.organizer.slug, diff --git a/src/pretix/base/payment.py b/src/pretix/base/payment.py index ddd42318f1..8efc58d495 100644 --- a/src/pretix/base/payment.py +++ b/src/pretix/base/payment.py @@ -71,7 +71,7 @@ from pretix.helpers import OF_SELF from pretix.helpers.countries import CachedCountries from pretix.helpers.format import format_map from pretix.helpers.money import DecimalTextInput -from pretix.multidomain.urlreverse import build_absolute_uri +from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.presale.views import get_cart from pretix.presale.views.cart import cart_session, get_or_create_cart_id @@ -379,7 +379,7 @@ class BasePaymentProvider: if not self.settings.get('_hidden_seed'): self.settings.set('_hidden_seed', get_random_string(64)) - hidden_url = build_absolute_uri(self.event, 'presale:event.payment.unlock', kwargs={ + hidden_url = eventreverse_absolute(self.event, 'presale:event.payment.unlock', kwargs={ 'hash': hashlib.sha256((self.settings._hidden_seed + self.event.slug).encode()).hexdigest(), }) @@ -834,7 +834,7 @@ class BasePaymentProvider: """ raise NotImplementedError() # NOQA - def execute_payment(self, request: HttpRequest, payment: OrderPayment) -> str: + def execute_payment(self, request: HttpRequest, payment: OrderPayment) -> str | None: """ After the user has confirmed their purchase, this method will be called to complete the payment process. This is the place to actually move the money if applicable. diff --git a/src/pretix/base/pdf.py b/src/pretix/base/pdf.py index 21a62e7e07..e4b8159c07 100644 --- a/src/pretix/base/pdf.py +++ b/src/pretix/base/pdf.py @@ -372,6 +372,11 @@ DEFAULT_VARIABLES = OrderedDict(( "editor_sample": _("Atlantis"), "evaluate": lambda op, order, ev: str(getattr(order.invoice_address.country, 'name', '')) if getattr(order, 'invoice_address', None) else '' }), + ("invoice_custom_field", { + "label": _("Invoice custom recipient field"), + "editor_sample": _("Custom recipient field"), + "evaluate": lambda op, order, ev: order.invoice_address.custom_field if getattr(order, 'invoice_address', None) else '' + }), ("addons", { "label": _("List of Add-Ons"), "editor_sample": _("Add-on 1\n2x Add-on 2"), @@ -498,9 +503,9 @@ DEFAULT_VARIABLES = OrderedDict(( ) if op.valid_until else "" }), ("program_times", { - "label": _("Program times: date and time"), + "label": _("Program times"), "editor_sample": _( - "2017-05-31 10:00 – 12:00\n2017-05-31 14:00 – 16:00\n2017-05-31 14:00 – 2017-06-01 14:00"), + "2017-05-31 10:00 – 12:00, Room 1\n2017-05-31 14:00 – 16:00, Room 2\n2017-05-31 14:00 – 2017-06-01 14:00, Building A"), "evaluate": lambda op, order, ev: get_program_times(op, ev) }), ("medium_identifier", { @@ -748,13 +753,19 @@ def get_seat(op: OrderPosition): def get_program_times(op: OrderPosition, ev: Event): - return '\n'.join([ - datetimerange( - pt.start.astimezone(ev.timezone), - pt.end.astimezone(ev.timezone), - as_html=False - ) for pt in op.item.program_times.all() - ]) + ptstr = [] + for pt in op.item.program_times.all(): + ptstr.append([ + datetimerange( + pt.start.astimezone(ev.timezone), + pt.end.astimezone(ev.timezone), + as_html=False + ), + (', ' + ', '.join( + l.strip() for l in str(pt.location).splitlines() if l.strip()) + ) if str(pt.location).strip() else '' + ]) + return '\n'.join(''.join(l) for l in ptstr) def generate_compressed_addon_list(op, order, event, only_checked_in=False): @@ -923,7 +934,7 @@ class Renderer: # We do not use str.format like in emails so we (a) can evaluate lazily and (b) can re-implement this # 1:1 on other platforms that render PDFs through our API (libpretixprint) - return re.sub(r'\{([a-zA-Z0-9:_]+)\}', replace, text) + return re.sub(r'\{([-a-zA-Z0-9:_]+)\}', replace, text) elif o['content'].startswith('itemmeta:'): if op.variation_id: @@ -1056,7 +1067,7 @@ class Renderer: except: logger.exception('Reshaping/Bidi fixes failed on string {}'.format(repr(text))) - p = Paragraph(text, style=style) + p = Paragraph(text, style=style) # not using AutoEscapeParagraph is safe as we escape above return p, ad, lineheight def _draw_textcontainer(self, canvas: Canvas, op: OrderPosition, order: Order, o: dict): diff --git a/src/pretix/base/plugins.py b/src/pretix/base/plugins.py index 35647a1ba6..a1e1eec71d 100644 --- a/src/pretix/base/plugins.py +++ b/src/pretix/base/plugins.py @@ -49,14 +49,39 @@ class PluginType(Enum): EXPORT = 4 +def plugin_is_available(meta, event=None, organizer=None): + if not hasattr(meta.app, 'is_available'): + return True + + level = getattr(meta, "level", PLUGIN_LEVEL_EVENT) + if level == PLUGIN_LEVEL_EVENT: + if event: + return meta.app.is_available(event) + elif organizer: + if not hasattr(organizer, '_plugin_availability_fallback_event'): + with scope(organizer=organizer): + setattr(organizer, '_plugin_availability_fallback_event', organizer.events.first()) + return ( + organizer._plugin_availability_fallback_event + and meta.app.is_available(organizer._plugin_availability_fallback_event) + ) + elif level == PLUGIN_LEVEL_ORGANIZER: + if organizer: + return meta.app.is_available(organizer) + elif event: + return meta.app.is_available(event.organizer) + elif level == PLUGIN_LEVEL_EVENT_ORGANIZER_HYBRID and (event or organizer): + return meta.app.is_available(event or organizer) + + return True + + def get_all_plugins(*, event=None, organizer=None) -> List[type]: """ Returns the PretixPluginMeta classes of all plugins found in the installed Django apps. """ assert not event or not organizer plugins = [] - event_fallback = None - event_fallback_used = False for app in apps.get_app_configs(): if hasattr(app, 'PretixPluginMeta'): meta = app.PretixPluginMeta @@ -65,28 +90,8 @@ def get_all_plugins(*, event=None, organizer=None) -> List[type]: if app.name in settings.PRETIX_PLUGINS_EXCLUDE: continue - level = getattr(meta, "level", PLUGIN_LEVEL_EVENT) - if level == PLUGIN_LEVEL_EVENT: - if event and hasattr(app, 'is_available'): - if not app.is_available(event): - continue - elif organizer and hasattr(app, 'is_available'): - if not event_fallback_used: - with scope(organizer=organizer): - event_fallback = organizer.events.first() - event_fallback_used = True - if not event_fallback or not app.is_available(event_fallback): - continue - elif level == PLUGIN_LEVEL_ORGANIZER: - if organizer and hasattr(app, 'is_available'): - if not app.is_available(organizer): - continue - elif event and hasattr(app, 'is_available'): - if not app.is_available(event.organizer): - continue - elif level == PLUGIN_LEVEL_EVENT_ORGANIZER_HYBRID and (event or organizer) and hasattr(app, 'is_available'): - if not app.is_available(event or organizer): - continue + if not plugin_is_available(meta, event, organizer): + continue plugins.append(meta) return sorted( diff --git a/src/pretix/base/services/cart.py b/src/pretix/base/services/cart.py index 59abf6c878..c9ddf51a9a 100644 --- a/src/pretix/base/services/cart.py +++ b/src/pretix/base/services/cart.py @@ -162,12 +162,12 @@ error_messages = { 'price_too_high': gettext_lazy('The entered price is to high.'), 'voucher_invalid': gettext_lazy('This voucher code is not known in our database.'), 'voucher_min_usages': ngettext_lazy( - 'The voucher code "%(voucher)s" can only be used if you select at least %(number)s matching products.', + 'The voucher code "%(voucher)s" can only be used if you select at least %(number)s matching product.', 'The voucher code "%(voucher)s" can only be used if you select at least %(number)s matching products.', 'number' ), 'voucher_min_usages_removed': ngettext_lazy( - 'The voucher code "%(voucher)s" can only be used if you select at least %(number)s matching products. ' + 'The voucher code "%(voucher)s" can only be used if you select at least %(number)s matching product. ' 'We have therefore removed some positions from your cart that can no longer be purchased like this.', 'The voucher code "%(voucher)s" can only be used if you select at least %(number)s matching products. ' 'We have therefore removed some positions from your cart that can no longer be purchased like this.', @@ -287,11 +287,11 @@ def _check_position_constraints( raise CartPositionError(error_messages['unavailable']) # Invalid media policy for online sale - if item.media_policy in (Item.MEDIA_POLICY_NEW, Item.MEDIA_POLICY_REUSE_OR_NEW): + if item.media_policy in (Item.MEDIA_POLICY_NEW, Item.MEDIA_POLICY_REUSE_OR_NEW, Item.MEDIA_POLICY_APPEND_OR_NEW, Item.MEDIA_POLICY_REUSE_OR_NEW): mt = MEDIA_TYPES[item.media_type] if not mt.medium_created_by_server: raise CartPositionError(error_messages['media_usage_not_implemented']) - elif item.media_policy == Item.MEDIA_POLICY_REUSE: + elif item.media_policy in (Item.MEDIA_POLICY_REUSE, Item.MEDIA_POLICY_APPEND): raise CartPositionError(error_messages['media_usage_not_implemented']) # Item removed from sales channel diff --git a/src/pretix/base/services/checkin.py b/src/pretix/base/services/checkin.py index ecf4cf7a9f..3ac7b6792b 100644 --- a/src/pretix/base/services/checkin.py +++ b/src/pretix/base/services/checkin.py @@ -867,6 +867,15 @@ class RequiredQuestionsError(Exception): super().__init__(msg) +class RequiredMediaExchangeError(Exception): + def __init__(self, msg, code, media_policy, media_type): + self.msg = msg + self.code = code + self.media_policy = media_policy + self.media_type = media_type + super().__init__(msg) + + def _save_answers(op, answers, given_answers): def _create_answer(question, answer): try: @@ -939,7 +948,7 @@ def perform_checkin(op: OrderPosition, clist: CheckinList, given_answers: dict, ignore_unpaid=False, nonce=None, datetime=None, questions_supported=True, user=None, auth=None, canceled_supported=False, type=Checkin.TYPE_ENTRY, raw_barcode=None, raw_source_type=None, from_revoked_secret=False, simulate=False, - gate=None): + gate=None, reusable_medium=None): """ Create a checkin for this particular order position and check-in list. Fails with CheckInError if the check in is not valid at this time. @@ -955,6 +964,7 @@ def perform_checkin(op: OrderPosition, clist: CheckinList, given_answers: dict, :param datetime: The datetime of the checkin, defaults to now. :param simulate: If true, the check-in is not saved. :param gate: The gate the check-in was performed at. + :param reusable_medium: The medium that is available for an exchange """ # !!!!!!!!! @@ -1035,7 +1045,7 @@ def perform_checkin(op: OrderPosition, clist: CheckinList, given_answers: dict, with transaction.atomic(): # Lock order positions, if it is an entry. We don't need it for exits, as a race condition wouldn't be problematic - opqs = OrderPosition.all + opqs = OrderPosition.all.select_related("order", "item") if type != Checkin.TYPE_EXIT: opqs = opqs.select_for_update(of=OF_SELF) op = opqs.get(pk=op.pk) @@ -1101,6 +1111,24 @@ def perform_checkin(op: OrderPosition, clist: CheckinList, given_answers: dict, require_answers ) + required_media_policy = op.item.media_policy + required_media_type = op.item.media_type + require_a_medium = required_media_policy and required_media_type + linked_media = op.linked_media + if require_a_medium and not reusable_medium and not force: + if not linked_media.exists(): + raise RequiredMediaExchangeError( + _('Ticket needs to be exchanged to a suitable medium.'), + 'exchange', + required_media_policy, + required_media_type + ) + elif op.organizer.settings.reusable_media_usage_enforced: + raise CheckInError( + _('This ticket has already been exchanged for a reusable medium that now needs to be used instead.'), + 'already_exchanged', + ) + device = None if isinstance(auth, Device): device = auth diff --git a/src/pretix/base/services/currencies.py b/src/pretix/base/services/currencies.py index 620f88b121..c8de3c4891 100644 --- a/src/pretix/base/services/currencies.py +++ b/src/pretix/base/services/currencies.py @@ -38,6 +38,7 @@ SOURCE_NAMES = { None: _('European Central Bank'), # backwards-compatibility 'eu:ecb:eurofxref-daily': _('European Central Bank'), 'cz:cnb:rate-fixing-daily': _('Czech National Bank'), + 'pl:nbp:table-a': _('National Bank of Poland'), } @@ -49,6 +50,7 @@ def fetch_rates(sender, **kwargs): source_tasks = { 'eu:ecb:eurofxref-daily': fetch_ecb_rates, 'cz:cnb:rate-fixing-daily': fetch_cnb_cz_rates, + 'pl:nbp:table-a': fetch_nbp_pl_rates, } for source_name, task in source_tasks.items(): @@ -144,3 +146,29 @@ def fetch_cnb_cz_rates(): rate=rate, ) ) + + +@app.task() +def fetch_nbp_pl_rates(): + """ + Fetches currency rates from the Polish National Bank. + """ + r = requests.get("https://api.nbp.pl/api/exchangerates/tables/A/", headers={ + "Accept": "application/json", + }) + r.raise_for_status() + data = r.json()[0] + + source_date = datetime.strptime(data["effectiveDate"], "%Y-%m-%d").date() + + for r in data["rates"]: + rate = Decimal(r["mid"]).quantize(Decimal('0.000001')) + ExchangeRate.objects.update_or_create( + source='pl:nbp:table-a', + source_currency=r["code"], + other_currency='PLN', + defaults=dict( + source_date=source_date, + rate=rate, + ) + ) diff --git a/src/pretix/base/services/export.py b/src/pretix/base/services/export.py index c04119cf67..93d2144970 100644 --- a/src/pretix/base/services/export.py +++ b/src/pretix/base/services/export.py @@ -51,7 +51,7 @@ from pretix.base.signals import ( ) from pretix.celery_app import app from pretix.helpers import OF_SELF, repeatable_reads_transaction -from pretix.helpers.urls import build_absolute_uri +from pretix.helpers.urls import mainreverse_absolute logger = logging.getLogger(__name__) @@ -455,7 +455,7 @@ def scheduled_organizer_export(self, organizer: Organizer, schedule: int) -> Non schedule, organizer, exporter, - build_absolute_uri( + mainreverse_absolute( 'control:organizer.export', kwargs={ 'organizer': organizer.slug, @@ -481,7 +481,7 @@ def scheduled_event_export(self, event: Event, schedule: int) -> None: schedule, event, exporter, - build_absolute_uri( + mainreverse_absolute( 'control:event.orders.export', kwargs={ 'event': event.slug, diff --git a/src/pretix/base/services/invoices.py b/src/pretix/base/services/invoices.py index 5e4e9666b0..75653e9081 100644 --- a/src/pretix/base/services/invoices.py +++ b/src/pretix/base/services/invoices.py @@ -205,6 +205,19 @@ def build_invoice(invoice: Invoice) -> Invoice: invoice.foreign_currency_rate = rate.rate.quantize(Decimal('0.0001'), ROUND_HALF_UP) invoice.foreign_currency_rate_date = rate.source_date invoice.foreign_currency_source = 'cz:cnb:rate-fixing-daily' + elif invoice.event.settings.invoice_eu_currencies == 'PLN' and invoice.event.currency != 'PLN': + invoice.foreign_currency_display = 'PLN' + if settings.FETCH_ECB_RATES: + rate = ExchangeRate.objects.filter( + source='pl:nbp:table-a', + source_currency=invoice.event.currency, + other_currency=invoice.foreign_currency_display, + source_date__gt=now().date() - timedelta(days=7) + ).first() + if rate: + invoice.foreign_currency_rate = rate.rate.quantize(Decimal('0.0001'), ROUND_HALF_UP) + invoice.foreign_currency_rate_date = rate.source_date + invoice.foreign_currency_source = 'pl:nbp:table-a' except InvoiceAddress.DoesNotExist: ia = None diff --git a/src/pretix/base/services/mail.py b/src/pretix/base/services/mail.py index b5fae6ba75..3b1b13f9d0 100644 --- a/src/pretix/base/services/mail.py +++ b/src/pretix/base/services/mail.py @@ -85,7 +85,7 @@ from pretix.helpers.format import ( FormattedString, PlainHtmlAlternativeString, SafeFormatter, format_map, ) from pretix.helpers.hierarkey import clean_filename -from pretix.multidomain.urlreverse import build_absolute_uri +from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.presale.ical import get_private_icals logger = logging.getLogger('pretix.base.mail') @@ -997,7 +997,7 @@ def _wrap_plain_body(content_plain, signature, event, order, position, no_order_ body_plain += _( "You can view your order details at the following URL:\n{orderurl}." ).replace("\n", "\r\n").format( - orderurl=build_absolute_uri( + orderurl=eventreverse_absolute( order.event, 'presale:event.order.position', kwargs={ 'order': order.code, 'secret': position.web_secret, @@ -1013,7 +1013,7 @@ def _wrap_plain_body(content_plain, signature, event, order, position, no_order_ body_plain += _( "You can view your order details at the following URL:\n{orderurl}." ).replace("\n", "\r\n").format( - event=event.name, orderurl=build_absolute_uri( + event=event.name, orderurl=eventreverse_absolute( order.event, 'presale:event.order.open', kwargs={ 'order': order.code, 'secret': order.secret, diff --git a/src/pretix/base/services/media.py b/src/pretix/base/services/media.py index c431e79ae3..6327242194 100644 --- a/src/pretix/base/services/media.py +++ b/src/pretix/base/services/media.py @@ -23,10 +23,13 @@ import secrets from django.db import IntegrityError from django.db.models import Q +from django.utils.translation import gettext as _ from django_scopes import scopes_disabled -from pretix.base.models import GiftCardAcceptance -from pretix.base.models.media import MediumKeySet +from pretix.base.media import MEDIA_TYPES +from pretix.base.models import Checkin, GiftCardAcceptance, Item +from pretix.base.models.media import MediumKeySet, ReusableMedium +from pretix.base.services.checkin import CheckInError def create_nfc_mf0aes_keyset(organizer): @@ -70,3 +73,174 @@ def get_keysets_for_organizer(organizer): if new_set: sets.append(new_set) return sets + + +def perform_media_exchange(organizer, media_type, identifier, link_orderposition, user, auth): + """ + Create or retrieve a medium, then link the order position to it. Expected to be called in a transaction. + + :param organizer: Organizer to operate in + :param media_type: Type of medium to operate with + :param identifier: Identifier of the medium + :param link_orderposition: Position to link to the medium + :return: ReusableMedium + """ + medium = None + media_policy = link_orderposition.item.media_policy + + if media_type not in MEDIA_TYPES: # should be caught by serializer already + raise CheckInError( + _('Invalid medium type.'), + Checkin.REASON_ERROR, + reason=_('Invalid medium type.'), + ) + + if not MEDIA_TYPES[media_type].is_active(organizer): + raise CheckInError( + _('Medium type is not enabled for organizer.'), + Checkin.REASON_ERROR, + reason=_('Medium type is not enabled for organizer.'), + ) + + if link_orderposition.item.media_type != media_type: + raise CheckInError( + _('Incorrect medium type for product.'), + Checkin.REASON_PRODUCT, + reason=_('Incorrect medium type for product.'), + ) + + if link_orderposition.linked_media.exists(): + raise CheckInError( + _('Ticket is already exchanged for reusable medium.'), + Checkin.REASON_ALREADY_EXCHANGED, + reason=_('Ticket is already exchanged for reusable medium.'), + ) + + if media_policy in (Item.MEDIA_POLICY_APPEND, Item.MEDIA_POLICY_APPEND_OR_NEW, Item.MEDIA_POLICY_NEW): + link_action = "append" + else: + link_action = "replace" + + if media_policy in (Item.MEDIA_POLICY_REUSE, Item.MEDIA_POLICY_APPEND): + try: + medium = ReusableMedium.objects.get( + type=media_type, + identifier=identifier, + organizer=organizer, + ) + except ReusableMedium.DoesNotExist: + raise CheckInError( + _('Reusable medium not found.'), + Checkin.REASON_MEDIUM_INVALID, + reason=_('Reusable medium not found.'), + ) + else: + if medium.is_expired or not medium.active: + raise CheckInError( + _('Reusable medium is inactive or expired.'), + Checkin.REASON_MEDIUM_INVALID, + reason=_('Reusable medium is inactive or expired.'), + ) + + elif media_policy in (Item.MEDIA_POLICY_REUSE_OR_NEW, Item.MEDIA_POLICY_APPEND_OR_NEW): + try: + medium = ReusableMedium.objects.get( + type=media_type, + identifier=identifier, + organizer=organizer, + ) + except ReusableMedium.DoesNotExist: + if not MEDIA_TYPES[media_type].medium_created_from_unknown_supported: + raise CheckInError( + _('Reusable medium not found and could not be created.'), + Checkin.REASON_MEDIUM_INVALID, + ) + + medium = MEDIA_TYPES[media_type].handle_unknown(organizer, identifier, user, auth, force_create=True) + if not medium: + raise CheckInError( + _('Reusable medium not found and could not be created.'), + Checkin.REASON_MEDIUM_INVALID, + ) + + if medium.is_expired or not medium.active: + raise CheckInError( + _('Reusable medium is inactive or expired.'), + Checkin.REASON_MEDIUM_INVALID, + reason=_('Reusable medium is inactive or expired.'), + ) + + elif media_policy == Item.MEDIA_POLICY_NEW: + if not MEDIA_TYPES[media_type].medium_created_from_unknown_supported: + raise CheckInError( + _('Reusable medium not found and could not be created.'), + Checkin.REASON_MEDIUM_INVALID, + ) + try: + medium = MEDIA_TYPES[media_type].handle_unknown(organizer, identifier, user, auth, force_create=True) + except IntegrityError: + raise CheckInError( + _('Reusable medium already exists.'), + Checkin.REASON_MEDIUM_EXISTS, + ) + else: + if not medium: + raise CheckInError( + _('Reusable medium could not be created.'), + Checkin.REASON_MEDIUM_INVALID, + ) + + else: + raise CheckInError( + _('Product does not support medium exchange.'), + Checkin.REASON_PRODUCT, + reason=_('Product does not support medium exchange.'), + ) + + if link_action == 'append': + medium.linked_orderpositions.add(link_orderposition) + medium.log_action( + 'pretix.reusable_medium.linked_orderposition.added', + user=user, + auth=auth, + data={ + 'linked_orderposition': link_orderposition, + } + ) + elif link_action == 'replace': + already_found = False + for op_pk in medium.linked_orderpositions.values_list('pk', flat=True): + if op_pk == link_orderposition.pk: + already_found = True + continue + else: + medium.log_action( + 'pretix.reusable_medium.linked_orderposition.removed', + data={ + 'linked_orderposition': op_pk, + } + ) + if not already_found: + medium.linked_orderpositions.set([link_orderposition]) + medium.log_action( + 'pretix.reusable_medium.linked_orderposition.added', + user=user, + auth=auth, + data={ + 'linked_orderposition': link_orderposition, + } + ) + + link_orderposition.order.log_action( + 'pretix.reusable_medium.exchanged', + data={ + 'position': link_orderposition.pk, + 'positionid': link_orderposition.positionid, + 'medium': medium.pk, + 'medium_identifier': medium.identifier, + 'medium_type': medium.media_type.identifier, + } + ) + medium.touch() + + return medium diff --git a/src/pretix/base/services/modelimport.py b/src/pretix/base/services/modelimport.py index 3ef774b70a..8ed36dc44c 100644 --- a/src/pretix/base/services/modelimport.py +++ b/src/pretix/base/services/modelimport.py @@ -26,8 +26,9 @@ from typing import List from django.conf import settings as django_settings from django.core.exceptions import ValidationError from django.db import transaction +from django.db.utils import IntegrityError from django.utils.timezone import now -from django.utils.translation import gettext as _ +from django.utils.translation import gettext as _, ngettext from pretix.base.i18n import language from pretix.base.modelimport import DataImportError, ImportColumn, parse_csv @@ -260,6 +261,7 @@ def import_vouchers(event: Event, fileid: str, settings: dict, locale: str, user # Prepare model objects. Yes, this might consume lots of RAM, but allows us to make the actual SQL transaction # shorter. We'll see what works better in reality… vouchers = [] + codes = set() lock_seats = [] for i, record in enumerate(data): try: @@ -268,6 +270,14 @@ def import_vouchers(event: Event, fileid: str, settings: dict, locale: str, user if not record.get("code"): raise ValidationError(_('A voucher cannot be created without a code.')) + code = record.get("code") + if code.upper() in codes: + raise ValidationError( + _('Voucher codes must be unique. Code "{code}" already exists in this import.').format( + code=code, + ) + ) + codes.add(code.upper()) Voucher.clean_item_properties( record, event, @@ -286,8 +296,22 @@ def import_vouchers(event: Event, fileid: str, settings: dict, locale: str, user lock_seats.append(voucher.seat) except (ValidationError, ImportError) as e: raise DataImportError( - _('Invalid data in row {row}: {message}').format(row=i, message=str(e)) + _('Invalid data in row {row}: {message}').format(row=i + 1, message=str(e)) ) + existing_codes = Voucher.objects.filter( + event=event, + code__in=codes, + ).values_list("code", flat=True) + if len(existing_codes): + raise DataImportError( + ngettext( + 'Voucher codes must be unique. Import contains existing voucher code {code}.', + 'Voucher codes must be unique. Import contains existing voucher codes {code}.', + len(existing_codes) + ).format( + code=", ".join(existing_codes) + ) + ) with transaction.atomic(): # We don't support quotas here, so we only need to lock if seats are in use @@ -300,7 +324,13 @@ def import_vouchers(event: Event, fileid: str, settings: dict, locale: str, user save_logentries = [] for v in vouchers: - v.save() + try: + v.save() + except IntegrityError: + # should not happen as we check existing codes before, but we did not lock so we might have a race-condition + raise DataImportError( + _('Vouchers could not be imported, probably due to a voucher code already being in use.') + ) save_logentries.append(v.log_action( 'pretix.voucher.added', user=user, diff --git a/src/pretix/base/services/notifications.py b/src/pretix/base/services/notifications.py index 0a70e7c32d..950e111c6e 100644 --- a/src/pretix/base/services/notifications.py +++ b/src/pretix/base/services/notifications.py @@ -37,7 +37,7 @@ from pretix.base.services.tasks import ProfiledTask, TransactionAwareTask from pretix.base.signals import notification from pretix.celery_app import app from pretix.helpers.celery import get_task_priority -from pretix.helpers.urls import build_absolute_uri +from pretix.helpers.urls import mainreverse_absolute @app.task(base=TransactionAwareTask, acks_late=True, max_retries=9, default_retry_delay=900) @@ -136,10 +136,10 @@ def send_notification_mail(notification: Notification, user: User): 'site_url': settings.SITE_URL, 'color': settings.PRETIX_PRIMARY_COLOR, 'notification': notification, - 'settings_url': build_absolute_uri( + 'settings_url': mainreverse_absolute( 'control:user.settings.notifications', ), - 'disable_url': build_absolute_uri( + 'disable_url': mainreverse_absolute( 'control:user.settings.notifications.off', kwargs={ 'token': user.notifications_token, diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 15168acbfd..f67748801b 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -733,8 +733,6 @@ def _check_positions(event: Event, now_dt: datetime, time_machine_now_dt: dateti _check_date(event, time_machine_now_dt) products_seen = Counter() - q_avail = Counter() - v_avail = Counter() v_usages = Counter() v_budget = {} deleted_positions = set() @@ -799,6 +797,9 @@ def _check_positions(event: Event, now_dt: datetime, time_machine_now_dt: dateti shared_lock_objects=[event] ) + q_avail = Counter() + v_avail = Counter() + # Check maximum order size limit = min(int(event.settings.max_items_per_order), settings.PRETIX_MAX_ORDER_SIZE) if sum(1 for cp in sorted_positions if not cp.addon_to) > limit: @@ -3492,7 +3493,7 @@ def signal_listener_issue_media(sender: Event, order: Order, **kwargs): from pretix.base.models import ReusableMedium for p in order.positions.all(): - if p.item.media_policy in (Item.MEDIA_POLICY_NEW, Item.MEDIA_POLICY_REUSE_OR_NEW): + if p.item.media_policy in (Item.MEDIA_POLICY_NEW, Item.MEDIA_POLICY_REUSE_OR_NEW, Item.MEDIA_POLICY_APPEND_OR_NEW): mt = MEDIA_TYPES[p.item.media_type] if mt.medium_created_by_server and not p.linked_media.exists(): rm = ReusableMedium.objects.create( @@ -3501,8 +3502,8 @@ def signal_listener_issue_media(sender: Event, order: Order, **kwargs): identifier=mt.generate_identifier(sender.organizer), active=True, customer=order.customer, - linked_orderposition=p, ) + rm.linked_orderpositions.add(p) rm.log_action( 'pretix.reusable_medium.created', data={ diff --git a/src/pretix/base/services/placeholders.py b/src/pretix/base/services/placeholders.py index f9b81554d3..1776b25e0e 100644 --- a/src/pretix/base/services/placeholders.py +++ b/src/pretix/base/services/placeholders.py @@ -327,7 +327,7 @@ def get_best_name(position_or_address, parts=False): @receiver(register_text_placeholders, dispatch_uid="pretixbase_register_text_placeholders") def base_placeholders(sender, **kwargs): - from pretix.multidomain.urlreverse import build_absolute_uri + from pretix.multidomain.urlreverse import eventreverse_absolute def _event_sample(event): if event.has_subevents: @@ -388,14 +388,14 @@ def base_placeholders(sender, **kwargs): lambda event: LazyDate(now() + timedelta(days=15)) ), SimpleFunctionalTextPlaceholder( - 'url', ['order', 'event'], lambda order, event: build_absolute_uri( + 'url', ['order', 'event'], lambda order, event: eventreverse_absolute( event, 'presale:event.order.open', kwargs={ 'order': order.code, 'secret': order.secret, 'hash': order.email_confirm_secret() } - ), lambda event: build_absolute_uri( + ), lambda event: eventreverse_absolute( event, 'presale:event.order.open', kwargs={ 'order': 'F8VVL', @@ -406,7 +406,7 @@ def base_placeholders(sender, **kwargs): ), SimpleButtonPlaceholder( 'url_button', ['order', 'event'], - url_func=lambda order, event: build_absolute_uri( + url_func=lambda order, event: eventreverse_absolute( event, 'presale:event.order.open', kwargs={ 'order': order.code, @@ -415,7 +415,7 @@ def base_placeholders(sender, **kwargs): } ), text_func=lambda order, event: _("View order details"), - sample_url_func=lambda event: build_absolute_uri( + sample_url_func=lambda event: eventreverse_absolute( event, 'presale:event.order.open', kwargs={ 'order': 'F8VVL', @@ -426,13 +426,13 @@ def base_placeholders(sender, **kwargs): sample_text_func=lambda event: _("View order details"), ), SimpleFunctionalTextPlaceholder( - 'url_info_change', ['order', 'event'], lambda order, event: build_absolute_uri( + 'url_info_change', ['order', 'event'], lambda order, event: eventreverse_absolute( event, 'presale:event.order.modify', kwargs={ 'order': order.code, 'secret': order.secret, } - ), lambda event: build_absolute_uri( + ), lambda event: eventreverse_absolute( event, 'presale:event.order.modify', kwargs={ 'order': 'F8VVL', @@ -441,13 +441,13 @@ def base_placeholders(sender, **kwargs): ), ), SimpleFunctionalTextPlaceholder( - 'url_products_change', ['order', 'event'], lambda order, event: build_absolute_uri( + 'url_products_change', ['order', 'event'], lambda order, event: eventreverse_absolute( event, 'presale:event.order.change', kwargs={ 'order': order.code, 'secret': order.secret, } - ), lambda event: build_absolute_uri( + ), lambda event: eventreverse_absolute( event, 'presale:event.order.change', kwargs={ 'order': 'F8VVL', @@ -456,13 +456,13 @@ def base_placeholders(sender, **kwargs): ), ), SimpleFunctionalTextPlaceholder( - 'url_cancel', ['order', 'event'], lambda order, event: build_absolute_uri( + 'url_cancel', ['order', 'event'], lambda order, event: eventreverse_absolute( event, 'presale:event.order.cancel', kwargs={ 'order': order.code, 'secret': order.secret, } - ), lambda event: build_absolute_uri( + ), lambda event: eventreverse_absolute( event, 'presale:event.order.cancel', kwargs={ 'order': 'F8VVL', @@ -471,7 +471,7 @@ def base_placeholders(sender, **kwargs): ), ), SimpleFunctionalTextPlaceholder( - 'url', ['event', 'position'], lambda event, position: build_absolute_uri( + 'url', ['event', 'position'], lambda event, position: eventreverse_absolute( event, 'presale:event.order.position', kwargs={ @@ -480,7 +480,7 @@ def base_placeholders(sender, **kwargs): 'position': position.positionid } ), - lambda event: build_absolute_uri( + lambda event: eventreverse_absolute( event, 'presale:event.order.position', kwargs={ 'order': 'F8VVL', @@ -491,7 +491,7 @@ def base_placeholders(sender, **kwargs): ), SimpleButtonPlaceholder( 'url_button', ['event', 'position'], - url_func=lambda event, position: build_absolute_uri( + url_func=lambda event, position: eventreverse_absolute( event, 'presale:event.order.position', kwargs={ 'order': position.order.code, @@ -500,7 +500,7 @@ def base_placeholders(sender, **kwargs): } ), text_func=lambda event, position: _("View registration details"), - sample_url_func=lambda event: build_absolute_uri( + sample_url_func=lambda event: eventreverse_absolute( event, 'presale:event.order.position', kwargs={ 'order': 'F8VVL', @@ -511,14 +511,14 @@ def base_placeholders(sender, **kwargs): sample_text_func=lambda event: _("View registration details"), ), SimpleFunctionalTextPlaceholder( - 'url_info_change', ['position', 'event'], lambda position, event: build_absolute_uri( + 'url_info_change', ['position', 'event'], lambda position, event: eventreverse_absolute( event, 'presale:event.order.position.modify', kwargs={ 'order': position.order.code, 'secret': position.web_secret, 'position': position.positionid } - ), lambda event: build_absolute_uri( + ), lambda event: eventreverse_absolute( event, 'presale:event.order.position.modify', kwargs={ 'order': 'F8VVL', @@ -528,14 +528,14 @@ def base_placeholders(sender, **kwargs): ), ), SimpleFunctionalTextPlaceholder( - 'url_products_change', ['position', 'event'], lambda position, event: build_absolute_uri( + 'url_products_change', ['position', 'event'], lambda position, event: eventreverse_absolute( event, 'presale:event.order.position.change', kwargs={ 'order': position.order.code, 'secret': position.web_secret, 'position': position.positionid } - ), lambda event: build_absolute_uri( + ), lambda event: eventreverse_absolute( event, 'presale:event.order.position.change', kwargs={ 'order': 'F8VVL', @@ -581,20 +581,20 @@ def base_placeholders(sender, **kwargs): ), SimpleFunctionalTextPlaceholder( 'url_remove', ['waiting_list_voucher', 'event'], - lambda waiting_list_voucher, event: build_absolute_uri( + lambda waiting_list_voucher, event: eventreverse_absolute( event, 'presale:event.waitinglist.remove' ) + '?voucher=' + waiting_list_voucher.code, - lambda event: build_absolute_uri( + lambda event: eventreverse_absolute( event, 'presale:event.waitinglist.remove', ) + '?voucher=68CYU2H6ZTP3WLK5', ), SimpleFunctionalTextPlaceholder( 'url', ['waiting_list_voucher', 'event'], - lambda waiting_list_voucher, event: build_absolute_uri( + lambda waiting_list_voucher, event: eventreverse_absolute( event, 'presale:event.redeem' ) + '?voucher=' + waiting_list_voucher.code, - lambda event: build_absolute_uri( + lambda event: eventreverse_absolute( event, 'presale:event.redeem', ) + '?voucher=68CYU2H6ZTP3WLK5', @@ -611,7 +611,7 @@ def base_placeholders(sender, **kwargs): 'orders', ['event', 'orders'], lambda event, orders: '\n' + '\n\n'.join( '* {} - {}'.format( order.full_code, - build_absolute_uri(event, 'presale:event.order.open', kwargs={ + eventreverse_absolute(event, 'presale:event.order.open', kwargs={ 'event': event.slug, 'organizer': event.organizer.slug, 'order': order.code, @@ -623,7 +623,7 @@ def base_placeholders(sender, **kwargs): ), lambda event: '\n' + '\n\n'.join( '* {} - {}'.format( '{}-{}'.format(event.slug.upper(), order['code']), - build_absolute_uri(event, 'presale:event.order.open', kwargs={ + eventreverse_absolute(event, 'presale:event.order.open', kwargs={ 'event': event.slug, 'organizer': event.organizer.slug, 'order': order['code'], @@ -662,13 +662,13 @@ def base_placeholders(sender, **kwargs): # join vouchers with two spaces at end of line so markdown-parser inserts a
'voucher_url_list', ['event', 'voucher_list'], lambda event, voucher_list: ' \n'.join([ - build_absolute_uri( + eventreverse_absolute( event, 'presale:event.redeem' ) + '?voucher=' + c for c in voucher_list ]), lambda event: ' \n'.join([ - build_absolute_uri( + eventreverse_absolute( event, 'presale:event.redeem' ) + '?voucher=' + c for c in ['68CYU2H6ZTP3WLK5', '7MB94KKPVEPSMVF2'] @@ -676,10 +676,10 @@ def base_placeholders(sender, **kwargs): inline=False, ), SimpleFunctionalTextPlaceholder( - 'url', ['event', 'voucher_list'], lambda event, voucher_list: build_absolute_uri(event, 'presale:event.index', kwargs={ + 'url', ['event', 'voucher_list'], lambda event, voucher_list: eventreverse_absolute(event, 'presale:event.index', kwargs={ 'event': event.slug, 'organizer': event.organizer.slug, - }), lambda event: build_absolute_uri(event, 'presale:event.index', kwargs={ + }), lambda event: eventreverse_absolute(event, 'presale:event.index', kwargs={ 'event': event.slug, 'organizer': event.organizer.slug, }) diff --git a/src/pretix/base/services/update_check.py b/src/pretix/base/services/update_check.py index 5a23b33884..af06ece097 100644 --- a/src/pretix/base/services/update_check.py +++ b/src/pretix/base/services/update_check.py @@ -37,7 +37,7 @@ from pretix.base.services.mail import mail from pretix.base.settings import GlobalSettingsObject from pretix.base.signals import periodic_task from pretix.celery_app import app -from pretix.helpers.urls import build_absolute_uri +from pretix.helpers.urls import mainreverse_absolute @receiver(signal=periodic_task) @@ -121,7 +121,7 @@ def send_update_notification_email(): ) ), { - 'url': build_absolute_uri('control:global.update') + 'url': mainreverse_absolute('control:global.update') }, ) diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 940f621920..53fbbfda37 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -211,12 +211,25 @@ DEFAULTS = { 'form_class': forms.BooleanField, 'serializer_class': serializers.BooleanField, 'form_kwargs': dict( - label=_("Activate re-usable media"), - help_text=_("The re-usable media feature allows you to connect tickets and gift cards with physical media " - "such as wristbands or chip cards that may be re-used for different tickets or gift cards " + label=_("Activate reusable media"), + help_text=_("The reusable media feature allows you to connect tickets and gift cards with physical media " + "such as wristbands or chip cards that may be reused for different tickets or gift cards " "later.") ) }, + 'reusable_media_usage_enforced': { + 'default': 'False', + 'type': bool, + 'form_class': forms.BooleanField, + 'serializer_class': serializers.BooleanField, + 'form_kwargs': dict( + label=_("Enforce the usage of issued reusable media for check-in"), + help_text=_("If enabled, a ticket barcode will not be accepted anymore, if a reusable medium has been " + "created and linked to a ticket. Keeping this option turned off will treat the reusable " + "medium and ticket as equals."), + widget=forms.CheckboxInput(attrs={'data-display-dependency': '#id_settings-reusable_media_active'}), + ) + }, 'reusable_media_type_barcode': { 'default': 'False', 'type': bool, @@ -574,6 +587,7 @@ DEFAULTS = { ('True', _('Based on European Central Bank daily rates, whenever the invoice recipient is in an EU ' 'country that uses a different currency.')), ('CZK', _('Based on Czech National Bank daily rates, whenever the invoice amount is not in CZK.')), + ('PLN', _('Based on National Bank of Poland daily rates, whenever the invoice amount is not in PLN.')), ), ), 'serializer_kwargs': dict( @@ -582,6 +596,7 @@ DEFAULTS = { ('True', _('Based on European Central Bank daily rates, whenever the invoice recipient is in an EU ' 'country that uses a different currency.')), ('CZK', _('Based on Czech National Bank daily rates, whenever the invoice amount is not in CZK.')), + ('PLN', _('Based on National Bank of Poland daily rates, whenever the invoice amount is not in PLN.')), ), ), }, @@ -1261,7 +1276,7 @@ DEFAULTS = { 'serializer_class': serializers.BooleanField, 'write_permission': 'event.settings.invoicing:write', 'form_kwargs': dict( - label=_("Allow to update existing invoices"), + label=_("Allow updating existing invoices"), help_text=_("By default, invoices can never again be changed once they are issued. In most countries, we " "recommend to leave this option turned off and always issue a new invoice if a change needs " "to be made."), @@ -1909,8 +1924,6 @@ DEFAULTS = { 'serializer_class': serializers.BooleanField, 'form_kwargs': dict( label=_("Hide all past dates from calendar"), - help_text=_("This option currently only affects the calendar of this event series, not the organizer-wide " - "calendar.") ) }, 'allow_modifications': { @@ -3712,7 +3725,11 @@ Your {organizer} team""")) # noqa: W291 # To maintain backwards-compatibility, we provide Stripe's ApplePay MerchantID Domain Validation Certificate by default 'default': "7B227073704964223A2239373943394538343346343131343044463144313834343232393232313734313034353044314339464446394437384337313531303944334643463542433731222C2276657273696F6E223A312C22637265617465644F6E223A313536363233343735303036312C227369676E6174757265223A22333038303036303932613836343838366637306430313037303261303830333038303032303130313331306633303064303630393630383634383031363530333034303230313035303033303830303630393261383634383836663730643031303730313030303061303830333038323033653333303832303338386130303330323031303230323038346333303431343935313964353433363330306130363038326138363438636533643034303330323330376133313265333032633036303335353034303330633235343137303730366336353230343137303730366336393633363137343639366636653230343936653734363536373732363137343639366636653230343334313230326432303437333333313236333032343036303335353034306230633164343137303730366336353230343336353732373436393636363936333631373436393666366532303431373537343638366637323639373437393331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533333031653137306433313339333033353331333833303331333333323335333735613137306433323334333033353331333633303331333333323335333735613330356633313235333032333036303335353034303330633163363536333633326437333664373032643632373236663662363537323264373336393637366535663535343333343264353035323466343433313134333031323036303335353034306230633062363934663533323035333739373337343635366437333331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533333035393330313330363037326138363438636533643032303130363038326138363438636533643033303130373033343230303034633231353737656465626436633762323231386636386464373039306131323138646337623062643666326332383364383436303935643934616634613534313162383334323065643831316633343037653833333331663163353463336637656233323230643662616435643465666634393238393839336537633066313361333832303231313330383230323064333030633036303335353164313330313031666630343032333030303330316630363033353531643233303431383330313638303134323366323439633434663933653465663237653663346636323836633366613262626664326534623330343530363038326230363031303530353037303130313034333933303337333033353036303832623036303130353035303733303031383632393638373437343730336132663266366636333733373032653631373037303663363532653633366636643266366636333733373033303334326436313730373036633635363136393633363133333330333233303832303131643036303335353164323030343832303131343330383230313130333038323031306330363039326138363438383666373633363430353031333038316665333038316333303630383262303630313035303530373032303233303831623630633831623335323635366336393631366536333635323036663665323037343638363937333230363336353732373436393636363936333631373436353230363237393230363136653739323037303631373237343739323036313733373337353664363537333230363136333633363537303734363136653633363532303666363632303734363836353230373436383635366532303631373037303663363936333631363236633635323037333734363136653634363137323634323037343635373236643733323036313665363432303633366636653634363937343639366636653733323036663636323037353733363532633230363336353732373436393636363936333631373436353230373036663663363936333739323036313665363432303633363537323734363936363639363336313734363936663665323037303732363136333734363936333635323037333734363137343635366436353665373437333265333033363036303832623036303130353035303730323031313632613638373437343730336132663266373737373737326536313730373036633635326536333666366432663633363537323734363936363639363336313734363536313735373436383666373236393734373932663330333430363033353531643166303432643330326233303239613032376130323538363233363837343734373033613266326636333732366332653631373037303663363532653633366636643266363137303730366336353631363936333631333332653633373236633330316430363033353531643065303431363034313439343537646236666435373438313836383938393736326637653537383530376537396235383234333030653036303335353164306630313031666630343034303330323037383033303066303630393261383634383836663736333634303631643034303230353030333030613036303832613836343863653364303430333032303334393030333034363032323130306265303935373166653731653165373335623535653561666163623463373266656234343566333031383532323263373235313030326236316562643666353530323231303064313862333530613564643664643665623137343630333562313165623263653837636661336536616636636264383338303839306463383263646461613633333038323032656533303832303237356130303330323031303230323038343936643266626633613938646139373330306130363038326138363438636533643034303330323330363733313162333031393036303335353034303330633132343137303730366336353230353236663666373432303433343132303264323034373333333132363330323430363033353530343062306331643431373037303663363532303433363537323734363936363639363336313734363936663665323034313735373436383666373236393734373933313133333031313036303335353034306130633061343137303730366336353230343936653633326533313062333030393036303335353034303631333032353535333330316531373064333133343330333533303336333233333334333633333330356131373064333233393330333533303336333233333334333633333330356133303761333132653330326330363033353530343033306332353431373037303663363532303431373037303663363936333631373436393666366532303439366537343635363737323631373436393666366532303433343132303264323034373333333132363330323430363033353530343062306331643431373037303663363532303433363537323734363936363639363336313734363936663665323034313735373436383666373236393734373933313133333031313036303335353034306130633061343137303730366336353230343936653633326533313062333030393036303335353034303631333032353535333330353933303133303630373261383634386365336430323031303630383261383634386365336430333031303730333432303030346630313731313834313964373634383564353161356532353831303737366538383061326566646537626165346465303864666334623933653133333536643536363562333561653232643039373736306432323465376262613038666437363137636538386362373662623636373062656338653832393834666635343435613338316637333038316634333034363036303832623036303130353035303730313031303433613330333833303336303630383262303630313035303530373330303138363261363837343734373033613266326636663633373337303265363137303730366336353265363336663664326636663633373337303330333432643631373037303663363537323666366637343633363136373333333031643036303335353164306530343136303431343233663234396334346639336534656632376536633466363238366333666132626266643265346233303066303630333535316431333031303166663034303533303033303130316666333031663036303335353164323330343138333031363830313462626230646561313538333338383961613438613939646562656264656261666461636232346162333033373036303335353164316630343330333032653330326361303261613032383836323636383734373437303361326632663633373236633265363137303730366336353265363336663664326636313730373036633635373236663666373436333631363733333265363337323663333030653036303335353164306630313031666630343034303330323031303633303130303630613261383634383836663736333634303630323065303430323035303033303061303630383261383634386365336430343033303230333637303033303634303233303361636637323833353131363939623138366662333563333536636136326266663431376564643930663735346461323865626566313963383135653432623738396638393866373962353939663938643534313064386639646539633266653032333033323264643534343231623061333035373736633564663333383362393036376664313737633263323136643936346663363732363938323132366635346638376137643162393963623962303938393231363130363939306630393932316430303030333138323031386233303832303138373032303130313330383138363330376133313265333032633036303335353034303330633235343137303730366336353230343137303730366336393633363137343639366636653230343936653734363536373732363137343639366636653230343334313230326432303437333333313236333032343036303335353034306230633164343137303730366336353230343336353732373436393636363936333631373436393666366532303431373537343638366637323639373437393331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533303230383463333034313439353139643534333633303064303630393630383634383031363530333034303230313035303061303831393533303138303630393261383634383836663730643031303930333331306230363039326138363438383666373064303130373031333031633036303932613836343838366637306430313039303533313066313730643331333933303338333133393331333733313332333333303561333032613036303932613836343838366637306430313039333433313164333031623330306430363039363038363438303136353033303430323031303530306131306130363038326138363438636533643034303330323330326630363039326138363438383666373064303130393034333132323034323062303731303365313430613462386231376262613230316130336163643036396234653431366232613263383066383661383338313435633239373566633131333030613036303832613836343863653364303430333032303434363330343430323230343639306264636637626461663833636466343934396534633035313039656463663334373665303564373261313264376335666538633033303033343464663032323032363764353863393365626233353031333836363062353730373938613064643731313734316262353864626436613138363633353038353431656565393035303030303030303030303030227D", # NoQA 'type': str, - } + }, + 'widget_vite_origins': { + 'default': '', + 'type': str, + }, } PERSON_NAME_TITLE_GROUPS = OrderedDict([ ('english_common', (_('Most common English titles'), ( diff --git a/src/pretix/base/templates/error.html b/src/pretix/base/templates/error.html index 2dcc3e9fa4..333c8267b0 100644 --- a/src/pretix/base/templates/error.html +++ b/src/pretix/base/templates/error.html @@ -11,6 +11,7 @@ + {% block custom_header %}{% endblock %} {% if css_theme %} @@ -21,5 +22,4 @@ {% block content %}{% endblock %} - diff --git a/src/pretix/base/templates/pretixbase/email/notification.html b/src/pretix/base/templates/pretixbase/email/notification.html index cb7d9e7e96..76b70c2ddb 100644 --- a/src/pretix/base/templates/pretixbase/email/notification.html +++ b/src/pretix/base/templates/pretixbase/email/notification.html @@ -55,10 +55,12 @@ {% trans "You receive these emails based on your notification settings." %}
{% trans "Click here to view and change your notification settings" %} -
- - {% trans "Click here disable all notifications immediately." %} + {% if disable_url %}
+ + {% trans "Click here disable all notifications immediately." %} + + {% endif %} -
-
- -
-
- -
-
- - -
-

- {% trans "Your rule always filters by product or variation, but the following products or variations are not contained in any of your rule parts so people with these tickets will not get in:" %} -

-
    -
  • {{ "{" }}{h}{{ "}" }}
  • -
-

- {% trans "Please double-check if this was intentional." %} -

-
+
+
{{ form.rules }} @@ -125,13 +89,10 @@
- {{ items|json_script:"items" }} - - {% if DEBUG %} - - {% else %} - + {% if items %} + {{ items|json_script:"items" }} {% endif %} + {% compress js %} @@ -144,15 +105,6 @@ {% endcompress %} - {% compress js %} - - - - - - - - - - {% endcompress %} + {% vite_hmr %} + {% vite_asset "src/pretix/static/pretixcontrol/js/ui/checkinrules/index.ts" %} {% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/checkin/simulator.html b/src/pretix/control/templates/pretixcontrol/checkin/simulator.html index ff38299696..48b5c5e240 100644 --- a/src/pretix/control/templates/pretixcontrol/checkin/simulator.html +++ b/src/pretix/control/templates/pretixcontrol/checkin/simulator.html @@ -5,6 +5,7 @@ {% load getitem %} {% load static %} {% load compress %} +{% load vite %} {% block title %}{% trans "Check-in simulator" %}{% endblock %} {% block inside %}

@@ -53,6 +54,8 @@ {% elif result.status == "incomplete" %} + {% elif result.status == "exchange" %} + {% elif result.status == "error" %} {% if result.reason == "already_redeemed" %} @@ -78,6 +81,14 @@ {% endfor %} + {% elif result.status == "exchange" %} +

{% trans "Media exchange required" %}

+

+ {% blocktrans trimmed with media_policy=media_policies|getitem:result.media_policy media_type=media_types|getitem:result.media_type %} + This ticket needs to be exchanged into a {{ media_type }} reusable medium. + {{ media_policy }}. + {% endblocktrans %} +

{% elif result.status == "error" %}

{{ reason_labels|getitem:result.reason }}

{% if result.reason_explanation %} @@ -124,11 +135,9 @@ {% endif %} {% if result.rule_graph %}
-
- -
- +
+ {% endif %} @@ -152,10 +161,6 @@ {% endcompress %} - {% compress js %} - - - - - {% endcompress %} + {% vite_hmr %} + {% vite_asset "src/pretix/static/pretixcontrol/js/ui/checkinrules/index.ts" %} {% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/event/dangerzone.html b/src/pretix/control/templates/pretixcontrol/event/dangerzone.html index dc08123fc9..dc2773bbe3 100644 --- a/src/pretix/control/templates/pretixcontrol/event/dangerzone.html +++ b/src/pretix/control/templates/pretixcontrol/event/dangerzone.html @@ -9,23 +9,24 @@

{% trans "Go offline" %}

-
+
+

{% blocktrans trimmed %} You can take your event offline. Nobody except your team will be able to see or access it any more. {% endblocktrans %} -

-
-
- {% csrf_token %} - +

+
+ + {% csrf_token %} + - - -
+ +
@@ -34,22 +35,24 @@

{% trans "Cancel event" %}

-
+
+

{% blocktrans trimmed %} If you need to call off your event you want to cancel and refund all tickets, you can do so through this option. {% endblocktrans %} +

-
- {% if "event:cancel" in request.eventpermset %} - - +
+ + + {% if "event:cancel" in request.eventpermset %} {% trans "Cancel event" %} - - {% else %} - {% trans "No permission" %} - {% endif %} + {% else %} + {% trans "No permission" %} + {% endif %} +
@@ -59,15 +62,16 @@

{% trans "Delete personal data" %}

-
+
+

{% blocktrans trimmed %} You can remove personal data such as names and email addresses from your event and only retain the financial information such as the number and type of tickets sold. {% endblocktrans %} +

-
- +
+ {% trans "Delete personal data" %} @@ -80,15 +84,17 @@

{% trans "Delete event" %}

-
+
+

{% blocktrans trimmed %} You can delete your event completely only as long as it does not contain any undeletable data, such as orders not performed in test mode. {% endblocktrans %} +

-
+
+ class="btn btn-danger btn-lg {% if not request.event.allow_delete %}disabled{% endif %}"> {% trans "Delete event" %} diff --git a/src/pretix/control/templates/pretixcontrol/item/include_program_times.html b/src/pretix/control/templates/pretixcontrol/item/include_program_times.html index e223a0eecb..9939cbf4fd 100644 --- a/src/pretix/control/templates/pretixcontrol/item/include_program_times.html +++ b/src/pretix/control/templates/pretixcontrol/item/include_program_times.html @@ -34,6 +34,7 @@ {% bootstrap_form_errors form %} {% bootstrap_field form.start layout="control" %} {% bootstrap_field form.end layout="control" %} + {% bootstrap_field form.location layout="control" %}
{% endfor %} @@ -59,6 +60,7 @@
{% bootstrap_field formset.empty_form.start layout="control" %} {% bootstrap_field formset.empty_form.end layout="control" %} + {% bootstrap_field formset.empty_form.location layout="control" %}
{% endescapescript %} diff --git a/src/pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html b/src/pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html new file mode 100644 index 0000000000..080f312cde --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html @@ -0,0 +1,49 @@ +{% extends "pretixcontrol/event/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block content %} +

+ {% trans "Change multiple quotas" %} + + {% blocktrans trimmed with number=quotas.count %} + {{ number }} selected + {% endblocktrans %} + +

+
+ {% csrf_token %} + {% bootstrap_form_errors form %} + +
+ {% trans "General information" %} + {% bootstrap_field form.name layout="bulkedit" %} + {% bootstrap_field form.size layout="bulkedit" %} +
+
+ {% trans "Items" %} +

+ {% blocktrans trimmed %} + Please select the products or product variations this quota should be applied to. If you apply two + quotas to the same product, it will only be available if both quotas have capacity + left. + {% endblocktrans %} +

+ {% bootstrap_field form.itemvars layout="bulkedit" %} +
+
+ {% trans "Advanced options" %} + {% bootstrap_field form.close_when_sold_out layout="bulkedit" %} + {% bootstrap_field form.release_after_exit layout="bulkedit" %} + {% bootstrap_field form.ignore_for_event_availability layout="bulkedit" %} +
+
+ +
+
+{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html b/src/pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html new file mode 100644 index 0000000000..2420d8bf12 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html @@ -0,0 +1,34 @@ +{% extends "pretixcontrol/event/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block title %}{% trans "Delete quotas" %}{% endblock %} +{% block content %} +

{% trans "Delete quotas" %}

+
+ {% csrf_token %} + {% if allowed %} +

{% blocktrans trimmed count num=allowed|length %} + Are you sure you want to delete the following quota? + {% plural %} + Are you sure you want to delete the following {{ num }} quotas? + {% endblocktrans %}

+
    + {% for q in allowed %} +
  • + {{ q }} {% if q.subevent %}({{ q.subevent }}){% endif %} + +
  • + {% endfor %} +
+ {% endif %} +
+ + {% trans "Cancel" %} + + +
+
+{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/items/quotas.html b/src/pretix/control/templates/pretixcontrol/items/quotas.html index 5e2729bfca..0da36c9be5 100644 --- a/src/pretix/control/templates/pretixcontrol/items/quotas.html +++ b/src/pretix/control/templates/pretixcontrol/items/quotas.html @@ -1,6 +1,7 @@ {% extends "pretixcontrol/items/base.html" %} {% load i18n %} {% load urlreplace %} +{% load bootstrap3 %} {% block title %}{% trans "Quotas" %}{% endblock %} {% block inside %}

{% trans "Quotas" %}

@@ -13,21 +14,12 @@ number of a specific ticket type at the same time. {% endblocktrans %}

- {% if request.event.has_subevents %} -
- {% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %} -
- {% endif %} - {% if quotas|length == 0 %} + {% if quotas|length == 0 and not filter_form.filtered %}

- {% if request.GET.subevent %} - {% trans "Your search did not match any quotas." %} - {% else %} - {% blocktrans trimmed %} - You haven't created any quotas yet. - {% endblocktrans %} - {% endif %} + {% blocktrans trimmed %} + You haven't created any quotas yet. + {% endblocktrans %}

{% if 'event.items:write' in request.eventpermset %} @@ -36,79 +28,160 @@ {% endif %}
{% else %} + +
+
+

+ {% trans "Filter" %} +

+
+
+
+
+ {% bootstrap_field filter_form.query %} +
+ {% if filter_form.subevent %} +
+ {% bootstrap_field filter_form.subevent %} +
+
+ {% bootstrap_field filter_form.date_from %} +
+
+ {% bootstrap_field filter_form.date_until %} +
+
+ {% bootstrap_field filter_form.time_from %} +
+
+ {% bootstrap_field filter_form.time_until %} +
+
+ {% bootstrap_field filter_form.weekday %} +
+ {% endif %} +
+ +
+ +
+
+
{% if 'event.items:write' in request.eventpermset %}

{% trans "Create a new quota" %}

{% endif %} -
- - - - - - {% if request.event.has_subevents %} - - {% endif %} - - - - - - - {% for q in quotas %} + + {% csrf_token %} + {% for field in filter_form %} + {{ field.as_hidden }} + {% endfor %} +
+
{% trans "Quota name" %} - - - {% trans "Products" %}{% trans "Date" context "subevent" %} - - - {% trans "Total capacity" %} - - - {% trans "Capacity left" %}
+ - - - {% if request.event.has_subevents %} - + {% if "event.items:write" in request.eventpermset %} + {% endif %} - - - + + + {% if request.event.has_subevents %} + + {% endif %} + + + - {% endfor %} - -
- {{ q.name }} - {% if q.ignore_for_event_availability %} - - {% endif %} - -
    - {% for item in q.cached_items %} - {% if not item.has_variations %} -
  • {{ item }}
  • - {% endif %} - {% endfor %} - {% for v in q.variations.all %} -
  • - {{ v.item }} – {{ v }}
  • - {% endfor %} -
-
- {{ q.subevent.name }} – {{ q.subevent.get_date_range_display_with_times }} - + + {% if q.size == None %}Unlimited{% else %}{{ q.size }}{% endif %}{% include "pretixcontrol/items/fragment_quota_availability.html" with availability=q.cached_avail closed=q.closed %} - {% if 'event.items:write' in request.eventpermset %} - - - - - - {% endif %} - {% trans "Quota name" %} + + + {% trans "Products" %}{% trans "Date" context "subevent" %} + + + {% trans "Total capacity" %} + + + {% trans "Capacity left" %}
-
+ {% if "event.items:write" in request.eventpermset and page_obj.paginator.num_pages > 1 %} + + + + + + + + + {% endif %} + + + {% for q in quotas %} + + {% if "event.items:write" in request.eventpermset %} + + + + {% endif %} + + {{ q.name }} + {% if q.ignore_for_event_availability %} + + {% endif %} + + +
    + {% for item in q.cached_items %} + {% if not item.has_variations %} +
  • {{ item }}
  • + {% endif %} + {% endfor %} + {% for v in q.variations.all %} +
  • + {{ v.item }} – {{ v }}
  • + {% endfor %} +
+ + {% if request.event.has_subevents %} + + {{ q.subevent.name }} – {{ q.subevent.get_date_range_display_with_times }} + + {% endif %} + {% if q.size == None %}Unlimited{% else %}{{ q.size }}{% endif %} + {% include "pretixcontrol/items/fragment_quota_availability.html" with availability=q.cached_avail closed=q.closed %} + + {% if 'event.items:write' in request.eventpermset %} + + + + + + {% endif %} + + + {% endfor %} + + +
+ {% if "event.items:write" in request.eventpermset %} +
+ + +
+ {% endif %} + {% endif %} {% include "pretixcontrol/pagination.html" %} {% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/order/approve.html b/src/pretix/control/templates/pretixcontrol/order/approve.html index ef9e19b18f..77df8a6a12 100644 --- a/src/pretix/control/templates/pretixcontrol/order/approve.html +++ b/src/pretix/control/templates/pretixcontrol/order/approve.html @@ -1,4 +1,5 @@ {% extends "pretixcontrol/event/base.html" %} +{% load eventsignal %} {% load i18n %} {% block title %} {% trans "Approve order" %} @@ -7,6 +8,9 @@

{% trans "Approve order" %}

+ + {% eventsignal request.event "pretix.control.signals.order_approve_info" order=order request=request %} +

{% blocktrans trimmed %} Do you really want to approve this order? {% endblocktrans %}

diff --git a/src/pretix/control/templates/pretixcontrol/order/index.html b/src/pretix/control/templates/pretixcontrol/order/index.html index 1d3fa472df..37e6171c6f 100644 --- a/src/pretix/control/templates/pretixcontrol/order/index.html +++ b/src/pretix/control/templates/pretixcontrol/order/index.html @@ -134,6 +134,39 @@
{% endif %} + {% if invoice_qualified and order.invoice_dirty %} +
+

+ {% blocktrans trimmed %} + This order was changed after the last invoice was generated. A new invoice was not generated yet, because invoices are configured to be generated on payment or if required by the payment method. + A new invoice will be generated once the customer pays the invoice or selects a payment method that requires an invoice. + {% endblocktrans %} +

+ {% if "event.orders:write" in request.eventpermset %} +

+ {% if uncancelled_invoice %} +

+ {% csrf_token %} + +
+ {% elif can_generate_invoice %} +
+ {% csrf_token %} + +
+ {% endif %} +

+ {% endif %} +
+ {% endif %} +
{% for cr in order.cancellation_requests.all %} @@ -471,7 +504,9 @@ {% endif %} {% if line.subevent %}
- {{ line.subevent.name }} · {{ line.subevent.get_date_range_display_with_times }} + + {{ line.subevent.name }} + · {{ line.subevent.get_date_range_display_with_times }} {% endif %} {% if line.used_membership %}
@@ -551,7 +586,7 @@ {{ pl.datetime|date:"SHORT_DATETIME_FORMAT" }} {{ pl.get_type_display }} - ({{ pl.source }}{% if pl.device %}, #{{ pl.device.device_id }}{% endif %}) + ({{ pl.source }}{% if pl.device %}, {{ pl.device.name }} - #{{ pl.device.device_id }}{% endif %}) {% if not pl.successful %}{% endif %}
{% endfor %} @@ -1043,7 +1078,7 @@
{% trans "VAT ID" %}
{{ order.invoice_address.vat_id }} - {% if order.invoice_address.vat_id_validated %} + {% if order.invoice_address.vat_id and order.invoice_address.vat_id_validated %} {% elif order.invoice_address.vat_id %}
{% trans "How should the refund be sent?" %}

{% blocktrans trimmed %} - Any payments that you selected for automatical refunds will be immediately communicate the refund - request to the respective payment provider. Manual refunds will be created as pending refunds, you - can then later mark them as done once you actually transferred the money back to the customer. + Any payments you selected for automatic refunds will have the refund request sent immediately to the + respective payment provider. Manual refunds will be created as pending refunds, which you can later + mark as done once you have actually transferred the money back to the customer. {% endblocktrans %}

diff --git a/src/pretix/control/templates/pretixcontrol/orders/index.html b/src/pretix/control/templates/pretixcontrol/orders/index.html index 78491b14bd..d729de6eb5 100644 --- a/src/pretix/control/templates/pretixcontrol/orders/index.html +++ b/src/pretix/control/templates/pretixcontrol/orders/index.html @@ -108,7 +108,7 @@

{% endif %} - + {% csrf_token %} {% for field in filter_form %} {{ field.as_hidden }} diff --git a/src/pretix/control/templates/pretixcontrol/organizers/edit.html b/src/pretix/control/templates/pretixcontrol/organizers/edit.html index 2cfb241a7f..960c6fb4f5 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/edit.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/edit.html @@ -222,6 +222,7 @@
{% trans "Reusable media" %} {% bootstrap_field sform.reusable_media_active layout="control" %} + {% bootstrap_field sform.reusable_media_usage_enforced layout="control" %}
diff --git a/src/pretix/control/templates/pretixcontrol/organizers/reusable_media.html b/src/pretix/control/templates/pretixcontrol/organizers/reusable_media.html index 9b96fc8af7..6b2f9e2c73 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/reusable_media.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/reusable_media.html @@ -58,8 +58,8 @@ {% trans "Media type" context "reusable_media" %} - - + + {% trans "Connections" context "reusable_media" %} @@ -90,13 +90,13 @@ {% endif %} {% endif %} - {% if m.linked_orderposition %} + {% for op in m.linked_orderpositions.all %} - - {{ m.linked_orderposition.order.code }}-{{ m.linked_orderposition.positionid }} + + {{ op.order.code }}-{{ op.positionid }} - {% endif %} + {% endfor %} {% if m.linked_giftcard %} diff --git a/src/pretix/control/templates/pretixcontrol/organizers/reusable_medium.html b/src/pretix/control/templates/pretixcontrol/organizers/reusable_medium.html index f53ebbf0c2..4cac9db0ac 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/reusable_medium.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/reusable_medium.html @@ -26,7 +26,19 @@
{% trans "Media type" context "reusable_media" %}
{{ medium.get_type_display }}
{% trans "Identifier" context "reusable_media" %}
-
{{ medium.identifier }}
+
+ {{ medium.identifier }} + + {% if medium.type == "barcode" %} + + {% endif %} +
{% trans "Status" %}
{% if not medium.active %} @@ -41,34 +53,34 @@
{% if medium.customer %} - - {% if "organizer.customers:read" in request.orgapermset %} - + + {% if "organizer.customers:read" in request.orgapermset %} + + {{ medium.customer }} + + {% else %} {{ medium.customer }} - - {% else %} - {{ medium.customer }} - {% endif %} - + {% endif %} + {% endif %} - {% if medium.linked_orderposition %} + {% for op in medium.linked_orderpositions.all %} - - - {{ medium.linked_orderposition.order.code }}-{{ medium.linked_orderposition.positionid }} - - {% endif %} + + + {{ op.order.code }}-{{ op.positionid }} + + {% endfor %} {% if medium.linked_giftcard %} - - {% if "organizer.giftcards:read" in request.orgapermset %} - - {{ medium.linked_giftcard.secret }} - - {% else %} - {{ medium.linked_giftcard.secret|slice:":3" }}… - {% endif %} - + + {% if "organizer.giftcards:read" in request.orgapermset %} + + {{ medium.linked_giftcard.secret }} + + {% else %} + {{ medium.linked_giftcard.secret|slice:":3" }}… + {% endif %} + {% endif %}
{% if medium.notes %} diff --git a/src/pretix/control/templates/pretixcontrol/organizers/team_edit.html b/src/pretix/control/templates/pretixcontrol/organizers/team_edit.html index 40693af31c..f855d5b89a 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/team_edit.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/team_edit.html @@ -2,6 +2,7 @@ {% load i18n %} {% load bootstrap3 %} {% load getitem %} +{% load icon %} {% block inner %} {% if team %}

{% trans "Team:" %} {{ team.name }}

@@ -25,6 +26,18 @@ {% trans "Organizer permissions" %} {% bootstrap_field form.all_organizer_permissions layout="control" %}
+

+ {% icon "info-circle" %} + {% blocktrans trimmed %} + Even if a team has no access to a certain category of data, they might still be able to see + parts of this data when it is linked to data they can see. + {% endblocktrans %} + {% blocktrans trimmed %} + For example, someone with access to customer accounts will be able to see some information + about gift cards linked to a customer account, even if they generally can't see gift cards + directly. + {% endblocktrans %} +

{% for f in form.organizer_field_names %} {% bootstrap_field form|getitem:f layout="control" %} {% endfor %} @@ -37,6 +50,17 @@ {% bootstrap_field form.limit_events layout="control" %} {% bootstrap_field form.all_event_permissions layout="control" %}
+

+ {% icon "info-circle" %} + {% blocktrans trimmed %} + Even if a team has no access to a certain category of data, they might still be able to see + parts of this data when it is linked to data they can see. + {% endblocktrans %} + {% blocktrans trimmed %} + For example, someone with access to orders will be able to see some information about + vouchers used to create an order, even if they generally can't see vouchers directly. + {% endblocktrans %} +

{% for f in form.event_field_names %} {% bootstrap_field form|getitem:f layout="control" %} {% endfor %} diff --git a/src/pretix/control/templates/pretixcontrol/pdf/index.html b/src/pretix/control/templates/pretixcontrol/pdf/index.html index 0935a6c127..814c1d37e5 100644 --- a/src/pretix/control/templates/pretixcontrol/pdf/index.html +++ b/src/pretix/control/templates/pretixcontrol/pdf/index.html @@ -19,9 +19,7 @@ {% endif %} - + {{ layout|json_script:"editor-data" }}
diff --git a/src/pretix/control/templates/pretixcontrol/subevents/bulk.html b/src/pretix/control/templates/pretixcontrol/subevents/bulk.html index 3f7a041f79..97a0e74d48 100644 --- a/src/pretix/control/templates/pretixcontrol/subevents/bulk.html +++ b/src/pretix/control/templates/pretixcontrol/subevents/bulk.html @@ -379,6 +379,8 @@ {% trans "Add many time slots" %}

+
+ {% bootstrap_field form.skip_if_overlap layout="control" horizontal_label_class='sr-only' horizontal_field_class='col-md-12' %}
{% trans "General information" %} diff --git a/src/pretix/control/templates/pretixcontrol/subevents/detail.html b/src/pretix/control/templates/pretixcontrol/subevents/detail.html index 5bce7afbb1..5ffd541b01 100644 --- a/src/pretix/control/templates/pretixcontrol/subevents/detail.html +++ b/src/pretix/control/templates/pretixcontrol/subevents/detail.html @@ -4,290 +4,306 @@ {% load formset_tags %} {% load eventsignal %} {% load static %} -{% block title %}{% trans "Date" context "subevent" %}{% endblock %} +{% load money %} +{% load icon %} +{% block title %}{% blocktrans trimmed with name=subevent.name context "subevent" %}Date: {{ name }} +{% endblocktrans %}{% endblock %} {% block content %} - {% if not subevent.pk %} -

{% trans "Create date" context "subevent" %}

- {% else %} -

{% trans "Date" context "subevent" %}

- {% endif %} - - {% csrf_token %} - {% bootstrap_form_errors form %} - {% for f in itemvar_forms %} - {% bootstrap_form_errors f %} - {% endfor %} -
-
-
- {% trans "General information" %} - {% bootstrap_field form.name layout="control" %} - {% bootstrap_field form.active layout="control" %} - {% bootstrap_field form.date_from layout="control" %} - {% bootstrap_field form.date_to layout="control" %} - {% include "pretixcontrol/event/fragment_geodata.html" %} - {% bootstrap_field form.date_admission layout="control" %} - {% bootstrap_field form.frontpage_text layout="control" %} - {% bootstrap_field form.is_public layout="control" %} - {% bootstrap_field form.comment layout="control" %} - {% if meta_forms %} - +

+ {% blocktrans trimmed with name=subevent.name context "subevent" %}Date: {{ name }}{% endblocktrans %} + {% if 'event.subevents:write' in request.eventpermset %} + + + {% trans "Edit" %} + + {% endif %} +

+
+
+
+ {% trans "General information" %} +
+
{% trans "Name" %}
+
{{ subevent.name }}
+
{% trans "ID" %}
+
#{{ subevent.pk }}
+
{% trans "Status" %}
+
+ {% if not subevent.active %} + {% trans "Disabled" %} + {% elif subevent.presale_has_ended %} + {% trans "Presale over" %} + {% elif not subevent.presale_is_running %} + {% trans "Presale not started" %} + {% else %} + {% trans "On sale" %} + {% endif %} +
+
{% trans "Event start time" %}
+
{{ subevent.date_from|date:"SHORT_DATETIME_FORMAT" }}
+
{% trans "Event end time" %}
+
{{ subevent.date_to|date:"SHORT_DATETIME_FORMAT" }}
+ {% if subevent.date_admission %} +
{% trans "Admission time" %}
+
{{ subevent.date_admission|date:"SHORT_DATETIME_FORMAT" }}
{% endif %} -
-
- {% trans "Timeline" %} - {% bootstrap_field form.presale_start layout="control" %} - {% bootstrap_field form.presale_end layout="control" %} -
-
- {% trans "Quotas" %} -
- {{ formset.management_form }} - {% bootstrap_formset_errors formset %} -
- {% for form in formset %} -
-
- {{ form.id }} - {% bootstrap_field form.DELETE form_group_class="" layout="inline" %} -
-
-

-
-
- {% bootstrap_field form.name layout='inline' form_group_class="" %} -
-
- -
-
-

-
-
- {% bootstrap_form_errors form %} - {% bootstrap_field form.size layout="control" %} - {% bootstrap_field form.itemvars layout="control" %} - {% bootstrap_field form.release_after_exit layout="control" %} - {% bootstrap_field form.ignore_for_event_availability layout="control" %} -
-
- {% endfor %} -
- -

- -

-
-
- {% trans "Product settings" %} -

- {% trans "These settings are optional, if you leave them empty, the default values from the product settings will be used." %} -

- {% for f in itemvar_forms %} -
- {% bootstrap_form_errors f %} -
- -
-
- {% bootstrap_field f.price addon_after=request.event.currency form_group_class="" layout="inline" %} -
-
-
- {% bootstrap_field f.disabled layout="inline" form_group_class="" %} -
-
-
-
- - {% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_from_mode %}
- {% bootstrap_field f.available_from form_group_class="foo" layout="inline" %} -
-
- - {% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_until_mode %}
- {% bootstrap_field f.available_until form_group_class="" layout="inline" %} -
-
-
+ {% if subevent.presale_start %} +
{% trans "Start of presale" %}
+
{{ subevent.presale_start|date:"SHORT_DATETIME_FORMAT" }}
+ {% endif %} + {% if subevent.presale_end %} +
{% trans "End of presale" %}
+
{{ subevent.presale_end|date:"SHORT_DATETIME_FORMAT" }}
+ {% endif %} + {% if subevent.location %} +
{% trans "Location" %}
+
{{ subevent.location|linebreaksbr }}
+ {% endif %} +
{% trans "Show in lists" %}
+
{{ subevent.is_public|yesno }}
+ {% for k, v in subevent.meta_data.items %} +
{{ k }}
+
{{ v }}
{% endfor %} -
+ {% if subevent.comment %} +
{% trans "Internal comment" %}
+
{{ subevent.comment|linebreaksbr }}
+ {% endif %} + +
+
+ {% trans "Quotas" %} +
+ + + + + + + + + + + + {% for q in quotas %} + + + + + + + + {% endfor %} + +
{% trans "Quota name" %}{% trans "Products" %}{% trans "Total capacity" %}{% trans "Capacity left" %}
+ {{ q.name }} + {% if q.ignore_for_event_availability %} + + {% endif %} + +
    + {% for item in q.cached_items %} + {% if not item.has_variations %} +
  • + {{ item }} +
  • + {% endif %} + {% endfor %} + {% for v in q.variations.all %} +
  • + + {{ v.item }} – {{ v }}
  • + {% endfor %} +
+
{% if q.size == None %}Unlimited{% else %}{{ q.size }}{% endif %}{% include "pretixcontrol/items/fragment_quota_availability.html" with availability=q.cached_avail closed=q.closed %} + {% if 'event.items:write' in request.eventpermset %} + + {% endif %} +
+
+
+ {% if checkinlists %}
{% trans "Check-in lists" %} -

- {% blocktrans trimmed %} - You can choose to either add one or more check-in lists for every date in your series individually, - or use just one check-in list for all your dates and limit admission through check-in rules. Which - approach is better depends on multiple factors, such as the number of dates in your series. For a - series with one or less event date per day, individual lists are usually more helpful. If you - use dates to represent many time slots on the same day, or even overlapping time slots, working with - just one large check-in list will be easier. - {% endblocktrans %} -

-
- {{ cl_formset.management_form }} - {% bootstrap_formset_errors cl_formset %} -
- {% for form in cl_formset %} -
-
- {{ form.id }} - {% bootstrap_field form.DELETE form_group_class="" layout="inline" %} -
-
-

-
-
- {% bootstrap_field form.name layout='inline' form_group_class="" %} +
+ + + + + {% if "event.orders:read" in request.eventpermset %} + + {% endif %} + + + + + + {% for cl in checkinlists %} + + + {% if "event.orders:read" in request.eventpermset %} + + {% endif %} + + + {% endfor %} - - -

- -

+ +
{% trans "Name" %}{% trans "Checked in" %}{% trans "Products" %}
+ {{ cl.name }} + +
+
+
+
-
- +
+ {{ cl.checkin_count|default_if_none:"0" }} / + {{ cl.position_count|default_if_none:"0" }}
- -
-
- {% bootstrap_form_errors form %} - {% bootstrap_field form.include_pending layout="control" %} - {% bootstrap_field form.all_products layout="control" %} - {% bootstrap_field form.limit_products layout="control" %} - {% bootstrap_field form.allow_entry_after_exit layout="control" %} - {% if form.gates %} - {% bootstrap_field form.gates layout="control" %} +
+ {% if cl.all_products %} + {% trans "All" %} + {% else %} +
    + {% for item in cl.limit_products.all %} +
  • + {{ item }} +
  • + {% endfor %} +
{% endif %} - - +
+ {% if "event.orders:read" in request.eventpermset %} + + {% endif %} + {% if "event.settings.general:write" in request.eventpermset %} + + + + {% endif %} +

- {% for f in plugin_forms %} - {% if f.title %} -
- {{ f.title }} - {% if f.template %} - {% include f.template with form=f %} - {% else %} - {% bootstrap_form f layout="control" %} - {% endif %} -
- {% endif %} - {% endfor %} + {% endif %} + {% eventsignal request.event "pretix.control.signals.subevent_detail_html" subevent=subevent %} +
+ {% if "event.orders:read" in request.eventpermset %} +
- {% trans "Additional settings" %} - {% for f in plugin_forms %} - {% if not f.title %} - {% if f.template %} - {% include f.template with form=f %} - {% else %} - {% bootstrap_form f layout="control" %} - {% endif %} + + {% trans "Orders" %} + + {{ order_count }} + + + {% if order_count %} +
+ + + + + + + + + {% for o in orders %} + + + + + {% endfor %} + +
{% trans "Order code" %}{% trans "Details" %}
+ + + {{ o.code }} + + +
+ {% if o.testmode %} + {% trans "TEST MODE" %} + {% endif %} + {% if o.status == "p" and o.pcnt == 0 %} + {# Everything related to this subevent is canceled #} + + + {% trans "partially canceled" %} + + {% else %} + {% include "pretixcontrol/orders/fragment_order_status.html" with order=o %} + {% endif %} +
+ {% if "." in o.sales_channel.icon %} + + {% else %} + + {% endif %} + {{ o.datetime|date:"SHORT_DATETIME_FORMAT" }} + {% if o.email %} +
{% icon "envelope-o fa-fw text-muted" %} + {{ o.email|default_if_none:"" }} + {% endif %} + {% if o.invoice_address.name %} +
{% icon "user fa-fw text-muted" %} {{ o.invoice_address.name }} + {% endif %} +
{% icon "ticket text-muted fa-fw" %} {{ o.pcnt }} + {% if o.comment %} +
+ + {{ o.comment|linebreaksbr }} + + {% endif %} + {% if o.custom_followup_due %} +
+ {% blocktrans trimmed with date=o.custom_followup_at|date:"SHORT_DATE_FORMAT" context "followup" %} + TODO {{ date }}{% endblocktrans %} + {% elif o.custom_followup_at %} +
+ {% blocktrans trimmed with date=o.custom_followup_at|date:"SHORT_DATE_FORMAT" context "followup" %} + TODO {{ date }}{% endblocktrans %} + {% endif %} +
+
+ {% if order_count > 10 %} +

+ + {% trans "View all" %} + +

{% endif %} - {% endfor %} + {% else %} +
+

+ {% blocktrans trimmed %} + No orders found. + {% endblocktrans %} +

+
+ {% endif %}
- {% if subevent.pk %} -
-
-
-

- {% trans "Date history" context "subevent" %} -

-
- {% include "pretixcontrol/includes/logs.html" with obj=subevent %} -
+ {% endif %} +
+
+
+

+ {% trans "Date history" context "subevent" %} +

- {% endif %} + {% include "pretixcontrol/includes/logs.html" with obj=subevent %} +
-
- -
- +
{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/subevents/edit.html b/src/pretix/control/templates/pretixcontrol/subevents/edit.html new file mode 100644 index 0000000000..eccbe54256 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/subevents/edit.html @@ -0,0 +1,296 @@ +{% extends "pretixcontrol/event/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% load formset_tags %} +{% load eventsignal %} +{% load static %} +{% block title %}{% trans "Date" context "subevent" %}{% endblock %} +{% block content %} + {% if not subevent.pk %} +

{% trans "Create date" context "subevent" %}

+ {% else %} +

{% trans "Date" context "subevent" %}

+ {% endif %} +
+ {% csrf_token %} + {% bootstrap_form_errors form %} + {% for f in itemvar_forms %} + {% bootstrap_form_errors f %} + {% endfor %} +
+
+
+ {% trans "General information" %} + {% bootstrap_field form.name layout="control" %} + {% bootstrap_field form.active layout="control" %} + {% bootstrap_field form.date_from layout="control" %} + {% bootstrap_field form.date_to layout="control" %} + {% include "pretixcontrol/event/fragment_geodata.html" %} + {% bootstrap_field form.date_admission layout="control" %} + {% bootstrap_field form.frontpage_text layout="control" %} + {% bootstrap_field form.is_public layout="control" %} + {% bootstrap_field form.comment layout="control" %} + {% if meta_forms %} + + {% endif %} +
+
+ {% trans "Timeline" %} + {% bootstrap_field form.presale_start layout="control" %} + {% bootstrap_field form.presale_end layout="control" %} +
+
+ {% trans "Quotas" %} +
+ {{ formset.management_form }} + {% bootstrap_formset_errors formset %} +
+ {% for form in formset %} +
+
+ {{ form.id }} + {% bootstrap_field form.DELETE form_group_class="" layout="inline" %} +
+
+

+
+
+ {% bootstrap_field form.name layout='inline' form_group_class="" %} +
+
+ +
+
+

+
+
+ {% bootstrap_form_errors form %} + {% bootstrap_field form.size layout="control" %} + {% bootstrap_field form.itemvars layout="control" %} + {% bootstrap_field form.release_after_exit layout="control" %} + {% bootstrap_field form.ignore_for_event_availability layout="control" %} +
+
+ {% endfor %} +
+ +

+ +

+
+
+ {% trans "Product settings" %} +

+ {% trans "These settings are optional, if you leave them empty, the default values from the product settings will be used." %} +

+ {% for f in itemvar_forms %} +
+ {% bootstrap_form_errors f %} +
+ +
+
+ {% bootstrap_field f.price addon_after=request.event.currency form_group_class="" layout="inline" %} +
+
+
+ {% bootstrap_field f.disabled layout="inline" form_group_class="" %} +
+
+
+
+ + {% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_from_mode %}
+ {% bootstrap_field f.available_from form_group_class="foo" layout="inline" %} +
+
+ + {% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_until_mode %}
+ {% bootstrap_field f.available_until form_group_class="" layout="inline" %} +
+
+
+ {% endfor %} +
+
+ {% trans "Check-in lists" %} +

+ {% blocktrans trimmed %} + You can choose to either add one or more check-in lists for every date in your series individually, + or use just one check-in list for all your dates and limit admission through check-in rules. Which + approach is better depends on multiple factors, such as the number of dates in your series. For a + series with one or less event date per day, individual lists are usually more helpful. If you + use dates to represent many time slots on the same day, or even overlapping time slots, working with + just one large check-in list will be easier. + {% endblocktrans %} +

+
+ {{ cl_formset.management_form }} + {% bootstrap_formset_errors cl_formset %} +
+ {% for form in cl_formset %} +
+
+ {{ form.id }} + {% bootstrap_field form.DELETE form_group_class="" layout="inline" %} +
+
+

+
+
+ {% bootstrap_field form.name layout='inline' form_group_class="" %} +
+
+ +
+
+

+
+
+ {% bootstrap_form_errors form %} + {% bootstrap_field form.include_pending layout="control" %} + {% bootstrap_field form.all_products layout="control" %} + {% bootstrap_field form.limit_products layout="control" %} + {% bootstrap_field form.allow_entry_after_exit layout="control" %} + {% if form.gates %} + {% bootstrap_field form.gates layout="control" %} + {% endif %} +
+
+ {% endfor %} +
+ +

+ +

+
+ {% for f in plugin_forms %} + {% if f.title %} +
+ {{ f.title }} + {% if f.template %} + {% include f.template with form=f %} + {% else %} + {% bootstrap_form f layout="control" %} + {% endif %} +
+ {% endif %} + {% endfor %} +
+ {% trans "Additional settings" %} + {% for f in plugin_forms %} + {% if not f.title %} + {% if f.template %} + {% include f.template with form=f %} + {% else %} + {% bootstrap_form f layout="control" %} + {% endif %} + {% endif %} + {% endfor %} +
+
+ {% if subevent.pk %} +
+
+
+

+ {% trans "Date history" context "subevent" %} +

+
+ {% include "pretixcontrol/includes/logs.html" with obj=subevent %} +
+
+ {% endif %} +
+
+ + {% trans "Cancel" %} + + +
+
+{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/subevents/index.html b/src/pretix/control/templates/pretixcontrol/subevents/index.html index 52ac83fdf5..60c235dcbf 100644 --- a/src/pretix/control/templates/pretixcontrol/subevents/index.html +++ b/src/pretix/control/templates/pretixcontrol/subevents/index.html @@ -133,7 +133,7 @@ {% endif %} - + {{ s.name }}
#{{ s.pk }} @@ -182,7 +182,7 @@ {% endif %} {% if "event.subevents:write" in request.eventpermset %} - +
- + {% endif %} diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 35c659fd37..a4a8a5e188 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -308,7 +308,8 @@ urlpatterns = [ re_path(r'^pdf/editor/(?P[^/]+).pdf$', pdf.PdfView.as_view(), name='pdf.background'), re_path(r'^subevents/$', subevents.SubEventList.as_view(), name='event.subevents'), re_path(r'^subevents/select2$', typeahead.subevent_select2, name='event.subevents.select2'), - re_path(r'^subevents/(?P\d+)/$', subevents.SubEventUpdate.as_view(), name='event.subevent'), + re_path(r'^subevents/(?P\d+)/$', subevents.SubEventDetail.as_view(), name='event.subevent'), + re_path(r'^subevents/(?P\d+)/edit$', subevents.SubEventUpdate.as_view(), name='event.subevent.edit'), re_path(r'^subevents/(?P\d+)/delete$', subevents.SubEventDelete.as_view(), name='event.subevent.delete'), re_path(r'^subevents/add$', subevents.SubEventCreate.as_view(), name='event.subevents.add'), @@ -349,6 +350,8 @@ urlpatterns = [ name='event.items.questions.edit'), re_path(r'^questions/add$', item.QuestionCreate.as_view(), name='event.items.questions.add'), re_path(r'^quotas/$', item.QuotaList.as_view(), name='event.items.quotas'), + re_path(r'^quotas/bulk_action$', item.QuotaBulkAction.as_view(), name='event.items.quotas.bulkaction'), + re_path(r'^quotas/bulk_edit$', item.QuotaBulkUpdateView.as_view(), name='event.items.quotas.bulkedit'), re_path(r'^quotas/(?P\d+)/$', item.QuotaView.as_view(), name='event.items.quotas.show'), re_path(r'^quotas/select$', typeahead.quotas_select2, name='event.items.quotas.select2'), re_path(r'^quotas/(?P\d+)/change$', item.QuotaUpdate.as_view(), name='event.items.quotas.edit'), @@ -367,6 +370,7 @@ urlpatterns = [ re_path(r'^discounts/add$', discounts.DiscountCreate.as_view(), name='event.items.discounts.add'), re_path(r'^vouchers/$', vouchers.VoucherList.as_view(), name='event.vouchers'), re_path(r'^vouchers/tags/$', vouchers.VoucherTags.as_view(), name='event.vouchers.tags'), + re_path(r'^vouchers/tags/typeahead$', typeahead.voucher_tag_typeahead, name='event.vouchers.tags.typeahead'), re_path(r'^vouchers/rng$', vouchers.VoucherRNG.as_view(), name='event.vouchers.rng'), re_path(r'^vouchers/item_select$', typeahead.itemvarquota_select2, name='event.vouchers.itemselect2'), re_path(r'^vouchers/(?P\d+)/$', vouchers.VoucherUpdate.as_view(), name='event.voucher'), diff --git a/src/pretix/control/views/checkin.py b/src/pretix/control/views/checkin.py index 3c640ce12f..446aad2733 100644 --- a/src/pretix/control/views/checkin.py +++ b/src/pretix/control/views/checkin.py @@ -50,7 +50,7 @@ from i18nfield.strings import LazyI18nString from pretix.api.views.checkin import _redeem_process from pretix.base.media import MEDIA_TYPES -from pretix.base.models import Checkin, LogEntry, Order, OrderPosition +from pretix.base.models import Checkin, Item, LogEntry, Order, OrderPosition from pretix.base.models.checkin import CheckinList from pretix.base.models.orders import PrintLog from pretix.base.permissions import AnyPermissionOf @@ -401,13 +401,14 @@ class CheckinListUpdate(EventPermissionRequiredMixin, UpdateView): { 'id': i.pk, 'name': str(i), + 'active': i.active, 'variations': [ { 'id': v.pk, 'name': str(v.value) } for v in i.variations.all() ] - } for i in self.request.event.items.filter(active=True).prefetch_related('variations') + } for i in self.request.event.items.prefetch_related('variations') ], **super().get_context_data(), } @@ -532,6 +533,8 @@ class CheckInListSimulator(EventPermissionRequiredMixin, FormView): checkinlist=self.list, result=self.result, reason_labels=dict(Checkin.REASONS), + media_policies=dict(Item.MEDIA_POLICIES), + media_types=dict(MEDIA_TYPES), ) def form_valid(self, form): diff --git a/src/pretix/control/views/discounts.py b/src/pretix/control/views/discounts.py index 3b9055a6d0..2ba19dd024 100644 --- a/src/pretix/control/views/discounts.py +++ b/src/pretix/control/views/discounts.py @@ -44,7 +44,7 @@ from pretix.control.permissions import ( from pretix.helpers.models import modelcopy from ...helpers.compat import CompatDeleteView -from . import CreateView, PaginationMixin, UpdateView +from . import CreateView, UpdateView class DiscountDelete(EventPermissionRequiredMixin, CompatDeleteView): @@ -183,7 +183,7 @@ class DiscountCreate(EventPermissionRequiredMixin, CreateView): return super().form_invalid(form) -class DiscountList(PaginationMixin, ListView): +class DiscountList(ListView): model = Discount context_object_name = 'discounts' template_name = 'pretixcontrol/items/discounts.html' diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index 7a25d97bc8..7ff3aa8bdb 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -41,7 +41,7 @@ from collections import OrderedDict, defaultdict from decimal import Decimal from io import BytesIO from itertools import groupby -from urllib.parse import urlparse, urlsplit +from urllib.parse import urlsplit from zoneinfo import ZoneInfo import bleach @@ -64,7 +64,6 @@ from django.shortcuts import get_object_or_404, redirect from django.urls import NoReverseMatch, reverse from django.utils.functional import cached_property from django.utils.html import conditional_escape, format_html -from django.utils.http import url_has_allowed_host_and_scheme from django.utils.safestring import mark_safe from django.utils.timezone import now from django.utils.translation import gettext, gettext_lazy as _, gettext_noop @@ -97,7 +96,9 @@ from pretix.control.permissions import EventPermissionRequiredMixin from pretix.control.views.mailsetup import MailSettingsSetupView from pretix.control.views.user import RecentAuthenticationRequiredMixin from pretix.helpers.database import rolledback_transaction -from pretix.multidomain.urlreverse import build_absolute_uri, get_event_domain +from pretix.multidomain.urlreverse import ( + eventreverse_absolute, get_event_domain, +) from pretix.presale.views.widget import ( version_default as widget_version_default, ) @@ -234,13 +235,21 @@ class EventUpdate(DecoupleMixin, EventSettingsViewMixin, EventPermissionRequired self.request.event.log_action('pretix.event.footerlinks.changed', user=self.request.user, data={ 'data': self.footer_links_formset.cleaned_data }) - if form.has_changed(): - self.request.event.log_action('pretix.event.changed', user=self.request.user, data={ - k: (form.cleaned_data.get(k).name - if isinstance(form.cleaned_data.get(k), File) - else form.cleaned_data.get(k)) - for k in form.changed_data - }) + + change_data = { + k: (form.cleaned_data.get(k).name + if isinstance(form.cleaned_data.get(k), File) + else form.cleaned_data.get(k)) + for k in form.changed_data + } + meta_changed = {} + for f in self.meta_forms: + if f.has_changed(): + meta_changed[f.property.name] = f.cleaned_data["value"] + if meta_changed: + change_data['meta_data'] = meta_changed + if change_data: + self.request.event.log_action('pretix.event.changed', user=self.request.user, data=change_data) tickets.invalidate_cache.apply_async(kwargs={'event': self.request.event.pk}) messages.success(self.request, _('Your changes have been saved.')) @@ -1140,8 +1149,11 @@ class EventLive(EventPermissionRequiredMixin, TemplateView): if request.POST.get("delete") == "yes": try: with transaction.atomic(): - for order in request.event.orders.filter(testmode=True): - order.gracefully_delete(user=self.request.user) + Order.gracefully_delete_bulk( + request.event, + request.event.orders.filter(testmode=True), + user=self.request.user + ) except ProtectedError: messages.error(self.request, _('An order could not be deleted as some constraints (e.g. data ' 'created by plug-ins) do not allow it.')) @@ -1726,10 +1738,10 @@ class EventQRCode(EventPermissionRequiredMixin, View): permission = None def get(self, request, *args, filetype, **kwargs): - url = build_absolute_uri(request.event, 'presale:event.index') + url = eventreverse_absolute(request.event, 'presale:event.index') if "url" in request.GET: - if url_has_allowed_host_and_scheme(request.GET["url"], allowed_hosts=[urlparse(url).netloc]): + if request.GET["url"].startswith(url): url = request.GET["url"] else: raise PermissionDenied("Untrusted URL") diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 179b8cd095..a899800f1e 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -41,21 +41,22 @@ from json.decoder import JSONDecodeError from django.contrib import messages from django.core.exceptions import PermissionDenied from django.core.files import File -from django.db import transaction +from django.db import models, transaction from django.db.models import ( - Count, Exists, F, OuterRef, Prefetch, ProtectedError, Q, + Count, Exists, F, OuterRef, Prefetch, ProtectedError, Q, Subquery, Value, ) +from django.db.models.functions import Cast, Concat from django.forms.models import inlineformset_factory from django.http import ( Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect, ) -from django.shortcuts import redirect +from django.shortcuts import redirect, render from django.urls import resolve, reverse from django.utils.functional import cached_property from django.utils.timezone import now from django.utils.translation import gettext, gettext_lazy as _ from django.views.decorators.http import require_http_methods -from django.views.generic import ListView +from django.views.generic import FormView, ListView, View from django.views.generic.detail import DetailView, SingleObjectMixin from django_countries.fields import Country @@ -65,7 +66,7 @@ from pretix.api.serializers.item import ( ) from pretix.base.forms import I18nFormSet from pretix.base.models import ( - CartPosition, Item, ItemCategory, ItemProgramTime, ItemVariation, + CartPosition, Item, ItemCategory, ItemProgramTime, ItemVariation, LogEntry, OrderPosition, Question, QuestionAnswer, QuestionOption, Quota, SeatCategoryMapping, Voucher, ) @@ -74,12 +75,15 @@ from pretix.base.models.items import ItemAddOn, ItemBundle, ItemMetaValue from pretix.base.services.quotas import QuotaAvailability from pretix.base.services.tickets import invalidate_cache from pretix.base.signals import quota_availability -from pretix.control.forms.filter import QuestionAnswerFilterForm +from pretix.control.forms.filter import ( + QuestionAnswerFilterForm, QuotaFilterForm, +) from pretix.control.forms.item import ( CategoryForm, ItemAddOnForm, ItemAddOnsFormSet, ItemBundleForm, ItemBundleFormSet, ItemCreateForm, ItemMetaValueForm, ItemProgramTimeForm, ItemProgramTimeFormSet, ItemUpdateForm, ItemVariationForm, - ItemVariationsFormSet, QuestionForm, QuestionOptionForm, QuotaForm, + ItemVariationsFormSet, QuestionForm, QuestionOptionForm, QuotaBulkEditForm, + QuotaForm, ) from pretix.control.permissions import ( EventPermissionRequiredMixin, event_permission_required, @@ -87,6 +91,7 @@ from pretix.control.permissions import ( from pretix.control.signals import item_forms, item_formsets from pretix.helpers.models import modelcopy +from ...helpers import GroupConcat from ...helpers.compat import CompatDeleteView from . import ChartContainingView, CreateView, PaginationMixin, UpdateView @@ -330,7 +335,7 @@ class CategoryCreate(EventPermissionRequiredMixin, CreateView): return super().form_invalid(form) -class CategoryList(PaginationMixin, ListView): +class CategoryList(ListView): model = ItemCategory context_object_name = 'categories' template_name = 'pretixcontrol/items/categories.html' @@ -831,13 +836,38 @@ class QuestionCreate(EventPermissionRequiredMixin, QuestionMixin, CreateView): return ret -class QuotaList(PaginationMixin, ListView): +class QuotaQueryMixin: + + @cached_property + def request_data(self): + if self.request.method == "POST": + return self.request.POST + return self.request.GET + + def get_queryset(self): + qs = self.request.event.quotas + if self.filter_form.is_valid(): + qs = self.filter_form.filter_qs(qs) + + if 'quota' in self.request_data and '__ALL' not in self.request_data: + qs = qs.filter( + id__in=self.request_data.getlist('quota') + ) + + return qs + + @cached_property + def filter_form(self): + return QuotaFilterForm(data=self.request_data, prefix='filter', event=self.request.event) + + +class QuotaList(PaginationMixin, QuotaQueryMixin, ListView): model = Quota context_object_name = 'quotas' template_name = 'pretixcontrol/items/quotas.html' def get_queryset(self): - qs = self.request.event.quotas.prefetch_related( + return super().get_queryset().prefetch_related( Prefetch( "items", queryset=Item.objects.annotate( @@ -852,28 +882,10 @@ class QuotaList(PaginationMixin, ListView): queryset=self.request.event.subevents.all() ) ) - if self.request.GET.get("subevent", "") != "": - s = self.request.GET.get("subevent", "") - qs = qs.filter(subevent_id=s) - - valid_orders = { - '-date': ('-subevent__date_from', 'name', 'pk'), - 'date': ('subevent__date_from', '-name', '-pk'), - 'size': ('size', 'name', 'pk'), - '-size': ('-size', '-name', '-pk'), - 'name': ('name', 'pk'), - '-name': ('-name', '-pk'), - } - - if self.request.GET.get("ordering", "-date") in valid_orders: - qs = qs.order_by(*valid_orders[self.request.GET.get("ordering", "-date")]) - else: - qs = qs.order_by('name', 'subevent__date_from', 'pk') - - return qs def get_context_data(self, **kwargs): ctx = super().get_context_data() + ctx['filter_form'] = self.filter_form qa = QuotaAvailability() qa.queue(*ctx['quotas']) @@ -884,6 +896,165 @@ class QuotaList(PaginationMixin, ListView): return ctx +class QuotaBulkAction(QuotaQueryMixin, EventPermissionRequiredMixin, View): + permission = 'event.items:write' + + @transaction.atomic + def post(self, request, *args, **kwargs): + if request.POST.get('action') == 'delete': + return render(request, 'pretixcontrol/items/quota_delete_bulk.html', { + 'allowed': self.get_queryset().select_related("subevent"), + }) + elif request.POST.get('action') == 'delete_confirm': + log_entries = [] + to_delete = [] + for obj in self.get_queryset(): + log_entries.append(obj.log_action('pretix.event.quota.deleted', user=self.request.user, save=False)) + to_delete.append(obj.pk) + + if to_delete: + LogEntry.bulk_create_and_postprocess(log_entries) + Quota.objects.filter(pk__in=to_delete).delete() + messages.success(request, _('The selected quotas have been deleted or disabled.')) + return redirect(self.get_success_url()) + + def get_success_url(self) -> str: + return reverse('control:event.items.quotas', kwargs={ + 'organizer': self.request.event.organizer.slug, + 'event': self.request.event.slug, + }) + + +class QuotaBulkUpdateView(QuotaQueryMixin, EventPermissionRequiredMixin, FormView): + template_name = 'pretixcontrol/items/quota_bulk_edit.html' + permission = 'event.items:write' + context_object_name = 'quota' + form_class = QuotaBulkEditForm + + 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 behaviour + return '_bulk' in self.request.POST + + def get_form_kwargs(self): + initial = {} + mixed_values = set() + qs = self.get_queryset().annotate( + items_list=Subquery( + Quota.items.through.objects.filter( + quota_id=OuterRef('pk'), + item__variations__isnull=True, + ).order_by().values('quota_id').annotate( + g=GroupConcat('item_id', separator=',', ordered=True) + ).values('g') + ), + vars_list=Subquery( + Quota.variations.through.objects.filter( + quota_id=OuterRef('pk') + ).order_by().values('quota_id').annotate( + g=GroupConcat( + Concat( + Cast(F('itemvariation__item_id'), output_field=models.TextField()), + Value('-', output_field=models.TextField()), + Cast(F('itemvariation_id'), output_field=models.TextField()), + ), + separator=',', + ordered=True + ) + ).values('g') + ), + ) + + fields = { + 'name': 'name', + 'size': 'size', + 'subevent': 'subevent', + 'close_when_sold_out': 'close_when_sold_out', + 'release_after_exit': 'release_after_exit', + 'ignore_for_event_availability': 'ignore_for_event_availability', + } + for k, f in fields.items(): + existing_values = list(qs.order_by(f).values(f).annotate(c=Count('*'))) + if len(existing_values) == 1: + initial[k] = existing_values[0][f] + elif len(existing_values) > 1: + mixed_values.add(k) + initial[k] = None + + item_values = list(qs.order_by("items_list").values("items_list").annotate(c=Count('*'))) + var_values = list(qs.order_by("vars_list").values("vars_list").annotate(c=Count('*'))) + if len(item_values) > 1 or len(var_values) > 1: + mixed_values.add("itemvars") + else: + initial["itemvars"] = [iv for iv in (item_values[0]["items_list"] or "").split(",") + (var_values[0]["vars_list"] or "").split(",") if iv] + + 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.items.quotas', kwargs={ + 'organizer': self.request.event.organizer.slug, + 'event': self.request.event.slug, + }) + + @transaction.atomic() + 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.event.quota.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['quotas'] = self.get_queryset() + ctx['bulk_selected'] = self.request.POST.getlist("_bulk") + return ctx + + 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) + + class QuotaCreate(EventPermissionRequiredMixin, CreateView): model = Quota form_class = QuotaForm @@ -1447,12 +1618,8 @@ class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, MetaDataE meta_changed = {} for f in self.meta_forms: - meta_changed.update({ - k: (f.cleaned_data.get(k).name - if isinstance(f.cleaned_data.get(k), File) - else f.cleaned_data.get(k)) - for k in f.changed_data - }) + if f.has_changed(): + meta_changed[f.property.name] = f.cleaned_data["value"] if meta_changed: change_data['meta_data'] = meta_changed diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index d0bb06cc45..53b628ed58 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -79,9 +79,9 @@ 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 ( - CachedCombinedTicket, CachedFile, CachedTicket, Checkin, Invoice, - InvoiceAddress, Item, ItemVariation, LogEntry, Order, QuestionAnswer, - Quota, ScheduledEventExport, generate_secret, + CachedFile, CachedTicket, Checkin, Invoice, InvoiceAddress, Item, + ItemVariation, LogEntry, Order, QuestionAnswer, Quota, + ScheduledEventExport, generate_secret, ) from pretix.base.models.orders import ( CancellationRequest, OrderFee, OrderPayment, OrderPosition, OrderRefund, @@ -139,6 +139,7 @@ from pretix.helpers import OF_SELF from pretix.helpers.compat import CompatDeleteView from pretix.helpers.format import SafeFormatter, format_map from pretix.helpers.hierarkey import clean_filename +from pretix.helpers.iter import chunked_iterable from pretix.helpers.json import CustomJSONEncoder from pretix.helpers.safedownload import check_token from pretix.presale.signals import question_form_fields @@ -240,7 +241,7 @@ class BaseOrderBulkActionView(OrderSearchMixin, EventPermissionRequiredMixin, As raise NotImplementedError() def execute_bulk(self, queryset: QuerySet, form: forms.Form): - qs = self.allowed_for(self.allowed_for(self.get_queryset())) + qs = self.allowed_for(self.get_queryset()) total = qs.count() orders_with_successful_action = 0 for i, o in enumerate(qs): @@ -394,8 +395,21 @@ class OrderDeleteBulkActionView(BaseOrderBulkActionView): testmode=True, ) - def execute_single(self, instance, form: forms.Form): - instance.gracefully_delete(user=self.request.user) + def execute_bulk(self, queryset: QuerySet, form: forms.Form): + qs = self.allowed_for(self.get_queryset()) + total = qs.count() + all_ids = list(qs.values_list("id", flat=True)) + + orders_with_successful_action = 0 + for chunk in chunked_iterable(all_ids, 1000): + Order.gracefully_delete_bulk( + self.request.event, + qs.filter(id__in=chunk), + user=self.request.user, + ) + orders_with_successful_action += len(chunk) + self.async_set_progress(orders_with_successful_action / total * 100) + return orders_with_successful_action, total class OrderList(OrderSearchMixin, EventPermissionRequiredMixin, PaginationMixin, ListView): @@ -554,6 +568,9 @@ class OrderDetail(OrderView): ctx['download_buttons'] = self.download_buttons ctx['payment_refund_sum'] = self.order.payment_refund_sum ctx['pending_sum'] = self.order.pending_sum + ctx['uncancelled_invoice'] = self.order.invoices.exclude( + Exists(self.order.invoices.filter(refers=OuterRef('pk'), is_cancellation=True)) + ).exclude(is_cancellation=True).first() return ctx @@ -718,30 +735,13 @@ class OrderDownload(AsyncAction, OrderView): ), content_type=value.type ) - elif isinstance(value, CachedCombinedTicket): - if value.type == 'text/uri-list': - resp = HttpResponseRedirect(value.file.file.read()) - return resp - else: - return FileResponse( - value.file.file, - filename='{}-{}-{}{}'.format( - self.request.event.slug.upper(), self.order.code, self.output.identifier, value.extension - ), - content_type=value.type - ) else: return redirect(self.get_self_url()) def get_last_ct(self): - if 'position' in self.kwargs: - ct = CachedTicket.objects.filter( - order_position=self.order_position, provider=self.output.identifier, file__isnull=False - ).last() - else: - ct = CachedCombinedTicket.objects.filter( - order=self.order, provider=self.output.identifier, file__isnull=False - ).last() + ct = CachedTicket.objects.filter( + order_position=self.order_position, provider=self.output.identifier, file__isnull=False + ).last() if not ct or not ct.file: return None return ct diff --git a/src/pretix/control/views/organizer.py b/src/pretix/control/views/organizer.py index 03404813f9..b891349dfa 100644 --- a/src/pretix/control/views/organizer.py +++ b/src/pretix/control/views/organizer.py @@ -102,7 +102,7 @@ from pretix.base.models.organizer import ( from pretix.base.payment import PaymentException from pretix.base.plugins import ( PLUGIN_LEVEL_EVENT, PLUGIN_LEVEL_EVENT_ORGANIZER_HYBRID, - PLUGIN_LEVEL_ORGANIZER, + PLUGIN_LEVEL_ORGANIZER, plugin_is_available, ) from pretix.base.services.export import ( init_organizer_exporters, multiexport, scheduled_organizer_export, @@ -139,8 +139,8 @@ from pretix.helpers import OF_SELF, GroupConcat from pretix.helpers.compat import CompatDeleteView from pretix.helpers.dicts import merge_dicts from pretix.helpers.format import SafeFormatter, format_map -from pretix.helpers.urls import build_absolute_uri as build_global_uri -from pretix.multidomain.urlreverse import build_absolute_uri +from pretix.helpers.urls import mainreverse_absolute +from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.presale.forms.customer import TokenGenerator logger = logging.getLogger(__name__) @@ -597,6 +597,13 @@ class OrganizerCreate(CreateView): }) +def available_plugins(organizer): + from pretix.base.plugins import get_all_plugins + + return (p for p in get_all_plugins(organizer=organizer) if not p.name.startswith('.') + and getattr(p, 'visible', True)) + + class OrganizerPlugins(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, TemplateView, SingleObjectMixin): model = Organizer context_object_name = 'organizer' @@ -606,12 +613,6 @@ class OrganizerPlugins(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi def get_object(self, queryset=None) -> Organizer: return self.request.organizer - def available_plugins(self, organizer): - from pretix.base.plugins import get_all_plugins - - return (p for p in get_all_plugins(organizer=organizer) if not p.name.startswith('.') - and getattr(p, 'visible', True)) - def prepare_links(self, pluginmeta, key): links = getattr(pluginmeta, key, []) try: @@ -637,7 +638,7 @@ class OrganizerPlugins(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi from pretix.base.plugins import CATEGORY_LABELS, CATEGORY_ORDER context = super().get_context_data(*args, **kwargs) - plugins = list(self.available_plugins(self.object)) + plugins = list(available_plugins(self.object)) active_counter = Counter() events_total = 0 @@ -685,7 +686,7 @@ class OrganizerPlugins(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi self.object = self.get_object() plugins_available = { - p.module: p for p in self.available_plugins(self.object) + p.module: p for p in available_plugins(self.object) } choose_events_next = False with transaction.atomic(): @@ -786,12 +787,6 @@ class OrganizerPluginEvents(OrganizerDetailViewMixin, OrganizerPermissionRequire } return kwargs - def available_plugins(self, organizer): - from pretix.base.plugins import get_all_plugins - - return (p for p in get_all_plugins(organizer=organizer) if not p.name.startswith('.') - and getattr(p, 'visible', True)) - def get_context_data(self, **kwargs): return super().get_context_data( plugin=self.plugin, @@ -799,12 +794,10 @@ class OrganizerPluginEvents(OrganizerDetailViewMixin, OrganizerPermissionRequire ) def dispatch(self, request, *args, **kwargs): - plugins_available = { - p.module: p for p in self.available_plugins(self.request.organizer) - } - if kwargs["plugin"] not in plugins_available: + try: + self.plugin = next(p for p in available_plugins(self.request.organizer) if p.module == kwargs["plugin"]) + except StopIteration: raise Http404(_("Unknown plugin.")) - self.plugin = plugins_available[kwargs["plugin"]] level = getattr(self.plugin, "level", PLUGIN_LEVEL_EVENT) if level == PLUGIN_LEVEL_ORGANIZER: raise Http404(_("This plugin can only be enabled for the entire organizer account.")) @@ -835,6 +828,9 @@ class OrganizerPluginEvents(OrganizerDetailViewMixin, OrganizerPermissionRequire logentries_to_save = [] for e in self.request.organizer.events.filter(pk__in=events_to_enable): + if not plugin_is_available(self.plugin, organizer=self.request.organizer, event=e): + messages.warning(self.request, _("This plugin cannot be activated for event {}.").format(e.name)) + continue logentries_to_save.append( e.log_action('pretix.event.plugins.enabled', user=self.request.user, data={'plugin': self.plugin.module}, save=False) ) @@ -1043,7 +1039,7 @@ class TeamMemberView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, 'user': self, 'organizer': self.request.organizer.name, 'team': instance.team.name, - 'url': build_global_uri('control:auth.invite', kwargs={ + 'url': mainreverse_absolute('control:auth.invite', kwargs={ 'token': instance.token }) }, @@ -2855,10 +2851,12 @@ class SSOProviderUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequire def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) - ctx['redirect_uri'] = build_absolute_uri(self.request.organizer, 'presale:organizer.customer.login.return', - kwargs={ - 'provider': self.object.pk - }) + ctx['redirect_uri'] = eventreverse_absolute( + self.request.organizer, 'presale:organizer.customer.login.return', + kwargs={ + 'provider': self.object.pk + } + ) return ctx def get_form_kwargs(self): @@ -3089,7 +3087,7 @@ class CustomerDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi self.customer.log_action('pretix.customer.password.resetrequested', {}, user=self.request.user) ctx = self.customer.get_email_context() token = TokenGenerator().make_token(self.customer) - ctx['url'] = build_absolute_uri( + ctx['url'] = eventreverse_absolute( self.request.organizer, 'presale:organizer.customer.recoverpw' ) + '?id=' + self.customer.identifier + '&token=' + token @@ -3388,8 +3386,10 @@ class ReusableMediaListView(OrganizerDetailViewMixin, OrganizerPermissionRequire def get_queryset(self): qs = self.request.organizer.reusable_media.select_related( - 'customer', 'linked_orderposition', 'linked_orderposition__order', 'linked_orderposition__order__event', - 'linked_giftcard' + 'customer', + 'linked_giftcard', + ).prefetch_related( + Prefetch('linked_orderpositions', queryset=OrderPosition.objects.select_related("order", "order__event")) ) if self.filter_form.is_valid(): qs = self.filter_form.filter_qs(qs) @@ -3437,10 +3437,14 @@ class ReusableMediumCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequ @transaction.atomic def form_valid(self, form): r = super().form_valid(form) - form.instance.log_action('pretix.reusable_medium.created', user=self.request.user, data={ + + data = { k: getattr(form.instance, k) for k in form.changed_data - }) + } + if "linked_orderpositions" in data: + data["linked_orderpositions"] = data["linked_orderpositions"].values_list("pk", flat=True) + form.instance.log_action('pretix.reusable_medium.created', user=self.request.user, data=data) messages.success(self.request, _('Your changes have been saved.')) return r @@ -3465,13 +3469,40 @@ class ReusableMediumUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequ @transaction.atomic def form_valid(self, form): + prev_linked_ops_pks = list(getattr(self.object, "linked_orderpositions").values_list("pk", flat=True)) + result = super().form_valid(form) if form.has_changed(): - self.object.log_action('pretix.reusable_medium.changed', user=self.request.user, data={ + data = { k: getattr(self.object, k) for k in form.changed_data - }) + } + if "linked_orderpositions" in data: + # handle changes to linked_orderpositions separately + linked_ops_pks = data["linked_orderpositions"].values_list("pk", flat=True) + del data["linked_orderpositions"] + for op_pk in prev_linked_ops_pks: + if op_pk not in linked_ops_pks: + self.object.log_action( + 'pretix.reusable_medium.linked_orderposition.removed', + user=self.request.user, + data={ + 'linked_orderposition': op_pk, + } + ) + for op_pk in linked_ops_pks: + if op_pk not in prev_linked_ops_pks: + self.object.log_action( + 'pretix.reusable_medium.linked_orderposition.added', + user=self.request.user, + data={ + 'linked_orderposition': op_pk, + } + ) + if data: + # log change-action only for changes other than linked_orderpositions + self.object.log_action('pretix.reusable_medium.changed', user=self.request.user, data=data) messages.success(self.request, _('Your changes have been saved.')) - return super().form_valid(form) + return result def get_success_url(self): return reverse('control:organizer.reusable_medium', kwargs={ diff --git a/src/pretix/control/views/pdf.py b/src/pretix/control/views/pdf.py index 03f21c7319..e8c5d855d7 100644 --- a/src/pretix/control/views/pdf.py +++ b/src/pretix/control/views/pdf.py @@ -284,7 +284,7 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView): ctx['pdf'] = self.get_current_background() ctx['variables'] = self.get_variables() ctx['images'] = self.get_images() - ctx['layout'] = json.dumps(self.get_current_layout()) + ctx['layout'] = self.get_current_layout() ctx['title'] = self.title ctx['locales'] = [p for p in settings.LANGUAGES if p[0] in self.request.event.settings.locales] ctx['maxfilesize'] = self.maxfilesize diff --git a/src/pretix/control/views/subevents.py b/src/pretix/control/views/subevents.py index 4ecf6a8237..a71189cef7 100644 --- a/src/pretix/control/views/subevents.py +++ b/src/pretix/control/views/subevents.py @@ -41,7 +41,9 @@ from django.contrib import messages from django.core.exceptions import ValidationError from django.core.files import File from django.db import transaction -from django.db.models import Count, F, Prefetch, ProtectedError +from django.db.models import ( + Count, Exists, F, OuterRef, Prefetch, ProtectedError, Subquery, +) from django.db.models.functions import Coalesce, TruncDate, TruncTime from django.forms import inlineformset_factory from django.http import Http404, HttpResponse, HttpResponseRedirect @@ -49,17 +51,21 @@ from django.shortcuts import redirect, render from django.urls import reverse from django.utils.formats import get_format from django.utils.functional import cached_property +from django.utils.http import url_has_allowed_host_and_scheme from django.utils.timezone import make_aware, now from django.utils.translation import gettext_lazy as _, pgettext_lazy from django.views import View -from django.views.generic import CreateView, FormView, ListView, UpdateView +from django.views.generic import ( + CreateView, DetailView, FormView, ListView, UpdateView, +) -from pretix.base.models import CartPosition, LogEntry +from pretix.base.models import CartPosition, LogEntry, OrderPosition from pretix.base.models.checkin import CheckinList from pretix.base.models.event import SubEvent, SubEventMetaValue from pretix.base.models.items import ( - ItemVariation, Quota, SubEventItem, SubEventItemVariation, + Item, ItemVariation, Quota, SubEventItem, SubEventItemVariation, ) +from pretix.base.models.orders import CancellationRequest from pretix.base.reldate import RelativeDate, RelativeDateWrapper from pretix.base.services import tickets from pretix.base.services.quotas import QuotaAvailability @@ -505,9 +511,69 @@ class SubEventEditorMixin(MetaDataEditorMixin): ) and self.cl_formset.is_valid() and all(f.is_valid() for f in self.plugin_forms) -class SubEventUpdate(EventPermissionRequiredMixin, SubEventEditorMixin, UpdateView): +class SubEventDetail(EventPermissionRequiredMixin, DetailView): model = SubEvent template_name = 'pretixcontrol/subevents/detail.html' + permission = None + context_object_name = 'subevent' + + def get_object(self, queryset=None) -> SubEvent: + try: + return self.request.event.subevents.get( + id=self.kwargs['subevent'] + ) + except SubEvent.DoesNotExist: + raise Http404(pgettext_lazy("subevent", "The requested date does not exist.")) + + def get_context_data(self, **kwargs): + oqs = self.request.event.orders.filter( + Exists( + OrderPosition.objects.filter( + subevent=self.object, + order_id=OuterRef("id"), + ) + ) + ).annotate( + pcnt=Subquery( + OrderPosition.objects.filter( + subevent=self.object, + order_id=OuterRef("id"), + ).values("subevent").annotate(c=Count("*")).values("c") + ), + has_cancellation_request=Exists(CancellationRequest.objects.filter(order=OuterRef("pk"))), + ).select_related("invoice_address").prefetch_related("sales_channel") + ctx = { + "quotas": self.object.quotas.prefetch_related( + Prefetch( + "items", + queryset=Item.objects.annotate( + has_variations=Exists(ItemVariation.objects.filter(item=OuterRef("pk"))) + ), + to_attr="cached_items" + ), + "variations", + "variations__item", + ).order_by("name", "pk"), + "checkinlists": self.object.checkinlist_set.prefetch_related("limit_products"), + "orders": oqs[:11], + "order_count": oqs.count(), + } + + qa = QuotaAvailability() + qa.queue(*ctx["quotas"]) + qa.compute() + for quota in ctx["quotas"]: + quota.cached_avail = qa.results[quota] + + return super().get_context_data( + **kwargs, + **ctx, + ) + + +class SubEventUpdate(EventPermissionRequiredMixin, SubEventEditorMixin, UpdateView): + model = SubEvent + template_name = 'pretixcontrol/subevents/edit.html' permission = 'event.subevents:write' context_object_name = 'subevent' form_class = SubEventForm @@ -531,6 +597,7 @@ class SubEventUpdate(EventPermissionRequiredMixin, SubEventEditorMixin, UpdateVi @transaction.atomic def form_valid(self, form): + self.object = form.save() self.save_formset(self.object) self.save_cl_formset(self.object) self.save_meta() @@ -540,41 +607,60 @@ class SubEventUpdate(EventPermissionRequiredMixin, SubEventEditorMixin, UpdateVi # TODO: LogEntry? messages.success(self.request, _('Your changes have been saved.')) - if form.has_changed() or any(f.has_changed() for f in self.plugin_forms): - data = { - k: form.cleaned_data.get(k) for k in form.changed_data - } - for f in self.plugin_forms: - data.update({ - k: (f.cleaned_data.get(k).name - if isinstance(f.cleaned_data.get(k), File) - else f.cleaned_data.get(k)) - for k in f.changed_data - }) + + change_data = { + k: (form.cleaned_data.get(k).name + if isinstance(form.cleaned_data.get(k), File) + else form.cleaned_data.get(k)) + for k in form.changed_data + } + meta_changed = {} + for f in self.meta_forms: + if f.has_changed(): + meta_changed[f.property.name] = f.cleaned_data["value"] + if meta_changed: + change_data['meta_data'] = meta_changed + for f in self.plugin_forms: + change_data.update({ + k: (f.cleaned_data.get(k).name + if isinstance(f.cleaned_data.get(k), File) + else f.cleaned_data.get(k)) + for k in f.changed_data + }) + if change_data: self.object.log_action( - 'pretix.subevent.changed', user=self.request.user, data=data + 'pretix.subevent.changed', user=self.request.user, data=change_data ) + for f in self.plugin_forms: f.subevent = self.object f.save() tickets.invalidate_cache.apply_async(kwargs={'event': self.request.event.pk}) - return super().form_valid(form) + return HttpResponseRedirect(self.get_success_url()) def get_success_url(self) -> str: - return reverse('control:event.subevents', kwargs={ + if "next" in self.request.GET and url_has_allowed_host_and_scheme(self.request.GET.get("next"), allowed_hosts=None): + return self.request.GET.get("next") + return reverse('control:event.subevent', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, - }) + ('?' + self.request.GET.get('returnto') if 'returnto' in self.request.GET else '') + 'subevent': self.object.pk, + }) def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs['event'] = self.request.event return kwargs + def get_context_data(self, **kwargs): + return super().get_context_data( + next_url=self.get_success_url() + ) + class SubEventCreate(SubEventEditorMixin, EventPermissionRequiredMixin, CreateView): model = SubEvent - template_name = 'pretixcontrol/subevents/detail.html' + template_name = 'pretixcontrol/subevents/edit.html' permission = 'event.subevents:write' context_object_name = 'subevent' form_class = SubEventForm @@ -628,6 +714,14 @@ class SubEventCreate(SubEventEditorMixin, EventPermissionRequiredMixin, CreateVi else f.cleaned_data.get(k)) for k in f.cleaned_data }) + + meta_changed = {} + for f in self.meta_forms: + if f.has_changed(): + meta_changed[f.property.name] = f.cleaned_data["value"] + if meta_changed: + data['meta_data'] = meta_changed + form.instance.log_action('pretix.subevent.added', data=dict(data), user=self.request.user) self.save_formset(form.instance) @@ -917,6 +1011,35 @@ class SubEventBulkCreate(SubEventEditorMixin, EventPermissionRequiredMixin, Asyn if len(subevents) > 100_000: raise ValidationError(_('Please do not create more than 100.000 dates at once.')) + if form.cleaned_data.get("skip_if_overlap") and subevents: + def overlaps(a_from, a_to, b_from, b_to): + if a_from == b_from: + return True + if a_from > b_from: + # a starts after b + # check if it starts before b ends + return b_to and a_from < b_to + # a starts before b + # check if it ends before b starts + return a_to and a_to > b_from + + date_min = min(se.date_from for se in subevents) + date_max = max(se.date_to or se.date_from for se in subevents) + dates_existing = list(self.request.event.subevents.annotate( + date_fromto=Coalesce('date_to', 'date_from'), + ).filter( + date_from__lte=date_max, + date_fromto__gte=date_min, + ).values('date_from', 'date_to')) + subevents = [ + se for se in subevents if not any( + overlaps(se.date_from, se.date_to, other['date_from'], other['date_to']) + for other in dates_existing + ) + ] + if not subevents: + raise ValidationError(_('All dates would be skipped because they conflict with existing dates.')) + for i, se in enumerate(subevents): se.save(clear_cache=False) if i % 100 == 0: diff --git a/src/pretix/control/views/typeahead.py b/src/pretix/control/views/typeahead.py index 73213472bf..cfaf33c6ad 100644 --- a/src/pretix/control/views/typeahead.py +++ b/src/pretix/control/views/typeahead.py @@ -145,11 +145,21 @@ def event_list(request): if 'can_copy' in request.GET: qs = EventWizardCopyForm.copy_from_queryset(request.user, request.session) else: - qs = request.user.get_events_with_any_permission(request) + permission = request.GET.get('permission') + if permission: + qs = request.user.get_events_with_permission(permission, request) + else: + qs = request.user.get_events_with_any_permission(request) + + name_slug_q = Q(name__icontains=i18ncomp(query)) | Q(slug__icontains=query) + organizer = request.GET.get('organizer') + if organizer: + qs = qs.filter(organizer__slug=organizer) + else: + name_slug_q |= Q(organizer__name__icontains=i18ncomp(query)) | Q(organizer__slug__icontains=query) qs = qs.filter( - Q(name__icontains=i18ncomp(query)) | Q(slug__icontains=query) | - Q(organizer__name__icontains=i18ncomp(query)) | Q(organizer__slug__icontains=query) + name_slug_q ).annotate( min_from=Min('subevents__date_from'), max_from=Max('subevents__date_from'), @@ -162,10 +172,19 @@ def event_list(request): total = qs.count() pagesize = 20 offset = (page - 1) * pagesize + results = [] + if page == 1 and 'include_none' in request.GET and not query: + results.append({ + 'id': "_none", + 'text': _("No event"), + 'name': _("No event"), + 'type': "event", + }) + results += [ + serialize_event(e) for e in qs.select_related('organizer')[offset:offset + pagesize] + ] doc = { - 'results': [ - serialize_event(e) for e in qs.select_related('organizer')[offset:offset + pagesize] - ], + 'results': results, 'pagination': { "more": total >= (offset + pagesize) } @@ -181,7 +200,7 @@ def giftcard_select2(request, **kwargs): except ValueError: page = 1 - if request.user.has_organizer_permission(request.organizer, 'organizer.giftcards:write', request): + if request.user.has_organizer_permission(request.organizer, 'organizer.giftcards:read', request): qs = request.organizer.issued_gift_cards.filter( Q(secret__icontains=query) ).order_by('secret') @@ -316,7 +335,7 @@ def nav_context_list(request): page = 1 qs_events = request.user.get_events_with_any_permission(request).filter( - Q(name__icontains=i18ncomp(query)) | Q(slug__icontains=query) + Q(name__icontains=i18ncomp(query)) | Q(slug__icontains=query) | Q(domain__domainname__iexact=query) ).annotate( min_from=Min('subevents__date_from'), max_from=Max('subevents__date_from'), @@ -331,7 +350,7 @@ def nav_context_list(request): else: qs_orga = Organizer.objects.filter(pk__in=request.user.teams.values_list('organizer', flat=True)) if query: - qs_orga = qs_orga.filter(Q(name__icontains=query) | Q(slug__icontains=query)) + qs_orga = qs_orga.filter(Q(name__icontains=query) | Q(slug__icontains=query) | Q(domains__domainname__iexact=query)) qs_orga = qs_orga.annotate( n_events=Count("events") ).order_by("-n_events") @@ -619,7 +638,7 @@ def checkinlist_select2(request, **kwargs): qs = request.event.checkin_lists.select_related('subevent').filter( qf - ).order_by('name') + ).order_by('subevent__date_from', 'name', 'pk') total = qs.count() pagesize = 20 @@ -956,6 +975,21 @@ def subevent_meta_values(request, organizer, event): }) +@event_permission_required('event.vouchers:read') +def voucher_tag_typeahead(request, **kwargs): + q = request.GET.get('q', '') + tags = request.event.vouchers.filter( + tag__isnull=False, + waitinglistentries__isnull=True, + ).filter( + tag__icontains=q, + ).values_list('tag', flat=True).distinct().order_by('tag')[:10] + + return JsonResponse({ + 'results': [{'name': t} for t in tags] + }) + + def item_meta_values(request, organizer, event): q = request.GET.get('q') propname = request.GET.get('property') diff --git a/src/pretix/control/views/users.py b/src/pretix/control/views/users.py index 207d852e22..971be19c5b 100644 --- a/src/pretix/control/views/users.py +++ b/src/pretix/control/views/users.py @@ -19,19 +19,23 @@ # You should have received a copy of the GNU Affero General Public License along with this program. If not, see # . # +import hmac import json from contextlib import contextmanager from django.conf import settings from django.contrib import messages from django.contrib.auth import ( - BACKEND_SESSION_KEY, get_user_model, load_backend, login, + BACKEND_SESSION_KEY, HASH_SESSION_KEY, get_user_model, load_backend, login, + logout, ) from django.contrib.auth.mixins import LoginRequiredMixin +from django.contrib.auth.views import redirect_to_login +from django.core.exceptions import PermissionDenied from django.db import transaction from django.shortcuts import get_object_or_404, redirect from django.urls import reverse -from django.utils.crypto import get_random_string +from django.utils.crypto import get_random_string, salted_hmac from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ from django.views import View @@ -218,11 +222,13 @@ class UserImpersonateView(AdministratorPermissionRequiredMixin, RecentAuthentica def post(self, request, *args, **kwargs): self.object = get_object_or_404(User, pk=self.kwargs.get("id")) + staff_session = request.user.get_active_staff_session(request.session.session_key) self.request.user.log_action('pretix.control.auth.user.impersonated', user=request.user, data={ 'other': self.kwargs.get("id"), - 'other_email': self.object.email + 'other_email': self.object.email, + 'staff_session': staff_session.pk, }) oldkey = request.session.session_key @@ -230,7 +236,15 @@ class UserImpersonateView(AdministratorPermissionRequiredMixin, RecentAuthentica hijacked = self.object hijack_history = request.session.get("hijack_history", []) - hijack_history.append(request.user._meta.pk.value_to_string(hijacker)) + hijack_history.append({ + "user": request.user.pk, + # We include the auth_hash, because it is unguessable. So should an attacker gain an attack vector to + # modify hijack_history, they can't just insert or change a user that shouldn't be there. We HMAC it + # again, though, since we also do not want the auth_hash of the admin user to be in the session of an + # unprivileged user to contain the risk if there is some leak of session data. + "auth_hash": salted_hmac(key_salt=b"hijack-history-hash", value=request.session[HASH_SESSION_KEY], + algorithm="sha256", secret=settings.SECRET_KEY).hexdigest(), + }) backend = get_used_backend(request) backend = f"{backend.__module__}.{backend.__class__.__name__}" @@ -238,6 +252,12 @@ class UserImpersonateView(AdministratorPermissionRequiredMixin, RecentAuthentica with signals.no_update_last_login(), keep_session_age(request.session): login(request, hijacked, backend=backend) + request.session.save() + staff_session.logs.create( + method='(NOTE)', + url=f'Begin impersonating user #{hijacked.pk} (request session {oldkey[:8]} -> {request.session.session_key[:8]})', + ) + request.session["hijack_history"] = hijack_history signals.hijack_started.send( @@ -254,13 +274,28 @@ class UserImpersonateView(AdministratorPermissionRequiredMixin, RecentAuthentica class UserImpersonateStopView(LoginRequiredMixin, View): def post(self, request, *args, **kwargs): - impersonated = request.user - - hijs = request.session['hijacker_session'] + staff_session_key = request.session['hijacker_session'] + prev_session_key = request.session.session_key hijack_history = request.session.get("hijack_history", []) hijacked = request.user - user_pk = hijack_history.pop() - hijacker = get_object_or_404(get_user_model(), pk=user_pk) + prev_session = hijack_history.pop() + hijacker = get_object_or_404(get_user_model(), pk=prev_session["user"]) + staff_session = hijacker.get_active_staff_session(staff_session_key) + if not staff_session: + raise PermissionDenied + + expected_hash = salted_hmac( + key_salt=b"hijack-history-hash", + value=hijacker.get_session_auth_hash(), + algorithm="sha256", + secret=settings.SECRET_KEY + ).hexdigest() + if not hmac.compare_digest(expected_hash, prev_session["auth_hash"]): + # Could be an attacker-controlled hijack history, but could also be e.g. a password change of the admin user + # that happened during the hijack session + logout(request) + return redirect_to_login(request.get_full_path()) + backend = get_used_backend(request) backend = f"{backend.__module__}.{backend.__class__.__name__}" with signals.no_update_last_login(), keep_session_age(request.session): @@ -275,17 +310,22 @@ class UserImpersonateStopView(LoginRequiredMixin, View): hijacked=hijacked, ) - ss = request.user.get_active_staff_session(hijs) - if ss: - request.session.save() - ss.session_key = request.session.session_key - ss.save() + request.session.save() + staff_session.session_key = request.session.session_key + staff_session.save() + + staff_session.logs.create( + method='(NOTE)', + url=f'Stop impersonating user #{hijacked.pk} (request session {prev_session_key[:8]}, ' + f'staff session {staff_session_key[:8]} -> {request.session.session_key[:8]})', + ) request.user.log_action('pretix.control.auth.user.impersonate_stopped', user=request.user, data={ - 'other': impersonated.pk, - 'other_email': impersonated.email + 'other': hijacked.pk, + 'other_email': hijacked.email, + 'staff_session': staff_session.pk, }) return redirect(reverse('control:index')) diff --git a/src/pretix/control/views/vouchers.py b/src/pretix/control/views/vouchers.py index 4745f887cc..c5ae68eb2c 100644 --- a/src/pretix/control/views/vouchers.py +++ b/src/pretix/control/views/vouchers.py @@ -77,7 +77,7 @@ from pretix.control.views import PaginationMixin from pretix.helpers.compat import CompatDeleteView from pretix.helpers.format import SafeFormatter, format_map from pretix.helpers.models import modelcopy -from pretix.multidomain.urlreverse import build_absolute_uri +from pretix.multidomain.urlreverse import eventreverse_absolute class VoucherList(PaginationMixin, EventPermissionRequiredMixin, ListView): @@ -338,7 +338,7 @@ class VoucherUpdate(EventPermissionRequiredMixin, UpdateView): } if self.object.subevent_id: url_params['subevent'] = self.object.subevent_id - ctx['url'] = build_absolute_uri(self.request.event, "presale:event.redeem") + "?" + urlencode(url_params) + ctx['url'] = eventreverse_absolute(self.request.event, "presale:event.redeem") + "?" + urlencode(url_params) return ctx diff --git a/src/pretix/helpers/apps.py b/src/pretix/helpers/apps.py index c51aa3ed30..847fccb6d0 100644 --- a/src/pretix/helpers/apps.py +++ b/src/pretix/helpers/apps.py @@ -29,3 +29,8 @@ class PretixHelpersConfig(AppConfig): def ready(self): from .monkeypatching import monkeypatch_all_at_ready monkeypatch_all_at_ready() + + # Ensure reportlab does not make any calls to the internet or the local disk + from reportlab import rl_config + rl_config.trustedHosts = [] + rl_config.trustedSchemes = ['data'] diff --git a/src/pretix/helpers/compressor.py b/src/pretix/helpers/compressor.py deleted file mode 100644 index 97131548b8..0000000000 --- a/src/pretix/helpers/compressor.py +++ /dev/null @@ -1,63 +0,0 @@ -# -# 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 . -# -# 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 -# . -# -import os -import re -import shlex - -from compressor.exceptions import FilterError -from compressor.filters import CompilerFilter -from django.conf import settings - - -class VueCompiler(CompilerFilter): - # Based on work (c) Laura Klünder in https://github.com/codingcatgirl/django-vue-rollup - # Released under Apache License 2.0 - - def __init__(self, content, attrs, **kwargs): - config_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'static', 'npm_dir') - node_path = os.path.join(settings.STATIC_ROOT, 'node_prefix', 'node_modules') - self.rollup_bin = os.path.join(node_path, 'rollup', 'dist', 'bin', 'rollup') - rollup_config = os.path.join(config_dir, 'rollup.config.js') - if not os.path.exists(self.rollup_bin) and not settings.DEBUG: - raise FilterError("Rollup not installed or pretix not built properly, please run 'make npminstall' in source root.") - command = ( - ' '.join(( - 'NODE_PATH=' + shlex.quote(node_path), - shlex.quote(self.rollup_bin), - '-c', - shlex.quote(rollup_config)) - ) + - ' --input {infile} -n {export_name} --file {outfile}' - ) - super().__init__(content, command=command, **kwargs) - - def input(self, **kwargs): - if self.filename is None: - raise FilterError('VueCompiler can only compile files, not inline code.') - if not os.path.exists(self.rollup_bin): - raise FilterError("Rollup not installed, please run 'make npminstall' in source root.") - self.options += (('export_name', re.sub( - r'^([a-z])|[^a-z0-9A-Z]+([a-zA-Z0-9])?', - lambda s: s.group(0)[-1].upper(), - os.path.basename(self.filename).split('.')[0] - )),) - return super().input(**kwargs) diff --git a/src/pretix/helpers/database.py b/src/pretix/helpers/database.py index 6defe63b17..8e75c2aae8 100644 --- a/src/pretix/helpers/database.py +++ b/src/pretix/helpers/database.py @@ -120,12 +120,17 @@ class GroupConcat(Aggregate): template = "%(function)s(%(distinct)s%(field)s::text, '%(separator)s' ORDER BY %(field)s::text ASC)" else: template = "%(function)s(%(distinct)s%(field)s::text, '%(separator)s')" - return super().as_sql( + + template, params = super().as_sql( compiler, connection, function='string_agg', template=template, **extra_context, ) + if self.ordered: + # ordered statement requires field parameters twice + params = params + params + return template, params class ReplicaRouter: diff --git a/src/pretix/helpers/logs.py b/src/pretix/helpers/logs.py index 5a26b8a0eb..82f098f5f6 100644 --- a/src/pretix/helpers/logs.py +++ b/src/pretix/helpers/logs.py @@ -46,6 +46,13 @@ class RequestIdFilter(logging.Filter): return True +class SkipNotFoundFilter(logging.Filter): + # Drop the WARNING "Not Found: ..." records django.request emits for 404s + # We have different access logs for that + def filter(self, record): + return getattr(record, 'status_code', None) != 404 + + class RequestIdMiddleware: def __init__(self, get_response): self.get_response = get_response diff --git a/src/pretix/helpers/monkeypatching.py b/src/pretix/helpers/monkeypatching.py index 6b3509f64a..39150e3341 100644 --- a/src/pretix/helpers/monkeypatching.py +++ b/src/pretix/helpers/monkeypatching.py @@ -27,6 +27,7 @@ from datetime import datetime from http import cookies from django.conf import settings +from django.core.exceptions import SuspiciousFileOperation from PIL import Image from requests.adapters import HTTPAdapter from urllib3.connection import HTTPConnection, HTTPSConnection @@ -40,6 +41,10 @@ from urllib3.util.connection import ( ) from urllib3.util.timeout import _DEFAULT_TIMEOUT +from pretix.helpers.reportlab import ThumbnailingImageReader + +_cgnat_net = ipaddress.ip_network('100.64.0.0/10') + def monkeypatch_vobject_performance(): """ @@ -146,12 +151,15 @@ def monkeypatch_urllib3_ssrf_protection(): if not getattr(settings, "ALLOW_HTTP_TO_PRIVATE_NETWORKS", False): ip_addr = ipaddress.ip_address(sa[0]) + check_ip4 = ip_addr.ipv4_mapped if getattr(ip_addr, "ipv4_mapped", None) else ip_addr if ip_addr.is_multicast: raise HTTPError(f"Request to multicast address {sa[0]} blocked") if ip_addr.is_loopback or ip_addr.is_link_local: raise HTTPError(f"Request to local address {sa[0]} blocked") if ip_addr.is_private: raise HTTPError(f"Request to private address {sa[0]} blocked") + if check_ip4 in _cgnat_net: + raise HTTPError(f"Request to RFC 6598 address {sa[0]} blocked") sock = None try: @@ -226,9 +234,27 @@ def monkeypatch_cookie_morsel(): cookies.Morsel._reserved.setdefault("partitioned", "Partitioned") +def monkeypatch_reportlab_imagereader(): + from reportlab.lib import utils + old_init = utils.ImageReader.__init__ + + def new_init(self, fileName, ident=None): # noqa + if not isinstance(fileName, Image.Image) and not hasattr(fileName, 'read') and not hasattr(fileName, 'str'): + if not isinstance(self, ThumbnailingImageReader): + # ThumbnailingImageReader is only used by us explicitly and not by using in html, so it is safe + raise SuspiciousFileOperation("reportlab should not be reading images from disk") + + return types.MethodType(old_init, self)( + fileName, ident + ) + + utils.ImageReader.__init__ = new_init + + def monkeypatch_all_at_ready(): monkeypatch_vobject_performance() monkeypatch_pillow_safer() monkeypatch_requests_timeout() monkeypatch_urllib3_ssrf_protection() monkeypatch_cookie_morsel() + monkeypatch_reportlab_imagereader() diff --git a/src/pretix/helpers/payment.py b/src/pretix/helpers/payment.py index 8d19d56fd3..9950e85f2c 100644 --- a/src/pretix/helpers/payment.py +++ b/src/pretix/helpers/payment.py @@ -25,6 +25,19 @@ import text_unidecode from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ +EPC_QR_ALLOWED_CHARS = set( + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789/-?:().,'+ " +) + + +def epc_qr_field(value): + return ''.join( + char for char in text_unidecode.unidecode(str(value or '')) + if char in EPC_QR_ALLOWED_CHARS + ) + def dotdecimal(value): return str(value).replace(",", ".") @@ -77,7 +90,7 @@ def euro_epc_qr( return { "id": "girocode", "label": "EPC-QR", - "qr_data": "\n".join(text_unidecode.unidecode(str(d or '')) for d in [ + "qr_data": "\n".join(epc_qr_field(d) for d in [ "BCD", # Service Tag: ‘BCD’ "002", # Version: V2 "2", # Character set: ISO 8859-1 diff --git a/src/pretix/helpers/reportlab.py b/src/pretix/helpers/reportlab.py index 5a39ac4a5b..618dbb87ef 100644 --- a/src/pretix/helpers/reportlab.py +++ b/src/pretix/helpers/reportlab.py @@ -20,14 +20,19 @@ # . # import logging +import re +import unicodedata from arabic_reshaper import ArabicReshaper +from bidi import get_display from django.conf import settings from django.utils.functional import SimpleLazyObject +from django.utils.html import escape from PIL import Image from reportlab.lib.styles import ParagraphStyle from reportlab.lib.utils import ImageReader from reportlab.pdfbase import pdfmetrics +from reportlab.pdfbase.ttfonts import TTFont from reportlab.platypus import Paragraph from pretix.presale.style import get_fonts @@ -70,6 +75,20 @@ reshaper = SimpleLazyObject(lambda: ArabicReshaper(configuration={ })) +def normalize_text(text: str) -> str: + # reportlab does not support unicode combination characters + # It's important we do this before we use ArabicReshaper + text = unicodedata.normalize("NFKC", text) + + # reportlab does not support RTL, ligature-heavy scripts like Arabic. Therefore, we use ArabicReshaper + # to resolve all ligatures and python-bidi to switch RTL texts. + try: + text = "\n".join(get_display(reshaper.reshape(l)) for l in re.split("\n", text)) + except: + logger.exception('Reshaping/Bidi fixes failed on string {}'.format(repr(text))) + return text + + class FontFallbackParagraph(Paragraph): def __init__(self, text, style=None, *args, **kwargs): if style is None: @@ -87,6 +106,8 @@ class FontFallbackParagraph(Paragraph): if not text: return True font = pdfmetrics.getFont(font_name) + if not isinstance(font, TTFont): + return True return all( ord(c) in font.face.charToGlyph or not c.isprintable() for c in text @@ -102,6 +123,24 @@ class FontFallbackParagraph(Paragraph): return family +class PlainTextParagraph(FontFallbackParagraph): + def __init__(self, text, style=None, linebreaks=True, *args, **kwargs): + if not isinstance(text, str): + if hasattr(text, '__html__'): + raise ValueError("It is contradictory to pass escaped content to PlainTextParagraph") + text = str(text) + + # Normalize unicode and apply reshaping + text = normalize_text(text) + + # Escape any HTML in the text + text = escape(text) + + if linebreaks: + text = text.strip().replace("\n", "
\n") + super().__init__(text, style, *args, **kwargs) + + def register_ttf_font_if_new(name, path): from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont diff --git a/src/pretix/helpers/security.py b/src/pretix/helpers/security.py index d09fbe0f3d..b9aa92456c 100644 --- a/src/pretix/helpers/security.py +++ b/src/pretix/helpers/security.py @@ -35,7 +35,7 @@ from geoip2.errors import AddressNotFoundError from pretix.base.i18n import language from pretix.base.services.mail import mail from pretix.helpers.http import get_client_ip -from pretix.helpers.urls import build_absolute_uri +from pretix.helpers.urls import mainreverse_absolute logger = logging.getLogger(__name__) @@ -175,7 +175,7 @@ def handle_login_source(user, request): 'source': src, 'country': Country(str(country)).name if country else _('Unknown country'), 'instance': settings.PRETIX_INSTANCE_NAME, - 'url': build_absolute_uri('control:user.settings') + 'url': mainreverse_absolute('control:user.settings') }, event=None, user=user, diff --git a/src/pretix/helpers/templatetags/wrap_in.py b/src/pretix/helpers/templatetags/wrap_in.py new file mode 100644 index 0000000000..e08bd2c909 --- /dev/null +++ b/src/pretix/helpers/templatetags/wrap_in.py @@ -0,0 +1,33 @@ +# +# 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 . +# +# 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 +# . +# +import logging + +from django import template +from django.utils.html import format_html + +register = template.Library() +logger = logging.getLogger(__name__) + + +@register.filter +def wrap_in(content, tag_name): + return format_html(f'<{tag_name}>{{}}', content) diff --git a/src/pretix/helpers/thumb.py b/src/pretix/helpers/thumb.py index bf37f78e73..9134550db7 100644 --- a/src/pretix/helpers/thumb.py +++ b/src/pretix/helpers/thumb.py @@ -173,6 +173,7 @@ def create_thumbnail(source, size, formats=None): # filesystem path, this only works because _open() uses safe_join, which accepts absolute paths if they match the # expected base dir. For NanoCDN Files, this works because source.name is set to the storage path. source_rb = default_storage.open(source_name, mode='rb') + source_ext = os.path.splitext(source_name)[1].lower() image = Image.open(BytesIO(source_rb.read()), formats=formats or settings.PILLOW_FORMATS_QUESTIONS_IMAGE) try: @@ -183,11 +184,14 @@ def create_thumbnail(source, size, formats=None): frames = [] durations = [] for f in ImageSequence.Iterator(image): + if f.mode in ("P", "PA") and source_ext == '.png': + f = f.convert('RGBA') + if f.mode not in ("1", "L", "RGB", "RGBA"): + f = f.convert('RGB') durations.append(f.info.get("duration", 1000)) frames.append(resize_image(f, size)) image_out = frames[0] save_kwargs = {} - source_ext = os.path.splitext(source_name)[1].lower() if source_ext == '.jpg' or source_ext == '.jpeg': # Yields better file sizes for photos @@ -211,10 +215,6 @@ def create_thumbnail(source, size, formats=None): checksum = hashlib.md5(image.tobytes()).hexdigest() name = checksum + '.' + size.replace('^', 'c') + '.' + target_ext buffer = BytesIO() - if image_out.mode == "P" and source_ext == '.png': - image_out = image_out.convert('RGBA') - if image_out.mode not in ("1", "L", "RGB", "RGBA"): - image_out = image_out.convert('RGB') image_out.save(fp=buffer, format=target_ext.upper(), quality=quality, **save_kwargs) imgfile = ContentFile(buffer.getvalue()) diff --git a/src/pretix/helpers/urls.py b/src/pretix/helpers/urls.py index 7a91d498a9..bb586f2d2b 100644 --- a/src/pretix/helpers/urls.py +++ b/src/pretix/helpers/urls.py @@ -19,6 +19,7 @@ # You should have received a copy of the GNU Affero General Public License along with this program. If not, see # . # +import warnings from urllib.parse import urljoin from django.conf import settings @@ -26,6 +27,15 @@ from django.urls import reverse def build_absolute_uri(urlname, args=None, kwargs=None): + warnings.warn( + 'Usage of build_absolute_uri is confusing since there are many functions with that name. ' + 'Replace this usage with ', + DeprecationWarning + ) + return mainreverse_absolute(urlname, args, kwargs) + + +def mainreverse_absolute(urlname, args=None, kwargs=None): from pretix.multidomain import maindomain_urlconf return urljoin(settings.SITE_URL, reverse(urlname, args=args, kwargs=kwargs, urlconf=maindomain_urlconf)) diff --git a/src/pretix/locale/ang/LC_MESSAGES/django.po b/src/pretix/locale/ang/LC_MESSAGES/django.po index eb0752d5e0..cc8bde38f9 100644 --- a/src/pretix/locale/ang/LC_MESSAGES/django.po +++ b/src/pretix/locale/ang/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-30 11:22+0000\n" +"POT-Creation-Date: 2026-06-28 14:42+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -17,139 +17,173 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: pretix/_base_settings.py:87 -msgid "English" +#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html:670 +#: pretix/control/templates/pretixcontrol/events/index.html:166 +#: pretix/control/templates/pretixcontrol/organizers/detail.html:135 +#: pretix/control/views/dashboards.py:543 +msgid "Shop disabled" msgstr "" -#: pretix/_base_settings.py:88 -msgid "German" +#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html:672 +#: pretix/control/forms/filter.py:1370 pretix/control/forms/filter.py:1964 +#: pretix/control/templates/pretixcontrol/events/index.html:168 +#: pretix/control/templates/pretixcontrol/organizers/detail.html:137 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:36 +#: pretix/control/templates/pretixcontrol/subevents/index.html:172 +msgid "Presale over" +msgstr "" + +#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html:674 +#: pretix/control/forms/filter.py:1369 pretix/control/forms/filter.py:1963 +#: pretix/control/templates/pretixcontrol/events/index.html:170 +#: pretix/control/templates/pretixcontrol/organizers/detail.html:139 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:38 +#: pretix/control/templates/pretixcontrol/subevents/index.html:174 +msgid "Presale not started" +msgstr "" + +#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html:676 +#: pretix/control/templates/pretixcontrol/events/index.html:172 +#: pretix/control/templates/pretixcontrol/organizers/detail.html:141 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:40 +#: pretix/control/templates/pretixcontrol/subevents/index.html:176 +#: pretix/control/views/dashboards.py:549 +msgid "On sale" msgstr "" #: pretix/_base_settings.py:89 -msgid "German (informal)" +msgid "English" msgstr "" #: pretix/_base_settings.py:90 -msgid "Arabic" +msgid "German" msgstr "" #: pretix/_base_settings.py:91 -msgid "Basque" +msgid "German (informal)" msgstr "" #: pretix/_base_settings.py:92 -msgid "Catalan" +msgid "Arabic" msgstr "" #: pretix/_base_settings.py:93 -msgid "Chinese (simplified)" +msgid "Basque" msgstr "" #: pretix/_base_settings.py:94 -msgid "Chinese (traditional)" +msgid "Catalan" msgstr "" #: pretix/_base_settings.py:95 -msgid "Czech" +msgid "Chinese (simplified)" msgstr "" #: pretix/_base_settings.py:96 -msgid "Croatian" +msgid "Chinese (traditional)" msgstr "" #: pretix/_base_settings.py:97 -msgid "Danish" +msgid "Czech" msgstr "" #: pretix/_base_settings.py:98 -msgid "Dutch" +msgid "Croatian" msgstr "" #: pretix/_base_settings.py:99 -msgid "Dutch (informal)" +msgid "Danish" msgstr "" #: pretix/_base_settings.py:100 -msgid "French" +msgid "Dutch" msgstr "" #: pretix/_base_settings.py:101 -msgid "Finnish" +msgid "Dutch (informal)" msgstr "" #: pretix/_base_settings.py:102 -msgid "Galician" +msgid "French" msgstr "" #: pretix/_base_settings.py:103 -msgid "Greek" +msgid "Finnish" msgstr "" #: pretix/_base_settings.py:104 -msgid "Hebrew" +msgid "Galician" msgstr "" #: pretix/_base_settings.py:105 -msgid "Indonesian" +msgid "Greek" msgstr "" #: pretix/_base_settings.py:106 -msgid "Italian" +msgid "Hebrew" msgstr "" #: pretix/_base_settings.py:107 -msgid "Japanese" +msgid "Indonesian" msgstr "" #: pretix/_base_settings.py:108 -msgid "Latvian" +msgid "Italian" msgstr "" #: pretix/_base_settings.py:109 -msgid "Norwegian Bokmål" +msgid "Japanese" msgstr "" #: pretix/_base_settings.py:110 -msgid "Polish" +msgid "Latvian" msgstr "" #: pretix/_base_settings.py:111 -msgid "Portuguese (Portugal)" +msgid "Norwegian Bokmål" msgstr "" #: pretix/_base_settings.py:112 -msgid "Portuguese (Brazil)" +msgid "Polish" msgstr "" #: pretix/_base_settings.py:113 -msgid "Romanian" +msgid "Portuguese (Portugal)" msgstr "" #: pretix/_base_settings.py:114 -msgid "Russian" +msgid "Portuguese (Brazil)" msgstr "" #: pretix/_base_settings.py:115 -msgid "Slovak" +msgid "Romanian" msgstr "" #: pretix/_base_settings.py:116 -msgid "Swedish" +msgid "Russian" msgstr "" #: pretix/_base_settings.py:117 -msgid "Spanish" +msgid "Slovak" msgstr "" #: pretix/_base_settings.py:118 -msgid "Spanish (Latin America)" +msgid "Swedish" msgstr "" #: pretix/_base_settings.py:119 -msgid "Turkish" +msgid "Spanish" msgstr "" #: pretix/_base_settings.py:120 +msgid "Spanish (Latin America)" +msgstr "" + +#: pretix/_base_settings.py:121 +msgid "Turkish" +msgstr "" + +#: pretix/_base_settings.py:122 msgid "Ukrainian" msgstr "" @@ -163,11 +197,11 @@ msgstr "" msgid "pretixSCAN" msgstr "" -#: pretix/api/auth/devicesecurity.py:118 +#: pretix/api/auth/devicesecurity.py:120 msgid "pretixSCAN (kiosk mode, no order sync, no search)" msgstr "" -#: pretix/api/auth/devicesecurity.py:153 +#: pretix/api/auth/devicesecurity.py:155 msgid "pretixSCAN (online only, no order sync)" msgstr "" @@ -206,40 +240,40 @@ msgid "Target URL" msgstr "" #: pretix/api/models.py:118 pretix/base/models/devices.py:125 -#: pretix/base/models/organizer.py:373 +#: pretix/base/models/organizer.py:379 msgid "All events (including newly created ones)" msgstr "" #: pretix/api/models.py:119 pretix/base/models/devices.py:126 -#: pretix/base/models/organizer.py:374 +#: pretix/base/models/organizer.py:380 msgid "Limit to events" msgstr "" #: pretix/api/models.py:120 pretix/base/exporters/orderlist.py:306 -#: pretix/base/exporters/orderlist.py:1137 +#: pretix/base/exporters/orderlist.py:1150 #: pretix/base/modelimport_vouchers.py:326 pretix/base/models/orders.py:271 #: pretix/base/models/vouchers.py:295 pretix/control/forms/filter.py:593 -#: pretix/control/templates/pretixcontrol/order/index.html:981 +#: pretix/control/templates/pretixcontrol/order/index.html:1016 #: pretix/control/templates/pretixcontrol/organizers/webhooks.html:38 #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:21 #: pretix/control/views/vouchers.py:122 #: pretix/plugins/banktransfer/refund_export.py:47 -#: pretix/plugins/checkinlists/exporters.py:525 +#: pretix/plugins/checkinlists/exporters.py:524 msgid "Comment" msgstr "" -#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1533 +#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1541 #, python-brace-format msgid "The product \"{}\" is not assigned to a quota." msgstr "" -#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1750 -#: pretix/base/models/items.py:1917 pretix/base/models/items.py:2203 +#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1767 +#: pretix/base/models/items.py:1927 pretix/base/models/items.py:2213 msgid "One or more items do not belong to this event." msgstr "" #: pretix/api/serializers/checkin.py:69 pretix/api/serializers/checkin.py:72 -#: pretix/base/models/items.py:2214 pretix/base/models/items.py:2217 +#: pretix/base/models/items.py:2224 pretix/base/models/items.py:2227 #: pretix/base/models/waitinglist.py:306 pretix/base/models/waitinglist.py:309 msgid "The subevent does not belong to this event." msgstr "" @@ -276,11 +310,11 @@ msgstr "" msgid "Item meta data property '{name}' does not exist." msgstr "" -#: pretix/api/serializers/item.py:214 pretix/control/forms/item.py:1277 +#: pretix/api/serializers/item.py:214 pretix/control/forms/item.py:1332 msgid "The bundled item must not be the same item as the bundling one." msgstr "" -#: pretix/api/serializers/item.py:217 pretix/control/forms/item.py:1279 +#: pretix/api/serializers/item.py:217 pretix/control/forms/item.py:1334 msgid "The bundled item must not have bundles on its own." msgstr "" @@ -292,11 +326,11 @@ msgstr "" msgid "The program end must not be empty." msgstr "" -#: pretix/api/serializers/item.py:242 pretix/base/models/items.py:2322 +#: pretix/api/serializers/item.py:242 pretix/base/models/items.py:2339 msgid "The program end must not be before the program start." msgstr "" -#: pretix/api/serializers/item.py:247 pretix/base/models/items.py:2316 +#: pretix/api/serializers/item.py:247 pretix/base/models/items.py:2333 msgid "You cannot use program times on an event series." msgstr "" @@ -316,7 +350,7 @@ msgid "" "sales tax will be applied when the gift card is redeemed." msgstr "" -#: pretix/api/serializers/item.py:361 pretix/control/forms/item.py:784 +#: pretix/api/serializers/item.py:361 pretix/control/forms/item.py:839 msgid "Gift card products should not be admission products at the same time." msgstr "" @@ -326,23 +360,23 @@ msgid "" "nested endpoint." msgstr "" -#: pretix/api/serializers/item.py:587 pretix/control/forms/item.py:177 +#: pretix/api/serializers/item.py:587 pretix/control/forms/item.py:178 msgid "Question cannot depend on a question asked during check-in." msgstr "" -#: pretix/api/serializers/item.py:592 pretix/control/forms/item.py:182 +#: pretix/api/serializers/item.py:592 pretix/control/forms/item.py:183 msgid "Circular dependency between questions detected." msgstr "" -#: pretix/api/serializers/item.py:597 pretix/control/forms/item.py:191 +#: pretix/api/serializers/item.py:597 pretix/control/forms/item.py:192 msgid "This type of question cannot be asked during check-in." msgstr "" -#: pretix/api/serializers/item.py:600 pretix/control/forms/item.py:199 +#: pretix/api/serializers/item.py:600 pretix/control/forms/item.py:200 msgid "This type of question cannot be shown during check-in." msgstr "" -#: pretix/api/serializers/media.py:116 +#: pretix/api/serializers/media.py:143 msgid "" "A medium with the same identifier and type already exists in your organizer " "account." @@ -353,47 +387,47 @@ msgstr "" msgid "\"{input}\" is not a valid choice." msgstr "" -#: pretix/api/serializers/order.py:1494 pretix/api/views/cart.py:224 -#: pretix/base/services/orders.py:1593 +#: pretix/api/serializers/order.py:1502 pretix/api/views/cart.py:224 +#: pretix/base/services/orders.py:1594 #, python-brace-format msgid "The selected seat \"{seat}\" is not available." msgstr "" -#: pretix/api/serializers/order.py:1520 pretix/api/serializers/order.py:1527 +#: pretix/api/serializers/order.py:1528 pretix/api/serializers/order.py:1535 #, python-brace-format msgid "The product \"{}\" is not available on this date." msgstr "" -#: pretix/api/serializers/order.py:1542 pretix/api/views/cart.py:200 +#: pretix/api/serializers/order.py:1550 pretix/api/views/cart.py:200 #, python-brace-format msgid "" "There is not enough quota available on quota \"{}\" to perform the operation." msgstr "" #: pretix/api/serializers/organizer.py:152 -#: pretix/control/forms/organizer.py:1060 pretix/presale/forms/customer.py:471 +#: pretix/control/forms/organizer.py:1070 pretix/presale/forms/customer.py:472 msgid "An account with this email address is already registered." msgstr "" #: pretix/api/serializers/organizer.py:285 -#: pretix/control/forms/organizer.py:896 +#: pretix/control/forms/organizer.py:906 msgid "" "A gift card with the same secret already exists in your or an affiliated " "organizer account." msgstr "" -#: pretix/api/serializers/organizer.py:482 -#: pretix/control/views/organizer.py:1039 +#: pretix/api/serializers/organizer.py:495 +#: pretix/control/views/organizer.py:1035 msgid "Account invitation" msgstr "" -#: pretix/api/serializers/organizer.py:503 -#: pretix/control/views/organizer.py:1138 +#: pretix/api/serializers/organizer.py:516 +#: pretix/control/views/organizer.py:1134 msgid "This user already has been invited for this team." msgstr "" -#: pretix/api/serializers/organizer.py:519 -#: pretix/control/views/organizer.py:1155 +#: pretix/api/serializers/organizer.py:532 +#: pretix/control/views/organizer.py:1151 msgid "This user already has permissions for this team." msgstr "" @@ -402,28 +436,32 @@ msgid "" "The specified voucher has already been used the maximum number of times." msgstr "" -#: pretix/api/views/checkin.py:645 pretix/api/views/checkin.py:652 +#: pretix/api/views/checkin.py:653 pretix/api/views/checkin.py:660 msgid "Medium connected to other event" msgstr "" -#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:774 +#: pretix/api/views/checkin.py:814 +msgid "You cannot exchange a medium for a medium." +msgstr "" + +#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:777 #, python-brace-format msgid "" "The application \"{application_name}\" has been authorized to access your " "account." msgstr "" -#: pretix/api/views/order.py:607 pretix/control/views/orders.py:1605 +#: pretix/api/views/order.py:610 pretix/control/views/orders.py:1609 #: pretix/presale/views/order.py:788 pretix/presale/views/order.py:868 msgid "You cannot generate an invoice for this order." msgstr "" -#: pretix/api/views/order.py:612 pretix/control/views/orders.py:1607 +#: pretix/api/views/order.py:615 pretix/control/views/orders.py:1611 #: pretix/presale/views/order.py:790 pretix/presale/views/order.py:870 msgid "An invoice for this order already exists." msgstr "" -#: pretix/api/views/order.py:715 pretix/base/services/cart.py:223 +#: pretix/api/views/order.py:718 pretix/base/services/cart.py:223 #: pretix/base/services/orders.py:189 pretix/presale/views/order.py:852 msgid "One of the selected products is not available in the selected country." msgstr "" @@ -440,10 +478,10 @@ msgstr "" msgid "Order marked as paid" msgstr "" -#: pretix/api/webhooks.py:307 pretix/base/models/checkin.py:355 +#: pretix/api/webhooks.py:307 pretix/base/models/checkin.py:358 #: pretix/base/notifications.py:251 #: pretix/control/templates/pretixcontrol/event/mail.html:114 -#: pretix/control/views/orders.py:1566 +#: pretix/control/views/orders.py:1570 msgid "Order canceled" msgstr "" @@ -558,87 +596,98 @@ msgid "" msgstr "" #: pretix/api/webhooks.py:413 +msgid "Quota changed" +msgstr "" + +#: pretix/api/webhooks.py:414 +msgid "" +"This includes related events like creation, deletion, opening or closing of " +"quotas. No webhook is sent for changes to the resulting availability." +msgstr "" + +#: pretix/api/webhooks.py:419 msgid "Shop taken live" msgstr "" -#: pretix/api/webhooks.py:417 +#: pretix/api/webhooks.py:423 msgid "Shop taken offline" msgstr "" -#: pretix/api/webhooks.py:421 +#: pretix/api/webhooks.py:427 msgid "Test-Mode of shop has been activated" msgstr "" -#: pretix/api/webhooks.py:425 +#: pretix/api/webhooks.py:431 msgid "Test-Mode of shop has been deactivated" msgstr "" -#: pretix/api/webhooks.py:429 +#: pretix/api/webhooks.py:435 msgid "Waiting list entry added" msgstr "" -#: pretix/api/webhooks.py:433 +#: pretix/api/webhooks.py:439 msgid "Waiting list entry changed" msgstr "" -#: pretix/api/webhooks.py:437 +#: pretix/api/webhooks.py:443 msgid "Waiting list entry deleted" msgstr "" -#: pretix/api/webhooks.py:441 +#: pretix/api/webhooks.py:447 msgid "Waiting list entry received voucher" msgstr "" -#: pretix/api/webhooks.py:445 +#: pretix/api/webhooks.py:451 msgid "Voucher added" msgstr "" -#: pretix/api/webhooks.py:449 +#: pretix/api/webhooks.py:455 msgid "Voucher changed" msgstr "" -#: pretix/api/webhooks.py:450 +#: pretix/api/webhooks.py:456 msgid "" "Only includes explicit changes to the voucher, not e.g. an increase of the " "number of redemptions." msgstr "" -#: pretix/api/webhooks.py:454 +#: pretix/api/webhooks.py:460 msgid "Voucher deleted" msgstr "" -#: pretix/api/webhooks.py:458 +#: pretix/api/webhooks.py:464 msgid "Customer account created" msgstr "" -#: pretix/api/webhooks.py:462 +#: pretix/api/webhooks.py:468 msgid "Customer account changed" msgstr "" -#: pretix/api/webhooks.py:466 +#: pretix/api/webhooks.py:472 msgid "Customer account anonymized" msgstr "" -#: pretix/api/webhooks.py:470 +#: pretix/api/webhooks.py:476 msgid "Gift card added" msgstr "" -#: pretix/api/webhooks.py:474 +#: pretix/api/webhooks.py:480 msgid "Gift card modified" msgstr "" -#: pretix/api/webhooks.py:478 +#: pretix/api/webhooks.py:484 msgid "Gift card used in transaction" msgstr "" #: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103 -#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:1054 -#: pretix/base/forms/questions.py:1085 pretix/base/forms/questions.py:1337 -#: pretix/base/forms/questions.py:1373 pretix/base/payment.py:97 +#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:1074 +#: pretix/base/forms/questions.py:1105 pretix/base/forms/questions.py:1357 +#: pretix/base/forms/questions.py:1393 pretix/base/payment.py:97 #: pretix/control/forms/event.py:856 pretix/control/forms/event.py:862 #: pretix/control/forms/event.py:981 pretix/control/forms/event.py:1630 +#: pretix/control/forms/item.py:392 pretix/control/forms/item.py:394 #: pretix/control/forms/mailsetup.py:87 pretix/control/forms/mailsetup.py:129 -#: pretix/control/forms/subevents.py:181 +#: pretix/control/forms/subevents.py:191 #: pretix/plugins/banktransfer/payment.py:477 #: pretix/plugins/banktransfer/payment.py:483 #: pretix/presale/forms/customer.py:152 @@ -660,10 +709,10 @@ msgstr "" #: pretix/base/auth.py:155 pretix/base/exporters/customers.py:70 #: pretix/base/exporters/orderlist.py:283 -#: pretix/base/exporters/orderlist.py:483 -#: pretix/base/exporters/orderlist.py:622 +#: pretix/base/exporters/orderlist.py:484 +#: pretix/base/exporters/orderlist.py:623 #: pretix/base/exporters/waitinglist.py:110 pretix/base/forms/auth.py:269 -#: pretix/base/invoicing/email.py:42 pretix/base/models/auth.py:269 +#: pretix/base/invoicing/email.py:42 pretix/base/models/auth.py:278 #: pretix/base/models/customers.py:102 pretix/base/models/notifications.py:46 #: pretix/base/models/orders.py:245 pretix/base/pdf.py:336 #: pretix/control/navigation.py:86 pretix/control/navigation.py:540 @@ -673,21 +722,21 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/customer.html:50 #: pretix/control/templates/pretixcontrol/organizers/customers.html:63 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:164 -#: pretix/plugins/checkinlists/exporters.py:509 -#: pretix/presale/checkoutflow.py:1553 pretix/presale/forms/checkout.py:57 +#: pretix/plugins/checkinlists/exporters.py:508 +#: pretix/presale/checkoutflow.py:1574 pretix/presale/forms/checkout.py:54 #: pretix/presale/forms/customer.py:57 pretix/presale/forms/customer.py:142 -#: pretix/presale/forms/customer.py:298 pretix/presale/forms/customer.py:350 -#: pretix/presale/forms/customer.py:394 pretix/presale/forms/user.py:40 +#: pretix/presale/forms/customer.py:298 pretix/presale/forms/customer.py:351 +#: pretix/presale/forms/customer.py:395 pretix/presale/forms/user.py:40 #: pretix/presale/templates/pretixpresale/event/checkout_customer.html:31 #: pretix/presale/templates/pretixpresale/event/order.html:300 msgid "Email" msgstr "" #: pretix/base/auth.py:157 pretix/base/forms/auth.py:164 -#: pretix/base/forms/auth.py:225 pretix/base/models/auth.py:781 +#: pretix/base/forms/auth.py:225 pretix/base/models/auth.py:802 #: pretix/base/models/customers.py:104 pretix/control/forms/mailsetup.py:57 #: pretix/control/templates/pretixcontrol/user/settings.html:64 -#: pretix/presale/forms/customer.py:61 pretix/presale/forms/customer.py:302 +#: pretix/presale/forms/customer.py:61 pretix/presale/forms/customer.py:303 msgid "Password" msgstr "" @@ -762,9 +811,9 @@ msgstr "" #: pretix/base/customersso/oidc.py:206 pretix/base/customersso/oidc.py:214 #: pretix/base/customersso/oidc.py:237 pretix/base/customersso/oidc.py:254 -#: pretix/base/customersso/oidc.py:261 pretix/presale/views/customer.py:765 -#: pretix/presale/views/customer.py:775 pretix/presale/views/customer.py:814 -#: pretix/presale/views/customer.py:888 +#: pretix/base/customersso/oidc.py:261 pretix/presale/views/customer.py:767 +#: pretix/presale/views/customer.py:777 pretix/presale/views/customer.py:816 +#: pretix/presale/views/customer.py:890 #, python-brace-format msgid "Login was not successful. Error message: \"{error}\"." msgstr "" @@ -805,7 +854,7 @@ msgid "Attendee details" msgstr "" #: pretix/base/datasync/sourcefields.py:130 pretix/base/exporters/answers.py:66 -#: pretix/base/models/items.py:1767 pretix/control/navigation.py:185 +#: pretix/base/models/items.py:1777 pretix/control/navigation.py:185 #: pretix/control/templates/pretixcontrol/items/questions.html:3 #: pretix/control/templates/pretixcontrol/items/questions.html:5 msgid "Questions" @@ -817,7 +866,7 @@ msgstr "" #: pretix/base/datasync/sourcefields.py:132 #: pretix/control/templates/pretixcontrol/event/settings.html:279 -#: pretix/control/templates/pretixcontrol/order/index.html:176 +#: pretix/control/templates/pretixcontrol/order/index.html:209 #: pretix/presale/templates/pretixpresale/event/order.html:23 msgid "Order details" msgstr "" @@ -847,16 +896,16 @@ msgid "Event or date information" msgstr "" #: pretix/base/datasync/sourcefields.py:175 -#: pretix/base/exporters/orderlist.py:640 -#: pretix/base/exporters/orderlist.py:645 pretix/base/forms/questions.py:687 +#: pretix/base/exporters/orderlist.py:641 +#: pretix/base/exporters/orderlist.py:646 pretix/base/forms/questions.py:707 #: pretix/base/modelimport_orders.py:347 pretix/base/models/customers.py:344 -#: pretix/base/models/orders.py:1512 pretix/base/pdf.py:183 -#: pretix/control/forms/filter.py:684 pretix/control/forms/organizer.py:1154 -#: pretix/control/templates/pretixcontrol/order/index.html:571 +#: pretix/base/models/orders.py:1534 pretix/base/pdf.py:183 +#: pretix/control/forms/filter.py:684 pretix/control/forms/organizer.py:1164 +#: pretix/control/templates/pretixcontrol/order/index.html:606 #: pretix/control/templates/pretixcontrol/organizers/customer.html:123 -#: pretix/control/views/item.py:444 pretix/plugins/badges/exporters.py:495 -#: pretix/plugins/checkinlists/exporters.py:121 -#: pretix/plugins/checkinlists/exporters.py:495 +#: pretix/control/views/item.py:449 pretix/plugins/badges/exporters.py:503 +#: pretix/plugins/checkinlists/exporters.py:122 +#: pretix/plugins/checkinlists/exporters.py:494 #: pretix/plugins/ticketoutputpdf/exporters.py:94 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:162 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:165 @@ -873,11 +922,11 @@ msgid "Attendee" msgstr "" #: pretix/base/datasync/sourcefields.py:207 -#: pretix/base/exporters/orderlist.py:647 pretix/base/forms/questions.py:693 -#: pretix/base/models/customers.py:351 pretix/base/models/orders.py:1520 +#: pretix/base/exporters/orderlist.py:648 pretix/base/forms/questions.py:713 +#: pretix/base/models/customers.py:351 pretix/base/models/orders.py:1542 #: pretix/base/pdf.py:225 -#: pretix/control/templates/pretixcontrol/order/index.html:576 -#: pretix/control/views/item.py:456 +#: pretix/control/templates/pretixcontrol/order/index.html:611 +#: pretix/control/views/item.py:461 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:172 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:175 msgid "Attendee email" @@ -888,9 +937,9 @@ msgid "Attendee or order email" msgstr "" #: pretix/base/datasync/sourcefields.py:232 -#: pretix/base/exporters/orderlist.py:648 pretix/base/pdf.py:188 -#: pretix/control/templates/pretixcontrol/order/index.html:600 -#: pretix/plugins/badges/exporters.py:496 +#: pretix/base/exporters/orderlist.py:649 pretix/base/pdf.py:188 +#: pretix/control/templates/pretixcontrol/order/index.html:635 +#: pretix/plugins/badges/exporters.py:504 #: pretix/plugins/ticketoutputpdf/exporters.py:95 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:182 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:185 @@ -914,35 +963,35 @@ msgid "Attendee address country" msgstr "" #: pretix/base/datasync/sourcefields.py:279 -#: pretix/base/exporters/orderlist.py:690 pretix/base/pdf.py:346 +#: pretix/base/exporters/orderlist.py:691 pretix/base/pdf.py:346 msgid "Invoice address company" msgstr "" #: pretix/base/datasync/sourcefields.py:288 -#: pretix/base/exporters/orderlist.py:494 -#: pretix/base/exporters/orderlist.py:499 -#: pretix/base/exporters/orderlist.py:691 -#: pretix/base/exporters/orderlist.py:695 pretix/base/pdf.py:341 +#: pretix/base/exporters/orderlist.py:495 +#: pretix/base/exporters/orderlist.py:500 +#: pretix/base/exporters/orderlist.py:692 +#: pretix/base/exporters/orderlist.py:696 pretix/base/pdf.py:341 msgid "Invoice address name" msgstr "" #: pretix/base/datasync/sourcefields.py:317 -#: pretix/base/exporters/orderlist.py:697 pretix/base/pdf.py:351 +#: pretix/base/exporters/orderlist.py:698 pretix/base/pdf.py:351 msgid "Invoice address street" msgstr "" #: pretix/base/datasync/sourcefields.py:326 -#: pretix/base/exporters/orderlist.py:697 pretix/base/pdf.py:356 +#: pretix/base/exporters/orderlist.py:698 pretix/base/pdf.py:356 msgid "Invoice address ZIP code" msgstr "" #: pretix/base/datasync/sourcefields.py:335 -#: pretix/base/exporters/orderlist.py:697 pretix/base/pdf.py:361 +#: pretix/base/exporters/orderlist.py:698 pretix/base/pdf.py:361 msgid "Invoice address city" msgstr "" #: pretix/base/datasync/sourcefields.py:344 -#: pretix/base/exporters/orderlist.py:698 pretix/base/pdf.py:371 +#: pretix/base/exporters/orderlist.py:699 pretix/base/pdf.py:371 msgid "Invoice address country" msgstr "" @@ -957,13 +1006,13 @@ msgstr "" #: pretix/base/datasync/sourcefields.py:371 #: pretix/base/exporters/invoices.py:203 pretix/base/exporters/invoices.py:332 #: pretix/base/exporters/orderlist.py:283 -#: pretix/base/exporters/orderlist.py:481 -#: pretix/base/exporters/orderlist.py:619 -#: pretix/base/exporters/orderlist.py:938 pretix/base/models/orders.py:209 +#: pretix/base/exporters/orderlist.py:482 +#: pretix/base/exporters/orderlist.py:620 +#: pretix/base/exporters/orderlist.py:939 pretix/base/models/orders.py:209 #: pretix/base/notifications.py:199 pretix/base/pdf.py:105 #: pretix/base/templates/pretixbase/email/order_details.html:61 #: pretix/control/templates/pretixcontrol/checkin/index.html:95 -#: pretix/control/templates/pretixcontrol/order/index.html:181 +#: pretix/control/templates/pretixcontrol/order/index.html:214 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:116 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:22 #: pretix/control/templates/pretixcontrol/orders/index.html:47 @@ -971,12 +1020,13 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/customer.html:211 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:41 #: pretix/control/templates/pretixcontrol/search/orders.html:48 -#: pretix/plugins/badges/exporters.py:497 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:213 +#: pretix/plugins/badges/exporters.py:505 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:29 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:41 -#: pretix/plugins/checkinlists/exporters.py:122 -#: pretix/plugins/checkinlists/exporters.py:494 -#: pretix/plugins/checkinlists/exporters.py:760 +#: pretix/plugins/checkinlists/exporters.py:123 +#: pretix/plugins/checkinlists/exporters.py:493 +#: pretix/plugins/checkinlists/exporters.py:759 #: pretix/plugins/reports/exporters.py:576 #: pretix/plugins/reports/exporters.py:900 #: pretix/plugins/ticketoutputpdf/exporters.py:96 @@ -1001,8 +1051,8 @@ msgid "Product and variation name" msgstr "" #: pretix/base/datasync/sourcefields.py:410 pretix/base/exporters/items.py:57 -#: pretix/base/exporters/orderlist.py:633 -#: pretix/base/exporters/orderlist.py:949 +#: pretix/base/exporters/orderlist.py:634 +#: pretix/base/exporters/orderlist.py:950 #: pretix/base/exporters/waitinglist.py:113 msgid "Product ID" msgstr "" @@ -1017,11 +1067,11 @@ msgstr "" #: pretix/base/datasync/sourcefields.py:437 pretix/base/exporters/events.py:57 #: pretix/base/exporters/orderlist.py:283 -#: pretix/base/exporters/orderlist.py:480 -#: pretix/base/exporters/orderlist.py:618 +#: pretix/base/exporters/orderlist.py:481 +#: pretix/base/exporters/orderlist.py:619 #: pretix/base/exporters/waitinglist.py:117 pretix/base/models/event.py:595 -#: pretix/base/pdf.py:235 pretix/control/forms/filter.py:1407 -#: pretix/control/forms/filter.py:1852 +#: pretix/base/pdf.py:235 pretix/control/forms/filter.py:1413 +#: pretix/control/forms/filter.py:1985 #: pretix/control/templates/pretixcontrol/events/index.html:69 #: pretix/control/templates/pretixcontrol/organizers/detail.html:65 msgid "Event name" @@ -1043,7 +1093,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/vouchers/index.html:18 #: pretix/control/templates/pretixcontrol/vouchers/index.html:114 #: pretix/control/views/vouchers.py:120 pretix/control/views/waitinglist.py:326 -#: pretix/plugins/checkinlists/exporters.py:521 +#: pretix/plugins/checkinlists/exporters.py:520 #: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:74 #: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:76 #: pretix/presale/templates/pretixpresale/event/fragment_voucher_form.html:12 @@ -1079,9 +1129,9 @@ msgstr "" #: pretix/base/datasync/sourcefields.py:527 #: pretix/base/exporters/orderlist.py:292 -#: pretix/base/exporters/orderlist.py:704 pretix/base/modelimport_orders.py:508 -#: pretix/control/templates/pretixcontrol/order/index.html:193 -#: pretix/control/templates/pretixcontrol/pdf/index.html:249 +#: pretix/base/exporters/orderlist.py:705 pretix/base/modelimport_orders.py:508 +#: pretix/control/templates/pretixcontrol/order/index.html:226 +#: pretix/control/templates/pretixcontrol/pdf/index.html:247 msgid "Order locale" msgstr "" @@ -1109,25 +1159,25 @@ msgid "Question: {name}" msgstr "" #: pretix/base/datasync/sourcefields.py:604 -#: pretix/base/datasync/sourcefields.py:614 pretix/base/settings.py:3775 -#: pretix/base/settings.py:3788 pretix/base/settings.py:3804 -#: pretix/base/settings.py:3854 pretix/base/settings.py:3867 -#: pretix/base/settings.py:3881 pretix/base/settings.py:3934 -#: pretix/base/settings.py:3955 pretix/base/settings.py:3977 +#: pretix/base/datasync/sourcefields.py:614 pretix/base/settings.py:3794 +#: pretix/base/settings.py:3807 pretix/base/settings.py:3823 +#: pretix/base/settings.py:3873 pretix/base/settings.py:3886 +#: pretix/base/settings.py:3900 pretix/base/settings.py:3953 +#: pretix/base/settings.py:3974 pretix/base/settings.py:3996 msgid "Given name" msgstr "" #: pretix/base/datasync/sourcefields.py:628 -#: pretix/base/datasync/sourcefields.py:638 pretix/base/settings.py:3776 -#: pretix/base/settings.py:3789 pretix/base/settings.py:3805 -#: pretix/base/settings.py:3821 pretix/base/settings.py:3838 -#: pretix/base/settings.py:3853 pretix/base/settings.py:3868 -#: pretix/base/settings.py:3882 pretix/base/settings.py:3935 -#: pretix/base/settings.py:3956 pretix/base/settings.py:3978 +#: pretix/base/datasync/sourcefields.py:638 pretix/base/settings.py:3795 +#: pretix/base/settings.py:3808 pretix/base/settings.py:3824 +#: pretix/base/settings.py:3840 pretix/base/settings.py:3857 +#: pretix/base/settings.py:3872 pretix/base/settings.py:3887 +#: pretix/base/settings.py:3901 pretix/base/settings.py:3954 +#: pretix/base/settings.py:3975 pretix/base/settings.py:3997 msgid "Family name" msgstr "" -#: pretix/base/email.py:220 pretix/base/exporters/items.py:157 +#: pretix/base/email.py:225 pretix/base/exporters/items.py:157 #: pretix/base/exporters/items.py:205 pretix/base/models/tax.py:382 #: pretix/control/templates/pretixcontrol/event/tax.html:37 #: pretix/control/templates/pretixcontrol/event/tax.html:60 @@ -1141,31 +1191,31 @@ msgstr "" msgid "Default" msgstr "" -#: pretix/base/email.py:227 +#: pretix/base/email.py:232 msgid "Simple with logo" msgstr "" -#: pretix/base/exporter.py:217 pretix/base/exporter.py:350 +#: pretix/base/exporter.py:227 pretix/base/exporter.py:360 msgid "Export format" msgstr "" -#: pretix/base/exporter.py:219 +#: pretix/base/exporter.py:229 msgid "Excel (.xlsx)" msgstr "" -#: pretix/base/exporter.py:220 pretix/base/exporter.py:342 +#: pretix/base/exporter.py:230 pretix/base/exporter.py:352 msgid "CSV (with commas)" msgstr "" -#: pretix/base/exporter.py:221 pretix/base/exporter.py:343 +#: pretix/base/exporter.py:231 pretix/base/exporter.py:353 msgid "CSV (Excel-style)" msgstr "" -#: pretix/base/exporter.py:222 pretix/base/exporter.py:344 +#: pretix/base/exporter.py:232 pretix/base/exporter.py:354 msgid "CSV (with semicolons)" msgstr "" -#: pretix/base/exporter.py:338 +#: pretix/base/exporter.py:348 msgid "Combined Excel (.xlsx)" msgstr "" @@ -1175,9 +1225,9 @@ msgstr "" #: pretix/base/exporters/answers.py:55 pretix/base/exporters/json.py:52 #: pretix/base/exporters/mail.py:53 pretix/base/exporters/orderlist.py:88 -#: pretix/base/exporters/orderlist.py:881 -#: pretix/base/exporters/orderlist.py:1061 -#: pretix/base/exporters/orderlist.py:1305 +#: pretix/base/exporters/orderlist.py:882 +#: pretix/base/exporters/orderlist.py:1062 +#: pretix/base/exporters/orderlist.py:1320 #: pretix/plugins/reports/exporters.py:493 #: pretix/plugins/reports/exporters.py:666 msgctxt "export_category" @@ -1190,29 +1240,29 @@ msgid "" "customers while creating an order." msgstr "" -#: pretix/base/exporters/answers.py:76 pretix/base/exporters/orderlist.py:628 -#: pretix/base/exporters/orderlist.py:957 -#: pretix/base/exporters/orderlist.py:1198 pretix/base/models/checkin.py:58 -#: pretix/base/models/items.py:2067 pretix/base/models/orders.py:1490 -#: pretix/base/models/orders.py:3046 pretix/base/models/vouchers.py:190 +#: pretix/base/exporters/answers.py:76 pretix/base/exporters/orderlist.py:629 +#: pretix/base/exporters/orderlist.py:958 +#: pretix/base/exporters/orderlist.py:1213 pretix/base/models/checkin.py:58 +#: pretix/base/models/items.py:2077 pretix/base/models/orders.py:1512 +#: pretix/base/models/orders.py:3068 pretix/base/models/vouchers.py:190 #: pretix/base/models/waitinglist.py:61 pretix/control/forms/event.py:1798 #: pretix/control/forms/filter.py:446 pretix/control/forms/filter.py:1254 -#: pretix/control/forms/filter.py:2056 pretix/control/forms/filter.py:2278 -#: pretix/control/forms/filter.py:2393 pretix/control/forms/filter.py:2475 -#: pretix/control/forms/filter.py:2692 pretix/control/forms/orders.py:360 -#: pretix/control/forms/orders.py:849 +#: pretix/control/forms/filter.py:1547 pretix/control/forms/filter.py:2189 +#: pretix/control/forms/filter.py:2411 pretix/control/forms/filter.py:2526 +#: pretix/control/forms/filter.py:2608 pretix/control/forms/filter.py:2825 +#: pretix/control/forms/orders.py:364 pretix/control/forms/orders.py:857 #: pretix/control/templates/pretixcontrol/checkin/lists.html:108 -#: pretix/control/templates/pretixcontrol/items/quotas.html:55 +#: pretix/control/templates/pretixcontrol/items/quotas.html:99 #: pretix/control/templates/pretixcontrol/order/change.html:108 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:43 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:8 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:7 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:12 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:7 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:12 #: pretix/control/templates/pretixcontrol/vouchers/index.html:140 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:170 #: pretix/control/views/waitinglist.py:330 -#: pretix/plugins/checkinlists/exporters.py:513 -#: pretix/plugins/checkinlists/exporters.py:703 +#: pretix/plugins/checkinlists/exporters.py:512 +#: pretix/plugins/checkinlists/exporters.py:702 #: pretix/plugins/sendmail/forms.py:137 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:32 #: pretix/presale/templates/pretixpresale/event/checkout_membership.html:48 @@ -1226,12 +1276,13 @@ msgstr "" #: pretix/control/forms/checkin.py:83 pretix/control/forms/event.py:1799 #: pretix/control/forms/filter.py:449 pretix/control/forms/filter.py:476 #: pretix/control/forms/filter.py:1253 pretix/control/forms/filter.py:1287 -#: pretix/control/forms/filter.py:2059 pretix/control/forms/filter.py:2092 -#: pretix/control/forms/filter.py:2281 pretix/control/forms/filter.py:2301 -#: pretix/control/forms/filter.py:2396 pretix/control/forms/filter.py:2412 -#: pretix/control/forms/filter.py:2478 pretix/control/forms/filter.py:2513 -#: pretix/control/forms/filter.py:2695 pretix/control/forms/filter.py:2710 -#: pretix/control/forms/orders.py:851 pretix/control/forms/orders.py:1013 +#: pretix/control/forms/filter.py:1550 pretix/control/forms/filter.py:1610 +#: pretix/control/forms/filter.py:2192 pretix/control/forms/filter.py:2225 +#: pretix/control/forms/filter.py:2414 pretix/control/forms/filter.py:2434 +#: pretix/control/forms/filter.py:2529 pretix/control/forms/filter.py:2545 +#: pretix/control/forms/filter.py:2611 pretix/control/forms/filter.py:2646 +#: pretix/control/forms/filter.py:2828 pretix/control/forms/filter.py:2843 +#: pretix/control/forms/orders.py:859 pretix/control/forms/orders.py:1021 #: pretix/control/templates/pretixcontrol/event/fragment_subevent_choice_simple.html:5 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:69 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:132 @@ -1276,26 +1327,26 @@ msgid "External identifier" msgstr "" #: pretix/base/exporters/customers.py:71 pretix/base/exporters/orderlist.py:284 -#: pretix/base/exporters/orderlist.py:484 -#: pretix/base/exporters/orderlist.py:623 +#: pretix/base/exporters/orderlist.py:485 +#: pretix/base/exporters/orderlist.py:624 #: pretix/base/exporters/waitinglist.py:111 #: pretix/base/modelimport_orders.py:87 pretix/base/models/customers.py:103 -#: pretix/base/models/customers.py:440 pretix/base/models/items.py:1659 +#: pretix/base/models/customers.py:440 pretix/base/models/items.py:1669 #: pretix/base/models/orders.py:249 pretix/base/models/waitinglist.py:80 #: pretix/base/pdf.py:331 -#: pretix/control/templates/pretixcontrol/order/index.html:257 +#: pretix/control/templates/pretixcontrol/order/index.html:290 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:166 #: pretix/control/views/waitinglist.py:326 -#: pretix/plugins/checkinlists/exporters.py:510 -#: pretix/presale/checkoutflow.py:1559 pretix/presale/forms/checkout.py:84 +#: pretix/plugins/checkinlists/exporters.py:509 +#: pretix/presale/checkoutflow.py:1580 pretix/presale/forms/checkout.py:81 #: pretix/presale/forms/waitinglist.py:80 #: pretix/presale/templates/pretixpresale/event/order.html:304 msgid "Phone number" msgstr "" -#: pretix/base/exporters/customers.py:72 pretix/base/models/auth.py:272 -#: pretix/base/models/customers.py:105 pretix/base/models/orders.py:3349 -#: pretix/base/settings.py:3908 pretix/base/settings.py:3920 +#: pretix/base/exporters/customers.py:72 pretix/base/models/auth.py:281 +#: pretix/base/models/customers.py:105 pretix/base/models/orders.py:3371 +#: pretix/base/settings.py:3927 pretix/base/settings.py:3939 #: pretix/control/templates/pretixcontrol/users/index.html:47 msgid "Full name" msgstr "" @@ -1303,23 +1354,23 @@ msgstr "" #: pretix/base/exporters/customers.py:77 pretix/base/exporters/invoices.py:208 #: pretix/base/exporters/invoices.py:217 pretix/base/exporters/invoices.py:336 #: pretix/base/exporters/invoices.py:344 pretix/base/exporters/orderlist.py:284 -#: pretix/base/exporters/waitinglist.py:109 pretix/base/forms/questions.py:1252 +#: pretix/base/exporters/waitinglist.py:109 pretix/base/forms/questions.py:1272 #: pretix/base/models/devices.py:68 pretix/base/models/devices.py:130 -#: pretix/base/models/event.py:1556 pretix/base/models/event.py:1794 -#: pretix/base/models/items.py:2071 pretix/base/models/items.py:2244 +#: pretix/base/models/event.py:1573 pretix/base/models/event.py:1811 +#: pretix/base/models/items.py:2081 pretix/base/models/items.py:2254 #: pretix/base/models/memberships.py:41 pretix/base/models/organizer.py:82 -#: pretix/base/models/organizer.py:639 pretix/base/models/seating.py:86 -#: pretix/base/models/waitinglist.py:69 pretix/base/settings.py:3533 -#: pretix/base/settings.py:3543 pretix/base/settings.py:3897 -#: pretix/control/forms/filter.py:661 pretix/control/forms/item.py:447 -#: pretix/control/forms/organizer.py:1085 +#: pretix/base/models/organizer.py:646 pretix/base/models/seating.py:86 +#: pretix/base/models/waitinglist.py:69 pretix/base/settings.py:3548 +#: pretix/base/settings.py:3558 pretix/base/settings.py:3916 +#: pretix/control/forms/filter.py:661 pretix/control/forms/item.py:502 +#: pretix/control/forms/organizer.py:1095 #: pretix/control/forms/waitinglist.py:84 #: pretix/control/templates/pretixcontrol/checkin/index.html:109 #: pretix/control/templates/pretixcontrol/checkin/lists.html:99 #: pretix/control/templates/pretixcontrol/event/tax.html:36 #: pretix/control/templates/pretixcontrol/oauth/app_list.html:12 #: pretix/control/templates/pretixcontrol/oauth/authorized.html:17 -#: pretix/control/templates/pretixcontrol/order/index.html:1030 +#: pretix/control/templates/pretixcontrol/order/index.html:1065 #: pretix/control/templates/pretixcontrol/organizers/customer.html:59 #: pretix/control/templates/pretixcontrol/organizers/customers.html:66 #: pretix/control/templates/pretixcontrol/organizers/devices.html:81 @@ -1327,16 +1378,18 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/ssoclients.html:20 #: pretix/control/templates/pretixcontrol/organizers/ssoproviders.html:20 #: pretix/control/templates/pretixcontrol/organizers/team_members.html:100 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:27 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:136 #: pretix/control/templates/pretixcontrol/subevents/index.html:97 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:162 #: pretix/control/views/waitinglist.py:326 pretix/plugins/badges/models.py:53 #: pretix/plugins/badges/templates/pretixplugins/badges/index.html:34 -#: pretix/plugins/checkinlists/exporters.py:376 -#: pretix/plugins/checkinlists/exporters.py:764 +#: pretix/plugins/checkinlists/exporters.py:375 +#: pretix/plugins/checkinlists/exporters.py:763 #: pretix/plugins/reports/exporters.py:901 #: pretix/plugins/ticketoutputpdf/models.py:333 #: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/index.html:32 -#: pretix/presale/forms/customer.py:179 pretix/presale/forms/customer.py:496 +#: pretix/presale/forms/customer.py:179 pretix/presale/forms/customer.py:497 #: pretix/presale/forms/waitinglist.py:68 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:86 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:142 @@ -1349,7 +1402,7 @@ msgstr "" msgid "Account active" msgstr "" -#: pretix/base/exporters/customers.py:81 pretix/base/models/auth.py:270 +#: pretix/base/exporters/customers.py:81 pretix/base/models/auth.py:279 #: pretix/base/models/customers.py:108 msgid "Verified email address" msgstr "" @@ -1365,7 +1418,7 @@ msgid "Registration date" msgstr "" #: pretix/base/exporters/customers.py:84 pretix/base/exporters/invoices.py:207 -#: pretix/base/exporters/waitinglist.py:121 pretix/base/models/auth.py:284 +#: pretix/base/exporters/waitinglist.py:121 pretix/base/models/auth.py:293 #: pretix/base/models/customers.py:114 pretix/base/models/exports.py:54 #: pretix/control/forms/event.py:1804 pretix/control/forms/exports.py:49 #: pretix/control/forms/exports.py:88 pretix/control/views/waitinglist.py:327 @@ -1373,10 +1426,10 @@ msgid "Language" msgstr "" #: pretix/base/exporters/customers.py:85 -#: pretix/base/exporters/reusablemedia.py:58 -#: pretix/base/models/customers.py:117 pretix/base/models/media.py:110 +#: pretix/base/exporters/reusablemedia.py:61 +#: pretix/base/models/customers.py:117 pretix/base/models/media.py:122 #: pretix/control/templates/pretixcontrol/organizers/customer.html:73 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:75 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:87 msgid "Notes" msgstr "" @@ -1397,51 +1450,51 @@ msgstr "" #: pretix/base/exporters/items.py:213 pretix/base/exporters/items.py:214 #: pretix/base/exporters/items.py:215 pretix/base/exporters/items.py:218 #: pretix/base/exporters/items.py:221 pretix/base/exporters/items.py:222 -#: pretix/base/exporters/items.py:223 pretix/base/exporters/orderlist.py:417 -#: pretix/base/exporters/orderlist.py:422 -#: pretix/base/exporters/orderlist.py:792 -#: pretix/base/exporters/orderlist.py:815 -#: pretix/base/exporters/orderlist.py:847 -#: pretix/base/exporters/orderlist.py:1449 -#: pretix/base/exporters/reusablemedia.py:68 -#: pretix/base/invoicing/transmission.py:119 pretix/base/modelimport.py:208 -#: pretix/base/modelimport.py:215 pretix/base/models/orders.py:1391 +#: pretix/base/exporters/items.py:223 pretix/base/exporters/orderlist.py:419 +#: pretix/base/exporters/orderlist.py:424 +#: pretix/base/exporters/orderlist.py:793 +#: pretix/base/exporters/orderlist.py:816 +#: pretix/base/exporters/orderlist.py:848 +#: pretix/base/exporters/orderlist.py:1464 +#: pretix/base/exporters/reusablemedia.py:77 +#: pretix/base/invoicing/transmission.py:119 pretix/base/modelimport.py:212 +#: pretix/base/modelimport.py:219 pretix/base/models/orders.py:1413 #: pretix/control/forms/filter.py:182 pretix/control/forms/filter.py:556 -#: pretix/control/forms/filter.py:743 pretix/control/forms/item.py:618 -#: pretix/control/forms/subevents.py:119 pretix/control/views/item.py:715 +#: pretix/control/forms/filter.py:743 pretix/control/forms/item.py:673 +#: pretix/control/forms/subevents.py:129 pretix/control/views/item.py:720 #: pretix/control/views/vouchers.py:140 pretix/control/views/vouchers.py:141 -#: pretix/plugins/checkinlists/exporters.py:602 -#: pretix/plugins/checkinlists/exporters.py:605 -#: pretix/plugins/checkinlists/exporters.py:632 -#: pretix/plugins/checkinlists/exporters.py:648 -#: pretix/plugins/checkinlists/exporters.py:718 +#: pretix/plugins/checkinlists/exporters.py:601 +#: pretix/plugins/checkinlists/exporters.py:604 +#: pretix/plugins/checkinlists/exporters.py:631 +#: pretix/plugins/checkinlists/exporters.py:647 +#: pretix/plugins/checkinlists/exporters.py:717 +#: pretix/plugins/checkinlists/exporters.py:825 #: pretix/plugins/checkinlists/exporters.py:826 #: pretix/plugins/checkinlists/exporters.py:827 -#: pretix/plugins/checkinlists/exporters.py:828 msgid "Yes" msgstr "" #: pretix/base/exporters/customers.py:103 #: pretix/base/exporters/customers.py:104 pretix/base/exporters/events.py:83 -#: pretix/base/exporters/invoices.py:309 pretix/base/exporters/orderlist.py:417 -#: pretix/base/exporters/orderlist.py:422 -#: pretix/base/exporters/orderlist.py:815 -#: pretix/base/exporters/orderlist.py:847 -#: pretix/base/exporters/orderlist.py:1449 -#: pretix/base/exporters/reusablemedia.py:68 -#: pretix/base/invoicing/transmission.py:121 pretix/base/modelimport.py:207 -#: pretix/base/modelimport.py:217 pretix/base/models/orders.py:1393 +#: pretix/base/exporters/invoices.py:309 pretix/base/exporters/orderlist.py:419 +#: pretix/base/exporters/orderlist.py:424 +#: pretix/base/exporters/orderlist.py:816 +#: pretix/base/exporters/orderlist.py:848 +#: pretix/base/exporters/orderlist.py:1464 +#: pretix/base/exporters/reusablemedia.py:77 +#: pretix/base/invoicing/transmission.py:121 pretix/base/modelimport.py:211 +#: pretix/base/modelimport.py:221 pretix/base/models/orders.py:1415 #: pretix/control/forms/filter.py:182 pretix/control/forms/filter.py:557 -#: pretix/control/forms/filter.py:744 pretix/control/forms/item.py:619 -#: pretix/control/forms/subevents.py:120 pretix/control/views/item.py:715 +#: pretix/control/forms/filter.py:744 pretix/control/forms/item.py:674 +#: pretix/control/forms/subevents.py:130 pretix/control/views/item.py:720 #: pretix/control/views/vouchers.py:140 pretix/control/views/vouchers.py:141 -#: pretix/plugins/checkinlists/exporters.py:602 -#: pretix/plugins/checkinlists/exporters.py:605 -#: pretix/plugins/checkinlists/exporters.py:632 -#: pretix/plugins/checkinlists/exporters.py:718 +#: pretix/plugins/checkinlists/exporters.py:601 +#: pretix/plugins/checkinlists/exporters.py:604 +#: pretix/plugins/checkinlists/exporters.py:631 +#: pretix/plugins/checkinlists/exporters.py:717 +#: pretix/plugins/checkinlists/exporters.py:825 #: pretix/plugins/checkinlists/exporters.py:826 #: pretix/plugins/checkinlists/exporters.py:827 -#: pretix/plugins/checkinlists/exporters.py:828 msgid "No" msgstr "" @@ -1463,10 +1516,10 @@ msgstr "" #: pretix/base/exporters/dekodi.py:234 pretix/base/exporters/invoices.py:74 #: pretix/base/exporters/orderlist.py:130 -#: pretix/base/exporters/orderlist.py:896 -#: pretix/base/exporters/orderlist.py:1255 -#: pretix/plugins/checkinlists/exporters.py:89 -#: pretix/plugins/checkinlists/exporters.py:868 +#: pretix/base/exporters/orderlist.py:897 +#: pretix/base/exporters/orderlist.py:1270 +#: pretix/plugins/checkinlists/exporters.py:90 +#: pretix/plugins/checkinlists/exporters.py:867 #: pretix/plugins/reports/accountingreport.py:75 #: pretix/plugins/reports/exporters.py:472 #: pretix/plugins/reports/exporters.py:714 @@ -1509,71 +1562,79 @@ msgstr "" msgid "Event currency" msgstr "" -#: pretix/base/exporters/events.py:61 pretix/base/models/auth.py:287 +#: pretix/base/exporters/events.py:61 pretix/base/models/auth.py:296 #: pretix/base/models/exports.py:133 pretix/control/forms/exports.py:93 msgid "Timezone" msgstr "" #: pretix/base/exporters/events.py:62 pretix/base/models/event.py:618 -#: pretix/base/models/event.py:1558 pretix/base/settings.py:3531 -#: pretix/base/settings.py:3541 pretix/control/forms/subevents.py:484 +#: pretix/base/models/event.py:1575 pretix/base/settings.py:3546 +#: pretix/base/settings.py:3556 pretix/control/forms/subevents.py:494 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:268 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:43 msgid "Event start time" msgstr "" #: pretix/base/exporters/events.py:63 pretix/base/models/event.py:620 -#: pretix/base/models/event.py:1560 pretix/base/pdf.py:297 -#: pretix/control/forms/subevents.py:489 +#: pretix/base/models/event.py:1577 pretix/base/pdf.py:297 +#: pretix/control/forms/subevents.py:499 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:270 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:45 msgid "Event end time" msgstr "" #: pretix/base/exporters/events.py:64 pretix/base/models/event.py:622 -#: pretix/base/models/event.py:1562 pretix/control/forms/subevents.py:494 +#: pretix/base/models/event.py:1579 pretix/control/forms/subevents.py:504 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:274 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:48 msgid "Admission time" msgstr "" #: pretix/base/exporters/events.py:65 pretix/base/models/event.py:634 -#: pretix/base/models/event.py:1571 pretix/control/forms/subevents.py:93 +#: pretix/base/models/event.py:1588 pretix/control/forms/subevents.py:93 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:52 msgid "Start of presale" msgstr "" #: pretix/base/exporters/events.py:66 pretix/base/models/event.py:628 -#: pretix/base/models/event.py:1565 pretix/control/forms/subevents.py:99 +#: pretix/base/models/event.py:1582 pretix/control/forms/subevents.py:99 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:56 msgid "End of presale" msgstr "" #: pretix/base/exporters/events.py:67 pretix/base/exporters/invoices.py:355 -#: pretix/base/models/event.py:640 pretix/base/models/event.py:1577 +#: pretix/base/models/event.py:640 pretix/base/models/event.py:1594 +#: pretix/base/models/items.py:2328 #: pretix/base/templates/pretixbase/email/order_details.html:83 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:60 msgid "Location" msgstr "" #: pretix/base/exporters/events.py:68 pretix/base/models/event.py:648 -#: pretix/base/models/event.py:1580 +#: pretix/base/models/event.py:1597 #: pretix/control/templates/pretixcontrol/event/fragment_geodata.html:18 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:54 msgid "Latitude" msgstr "" #: pretix/base/exporters/events.py:69 pretix/base/models/event.py:656 -#: pretix/base/models/event.py:1588 +#: pretix/base/models/event.py:1605 #: pretix/control/templates/pretixcontrol/event/fragment_geodata.html:28 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:64 msgid "Longitude" msgstr "" #: pretix/base/exporters/events.py:70 pretix/base/models/event.py:668 -#: pretix/base/models/event.py:1603 +#: pretix/base/models/event.py:1620 #: pretix/control/templates/pretixcontrol/event/index.html:137 -#: pretix/control/templates/pretixcontrol/order/index.html:1080 +#: pretix/control/templates/pretixcontrol/order/index.html:1115 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:70 msgid "Internal comment" msgstr "" -#: pretix/base/exporters/invoices.py:82 pretix/base/models/orders.py:1761 -#: pretix/base/models/orders.py:2185 pretix/control/forms/filter.py:214 -#: pretix/control/forms/filter.py:1060 pretix/control/forms/filter.py:2433 +#: pretix/base/exporters/invoices.py:82 pretix/base/models/orders.py:1783 +#: pretix/base/models/orders.py:2207 pretix/control/forms/filter.py:214 +#: pretix/control/forms/filter.py:1060 pretix/control/forms/filter.py:2566 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:9 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:14 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:44 @@ -1588,7 +1649,7 @@ msgstr "" #: pretix/base/exporters/invoices.py:84 pretix/base/exporters/invoices.py:86 #: pretix/control/forms/filter.py:216 pretix/control/forms/filter.py:1062 -#: pretix/control/forms/filter.py:2435 +#: pretix/control/forms/filter.py:2568 msgid "All payment providers" msgstr "" @@ -1619,9 +1680,9 @@ msgid "" msgstr "" #: pretix/base/exporters/invoices.py:193 pretix/base/shredder.py:583 -#: pretix/control/templates/pretixcontrol/order/index.html:268 -#: pretix/control/templates/pretixcontrol/order/index.html:386 -#: pretix/control/templates/pretixcontrol/organizers/edit.html:313 +#: pretix/control/templates/pretixcontrol/order/index.html:301 +#: pretix/control/templates/pretixcontrol/order/index.html:419 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:314 #: pretix/presale/templates/pretixpresale/event/order.html:236 #: pretix/presale/templates/pretixpresale/event/order.html:257 msgid "Invoices" @@ -1636,11 +1697,11 @@ msgid "Invoice number" msgstr "" #: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:331 -#: pretix/base/exporters/orderlist.py:1278 -#: pretix/base/exporters/orderlist.py:1324 +#: pretix/base/exporters/orderlist.py:1293 +#: pretix/base/exporters/orderlist.py:1339 #: pretix/base/exporters/waitinglist.py:108 pretix/base/forms/widgets.py:222 -#: pretix/base/models/items.py:1655 pretix/base/models/orders.py:258 -#: pretix/base/models/orders.py:3021 pretix/base/models/orders.py:3160 +#: pretix/base/models/items.py:1665 pretix/base/models/orders.py:258 +#: pretix/base/models/orders.py:3043 pretix/base/models/orders.py:3182 #: pretix/base/templates/pretixbase/email/order_details.html:70 #: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:25 #: pretix/control/templates/pretixcontrol/order/transactions.html:19 @@ -1648,7 +1709,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html:65 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:17 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:11 -#: pretix/plugins/checkinlists/exporters.py:756 +#: pretix/plugins/checkinlists/exporters.py:755 #: pretix/presale/templates/pretixpresale/event/fragment_giftcard_history.html:6 #: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:58 msgid "Date" @@ -1684,14 +1745,14 @@ msgstr "" #: pretix/base/exporters/invoices.py:209 pretix/base/exporters/invoices.py:337 #: pretix/base/exporters/orderlist.py:291 -#: pretix/base/exporters/orderlist.py:501 -#: pretix/base/exporters/orderlist.py:649 pretix/base/forms/questions.py:712 +#: pretix/base/exporters/orderlist.py:502 +#: pretix/base/exporters/orderlist.py:650 pretix/base/forms/questions.py:732 #: pretix/base/modelimport_orders.py:232 pretix/base/modelimport_orders.py:386 -#: pretix/base/models/customers.py:355 pretix/base/models/orders.py:1547 -#: pretix/base/models/orders.py:3351 pretix/control/forms/filter.py:665 +#: pretix/base/models/customers.py:355 pretix/base/models/orders.py:1569 +#: pretix/base/models/orders.py:3373 pretix/control/forms/filter.py:665 #: pretix/control/forms/filter.py:696 -#: pretix/control/templates/pretixcontrol/order/index.html:1032 -#: pretix/plugins/checkinlists/exporters.py:536 +#: pretix/control/templates/pretixcontrol/order/index.html:1067 +#: pretix/plugins/checkinlists/exporters.py:535 #: pretix/plugins/reports/exporters.py:856 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:88 #: pretix/presale/templates/pretixpresale/event/order.html:316 @@ -1701,14 +1762,14 @@ msgstr "" #: pretix/base/exporters/invoices.py:210 pretix/base/exporters/invoices.py:219 #: pretix/base/exporters/invoices.py:338 pretix/base/exporters/invoices.py:346 #: pretix/base/exporters/orderlist.py:291 -#: pretix/base/exporters/orderlist.py:501 -#: pretix/base/exporters/orderlist.py:650 pretix/base/forms/questions.py:723 +#: pretix/base/exporters/orderlist.py:502 +#: pretix/base/exporters/orderlist.py:651 pretix/base/forms/questions.py:743 #: pretix/base/modelimport_orders.py:244 pretix/base/modelimport_orders.py:397 -#: pretix/base/models/customers.py:356 pretix/base/models/orders.py:1548 -#: pretix/base/models/orders.py:3352 pretix/base/settings.py:1321 +#: pretix/base/models/customers.py:356 pretix/base/models/orders.py:1570 +#: pretix/base/models/orders.py:3374 pretix/base/settings.py:1336 #: pretix/control/forms/filter.py:669 pretix/control/forms/filter.py:700 -#: pretix/control/views/item.py:490 -#: pretix/plugins/checkinlists/exporters.py:537 +#: pretix/control/views/item.py:495 +#: pretix/plugins/checkinlists/exporters.py:536 #: pretix/plugins/reports/exporters.py:857 msgid "ZIP code" msgstr "" @@ -1716,28 +1777,29 @@ msgstr "" #: pretix/base/exporters/invoices.py:211 pretix/base/exporters/invoices.py:220 #: pretix/base/exporters/invoices.py:339 pretix/base/exporters/invoices.py:347 #: pretix/base/exporters/orderlist.py:291 -#: pretix/base/exporters/orderlist.py:501 -#: pretix/base/exporters/orderlist.py:651 pretix/base/forms/questions.py:731 +#: pretix/base/exporters/orderlist.py:502 +#: pretix/base/exporters/orderlist.py:652 pretix/base/forms/questions.py:751 #: pretix/base/modelimport_orders.py:256 pretix/base/modelimport_orders.py:408 -#: pretix/base/models/customers.py:357 pretix/base/models/orders.py:1549 -#: pretix/base/models/orders.py:3353 pretix/base/settings.py:1335 +#: pretix/base/models/customers.py:357 pretix/base/models/orders.py:1571 +#: pretix/base/models/orders.py:3375 pretix/base/settings.py:1350 #: pretix/control/forms/filter.py:674 pretix/control/forms/filter.py:705 -#: pretix/control/views/item.py:500 -#: pretix/plugins/checkinlists/exporters.py:538 +#: pretix/control/views/item.py:505 +#: pretix/plugins/checkinlists/exporters.py:537 #: pretix/plugins/reports/exporters.py:858 msgid "City" msgstr "" #: pretix/base/exporters/invoices.py:212 pretix/base/exporters/invoices.py:222 #: pretix/base/exporters/invoices.py:349 pretix/base/exporters/orderlist.py:291 -#: pretix/base/exporters/orderlist.py:501 -#: pretix/base/exporters/orderlist.py:653 pretix/base/forms/questions.py:768 -#: pretix/base/forms/questions.py:1202 pretix/base/modelimport_orders.py:295 -#: pretix/base/models/customers.py:359 pretix/base/models/orders.py:1551 -#: pretix/base/models/orders.py:3357 pretix/base/settings.py:1349 -#: pretix/base/views/js_helpers.py:72 pretix/control/forms/event.py:1098 -#: pretix/control/templates/pretixcontrol/order/index.html:1039 -#: pretix/plugins/checkinlists/exporters.py:540 +#: pretix/base/exporters/orderlist.py:502 +#: pretix/base/exporters/orderlist.py:654 pretix/base/forms/questions.py:788 +#: pretix/base/forms/questions.py:1222 pretix/base/modelimport_orders.py:295 +#: pretix/base/modelimport_orders.py:445 pretix/base/models/customers.py:359 +#: pretix/base/models/orders.py:1573 pretix/base/models/orders.py:3379 +#: pretix/base/settings.py:1364 pretix/base/views/js_helpers.py:72 +#: pretix/control/forms/event.py:1098 +#: pretix/control/templates/pretixcontrol/order/index.html:1074 +#: pretix/plugins/checkinlists/exporters.py:539 #: pretix/plugins/reports/exporters.py:859 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:95 #: pretix/presale/templates/pretixpresale/event/order.html:323 @@ -1748,16 +1810,16 @@ msgstr "" #: pretix/base/exporters/invoices.py:213 pretix/base/exporters/invoices.py:221 #: pretix/base/exporters/invoices.py:340 pretix/base/exporters/invoices.py:348 #: pretix/base/exporters/orderlist.py:291 -#: pretix/base/exporters/orderlist.py:501 -#: pretix/base/exporters/orderlist.py:652 pretix/base/forms/questions.py:743 +#: pretix/base/exporters/orderlist.py:502 +#: pretix/base/exporters/orderlist.py:653 pretix/base/forms/questions.py:763 #: pretix/base/modelimport_orders.py:274 pretix/base/modelimport_orders.py:425 -#: pretix/base/models/customers.py:358 pretix/base/models/orders.py:1550 -#: pretix/base/models/orders.py:3354 pretix/base/models/orders.py:3355 -#: pretix/base/settings.py:1361 pretix/control/forms/filter.py:679 +#: pretix/base/models/customers.py:358 pretix/base/models/orders.py:1572 +#: pretix/base/models/orders.py:3376 pretix/base/models/orders.py:3377 +#: pretix/base/settings.py:1376 pretix/control/forms/filter.py:679 #: pretix/control/forms/filter.py:710 -#: pretix/control/templates/pretixcontrol/order/index.html:1036 -#: pretix/control/views/item.py:510 -#: pretix/plugins/checkinlists/exporters.py:539 +#: pretix/control/templates/pretixcontrol/order/index.html:1071 +#: pretix/control/views/item.py:515 +#: pretix/plugins/checkinlists/exporters.py:538 #: pretix/plugins/reports/exporters.py:808 #: pretix/plugins/reports/exporters.py:853 #: pretix/plugins/reports/exporters.py:902 @@ -1773,10 +1835,10 @@ msgstr "" #: pretix/base/exporters/invoices.py:215 pretix/base/exporters/invoices.py:223 #: pretix/base/exporters/invoices.py:342 pretix/base/exporters/invoices.py:350 #: pretix/base/exporters/orderlist.py:292 -#: pretix/base/exporters/orderlist.py:501 -#: pretix/base/exporters/orderlist.py:700 pretix/base/modelimport_orders.py:321 -#: pretix/base/models/orders.py:3358 pretix/base/views/js_helpers.py:77 -#: pretix/control/templates/pretixcontrol/order/index.html:1043 +#: pretix/base/exporters/orderlist.py:502 +#: pretix/base/exporters/orderlist.py:701 pretix/base/modelimport_orders.py:321 +#: pretix/base/models/orders.py:3380 pretix/base/views/js_helpers.py:77 +#: pretix/control/templates/pretixcontrol/order/index.html:1078 #: pretix/plugins/reports/exporters.py:860 #: pretix/plugins/reports/exporters.py:902 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:99 @@ -1799,12 +1861,12 @@ msgstr "" #: pretix/base/exporters/invoices.py:216 pretix/base/exporters/invoices.py:343 #: pretix/base/exporters/orderlist.py:284 -#: pretix/base/exporters/orderlist.py:493 pretix/base/forms/questions.py:704 +#: pretix/base/exporters/orderlist.py:494 pretix/base/forms/questions.py:724 #: pretix/base/modelimport_orders.py:199 pretix/base/modelimport_orders.py:375 #: pretix/control/forms/filter.py:657 pretix/control/forms/filter.py:692 -#: pretix/control/templates/pretixcontrol/order/index.html:1028 -#: pretix/control/views/item.py:468 -#: pretix/plugins/checkinlists/exporters.py:520 +#: pretix/control/templates/pretixcontrol/order/index.html:1063 +#: pretix/control/views/item.py:473 +#: pretix/plugins/checkinlists/exporters.py:519 #: pretix/plugins/reports/exporters.py:855 #: pretix/plugins/reports/exporters.py:901 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:83 @@ -1817,14 +1879,14 @@ msgid "Street address" msgstr "" #: pretix/base/exporters/invoices.py:224 pretix/base/exporters/invoices.py:351 -#: pretix/base/models/orders.py:3367 pretix/base/models/orders.py:3423 +#: pretix/base/models/orders.py:3389 pretix/base/models/orders.py:3445 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:103 msgid "Beneficiary" msgstr "" #: pretix/base/exporters/invoices.py:225 pretix/base/exporters/invoices.py:352 -#: pretix/base/modelimport_orders.py:333 pretix/base/models/orders.py:3362 -#: pretix/control/templates/pretixcontrol/order/index.html:1064 +#: pretix/base/modelimport_orders.py:333 pretix/base/models/orders.py:3384 +#: pretix/control/templates/pretixcontrol/order/index.html:1099 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:111 msgid "Internal reference" msgstr "" @@ -1856,8 +1918,8 @@ msgstr "" #: pretix/base/exporters/invoices.py:232 pretix/base/exporters/invoices.py:353 #: pretix/base/exporters/orderlist.py:311 -#: pretix/base/exporters/orderlist.py:505 -#: pretix/base/exporters/orderlist.py:708 pretix/base/plugins.py:139 +#: pretix/base/exporters/orderlist.py:506 +#: pretix/base/exporters/orderlist.py:709 pretix/base/plugins.py:144 #: pretix/control/templates/pretixcontrol/event/payment.html:11 msgid "Payment providers" msgstr "" @@ -1868,7 +1930,7 @@ msgstr "" #: pretix/base/exporters/invoices.py:288 pretix/base/exporters/invoices.py:392 #: pretix/control/templates/pretixcontrol/event/mail.html:120 -#: pretix/control/templates/pretixcontrol/order/index.html:272 +#: pretix/control/templates/pretixcontrol/order/index.html:305 #: pretix/control/templates/pretixcontrol/order/mail_history.html:72 #: pretix/presale/templates/pretixpresale/event/order.html:244 msgid "Invoice" @@ -1878,13 +1940,13 @@ msgstr "" msgid "Line number" msgstr "" -#: pretix/base/exporters/invoices.py:324 pretix/base/exporters/orderlist.py:488 -#: pretix/base/models/items.py:492 pretix/base/models/items.py:1155 +#: pretix/base/exporters/invoices.py:324 pretix/base/exporters/orderlist.py:489 +#: pretix/base/models/items.py:497 pretix/base/models/items.py:1165 #: pretix/control/templates/pretixcontrol/pdf/placeholders.html:32 msgid "Description" msgstr "" -#: pretix/base/exporters/invoices.py:325 pretix/control/forms/orders.py:355 +#: pretix/base/exporters/invoices.py:325 pretix/control/forms/orders.py:359 msgid "Gross price" msgstr "" @@ -1892,18 +1954,18 @@ msgstr "" msgid "Net price" msgstr "" -#: pretix/base/exporters/invoices.py:327 pretix/base/exporters/orderlist.py:492 -#: pretix/base/exporters/orderlist.py:639 -#: pretix/base/exporters/orderlist.py:963 pretix/base/models/orders.py:2352 -#: pretix/base/models/orders.py:2551 pretix/base/models/orders.py:3070 +#: pretix/base/exporters/invoices.py:327 pretix/base/exporters/orderlist.py:493 +#: pretix/base/exporters/orderlist.py:640 +#: pretix/base/exporters/orderlist.py:964 pretix/base/models/orders.py:2374 +#: pretix/base/models/orders.py:2573 pretix/base/models/orders.py:3092 msgid "Tax value" msgstr "" -#: pretix/base/exporters/invoices.py:328 pretix/base/exporters/orderlist.py:490 -#: pretix/base/exporters/orderlist.py:637 -#: pretix/base/exporters/orderlist.py:960 pretix/base/models/orders.py:2339 -#: pretix/base/models/orders.py:2538 pretix/base/models/orders.py:3057 -#: pretix/base/models/orders.py:3173 pretix/base/models/tax.py:349 +#: pretix/base/exporters/invoices.py:328 pretix/base/exporters/orderlist.py:491 +#: pretix/base/exporters/orderlist.py:638 +#: pretix/base/exporters/orderlist.py:961 pretix/base/models/orders.py:2361 +#: pretix/base/models/orders.py:2560 pretix/base/models/orders.py:3079 +#: pretix/base/models/orders.py:3195 pretix/base/models/tax.py:349 #: pretix/control/templates/pretixcontrol/order/transactions.html:21 #: pretix/plugins/reports/accountingreport.py:316 #: pretix/plugins/reports/exporters.py:809 @@ -1919,7 +1981,7 @@ msgstr "" msgid "Product data" msgstr "" -#: pretix/base/exporters/items.py:50 pretix/base/exporters/orderlist.py:1188 +#: pretix/base/exporters/items.py:50 pretix/base/exporters/orderlist.py:1203 msgctxt "export_category" msgid "Product data" msgstr "" @@ -1928,8 +1990,8 @@ msgstr "" msgid "Download a spreadsheet with details about all products and variations." msgstr "" -#: pretix/base/exporters/items.py:58 pretix/base/exporters/orderlist.py:635 -#: pretix/base/exporters/orderlist.py:951 +#: pretix/base/exporters/items.py:58 pretix/base/exporters/orderlist.py:636 +#: pretix/base/exporters/orderlist.py:952 #: pretix/base/exporters/waitinglist.py:115 msgid "Variation ID" msgstr "" @@ -1942,31 +2004,31 @@ msgid "Product category" msgstr "" #: pretix/base/exporters/items.py:60 pretix/base/models/discount.py:64 -#: pretix/base/models/items.py:96 pretix/base/models/items.py:483 -#: pretix/base/models/tax.py:321 pretix/control/forms/organizer.py:267 +#: pretix/base/models/items.py:96 pretix/base/models/items.py:488 +#: pretix/base/models/tax.py:321 pretix/control/forms/organizer.py:276 #: pretix/control/templates/pretixcontrol/items/discounts.html:61 msgid "Internal name" msgstr "" -#: pretix/base/exporters/items.py:64 pretix/base/models/items.py:480 +#: pretix/base/exporters/items.py:64 pretix/base/models/items.py:485 msgid "Item name" msgstr "" -#: pretix/base/exporters/items.py:68 pretix/base/exporters/orderlist.py:634 -#: pretix/base/exporters/orderlist.py:952 -#: pretix/base/exporters/waitinglist.py:114 pretix/base/models/items.py:1148 -#: pretix/base/models/orders.py:1500 pretix/base/models/orders.py:3039 -#: pretix/plugins/checkinlists/exporters.py:698 +#: pretix/base/exporters/items.py:68 pretix/base/exporters/orderlist.py:635 +#: pretix/base/exporters/orderlist.py:953 +#: pretix/base/exporters/waitinglist.py:114 pretix/base/models/items.py:1158 +#: pretix/base/models/orders.py:1522 pretix/base/models/orders.py:3061 +#: pretix/plugins/checkinlists/exporters.py:697 msgid "Variation" msgstr "" -#: pretix/base/exporters/items.py:71 pretix/base/exporters/reusablemedia.py:53 +#: pretix/base/exporters/items.py:71 pretix/base/exporters/reusablemedia.py:56 #: pretix/base/models/customers.py:65 pretix/base/models/customers.py:447 -#: pretix/base/models/discount.py:60 pretix/base/models/event.py:1547 -#: pretix/base/models/items.py:489 pretix/base/models/items.py:1152 -#: pretix/base/models/media.py:77 pretix/base/settings.py:226 -#: pretix/base/settings.py:261 pretix/base/settings.py:292 -#: pretix/control/forms/filter.py:1360 pretix/control/forms/filter.py:2165 +#: pretix/base/models/discount.py:60 pretix/base/models/event.py:1564 +#: pretix/base/models/items.py:494 pretix/base/models/items.py:1162 +#: pretix/base/models/media.py:87 pretix/base/settings.py:239 +#: pretix/base/settings.py:274 pretix/base/settings.py:305 +#: pretix/control/forms/filter.py:1366 pretix/control/forms/filter.py:2298 #: pretix/control/templates/pretixcontrol/event/plugins.html:25 #: pretix/control/templates/pretixcontrol/event/plugins.html:75 #: pretix/control/templates/pretixcontrol/organizers/plugins.html:25 @@ -1985,22 +2047,22 @@ msgstr "" msgid "Sales channels" msgstr "" -#: pretix/base/exporters/items.py:73 pretix/base/models/items.py:497 -#: pretix/base/models/items.py:1166 +#: pretix/base/exporters/items.py:73 pretix/base/models/items.py:502 +#: pretix/base/models/items.py:1176 #: pretix/control/templates/pretixcontrol/items/index.html:48 msgid "Default price" msgstr "" -#: pretix/base/exporters/items.py:74 pretix/base/models/items.py:505 +#: pretix/base/exporters/items.py:74 pretix/base/models/items.py:510 #: pretix/control/templates/pretixcontrol/items/index.html:150 msgid "Free price input" msgstr "" -#: pretix/base/exporters/items.py:75 pretix/base/models/items.py:519 +#: pretix/base/exporters/items.py:75 pretix/base/models/items.py:524 msgid "Sales tax" msgstr "" -#: pretix/base/exporters/items.py:76 pretix/base/models/items.py:524 +#: pretix/base/exporters/items.py:76 pretix/base/models/items.py:529 msgid "Is an admission ticket" msgstr "" @@ -2010,11 +2072,11 @@ msgstr "" msgid "Personalized ticket" msgstr "" -#: pretix/base/exporters/items.py:78 pretix/base/models/items.py:538 +#: pretix/base/exporters/items.py:78 pretix/base/models/items.py:543 msgid "Generate tickets" msgstr "" -#: pretix/base/exporters/items.py:79 pretix/base/exporters/orderlist.py:1195 +#: pretix/base/exporters/items.py:79 pretix/base/exporters/orderlist.py:1210 #: pretix/base/exporters/waitinglist.py:41 pretix/base/shredder.py:371 #: pretix/control/forms/event.py:1874 pretix/control/navigation.py:249 #: pretix/control/templates/pretixcontrol/event/settings.html:362 @@ -2033,93 +2095,93 @@ msgstr "" #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:103 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:27 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:67 -#: pretix/presale/views/widget.py:452 +#: pretix/presale/views/widget.py:484 msgid "Waiting list" msgstr "" #: pretix/base/exporters/items.py:80 pretix/base/models/discount.py:82 #: pretix/base/models/items.py:224 pretix/base/models/items.py:280 -#: pretix/base/models/items.py:561 pretix/base/models/items.py:1205 -#: pretix/base/payment.py:394 pretix/control/forms/subevents.py:323 -#: pretix/control/forms/subevents.py:345 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:507 +#: pretix/base/models/items.py:566 pretix/base/models/items.py:1215 +#: pretix/base/payment.py:394 pretix/control/forms/subevents.py:333 +#: pretix/control/forms/subevents.py:355 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:509 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:172 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:150 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:150 msgid "Available from" msgstr "" #: pretix/base/exporters/items.py:81 pretix/base/models/discount.py:87 #: pretix/base/models/items.py:229 pretix/base/models/items.py:285 -#: pretix/base/models/items.py:571 pretix/base/models/items.py:1215 -#: pretix/base/payment.py:400 pretix/control/forms/subevents.py:328 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:512 +#: pretix/base/models/items.py:576 pretix/base/models/items.py:1225 +#: pretix/base/payment.py:400 pretix/control/forms/subevents.py:338 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:514 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:177 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:155 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:155 msgid "Available until" msgstr "" -#: pretix/base/exporters/items.py:82 pretix/base/models/items.py:609 +#: pretix/base/exporters/items.py:82 pretix/base/models/items.py:614 msgid "This product can only be bought using a voucher." msgstr "" -#: pretix/base/exporters/items.py:83 pretix/base/models/items.py:622 +#: pretix/base/exporters/items.py:83 pretix/base/models/items.py:627 msgid "" "This product will only be shown if a voucher matching the product is " "redeemed." msgstr "" -#: pretix/base/exporters/items.py:84 pretix/base/models/items.py:615 +#: pretix/base/exporters/items.py:84 pretix/base/models/items.py:620 msgid "Buying this product requires approval" msgstr "" -#: pretix/base/exporters/items.py:85 pretix/base/models/items.py:628 +#: pretix/base/exporters/items.py:85 pretix/base/models/items.py:633 msgid "Only sell this product as part of a bundle" msgstr "" -#: pretix/base/exporters/items.py:86 pretix/base/models/items.py:635 +#: pretix/base/exporters/items.py:86 pretix/base/models/items.py:640 msgid "Allow product to be canceled or changed" msgstr "" -#: pretix/base/exporters/items.py:87 pretix/base/models/items.py:641 +#: pretix/base/exporters/items.py:87 pretix/base/models/items.py:646 msgid "Minimum amount per order" msgstr "" -#: pretix/base/exporters/items.py:88 pretix/base/models/items.py:648 +#: pretix/base/exporters/items.py:88 pretix/base/models/items.py:653 msgid "Maximum amount per order" msgstr "" #: pretix/base/exporters/items.py:89 pretix/base/exporters/orderlist.py:304 -#: pretix/base/modelimport_orders.py:652 pretix/base/models/items.py:656 -#: pretix/base/models/items.py:1242 pretix/base/models/orders.py:281 -#: pretix/plugins/checkinlists/exporters.py:524 +#: pretix/base/modelimport_orders.py:652 pretix/base/models/items.py:661 +#: pretix/base/models/items.py:1252 pretix/base/models/orders.py:281 +#: pretix/plugins/checkinlists/exporters.py:523 msgid "Requires special attention" msgstr "" #: pretix/base/exporters/items.py:90 pretix/base/exporters/orderlist.py:305 -#: pretix/base/modelimport_orders.py:661 pretix/base/models/items.py:663 -#: pretix/base/models/items.py:1249 pretix/base/models/orders.py:288 -#: pretix/plugins/checkinlists/exporters.py:526 +#: pretix/base/modelimport_orders.py:661 pretix/base/models/items.py:668 +#: pretix/base/models/items.py:1259 pretix/base/models/orders.py:288 +#: pretix/plugins/checkinlists/exporters.py:525 msgid "Check-in text" msgstr "" -#: pretix/base/exporters/items.py:91 pretix/base/models/items.py:668 -#: pretix/base/models/items.py:1169 +#: pretix/base/exporters/items.py:91 pretix/base/models/items.py:673 +#: pretix/base/models/items.py:1179 msgid "Original price" msgstr "" -#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:685 +#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:690 msgid "This product is a gift card" msgstr "" -#: pretix/base/exporters/items.py:93 pretix/base/models/items.py:691 -#: pretix/base/models/items.py:1190 +#: pretix/base/exporters/items.py:93 pretix/base/models/items.py:696 +#: pretix/base/models/items.py:1200 #: pretix/control/templates/pretixcontrol/item/include_variations.html:41 #: pretix/control/templates/pretixcontrol/item/include_variations.html:167 msgid "Require a valid membership" msgstr "" -#: pretix/base/exporters/items.py:94 pretix/base/models/items.py:700 -#: pretix/base/models/items.py:1199 +#: pretix/base/exporters/items.py:94 pretix/base/models/items.py:705 +#: pretix/base/models/items.py:1209 msgid "Hide without a valid membership" msgstr "" @@ -2161,15 +2223,16 @@ msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:8 #: pretix/control/templates/pretixcontrol/orders/index.html:10 #: pretix/control/templates/pretixcontrol/organizers/customer.html:205 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:203 #: pretix/plugins/reports/accountingreport.py:673 #: pretix/plugins/reports/accountingreport.py:873 #: pretix/plugins/reports/exporters.py:673 pretix/plugins/statistics/apps.py:39 #: pretix/presale/templates/pretixpresale/organizers/customer_orders.html:13 -#: pretix/presale/views/customer.py:362 +#: pretix/presale/views/customer.py:364 msgid "Orders" msgstr "" -#: pretix/base/exporters/orderlist.py:103 pretix/base/models/orders.py:2603 +#: pretix/base/exporters/orderlist.py:103 pretix/base/models/orders.py:2625 #: pretix/base/notifications.py:205 msgid "Order positions" msgstr "" @@ -2196,9 +2259,9 @@ msgid "Only include orders created within this date range." msgstr "" #: pretix/base/exporters/orderlist.py:137 pretix/base/notifications.py:194 -#: pretix/base/pdf.py:245 pretix/base/settings.py:1223 -#: pretix/base/settings.py:1235 pretix/control/forms/filter.py:1259 -#: pretix/plugins/badges/exporters.py:499 +#: pretix/base/pdf.py:245 pretix/base/settings.py:1238 +#: pretix/base/settings.py:1250 pretix/control/forms/filter.py:1259 +#: pretix/plugins/badges/exporters.py:507 #: pretix/plugins/reports/exporters.py:315 #: pretix/plugins/reports/exporters.py:465 #: pretix/plugins/ticketoutputpdf/exporters.py:97 @@ -2211,10 +2274,10 @@ msgid "" "Will also include other dates in case of mixed orders!" msgstr "" -#: pretix/base/exporters/orderlist.py:149 pretix/base/models/items.py:795 -#: pretix/base/models/items.py:1702 pretix/control/forms/filter.py:442 -#: pretix/control/forms/filter.py:1248 pretix/control/forms/filter.py:2050 -#: pretix/control/forms/item.py:277 pretix/control/navigation.py:151 +#: pretix/base/exporters/orderlist.py:149 pretix/base/models/items.py:800 +#: pretix/base/models/items.py:1712 pretix/control/forms/filter.py:442 +#: pretix/control/forms/filter.py:1248 pretix/control/forms/filter.py:2183 +#: pretix/control/forms/item.py:278 pretix/control/navigation.py:151 #: pretix/control/navigation.py:160 #: pretix/control/templates/pretixcontrol/checkin/lists.html:113 #: pretix/control/templates/pretixcontrol/items/base.html:3 @@ -2222,7 +2285,9 @@ msgstr "" #: pretix/control/templates/pretixcontrol/items/index.html:5 #: pretix/control/templates/pretixcontrol/items/index.html:8 #: pretix/control/templates/pretixcontrol/items/questions.html:28 -#: pretix/control/templates/pretixcontrol/items/quotas.html:53 +#: pretix/control/templates/pretixcontrol/items/quotas.html:97 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:82 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:140 #: pretix/plugins/autocheckin/forms.py:56 #: pretix/plugins/autocheckin/models.py:72 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:31 @@ -2239,34 +2304,34 @@ msgid "" msgstr "" #: pretix/base/exporters/orderlist.py:283 -#: pretix/base/exporters/orderlist.py:479 -#: pretix/base/exporters/orderlist.py:617 -#: pretix/base/exporters/orderlist.py:935 -#: pretix/base/exporters/orderlist.py:1136 -#: pretix/base/exporters/orderlist.py:1324 +#: pretix/base/exporters/orderlist.py:480 +#: pretix/base/exporters/orderlist.py:618 +#: pretix/base/exporters/orderlist.py:936 +#: pretix/base/exporters/orderlist.py:1149 +#: pretix/base/exporters/orderlist.py:1339 #: pretix/base/exporters/waitinglist.py:116 pretix/control/forms/event.py:1850 #: pretix/control/forms/organizer.py:119 msgid "Event slug" msgstr "" #: pretix/base/exporters/orderlist.py:283 -#: pretix/base/exporters/orderlist.py:482 -#: pretix/base/exporters/orderlist.py:621 -#: pretix/base/exporters/orderlist.py:1136 -#: pretix/base/exporters/orderlist.py:1380 +#: pretix/base/exporters/orderlist.py:483 +#: pretix/base/exporters/orderlist.py:622 +#: pretix/base/exporters/orderlist.py:1149 +#: pretix/base/exporters/orderlist.py:1395 #: pretix/base/exporters/waitinglist.py:123 #: pretix/base/exporters/waitinglist.py:173 pretix/base/models/orders.py:215 -#: pretix/control/forms/filter.py:1055 pretix/control/forms/filter.py:1357 -#: pretix/control/forms/filter.py:1583 pretix/control/forms/filter.py:1652 -#: pretix/control/forms/filter.py:1724 pretix/control/forms/filter.py:1824 -#: pretix/control/forms/filter.py:2162 pretix/control/forms/filter.py:2242 -#: pretix/control/forms/filter.py:2523 pretix/control/forms/filter.py:2840 +#: pretix/control/forms/filter.py:1055 pretix/control/forms/filter.py:1363 +#: pretix/control/forms/filter.py:1716 pretix/control/forms/filter.py:1785 +#: pretix/control/forms/filter.py:1857 pretix/control/forms/filter.py:1957 +#: pretix/control/forms/filter.py:2295 pretix/control/forms/filter.py:2375 +#: pretix/control/forms/filter.py:2656 pretix/control/forms/filter.py:2973 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:52 #: pretix/control/templates/pretixcontrol/checkin/index.html:112 #: pretix/control/templates/pretixcontrol/event/invoicing.html:99 #: pretix/control/templates/pretixcontrol/events/index.html:92 -#: pretix/control/templates/pretixcontrol/order/index.html:826 -#: pretix/control/templates/pretixcontrol/order/index.html:922 +#: pretix/control/templates/pretixcontrol/order/index.html:861 +#: pretix/control/templates/pretixcontrol/order/index.html:957 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:26 #: pretix/control/templates/pretixcontrol/orders/index.html:151 #: pretix/control/templates/pretixcontrol/orders/refunds.html:65 @@ -2278,9 +2343,10 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:113 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mail.html:35 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html:64 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:30 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:42 #: pretix/control/templates/pretixcontrol/search/orders.html:63 #: pretix/control/templates/pretixcontrol/search/payments.html:103 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:31 #: pretix/control/templates/pretixcontrol/subevents/index.html:108 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:173 #: pretix/control/views/waitinglist.py:326 @@ -2293,20 +2359,20 @@ msgid "Status" msgstr "" #: pretix/base/exporters/orderlist.py:284 -#: pretix/base/exporters/orderlist.py:485 -#: pretix/base/exporters/orderlist.py:624 -#: pretix/base/exporters/orderlist.py:939 pretix/base/notifications.py:203 -#: pretix/base/settings.py:1224 pretix/base/settings.py:1236 -#: pretix/control/forms/filter.py:2484 -#: pretix/control/templates/pretixcontrol/order/index.html:183 +#: pretix/base/exporters/orderlist.py:486 +#: pretix/base/exporters/orderlist.py:625 +#: pretix/base/exporters/orderlist.py:940 pretix/base/notifications.py:203 +#: pretix/base/settings.py:1239 pretix/base/settings.py:1251 +#: pretix/control/forms/filter.py:2617 +#: pretix/control/templates/pretixcontrol/order/index.html:216 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:24 #: pretix/control/templates/pretixcontrol/orders/index.html:140 #: pretix/control/templates/pretixcontrol/organizers/customer.html:213 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:45 #: pretix/control/templates/pretixcontrol/search/orders.html:57 -#: pretix/plugins/badges/exporters.py:498 -#: pretix/plugins/checkinlists/exporters.py:123 -#: pretix/plugins/checkinlists/exporters.py:522 +#: pretix/plugins/badges/exporters.py:506 +#: pretix/plugins/checkinlists/exporters.py:124 +#: pretix/plugins/checkinlists/exporters.py:521 #: pretix/plugins/reports/exporters.py:513 #: pretix/plugins/reports/exporters.py:576 #: pretix/plugins/reports/exporters.py:696 @@ -2316,10 +2382,10 @@ msgid "Order date" msgstr "" #: pretix/base/exporters/orderlist.py:284 -#: pretix/base/exporters/orderlist.py:486 -#: pretix/base/exporters/orderlist.py:625 -#: pretix/base/exporters/orderlist.py:940 -#: pretix/plugins/checkinlists/exporters.py:523 +#: pretix/base/exporters/orderlist.py:487 +#: pretix/base/exporters/orderlist.py:626 +#: pretix/base/exporters/orderlist.py:941 +#: pretix/plugins/checkinlists/exporters.py:522 msgid "Order time" msgstr "" @@ -2351,18 +2417,19 @@ msgid "Tax value at {rate} % tax" msgstr "" #: pretix/base/exporters/orderlist.py:302 +#: pretix/base/exporters/orderlist.py:1151 msgid "Invoice numbers" msgstr "" #: pretix/base/exporters/orderlist.py:303 -#: pretix/base/exporters/orderlist.py:703 pretix/base/modelimport_orders.py:578 +#: pretix/base/exporters/orderlist.py:704 pretix/base/modelimport_orders.py:578 #: pretix/control/forms/filter.py:621 -#: pretix/control/templates/pretixcontrol/order/index.html:190 +#: pretix/control/templates/pretixcontrol/order/index.html:223 msgid "Sales channel" msgstr "" #: pretix/base/exporters/orderlist.py:307 -#: pretix/base/exporters/orderlist.py:668 pretix/base/models/orders.py:276 +#: pretix/base/exporters/orderlist.py:669 pretix/base/models/orders.py:276 #: pretix/control/forms/filter.py:251 msgid "Follow-up date" msgstr "" @@ -2374,14 +2441,14 @@ msgid "Positions" msgstr "" #: pretix/base/exporters/orderlist.py:309 -#: pretix/base/exporters/orderlist.py:705 pretix/base/models/orders.py:320 +#: pretix/base/exporters/orderlist.py:706 pretix/base/models/orders.py:320 #: pretix/control/forms/filter.py:603 msgid "Email address verified" msgstr "" #: pretix/base/exporters/orderlist.py:310 -#: pretix/base/exporters/orderlist.py:504 -#: pretix/base/exporters/orderlist.py:706 +#: pretix/base/exporters/orderlist.py:505 +#: pretix/base/exporters/orderlist.py:707 msgid "External customer ID" msgstr "" @@ -2390,87 +2457,87 @@ msgstr "" msgid "Paid by {method}" msgstr "" -#: pretix/base/exporters/orderlist.py:487 -#: pretix/base/exporters/orderlist.py:953 +#: pretix/base/exporters/orderlist.py:488 +#: pretix/base/exporters/orderlist.py:954 msgid "Fee type" msgstr "" -#: pretix/base/exporters/orderlist.py:489 -#: pretix/base/exporters/orderlist.py:636 -#: pretix/base/exporters/orderlist.py:959 pretix/base/modelimport_orders.py:467 -#: pretix/base/models/orders.py:1505 pretix/base/models/orders.py:3050 -#: pretix/base/pdf.py:160 pretix/control/forms/orders.py:638 +#: pretix/base/exporters/orderlist.py:490 +#: pretix/base/exporters/orderlist.py:637 +#: pretix/base/exporters/orderlist.py:960 pretix/base/modelimport_orders.py:467 +#: pretix/base/models/orders.py:1527 pretix/base/models/orders.py:3072 +#: pretix/base/pdf.py:160 pretix/control/forms/orders.py:646 #: pretix/control/templates/pretixcontrol/item/index.html:146 #: pretix/control/templates/pretixcontrol/order/change.html:194 -#: pretix/control/templates/pretixcontrol/order/change.html:418 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:497 +#: pretix/control/templates/pretixcontrol/order/change.html:420 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:499 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:162 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:140 -#: pretix/plugins/checkinlists/exporters.py:377 -#: pretix/plugins/checkinlists/exporters.py:501 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:140 +#: pretix/plugins/checkinlists/exporters.py:376 +#: pretix/plugins/checkinlists/exporters.py:500 #: pretix/plugins/reports/accountingreport.py:315 msgid "Price" msgstr "" -#: pretix/base/exporters/orderlist.py:491 -#: pretix/base/exporters/orderlist.py:638 -#: pretix/base/exporters/orderlist.py:962 +#: pretix/base/exporters/orderlist.py:492 +#: pretix/base/exporters/orderlist.py:639 +#: pretix/base/exporters/orderlist.py:963 #: pretix/control/templates/pretixcontrol/event/tax_edit.html:9 #: pretix/control/templates/pretixcontrol/event/tax_edit.html:16 #: pretix/control/templates/pretixcontrol/order/change.html:165 msgid "Tax rule" msgstr "" -#: pretix/base/exporters/orderlist.py:520 -#: pretix/base/exporters/orderlist.py:731 pretix/base/models/orders.py:204 +#: pretix/base/exporters/orderlist.py:521 +#: pretix/base/exporters/orderlist.py:732 pretix/base/models/orders.py:204 msgid "canceled" msgstr "" -#: pretix/base/exporters/orderlist.py:620 -#: pretix/base/exporters/orderlist.py:946 -#: pretix/plugins/checkinlists/exporters.py:761 +#: pretix/base/exporters/orderlist.py:621 +#: pretix/base/exporters/orderlist.py:947 +#: pretix/plugins/checkinlists/exporters.py:760 msgid "Position ID" msgstr "" -#: pretix/base/exporters/orderlist.py:629 -#: pretix/base/exporters/orderlist.py:1199 -#: pretix/base/exporters/waitinglist.py:119 pretix/base/forms/questions.py:658 -#: pretix/base/forms/questions.py:667 pretix/base/models/memberships.py:145 +#: pretix/base/exporters/orderlist.py:630 +#: pretix/base/exporters/orderlist.py:1214 +#: pretix/base/exporters/waitinglist.py:119 pretix/base/forms/questions.py:678 +#: pretix/base/forms/questions.py:687 pretix/base/models/memberships.py:145 #: pretix/control/forms/rrule.py:49 #: pretix/control/templates/pretixcontrol/events/index.html:80 -#: pretix/control/templates/pretixcontrol/order/index.html:823 -#: pretix/control/templates/pretixcontrol/order/index.html:917 +#: pretix/control/templates/pretixcontrol/order/index.html:858 +#: pretix/control/templates/pretixcontrol/order/index.html:952 #: pretix/control/templates/pretixcontrol/orders/refunds.html:55 #: pretix/control/templates/pretixcontrol/organizers/detail.html:68 #: pretix/control/templates/pretixcontrol/search/payments.html:83 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:19 #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:18 -#: pretix/plugins/checkinlists/exporters.py:514 -#: pretix/plugins/checkinlists/exporters.py:704 +#: pretix/plugins/checkinlists/exporters.py:513 +#: pretix/plugins/checkinlists/exporters.py:703 msgid "Start date" msgstr "" -#: pretix/base/exporters/orderlist.py:630 -#: pretix/base/exporters/orderlist.py:1200 +#: pretix/base/exporters/orderlist.py:631 +#: pretix/base/exporters/orderlist.py:1215 #: pretix/base/exporters/waitinglist.py:120 #: pretix/base/models/memberships.py:148 #: pretix/control/templates/pretixcontrol/events/index.html:84 #: pretix/control/templates/pretixcontrol/organizers/detail.html:70 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:21 #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:20 -#: pretix/plugins/checkinlists/exporters.py:515 -#: pretix/plugins/checkinlists/exporters.py:705 +#: pretix/plugins/checkinlists/exporters.py:514 +#: pretix/plugins/checkinlists/exporters.py:704 msgid "End date" msgstr "" -#: pretix/base/exporters/orderlist.py:632 -#: pretix/base/exporters/orderlist.py:950 +#: pretix/base/exporters/orderlist.py:633 +#: pretix/base/exporters/orderlist.py:951 #: pretix/base/exporters/waitinglist.py:112 #: pretix/base/modelimport_orders.py:129 -#: pretix/base/modelimport_vouchers.py:174 pretix/base/models/items.py:794 +#: pretix/base/modelimport_vouchers.py:174 pretix/base/models/items.py:799 #: pretix/base/models/vouchers.py:253 pretix/base/models/waitinglist.py:91 -#: pretix/control/forms/filter.py:2284 pretix/control/forms/filter.py:2539 -#: pretix/control/forms/orders.py:335 pretix/control/forms/vouchers.py:67 +#: pretix/control/forms/filter.py:2417 pretix/control/forms/filter.py:2672 +#: pretix/control/forms/orders.py:339 pretix/control/forms/vouchers.py:67 #: pretix/control/forms/waitinglist.py:106 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:66 #: pretix/control/templates/pretixcontrol/item/base.html:3 @@ -2481,10 +2548,10 @@ msgstr "" #: pretix/control/templates/pretixcontrol/vouchers/index.html:134 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:168 #: pretix/control/views/vouchers.py:120 pretix/control/views/waitinglist.py:326 -#: pretix/plugins/checkinlists/exporters.py:377 -#: pretix/plugins/checkinlists/exporters.py:501 -#: pretix/plugins/checkinlists/exporters.py:697 -#: pretix/plugins/checkinlists/exporters.py:763 +#: pretix/plugins/checkinlists/exporters.py:376 +#: pretix/plugins/checkinlists/exporters.py:500 +#: pretix/plugins/checkinlists/exporters.py:696 +#: pretix/plugins/checkinlists/exporters.py:762 #: pretix/plugins/reports/accountingreport.py:271 #: pretix/plugins/reports/exporters.py:386 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:159 @@ -2494,7 +2561,7 @@ msgstr "" msgid "Product" msgstr "" -#: pretix/base/exporters/orderlist.py:654 pretix/base/models/vouchers.py:315 +#: pretix/base/exporters/orderlist.py:655 pretix/base/models/vouchers.py:315 #: pretix/control/templates/pretixcontrol/vouchers/bulk.html:5 #: pretix/control/templates/pretixcontrol/vouchers/detail.html:6 #: pretix/control/templates/pretixcontrol/vouchers/detail.html:8 @@ -2502,129 +2569,130 @@ msgstr "" msgid "Voucher" msgstr "" -#: pretix/base/exporters/orderlist.py:655 +#: pretix/base/exporters/orderlist.py:656 msgid "Voucher budget usage" msgstr "" -#: pretix/base/exporters/orderlist.py:656 +#: pretix/base/exporters/orderlist.py:657 msgid "Voucher tag" msgstr "" -#: pretix/base/exporters/orderlist.py:657 +#: pretix/base/exporters/orderlist.py:658 msgid "Pseudonymization ID" msgstr "" -#: pretix/base/exporters/orderlist.py:658 pretix/control/forms/filter.py:714 +#: pretix/base/exporters/orderlist.py:659 pretix/control/forms/filter.py:714 #: pretix/control/templates/pretixcontrol/order/change.html:280 msgid "Ticket secret" msgstr "" -#: pretix/base/exporters/orderlist.py:659 pretix/base/modelimport_orders.py:610 +#: pretix/base/exporters/orderlist.py:660 pretix/base/modelimport_orders.py:610 #: pretix/base/modelimport_vouchers.py:272 -#: pretix/plugins/checkinlists/exporters.py:527 +#: pretix/plugins/checkinlists/exporters.py:526 msgid "Seat ID" msgstr "" -#: pretix/base/exporters/orderlist.py:660 -#: pretix/plugins/checkinlists/exporters.py:528 +#: pretix/base/exporters/orderlist.py:661 +#: pretix/plugins/checkinlists/exporters.py:527 msgid "Seat name" msgstr "" -#: pretix/base/exporters/orderlist.py:661 -#: pretix/plugins/checkinlists/exporters.py:529 +#: pretix/base/exporters/orderlist.py:662 +#: pretix/plugins/checkinlists/exporters.py:528 msgid "Seat zone" msgstr "" -#: pretix/base/exporters/orderlist.py:662 -#: pretix/plugins/checkinlists/exporters.py:530 +#: pretix/base/exporters/orderlist.py:663 +#: pretix/plugins/checkinlists/exporters.py:529 msgid "Seat row" msgstr "" -#: pretix/base/exporters/orderlist.py:663 -#: pretix/plugins/checkinlists/exporters.py:531 +#: pretix/base/exporters/orderlist.py:664 +#: pretix/plugins/checkinlists/exporters.py:530 msgid "Seat number" msgstr "" -#: pretix/base/exporters/orderlist.py:664 +#: pretix/base/exporters/orderlist.py:665 #: pretix/control/templates/pretixcontrol/order/change.html:224 -#: pretix/plugins/checkinlists/exporters.py:429 -#: pretix/plugins/checkinlists/exporters.py:532 +#: pretix/plugins/checkinlists/exporters.py:428 +#: pretix/plugins/checkinlists/exporters.py:531 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:167 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:169 msgid "Blocked" msgstr "" -#: pretix/base/exporters/orderlist.py:665 pretix/base/modelimport_orders.py:537 -#: pretix/base/models/orders.py:2570 +#: pretix/base/exporters/orderlist.py:666 pretix/base/modelimport_orders.py:537 +#: pretix/base/models/orders.py:2592 #: pretix/control/templates/pretixcontrol/organizers/customer.html:120 -#: pretix/plugins/checkinlists/exporters.py:533 -#: pretix/plugins/checkinlists/exporters.py:707 +#: pretix/plugins/checkinlists/exporters.py:532 +#: pretix/plugins/checkinlists/exporters.py:706 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:46 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:54 msgid "Valid from" msgstr "" -#: pretix/base/exporters/orderlist.py:666 pretix/base/modelimport_orders.py:545 -#: pretix/base/modelimport_vouchers.py:111 pretix/base/models/orders.py:2575 +#: pretix/base/exporters/orderlist.py:667 pretix/base/modelimport_orders.py:545 +#: pretix/base/modelimport_vouchers.py:111 pretix/base/models/orders.py:2597 #: pretix/base/models/vouchers.py:224 #: pretix/control/templates/pretixcontrol/organizers/customer.html:121 #: pretix/control/views/vouchers.py:120 -#: pretix/plugins/checkinlists/exporters.py:534 -#: pretix/plugins/checkinlists/exporters.py:708 +#: pretix/plugins/checkinlists/exporters.py:533 +#: pretix/plugins/checkinlists/exporters.py:707 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:48 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:60 msgid "Valid until" msgstr "" -#: pretix/base/exporters/orderlist.py:667 pretix/base/modelimport_orders.py:643 +#: pretix/base/exporters/orderlist.py:668 pretix/base/modelimport_orders.py:643 msgid "Order comment" msgstr "" -#: pretix/base/exporters/orderlist.py:669 +#: pretix/base/exporters/orderlist.py:670 msgid "Add-on to position ID" msgstr "" -#: pretix/base/exporters/orderlist.py:699 +#: pretix/base/exporters/orderlist.py:700 msgctxt "address" msgid "Invoice address state" msgstr "" -#: pretix/base/exporters/orderlist.py:707 pretix/control/navigation.py:327 +#: pretix/base/exporters/orderlist.py:708 pretix/control/navigation.py:327 #: pretix/control/templates/pretixcontrol/checkin/lists.html:6 #: pretix/control/templates/pretixcontrol/checkin/lists.html:8 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:521 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:523 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:274 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:164 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:131 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:164 #: pretix/plugins/checkinlists/apps.py:44 msgid "Check-in lists" msgstr "" -#: pretix/base/exporters/orderlist.py:709 +#: pretix/base/exporters/orderlist.py:710 msgid "Position order link" msgstr "" -#: pretix/base/exporters/orderlist.py:880 +#: pretix/base/exporters/orderlist.py:881 msgid "Order transaction data" msgstr "" -#: pretix/base/exporters/orderlist.py:882 +#: pretix/base/exporters/orderlist.py:883 msgid "" "Download a spreadsheet of all substantial changes to orders, i.e. all " "changes to products, prices or tax rates. The information is only accurate " "for changes made with pretix versions released after October 2021." msgstr "" -#: pretix/base/exporters/orderlist.py:899 +#: pretix/base/exporters/orderlist.py:900 msgid "Only include transactions created within this date range." msgstr "" -#: pretix/base/exporters/orderlist.py:934 pretix/base/models/event.py:695 -#: pretix/base/models/items.py:468 pretix/base/models/items.py:2060 -#: pretix/base/models/orders.py:232 pretix/base/models/orders.py:3152 +#: pretix/base/exporters/orderlist.py:935 pretix/base/models/event.py:695 +#: pretix/base/models/items.py:473 pretix/base/models/items.py:2070 +#: pretix/base/models/orders.py:232 pretix/base/models/orders.py:3174 #: pretix/base/models/vouchers.py:184 pretix/base/models/waitinglist.py:55 #: pretix/base/notifications.py:187 #: pretix/base/templates/pretixbase/email/cancel_confirm.txt:4 -#: pretix/control/forms/filter.py:1030 pretix/control/forms/filter.py:2835 +#: pretix/control/forms/filter.py:1030 pretix/control/forms/filter.py:2968 #: pretix/control/templates/pretixcontrol/organizers/customer.html:212 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:42 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mail.html:66 @@ -2637,9 +2705,9 @@ msgstr "" msgid "Event" msgstr "" -#: pretix/base/exporters/orderlist.py:936 -#: pretix/base/exporters/orderlist.py:1280 -#: pretix/base/exporters/orderlist.py:1428 +#: pretix/base/exporters/orderlist.py:937 +#: pretix/base/exporters/orderlist.py:1295 +#: pretix/base/exporters/orderlist.py:1443 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:50 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:36 #: pretix/plugins/banktransfer/refund_export.py:47 @@ -2651,19 +2719,19 @@ msgstr "" msgid "Currency" msgstr "" -#: pretix/base/exporters/orderlist.py:942 +#: pretix/base/exporters/orderlist.py:943 msgid "Transaction date" msgstr "" -#: pretix/base/exporters/orderlist.py:943 +#: pretix/base/exporters/orderlist.py:944 msgid "Transaction time" msgstr "" -#: pretix/base/exporters/orderlist.py:944 +#: pretix/base/exporters/orderlist.py:945 msgid "Old data" msgstr "" -#: pretix/base/exporters/orderlist.py:947 pretix/base/models/items.py:1555 +#: pretix/base/exporters/orderlist.py:948 pretix/base/models/items.py:1565 #: pretix/control/templates/pretixcontrol/order/transactions.html:23 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:207 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:353 @@ -2675,118 +2743,118 @@ msgstr "" msgid "Quantity" msgstr "" -#: pretix/base/exporters/orderlist.py:954 +#: pretix/base/exporters/orderlist.py:955 msgid "Internal fee type" msgstr "" -#: pretix/base/exporters/orderlist.py:956 +#: pretix/base/exporters/orderlist.py:957 msgctxt "subevent" msgid "Date ID" msgstr "" -#: pretix/base/exporters/orderlist.py:961 +#: pretix/base/exporters/orderlist.py:962 msgid "Tax rule ID" msgstr "" -#: pretix/base/exporters/orderlist.py:964 +#: pretix/base/exporters/orderlist.py:965 #: pretix/plugins/reports/accountingreport.py:320 msgid "Gross total" msgstr "" -#: pretix/base/exporters/orderlist.py:965 +#: pretix/base/exporters/orderlist.py:966 #: pretix/plugins/reports/accountingreport.py:319 msgid "Tax total" msgstr "" -#: pretix/base/exporters/orderlist.py:975 +#: pretix/base/exporters/orderlist.py:976 msgid "" "This value is supplied for informational purposes, it is not part of the " "original transaction data and might have changed since the transaction." msgstr "" -#: pretix/base/exporters/orderlist.py:998 +#: pretix/base/exporters/orderlist.py:999 msgid "Converted from legacy version" msgstr "" -#: pretix/base/exporters/orderlist.py:1060 +#: pretix/base/exporters/orderlist.py:1061 msgid "Payments and refunds" msgstr "" -#: pretix/base/exporters/orderlist.py:1062 +#: pretix/base/exporters/orderlist.py:1063 msgid "Download a spreadsheet of all payments or refunds of every order." msgstr "" -#: pretix/base/exporters/orderlist.py:1072 +#: pretix/base/exporters/orderlist.py:1073 msgid "Date range (payment date)" msgstr "" -#: pretix/base/exporters/orderlist.py:1075 +#: pretix/base/exporters/orderlist.py:1076 msgid "" "Note that using this will exclude any non-confirmed payments or non-" "completed refunds." msgstr "" -#: pretix/base/exporters/orderlist.py:1079 +#: pretix/base/exporters/orderlist.py:1080 msgid "Date range (start of transaction)" msgstr "" -#: pretix/base/exporters/orderlist.py:1085 +#: pretix/base/exporters/orderlist.py:1086 msgid "Payment states" msgstr "" -#: pretix/base/exporters/orderlist.py:1093 +#: pretix/base/exporters/orderlist.py:1094 msgid "Refund states" msgstr "" -#: pretix/base/exporters/orderlist.py:1136 -#: pretix/base/exporters/orderlist.py:1281 -#: pretix/base/exporters/orderlist.py:1324 pretix/base/models/orders.py:335 -#: pretix/base/models/orders.py:1748 pretix/base/models/orders.py:2166 -#: pretix/base/models/orders.py:2328 pretix/base/models/orders.py:2527 -#: pretix/base/models/orders.py:3012 +#: pretix/base/exporters/orderlist.py:1149 +#: pretix/base/exporters/orderlist.py:1296 +#: pretix/base/exporters/orderlist.py:1339 pretix/base/models/orders.py:335 +#: pretix/base/models/orders.py:1770 pretix/base/models/orders.py:2188 +#: pretix/base/models/orders.py:2350 pretix/base/models/orders.py:2549 +#: pretix/base/models/orders.py:3034 #: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:23 #: pretix/control/templates/pretixcontrol/organizers/customer.html:122 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mail.html:74 #: pretix/control/templates/pretixcontrol/search/payments.html:78 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:15 -#: pretix/plugins/checkinlists/exporters.py:375 +#: pretix/plugins/checkinlists/exporters.py:374 #: pretix/presale/templates/pretixpresale/event/order.html:68 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:70 msgid "Order" msgstr "" -#: pretix/base/exporters/orderlist.py:1136 -#: pretix/base/exporters/orderlist.py:1324 +#: pretix/base/exporters/orderlist.py:1149 +#: pretix/base/exporters/orderlist.py:1339 #: pretix/control/templates/pretixcontrol/search/payments.html:75 #: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html:5 #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html:5 msgid "Payment ID" msgstr "" -#: pretix/base/exporters/orderlist.py:1136 -#: pretix/base/exporters/orderlist.py:1425 +#: pretix/base/exporters/orderlist.py:1149 +#: pretix/base/exporters/orderlist.py:1440 #: pretix/control/templates/pretixcontrol/organizers/customer.html:298 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:32 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:62 msgid "Creation date" msgstr "" -#: pretix/base/exporters/orderlist.py:1136 -#: pretix/control/templates/pretixcontrol/order/index.html:918 +#: pretix/base/exporters/orderlist.py:1149 +#: pretix/control/templates/pretixcontrol/order/index.html:953 msgid "Completion date" msgstr "" -#: pretix/base/exporters/orderlist.py:1137 +#: pretix/base/exporters/orderlist.py:1150 msgid "Status code" msgstr "" -#: pretix/base/exporters/orderlist.py:1137 -#: pretix/base/exporters/orderlist.py:1279 -#: pretix/base/exporters/orderlist.py:1324 pretix/base/models/orders.py:1744 -#: pretix/base/models/orders.py:2162 pretix/control/forms/filter.py:1087 +#: pretix/base/exporters/orderlist.py:1150 +#: pretix/base/exporters/orderlist.py:1294 +#: pretix/base/exporters/orderlist.py:1339 pretix/base/models/orders.py:1766 +#: pretix/base/models/orders.py:2184 pretix/control/forms/filter.py:1087 #: pretix/control/forms/filter.py:1090 -#: pretix/control/templates/pretixcontrol/order/index.html:827 -#: pretix/control/templates/pretixcontrol/order/index.html:923 +#: pretix/control/templates/pretixcontrol/order/index.html:862 +#: pretix/control/templates/pretixcontrol/order/index.html:958 #: pretix/control/templates/pretixcontrol/orders/refunds.html:70 #: pretix/control/templates/pretixcontrol/search/payments.html:98 #: pretix/plugins/banktransfer/payment.py:300 @@ -2797,98 +2865,99 @@ msgstr "" msgid "Amount" msgstr "" -#: pretix/base/exporters/orderlist.py:1137 +#: pretix/base/exporters/orderlist.py:1150 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:102 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:115 -#: pretix/control/templates/pretixcontrol/order/index.html:825 -#: pretix/control/templates/pretixcontrol/order/index.html:920 +#: pretix/control/templates/pretixcontrol/order/index.html:860 +#: pretix/control/templates/pretixcontrol/order/index.html:955 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:85 #: pretix/plugins/reports/accountingreport.py:496 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:29 msgid "Payment method" msgstr "" -#: pretix/base/exporters/orderlist.py:1137 +#: pretix/base/exporters/orderlist.py:1150 msgid "Matching ID" msgstr "" -#: pretix/base/exporters/orderlist.py:1137 +#: pretix/base/exporters/orderlist.py:1150 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:38 msgid "Payment details" msgstr "" -#: pretix/base/exporters/orderlist.py:1187 +#: pretix/base/exporters/orderlist.py:1202 msgid "Quota availabilities" msgstr "" -#: pretix/base/exporters/orderlist.py:1189 +#: pretix/base/exporters/orderlist.py:1204 msgid "" "Download a spreadsheet of all quotas including their current availability." msgstr "" -#: pretix/base/exporters/orderlist.py:1194 -#: pretix/control/templates/pretixcontrol/items/quotas.html:49 +#: pretix/base/exporters/orderlist.py:1209 pretix/control/forms/filter.py:1591 +#: pretix/control/templates/pretixcontrol/items/quotas.html:93 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:81 msgid "Quota name" msgstr "" -#: pretix/base/exporters/orderlist.py:1194 +#: pretix/base/exporters/orderlist.py:1209 #: pretix/control/templates/pretixcontrol/items/quota.html:56 msgid "Total quota" msgstr "" -#: pretix/base/exporters/orderlist.py:1194 +#: pretix/base/exporters/orderlist.py:1209 #: pretix/control/templates/pretixcontrol/event/cancel.html:20 -#: pretix/control/views/item.py:954 +#: pretix/control/views/item.py:1125 msgid "Paid orders" msgstr "" -#: pretix/base/exporters/orderlist.py:1194 pretix/control/views/item.py:959 +#: pretix/base/exporters/orderlist.py:1209 pretix/control/views/item.py:1130 msgid "Pending orders" msgstr "" -#: pretix/base/exporters/orderlist.py:1194 +#: pretix/base/exporters/orderlist.py:1209 msgid "Blocking vouchers" msgstr "" -#: pretix/base/exporters/orderlist.py:1195 pretix/control/views/item.py:978 +#: pretix/base/exporters/orderlist.py:1210 pretix/control/views/item.py:1149 msgid "Current user's carts" msgstr "" -#: pretix/base/exporters/orderlist.py:1195 +#: pretix/base/exporters/orderlist.py:1210 msgid "Exited orders" msgstr "" -#: pretix/base/exporters/orderlist.py:1195 +#: pretix/base/exporters/orderlist.py:1210 msgid "Current availability" msgstr "" -#: pretix/base/exporters/orderlist.py:1212 -#: pretix/base/exporters/orderlist.py:1219 +#: pretix/base/exporters/orderlist.py:1227 +#: pretix/base/exporters/orderlist.py:1234 #: pretix/control/templates/pretixcontrol/items/quota.html:58 -#: pretix/control/views/item.py:985 +#: pretix/control/views/item.py:1156 msgid "Infinite" msgstr "" -#: pretix/base/exporters/orderlist.py:1241 +#: pretix/base/exporters/orderlist.py:1256 msgid "Gift card transactions" msgstr "" -#: pretix/base/exporters/orderlist.py:1242 -#: pretix/base/exporters/orderlist.py:1352 +#: pretix/base/exporters/orderlist.py:1257 +#: pretix/base/exporters/orderlist.py:1367 msgctxt "export_category" msgid "Gift cards" msgstr "" -#: pretix/base/exporters/orderlist.py:1243 +#: pretix/base/exporters/orderlist.py:1258 msgid "Download a spreadsheet of all gift card transactions." msgstr "" -#: pretix/base/exporters/orderlist.py:1276 -#: pretix/base/exporters/orderlist.py:1324 -#: pretix/base/exporters/orderlist.py:1423 pretix/base/models/giftcards.py:96 +#: pretix/base/exporters/orderlist.py:1291 +#: pretix/base/exporters/orderlist.py:1339 +#: pretix/base/exporters/orderlist.py:1438 pretix/base/models/giftcards.py:96 #: pretix/base/payment.py:1490 #: pretix/control/templates/pretixcontrol/giftcards/payment.html:4 -#: pretix/control/templates/pretixcontrol/order/index.html:563 +#: pretix/control/templates/pretixcontrol/order/index.html:598 #: pretix/control/templates/pretixcontrol/organizers/customer.html:297 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:30 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:59 @@ -2896,18 +2965,18 @@ msgstr "" msgid "Gift card code" msgstr "" -#: pretix/base/exporters/orderlist.py:1277 -#: pretix/base/exporters/orderlist.py:1370 -#: pretix/base/exporters/orderlist.py:1373 +#: pretix/base/exporters/orderlist.py:1292 +#: pretix/base/exporters/orderlist.py:1385 +#: pretix/base/exporters/orderlist.py:1388 #: pretix/base/models/memberships.py:120 pretix/control/forms/filter.py:255 -#: pretix/control/forms/filter.py:1574 pretix/control/forms/filter.py:1577 +#: pretix/control/forms/filter.py:1707 pretix/control/forms/filter.py:1710 #: pretix/control/templates/pretixcontrol/event/live.html:75 msgid "Test mode" msgstr "" -#: pretix/base/exporters/orderlist.py:1282 pretix/base/models/organizer.py:107 +#: pretix/base/exporters/orderlist.py:1297 pretix/base/models/organizer.py:107 #: pretix/control/forms/event.py:112 pretix/control/forms/filter.py:924 -#: pretix/control/forms/filter.py:1042 pretix/control/forms/filter.py:1839 +#: pretix/control/forms/filter.py:1042 pretix/control/forms/filter.py:1972 #: pretix/control/templates/pretixcontrol/email_setup.html:6 #: pretix/control/templates/pretixcontrol/email_setup_simple.html:6 #: pretix/control/templates/pretixcontrol/email_setup_smtp.html:6 @@ -2920,8 +2989,8 @@ msgstr "" msgid "Organizer" msgstr "" -#: pretix/base/exporters/orderlist.py:1289 pretix/base/invoicing/pdf.py:591 -#: pretix/control/templates/pretixcontrol/base.html:283 +#: pretix/base/exporters/orderlist.py:1304 pretix/base/invoicing/pdf.py:582 +#: pretix/control/templates/pretixcontrol/base.html:286 #: pretix/control/templates/pretixcontrol/checkin/index.html:145 #: pretix/control/templates/pretixcontrol/order/index.html:25 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:38 @@ -2938,10 +3007,11 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:84 #: pretix/control/templates/pretixcontrol/search/orders.html:77 #: pretix/control/templates/pretixcontrol/search/payments.html:119 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:228 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:67 -#: pretix/presale/forms/checkout.py:259 +#: pretix/presale/forms/checkout.py:216 #: pretix/presale/templates/pretixpresale/event/order.html:70 -#: pretix/presale/templates/pretixpresale/event/position.html:14 +#: pretix/presale/templates/pretixpresale/event/position.html:15 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:59 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:20 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:84 @@ -2950,52 +3020,52 @@ msgstr "" msgid "TEST MODE" msgstr "" -#: pretix/base/exporters/orderlist.py:1304 +#: pretix/base/exporters/orderlist.py:1319 msgid "Gift card redemptions" msgstr "" -#: pretix/base/exporters/orderlist.py:1306 +#: pretix/base/exporters/orderlist.py:1321 msgid "" "Download a spreadsheet of all payments or refunds that involve gift cards." msgstr "" -#: pretix/base/exporters/orderlist.py:1324 +#: pretix/base/exporters/orderlist.py:1339 #: pretix/control/templates/pretixcontrol/giftcards/payment.html:21 msgid "Issuer" msgstr "" -#: pretix/base/exporters/orderlist.py:1351 pretix/base/permissions.py:292 +#: pretix/base/exporters/orderlist.py:1366 pretix/base/permissions.py:292 #: pretix/control/navigation.py:577 pretix/control/navigation.py:595 #: pretix/control/templates/pretixcontrol/organizers/customer.html:291 #: pretix/control/templates/pretixcontrol/organizers/edit.html:157 #: pretix/plugins/reports/accountingreport.py:915 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:7 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:13 -#: pretix/presale/views/customer.py:374 +#: pretix/presale/views/customer.py:376 msgid "Gift cards" msgstr "" -#: pretix/base/exporters/orderlist.py:1353 +#: pretix/base/exporters/orderlist.py:1368 msgid "Download a spreadsheet of all gift cards including their current value." msgstr "" -#: pretix/base/exporters/orderlist.py:1364 +#: pretix/base/exporters/orderlist.py:1379 msgid "Show value at" msgstr "" -#: pretix/base/exporters/orderlist.py:1367 +#: pretix/base/exporters/orderlist.py:1382 msgid "Defaults to the time of report." msgstr "" -#: pretix/base/exporters/orderlist.py:1372 -#: pretix/base/exporters/orderlist.py:1382 pretix/control/forms/filter.py:555 -#: pretix/control/forms/filter.py:1359 pretix/control/forms/filter.py:1576 -#: pretix/control/forms/filter.py:1585 pretix/control/forms/filter.py:1655 -#: pretix/control/forms/filter.py:1665 pretix/control/forms/filter.py:1727 -#: pretix/control/forms/filter.py:2164 pretix/control/forms/filter.py:2173 -#: pretix/control/forms/filter.py:2244 pretix/control/forms/filter.py:2257 -#: pretix/control/forms/filter.py:2763 pretix/control/forms/filter.py:2782 -#: pretix/control/forms/filter.py:2842 +#: pretix/base/exporters/orderlist.py:1387 +#: pretix/base/exporters/orderlist.py:1397 pretix/control/forms/filter.py:555 +#: pretix/control/forms/filter.py:1365 pretix/control/forms/filter.py:1709 +#: pretix/control/forms/filter.py:1718 pretix/control/forms/filter.py:1788 +#: pretix/control/forms/filter.py:1798 pretix/control/forms/filter.py:1860 +#: pretix/control/forms/filter.py:2297 pretix/control/forms/filter.py:2306 +#: pretix/control/forms/filter.py:2377 pretix/control/forms/filter.py:2390 +#: pretix/control/forms/filter.py:2896 pretix/control/forms/filter.py:2915 +#: pretix/control/forms/filter.py:2975 #: pretix/control/templates/pretixcontrol/checkin/lists.html:145 #: pretix/control/templates/pretixcontrol/checkin/lists.html:151 #: pretix/control/templates/pretixcontrol/event/plugins.html:24 @@ -3004,6 +3074,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/plugins.html:24 #: pretix/control/templates/pretixcontrol/organizers/teams.html:61 #: pretix/control/templates/pretixcontrol/organizers/webhooks.html:52 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:167 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:43 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:62 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:76 @@ -3012,26 +3083,26 @@ msgstr "" msgid "All" msgstr "" -#: pretix/base/exporters/orderlist.py:1374 pretix/control/forms/filter.py:1578 +#: pretix/base/exporters/orderlist.py:1389 pretix/control/forms/filter.py:1711 msgid "Live" msgstr "" -#: pretix/base/exporters/orderlist.py:1383 pretix/control/forms/filter.py:1586 -#: pretix/control/templates/pretixcontrol/pdf/index.html:330 +#: pretix/base/exporters/orderlist.py:1398 pretix/control/forms/filter.py:1719 +#: pretix/control/templates/pretixcontrol/pdf/index.html:328 msgid "Empty" msgstr "" -#: pretix/base/exporters/orderlist.py:1384 pretix/control/forms/filter.py:1587 +#: pretix/base/exporters/orderlist.py:1399 pretix/control/forms/filter.py:1720 msgid "Valid and with value" msgstr "" -#: pretix/base/exporters/orderlist.py:1385 pretix/control/forms/filter.py:1588 +#: pretix/base/exporters/orderlist.py:1400 pretix/control/forms/filter.py:1721 msgid "Expired and with value" msgstr "" -#: pretix/base/exporters/orderlist.py:1386 pretix/control/forms/filter.py:238 -#: pretix/control/forms/filter.py:1235 pretix/control/forms/filter.py:1589 -#: pretix/control/forms/filter.py:2249 +#: pretix/base/exporters/orderlist.py:1401 pretix/control/forms/filter.py:238 +#: pretix/control/forms/filter.py:1235 pretix/control/forms/filter.py:1722 +#: pretix/control/forms/filter.py:2382 #: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html:37 #: pretix/control/templates/pretixcontrol/orders/overview.html:78 #: pretix/control/templates/pretixcontrol/organizers/customer.html:319 @@ -3042,44 +3113,44 @@ msgstr "" msgid "Expired" msgstr "" -#: pretix/base/exporters/orderlist.py:1424 pretix/base/models/giftcards.py:105 +#: pretix/base/exporters/orderlist.py:1439 pretix/base/models/giftcards.py:105 msgid "Test mode card" msgstr "" -#: pretix/base/exporters/orderlist.py:1426 +#: pretix/base/exporters/orderlist.py:1441 #: pretix/base/modelimport_orders.py:553 pretix/base/models/giftcards.py:109 -#: pretix/control/templates/pretixcontrol/order/index.html:203 +#: pretix/control/templates/pretixcontrol/order/index.html:236 #: pretix/control/templates/pretixcontrol/organizers/customer.html:299 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:65 msgid "Expiry date" msgstr "" -#: pretix/base/exporters/orderlist.py:1427 pretix/control/forms/orders.py:902 +#: pretix/base/exporters/orderlist.py:1442 pretix/control/forms/orders.py:910 msgid "Special terms and conditions" msgstr "" -#: pretix/base/exporters/orderlist.py:1429 +#: pretix/base/exporters/orderlist.py:1444 #: pretix/control/templates/pretixcontrol/order/change.html:98 -#: pretix/control/templates/pretixcontrol/order/change.html:410 +#: pretix/control/templates/pretixcontrol/order/change.html:412 #: pretix/control/templates/pretixcontrol/organizers/customer.html:301 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:34 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:71 msgid "Current value" msgstr "" -#: pretix/base/exporters/orderlist.py:1430 +#: pretix/base/exporters/orderlist.py:1445 msgid "Created in order" msgstr "" -#: pretix/base/exporters/orderlist.py:1431 +#: pretix/base/exporters/orderlist.py:1446 msgid "Last invoice number of order" msgstr "" -#: pretix/base/exporters/orderlist.py:1432 +#: pretix/base/exporters/orderlist.py:1447 msgid "Last invoice date of order" msgstr "" -#: pretix/base/exporters/reusablemedia.py:34 pretix/base/permissions.py:304 +#: pretix/base/exporters/reusablemedia.py:35 pretix/base/permissions.py:304 #: pretix/control/navigation.py:656 #: pretix/control/templates/pretixcontrol/organizers/edit.html:223 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:35 @@ -3089,46 +3160,46 @@ msgstr "" msgid "Reusable media" msgstr "" -#: pretix/base/exporters/reusablemedia.py:35 +#: pretix/base/exporters/reusablemedia.py:36 msgctxt "export_category" msgid "Reusable media" msgstr "" -#: pretix/base/exporters/reusablemedia.py:36 +#: pretix/base/exporters/reusablemedia.py:37 msgid "" "Download a spread sheet with the data of all reusable medias on your account." msgstr "" -#: pretix/base/exporters/reusablemedia.py:51 pretix/base/models/media.py:67 +#: pretix/base/exporters/reusablemedia.py:54 pretix/base/models/media.py:67 msgctxt "reusable_medium" msgid "Media type" msgstr "" -#: pretix/base/exporters/reusablemedia.py:52 pretix/base/models/media.py:73 +#: pretix/base/exporters/reusablemedia.py:55 pretix/base/models/media.py:73 msgctxt "reusable_medium" msgid "Identifier" msgstr "" -#: pretix/base/exporters/reusablemedia.py:54 pretix/base/models/media.py:81 -#: pretix/base/models/orders.py:264 pretix/base/models/orders.py:3164 +#: pretix/base/exporters/reusablemedia.py:57 pretix/base/models/media.py:91 +#: pretix/base/models/orders.py:264 pretix/base/models/orders.py:3186 #: pretix/control/forms/orders.py:78 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:138 msgid "Expiration date" msgstr "" -#: pretix/base/exporters/reusablemedia.py:55 pretix/base/models/media.py:90 -#: pretix/control/templates/pretixcontrol/order/index.html:216 +#: pretix/base/exporters/reusablemedia.py:58 pretix/base/models/media.py:100 +#: pretix/control/templates/pretixcontrol/order/index.html:249 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:60 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:136 #: pretix/presale/templates/pretixpresale/event/checkout_customer.html:8 msgid "Customer account" msgstr "" -#: pretix/base/exporters/reusablemedia.py:56 pretix/base/models/media.py:97 +#: pretix/base/exporters/reusablemedia.py:59 msgid "Linked ticket" msgstr "" -#: pretix/base/exporters/reusablemedia.py:57 pretix/base/models/media.py:104 +#: pretix/base/exporters/reusablemedia.py:60 pretix/base/models/media.py:116 msgid "Linked gift card" msgstr "" @@ -3210,7 +3281,7 @@ msgid "This combination of credentials is not known to our system." msgstr "" #: pretix/base/forms/auth.py:66 pretix/base/forms/user.py:94 -#: pretix/presale/forms/customer.py:391 pretix/presale/forms/customer.py:470 +#: pretix/presale/forms/customer.py:392 pretix/presale/forms/customer.py:471 msgid "For security reasons, please wait 5 minutes before you try again." msgstr "" @@ -3225,12 +3296,12 @@ msgstr "" #: pretix/base/forms/auth.py:157 pretix/base/forms/auth.py:214 #: pretix/base/forms/user.py:93 pretix/control/forms/users.py:45 -#: pretix/presale/forms/customer.py:295 pretix/presale/forms/customer.py:390 +#: pretix/presale/forms/customer.py:295 pretix/presale/forms/customer.py:391 msgid "Please enter the same password twice" msgstr "" #: pretix/base/forms/auth.py:172 pretix/base/forms/auth.py:233 -#: pretix/presale/forms/customer.py:307 pretix/presale/forms/customer.py:409 +#: pretix/presale/forms/customer.py:308 pretix/presale/forms/customer.py:410 msgid "Repeat password" msgstr "" @@ -3238,147 +3309,155 @@ msgstr "" msgid "Your email address" msgstr "" -#: pretix/base/forms/auth.py:326 pretix/control/forms/orders.py:1041 +#: pretix/base/forms/auth.py:326 pretix/control/forms/orders.py:1049 #: pretix/control/templates/pretixcontrol/shredder/download.html:53 msgid "Confirmation code" msgstr "" -#: pretix/base/forms/questions.py:139 pretix/base/forms/questions.py:266 +#: pretix/base/forms/questions.py:138 pretix/base/forms/questions.py:255 msgctxt "name_salutation" msgid "not specified" msgstr "" -#: pretix/base/forms/questions.py:229 -msgid "Please do not use special characters in names." -msgstr "" - -#: pretix/base/forms/questions.py:291 +#: pretix/base/forms/questions.py:280 msgid "Please enter a shorter name." msgstr "" -#: pretix/base/forms/questions.py:318 +#: pretix/base/forms/questions.py:291 +#, python-format +msgid "" +"The field \"%(label)s\" may not contain special characters such as " +"\"%(chars)s\"." +msgstr "" + +#: pretix/base/forms/questions.py:305 +#, python-format +msgid "The field \"%(label)s\" may not contain an URL (%(url)s)." +msgstr "" + +#: pretix/base/forms/questions.py:338 msgctxt "phonenumber" msgid "International area code" msgstr "" -#: pretix/base/forms/questions.py:344 +#: pretix/base/forms/questions.py:364 msgctxt "phonenumber" msgid "Phone number (without international area code)" msgstr "" -#: pretix/base/forms/questions.py:507 +#: pretix/base/forms/questions.py:527 msgid "" "You uploaded an image in landscape orientation. Please upload an image in " "portrait orientation." msgstr "" -#: pretix/base/forms/questions.py:510 +#: pretix/base/forms/questions.py:530 msgid "Please upload an image where the width is 3/4 of the height." msgstr "" -#: pretix/base/forms/questions.py:513 +#: pretix/base/forms/questions.py:533 msgid "" "The file you uploaded has a very large number of pixels, please upload an " "image no larger than 10000 x 10000 pixels." msgstr "" -#: pretix/base/forms/questions.py:516 pretix/helpers/images.py:75 +#: pretix/base/forms/questions.py:536 pretix/helpers/images.py:75 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: pretix/base/forms/questions.py:659 pretix/base/forms/questions.py:668 +#: pretix/base/forms/questions.py:679 pretix/base/forms/questions.py:688 msgid "" "If you keep this empty, the ticket will be valid starting at the time of " "purchase." msgstr "" -#: pretix/base/forms/questions.py:715 pretix/base/forms/questions.py:1108 +#: pretix/base/forms/questions.py:735 pretix/base/forms/questions.py:1128 msgid "Street and Number" msgstr "" -#: pretix/base/forms/questions.py:893 +#: pretix/base/forms/questions.py:913 #, python-brace-format msgid "Please enter a date between {min} and {max}." msgstr "" -#: pretix/base/forms/questions.py:899 +#: pretix/base/forms/questions.py:919 #, python-brace-format msgid "Please enter a date no earlier than {min}." msgstr "" -#: pretix/base/forms/questions.py:904 +#: pretix/base/forms/questions.py:924 #, python-brace-format msgid "Please enter a date no later than {max}." msgstr "" -#: pretix/base/forms/questions.py:942 +#: pretix/base/forms/questions.py:962 #, python-brace-format msgid "Please enter a date and time between {min} and {max}." msgstr "" -#: pretix/base/forms/questions.py:948 +#: pretix/base/forms/questions.py:968 #, python-brace-format msgid "Please enter a date and time no earlier than {min}." msgstr "" -#: pretix/base/forms/questions.py:953 +#: pretix/base/forms/questions.py:973 #, python-brace-format msgid "Please enter a date and time no later than {max}." msgstr "" -#: pretix/base/forms/questions.py:1172 +#: pretix/base/forms/questions.py:1192 msgid "" "Optional, but depending on the country you reside in we might need to charge " "you additional taxes if you do not enter it." msgstr "" -#: pretix/base/forms/questions.py:1177 +#: pretix/base/forms/questions.py:1197 msgid "" "Optional, but it might be required for you to claim tax benefits on your " "invoice depending on your and the seller’s country of residence." msgstr "" -#: pretix/base/forms/questions.py:1185 +#: pretix/base/forms/questions.py:1205 msgid "No invoice requested" msgstr "" -#: pretix/base/forms/questions.py:1187 +#: pretix/base/forms/questions.py:1207 msgid "Invoice transmission method" msgstr "" -#: pretix/base/forms/questions.py:1333 +#: pretix/base/forms/questions.py:1353 msgid "You need to provide a company name." msgstr "" -#: pretix/base/forms/questions.py:1335 +#: pretix/base/forms/questions.py:1355 msgid "You need to provide your name." msgstr "" -#: pretix/base/forms/questions.py:1361 +#: pretix/base/forms/questions.py:1381 msgid "" "If you enter an invoice address, you also need to select an invoice " "transmission method." msgstr "" -#: pretix/base/forms/questions.py:1403 +#: pretix/base/forms/questions.py:1423 msgid "" "The selected transmission type is not available in your country or for your " "type of address." msgstr "" -#: pretix/base/forms/questions.py:1412 +#: pretix/base/forms/questions.py:1432 msgid "" "The selected type of invoice transmission requires a field that is currently " "not available, please reach out to the organizer." msgstr "" -#: pretix/base/forms/questions.py:1416 +#: pretix/base/forms/questions.py:1436 msgid "This field is required for the selected type of invoice transmission." msgstr "" -#: pretix/base/forms/user.py:54 pretix/control/forms/organizer.py:576 +#: pretix/base/forms/user.py:54 pretix/control/forms/organizer.py:585 #: pretix/control/forms/users.py:58 msgid "Default timezone" msgstr "" @@ -3410,8 +3489,8 @@ msgstr "" msgid "WebAuthn-compatible hardware token (e.g. Yubikey)" msgstr "" -#: pretix/base/forms/user.py:92 pretix/presale/forms/customer.py:389 -#: pretix/presale/forms/customer.py:469 +#: pretix/base/forms/user.py:92 pretix/presale/forms/customer.py:390 +#: pretix/presale/forms/customer.py:470 msgid "The current password you entered was not correct." msgstr "" @@ -3419,13 +3498,13 @@ msgstr "" msgid "Please choose a password different to your current one." msgstr "" -#: pretix/base/forms/user.py:105 pretix/presale/forms/customer.py:398 -#: pretix/presale/forms/customer.py:474 +#: pretix/base/forms/user.py:105 pretix/presale/forms/customer.py:399 +#: pretix/presale/forms/customer.py:475 msgid "Your current password" msgstr "" #: pretix/base/forms/user.py:111 pretix/control/forms/users.py:50 -#: pretix/presale/forms/customer.py:403 +#: pretix/presale/forms/customer.py:404 msgid "New password" msgstr "" @@ -3455,7 +3534,7 @@ msgid "" "\"{{\" and \"}}\"." msgstr "" -#: pretix/base/forms/validators.py:72 pretix/control/views/event.py:900 +#: pretix/base/forms/validators.py:72 pretix/control/views/event.py:904 #, python-format msgid "Invalid placeholder: {%(value)s}" msgstr "" @@ -3470,8 +3549,8 @@ msgstr "" msgid "Available placeholders: {list}" msgstr "" -#: pretix/base/forms/widgets.py:223 pretix/base/models/items.py:1656 -#: pretix/plugins/checkinlists/exporters.py:757 +#: pretix/base/forms/widgets.py:223 pretix/base/models/items.py:1666 +#: pretix/plugins/checkinlists/exporters.py:756 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:40 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:54 msgid "Time" @@ -3537,68 +3616,68 @@ msgid "" "April 30, 2018, issued by the Director of the Revenue Agency." msgstr "" -#: pretix/base/invoicing/pdf.py:142 +#: pretix/base/invoicing/pdf.py:140 #, python-format msgctxt "invoice" msgid "Page %d of %d" msgstr "" -#: pretix/base/invoicing/pdf.py:387 +#: pretix/base/invoicing/pdf.py:380 msgctxt "invoice" msgid "Classic renderer (pretix 1.0)" msgstr "" -#: pretix/base/invoicing/pdf.py:431 +#: pretix/base/invoicing/pdf.py:423 msgctxt "invoice" msgid "Invoice from" msgstr "" -#: pretix/base/invoicing/pdf.py:437 +#: pretix/base/invoicing/pdf.py:429 msgctxt "invoice" msgid "Invoice to" msgstr "" -#: pretix/base/invoicing/pdf.py:474 pretix/base/invoicing/pdf.py:1225 +#: pretix/base/invoicing/pdf.py:466 pretix/base/invoicing/pdf.py:1211 msgctxt "invoice" msgid "Order code" msgstr "" -#: pretix/base/invoicing/pdf.py:483 pretix/base/invoicing/pdf.py:1238 +#: pretix/base/invoicing/pdf.py:475 pretix/base/invoicing/pdf.py:1224 msgctxt "invoice" msgid "Cancellation number" msgstr "" -#: pretix/base/invoicing/pdf.py:489 pretix/base/invoicing/pdf.py:1240 +#: pretix/base/invoicing/pdf.py:481 pretix/base/invoicing/pdf.py:1226 msgctxt "invoice" msgid "Original invoice" msgstr "" -#: pretix/base/invoicing/pdf.py:494 pretix/base/invoicing/pdf.py:1245 +#: pretix/base/invoicing/pdf.py:486 pretix/base/invoicing/pdf.py:1231 msgctxt "invoice" msgid "Invoice number" msgstr "" -#: pretix/base/invoicing/pdf.py:502 pretix/base/invoicing/pdf.py:1260 +#: pretix/base/invoicing/pdf.py:494 pretix/base/invoicing/pdf.py:1246 msgctxt "invoice" msgid "Cancellation date" msgstr "" -#: pretix/base/invoicing/pdf.py:508 +#: pretix/base/invoicing/pdf.py:500 msgctxt "invoice" msgid "Original invoice date" msgstr "" -#: pretix/base/invoicing/pdf.py:515 pretix/base/invoicing/pdf.py:1262 +#: pretix/base/invoicing/pdf.py:507 pretix/base/invoicing/pdf.py:1248 msgctxt "invoice" msgid "Invoice date" msgstr "" -#: pretix/base/invoicing/pdf.py:531 +#: pretix/base/invoicing/pdf.py:523 msgctxt "invoice" msgid "Event" msgstr "" -#: pretix/base/invoicing/pdf.py:565 +#: pretix/base/invoicing/pdf.py:556 #, python-brace-format msgctxt "invoice" msgid "" @@ -3606,140 +3685,140 @@ msgid "" "until {to_date}" msgstr "" -#: pretix/base/invoicing/pdf.py:612 pretix/base/services/mail.py:536 +#: pretix/base/invoicing/pdf.py:603 pretix/base/services/mail.py:536 #, python-brace-format msgctxt "invoice" msgid "Invoice {num}" msgstr "" -#: pretix/base/invoicing/pdf.py:664 +#: pretix/base/invoicing/pdf.py:655 #, python-brace-format msgctxt "invoice" msgid "Customer reference: {reference}" msgstr "" -#: pretix/base/invoicing/pdf.py:672 +#: pretix/base/invoicing/pdf.py:663 msgctxt "invoice" msgid "Customer VAT ID" msgstr "" -#: pretix/base/invoicing/pdf.py:679 +#: pretix/base/invoicing/pdf.py:669 msgctxt "invoice" msgid "Beneficiary" msgstr "" -#: pretix/base/invoicing/pdf.py:712 +#: pretix/base/invoicing/pdf.py:701 msgctxt "invoice" msgid "Tax Invoice" msgstr "" -#: pretix/base/invoicing/pdf.py:713 +#: pretix/base/invoicing/pdf.py:702 msgctxt "invoice" msgid "Invoice" msgstr "" -#: pretix/base/invoicing/pdf.py:714 -#: pretix/control/templates/pretixcontrol/order/index.html:272 +#: pretix/base/invoicing/pdf.py:703 +#: pretix/control/templates/pretixcontrol/order/index.html:305 #: pretix/control/templates/pretixcontrol/order/mail_history.html:72 #: pretix/presale/templates/pretixpresale/event/order.html:244 msgctxt "invoice" msgid "Cancellation" msgstr "" -#: pretix/base/invoicing/pdf.py:736 pretix/base/invoicing/pdf.py:744 +#: pretix/base/invoicing/pdf.py:725 pretix/base/invoicing/pdf.py:733 msgctxt "invoice" msgid "Description" msgstr "" -#: pretix/base/invoicing/pdf.py:737 pretix/base/invoicing/pdf.py:745 +#: pretix/base/invoicing/pdf.py:726 pretix/base/invoicing/pdf.py:734 msgctxt "invoice" msgid "Qty" msgstr "" -#: pretix/base/invoicing/pdf.py:738 pretix/base/invoicing/pdf.py:1042 +#: pretix/base/invoicing/pdf.py:727 pretix/base/invoicing/pdf.py:1031 msgctxt "invoice" msgid "Tax rate" msgstr "" -#: pretix/base/invoicing/pdf.py:739 +#: pretix/base/invoicing/pdf.py:728 msgctxt "invoice" msgid "Net" msgstr "" -#: pretix/base/invoicing/pdf.py:740 +#: pretix/base/invoicing/pdf.py:729 msgctxt "invoice" msgid "Gross" msgstr "" -#: pretix/base/invoicing/pdf.py:746 +#: pretix/base/invoicing/pdf.py:735 msgctxt "invoice" msgid "Amount" msgstr "" -#: pretix/base/invoicing/pdf.py:873 +#: pretix/base/invoicing/pdf.py:862 #, python-brace-format msgctxt "invoice" msgid "Single price: {net_price} net / {gross_price} gross" msgstr "" -#: pretix/base/invoicing/pdf.py:904 +#: pretix/base/invoicing/pdf.py:893 #, python-brace-format msgctxt "invoice" msgid "Single price: {price}" msgstr "" -#: pretix/base/invoicing/pdf.py:947 pretix/base/invoicing/pdf.py:952 +#: pretix/base/invoicing/pdf.py:936 pretix/base/invoicing/pdf.py:941 msgctxt "invoice" msgid "Invoice total" msgstr "" -#: pretix/base/invoicing/pdf.py:961 +#: pretix/base/invoicing/pdf.py:950 msgctxt "invoice" msgid "Received payments" msgstr "" -#: pretix/base/invoicing/pdf.py:966 +#: pretix/base/invoicing/pdf.py:955 msgctxt "invoice" msgid "Outstanding payments" msgstr "" -#: pretix/base/invoicing/pdf.py:983 +#: pretix/base/invoicing/pdf.py:972 msgctxt "invoice" msgid "Paid by gift card" msgstr "" -#: pretix/base/invoicing/pdf.py:988 +#: pretix/base/invoicing/pdf.py:977 msgctxt "invoice" msgid "Remaining amount" msgstr "" -#: pretix/base/invoicing/pdf.py:1012 +#: pretix/base/invoicing/pdf.py:1001 #, python-brace-format msgctxt "invoice" msgid "Invoice period: {daterange}" msgstr "" -#: pretix/base/invoicing/pdf.py:1043 +#: pretix/base/invoicing/pdf.py:1032 msgctxt "invoice" msgid "Net value" msgstr "" -#: pretix/base/invoicing/pdf.py:1044 +#: pretix/base/invoicing/pdf.py:1033 msgctxt "invoice" msgid "Gross value" msgstr "" -#: pretix/base/invoicing/pdf.py:1045 +#: pretix/base/invoicing/pdf.py:1034 msgctxt "invoice" msgid "Tax" msgstr "" -#: pretix/base/invoicing/pdf.py:1075 +#: pretix/base/invoicing/pdf.py:1064 msgctxt "invoice" msgid "Included taxes" msgstr "" -#: pretix/base/invoicing/pdf.py:1103 +#: pretix/base/invoicing/pdf.py:1092 #, python-brace-format msgctxt "invoice" msgid "" @@ -3747,7 +3826,7 @@ msgid "" "{date}, this corresponds to:" msgstr "" -#: pretix/base/invoicing/pdf.py:1118 +#: pretix/base/invoicing/pdf.py:1107 #, python-brace-format msgctxt "invoice" msgid "" @@ -3755,20 +3834,20 @@ msgid "" "{date}, the invoice total corresponds to {total}." msgstr "" -#: pretix/base/invoicing/pdf.py:1132 +#: pretix/base/invoicing/pdf.py:1121 msgid "Default invoice renderer (European-style letter)" msgstr "" -#: pretix/base/invoicing/pdf.py:1221 +#: pretix/base/invoicing/pdf.py:1207 msgctxt "invoice" msgid "(Please quote at all times.)" msgstr "" -#: pretix/base/invoicing/pdf.py:1268 +#: pretix/base/invoicing/pdf.py:1254 msgid "Simplified invoice renderer" msgstr "" -#: pretix/base/invoicing/pdf.py:1287 +#: pretix/base/invoicing/pdf.py:1273 #, python-brace-format msgctxt "invoice" msgid "Event date: {date_range}" @@ -3878,12 +3957,12 @@ msgstr "" msgid "Tax rule {val}" msgstr "" -#: pretix/base/media.py:71 +#: pretix/base/media.py:72 msgid "Barcode / QR-Code" msgstr "" -#: pretix/base/media.py:88 -#: pretix/control/templates/pretixcontrol/organizers/edit.html:256 +#: pretix/base/media.py:89 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:257 msgid "NFC UID-based" msgstr "" @@ -3892,37 +3971,37 @@ msgstr "" msgid "Default list" msgstr "" -#: pretix/base/modelimport.py:126 +#: pretix/base/modelimport.py:130 msgid "Keep empty" msgstr "" -#: pretix/base/modelimport.py:160 +#: pretix/base/modelimport.py:164 #, python-brace-format msgid "Invalid setting for column \"{header}\"." msgstr "" -#: pretix/base/modelimport.py:220 +#: pretix/base/modelimport.py:224 #, python-brace-format msgid "Could not parse {value} as a yes/no value." msgstr "" -#: pretix/base/modelimport.py:243 +#: pretix/base/modelimport.py:247 #, python-brace-format msgid "Could not parse {value} as a date and time." msgstr "" -#: pretix/base/modelimport.py:253 pretix/control/views/orders.py:1175 -#: pretix/control/views/orders.py:1204 pretix/control/views/orders.py:1253 -#: pretix/control/views/orders.py:1288 pretix/control/views/orders.py:1311 +#: pretix/base/modelimport.py:257 pretix/control/views/orders.py:1179 +#: pretix/control/views/orders.py:1208 pretix/control/views/orders.py:1257 +#: pretix/control/views/orders.py:1292 pretix/control/views/orders.py:1315 msgid "You entered an invalid number." msgstr "" -#: pretix/base/modelimport.py:300 pretix/base/modelimport.py:312 +#: pretix/base/modelimport.py:304 pretix/base/modelimport.py:316 msgctxt "subevent" msgid "No matching date was found." msgstr "" -#: pretix/base/modelimport.py:302 pretix/base/modelimport.py:314 +#: pretix/base/modelimport.py:306 pretix/base/modelimport.py:318 msgctxt "subevent" msgid "Multiple matching dates were found." msgstr "" @@ -3949,7 +4028,7 @@ msgid "" "internal ID, provided only one date in the system matches the input." msgstr "" -#: pretix/base/modelimport_orders.py:120 pretix/presale/views/waiting.py:157 +#: pretix/base/modelimport_orders.py:120 pretix/presale/views/waiting.py:162 msgctxt "subevent" msgid "You need to select a date." msgstr "" @@ -3970,7 +4049,7 @@ msgid "Multiple matching products were found." msgstr "" #: pretix/base/modelimport_orders.py:160 -#: pretix/base/modelimport_vouchers.py:205 pretix/base/models/items.py:1257 +#: pretix/base/modelimport_vouchers.py:205 pretix/base/models/items.py:1267 #: pretix/base/models/vouchers.py:266 pretix/base/models/waitinglist.py:99 msgid "Product variation" msgstr "" @@ -4025,23 +4104,19 @@ msgstr "" #: pretix/control/forms/filter.py:692 pretix/control/forms/filter.py:696 #: pretix/control/forms/filter.py:700 pretix/control/forms/filter.py:705 #: pretix/control/forms/filter.py:710 -#: pretix/control/templates/pretixcontrol/order/index.html:608 +#: pretix/control/templates/pretixcontrol/order/index.html:643 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:193 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:196 msgid "Attendee address" msgstr "" -#: pretix/base/modelimport_orders.py:445 -msgid "State" -msgstr "" - #: pretix/base/modelimport_orders.py:468 msgid "Calculate from product" msgstr "" #: pretix/base/modelimport_orders.py:486 #: pretix/control/templates/pretixcontrol/checkin/index.html:111 -#: pretix/control/templates/pretixcontrol/order/index.html:536 +#: pretix/control/templates/pretixcontrol/order/index.html:571 msgid "Ticket code" msgstr "" @@ -4093,8 +4168,8 @@ msgstr "" msgid "You need to select a specific seat." msgstr "" -#: pretix/base/modelimport_orders.py:691 pretix/base/models/items.py:1671 -#: pretix/base/models/items.py:1766 pretix/control/forms/item.py:148 +#: pretix/base/modelimport_orders.py:691 pretix/base/models/items.py:1681 +#: pretix/base/models/items.py:1776 pretix/control/forms/item.py:149 #: pretix/control/templates/pretixcontrol/items/question_edit.html:10 #: pretix/control/templates/pretixcontrol/items/question_edit.html:17 #: pretix/control/templates/pretixcontrol/items/questions.html:23 @@ -4102,7 +4177,7 @@ msgid "Question" msgstr "" #: pretix/base/modelimport_orders.py:701 pretix/base/modelimport_orders.py:709 -#: pretix/base/models/items.py:1830 pretix/base/models/items.py:1848 +#: pretix/base/models/items.py:1840 pretix/base/models/items.py:1858 msgid "Invalid option selected." msgstr "" @@ -4142,7 +4217,7 @@ msgid "Maximum discount budget" msgstr "" #: pretix/base/modelimport_vouchers.py:119 pretix/base/models/vouchers.py:228 -#: pretix/control/forms/filter.py:2258 +#: pretix/control/forms/filter.py:2391 msgid "Reserve ticket from quota" msgstr "" @@ -4170,7 +4245,7 @@ msgstr "" msgid "It is pointless to set a value without a price effect." msgstr "" -#: pretix/base/modelimport_vouchers.py:237 pretix/base/models/items.py:2121 +#: pretix/base/modelimport_vouchers.py:237 pretix/base/models/items.py:2131 #: pretix/base/models/vouchers.py:275 #: pretix/control/templates/pretixcontrol/items/quota_edit.html:8 #: pretix/control/templates/pretixcontrol/items/quota_edit.html:15 @@ -4219,35 +4294,35 @@ msgid "" "voucher" msgstr "" -#: pretix/base/models/auth.py:274 +#: pretix/base/models/auth.py:283 msgid "Is active" msgstr "" -#: pretix/base/models/auth.py:276 +#: pretix/base/models/auth.py:285 msgid "Is site admin" msgstr "" -#: pretix/base/models/auth.py:278 +#: pretix/base/models/auth.py:287 msgid "Date joined" msgstr "" -#: pretix/base/models/auth.py:280 +#: pretix/base/models/auth.py:289 msgid "Force user to select a new password" msgstr "" -#: pretix/base/models/auth.py:290 +#: pretix/base/models/auth.py:299 msgid "Two-factor authentication is required to log in" msgstr "" -#: pretix/base/models/auth.py:294 +#: pretix/base/models/auth.py:303 msgid "Receive notifications according to my settings below" msgstr "" -#: pretix/base/models/auth.py:295 +#: pretix/base/models/auth.py:304 msgid "If turned off, you will not get any notifications." msgstr "" -#: pretix/base/models/auth.py:309 +#: pretix/base/models/auth.py:318 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:23 #: pretix/control/templates/pretixcontrol/orders/index.html:135 #: pretix/control/templates/pretixcontrol/search/orders.html:54 @@ -4255,39 +4330,39 @@ msgstr "" #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:15 #: pretix/control/templates/pretixcontrol/users/form.html:4 #: pretix/control/templates/pretixcontrol/users/form.html:6 -#: pretix/control/views/organizer.py:174 tests/base/test_mail.py:202 +#: pretix/control/views/organizer.py:174 tests/base/test_mail.py:205 msgid "User" msgstr "" -#: pretix/base/models/auth.py:310 pretix/control/navigation.py:438 +#: pretix/base/models/auth.py:319 pretix/control/navigation.py:438 #: pretix/control/templates/pretixcontrol/users/index.html:5 #: pretix/control/templates/pretixcontrol/users/index.html:7 msgid "Users" msgstr "" -#: pretix/base/models/auth.py:367 +#: pretix/base/models/auth.py:376 msgid "Account information changed" msgstr "" -#: pretix/base/models/auth.py:394 +#: pretix/base/models/auth.py:403 #, python-brace-format msgid "" "to confirm changing your email address from {old_email}\n" "to {new_email}, use the following code:" msgstr "" -#: pretix/base/models/auth.py:398 +#: pretix/base/models/auth.py:407 #, python-brace-format msgid "" "to confirm that your email address {email} belongs to your pretix account, " "use the following code:" msgstr "" -#: pretix/base/models/auth.py:412 +#: pretix/base/models/auth.py:421 msgid "pretix confirmation code" msgstr "" -#: pretix/base/models/auth.py:456 +#: pretix/base/models/auth.py:465 #: pretix/control/templates/pretixcontrol/auth/forgot.html:7 msgid "Password recovery" msgstr "" @@ -4296,8 +4371,8 @@ msgstr "" msgid "All products (including newly created ones)" msgstr "" -#: pretix/base/models/checkin.py:56 pretix/plugins/badges/exporters.py:436 -#: pretix/plugins/checkinlists/exporters.py:854 +#: pretix/base/models/checkin.py:56 pretix/plugins/badges/exporters.py:444 +#: pretix/plugins/checkinlists/exporters.py:853 msgid "Limit to products" msgstr "" @@ -4382,58 +4457,70 @@ msgstr "" msgid "Exit" msgstr "" -#: pretix/base/models/checkin.py:356 +#: pretix/base/models/checkin.py:359 msgid "Unknown ticket" msgstr "" -#: pretix/base/models/checkin.py:357 +#: pretix/base/models/checkin.py:360 msgid "Ticket not paid" msgstr "" -#: pretix/base/models/checkin.py:358 +#: pretix/base/models/checkin.py:361 msgid "Forbidden by custom rule" msgstr "" -#: pretix/base/models/checkin.py:359 +#: pretix/base/models/checkin.py:362 msgid "Ticket code revoked/changed" msgstr "" -#: pretix/base/models/checkin.py:360 +#: pretix/base/models/checkin.py:363 msgid "Information required" msgstr "" -#: pretix/base/models/checkin.py:361 +#: pretix/base/models/checkin.py:364 msgid "Ticket already used" msgstr "" -#: pretix/base/models/checkin.py:362 +#: pretix/base/models/checkin.py:365 msgid "Ticket type not allowed here" msgstr "" -#: pretix/base/models/checkin.py:363 +#: pretix/base/models/checkin.py:366 msgid "Ticket code is ambiguous on list" msgstr "" -#: pretix/base/models/checkin.py:364 +#: pretix/base/models/checkin.py:367 msgid "Server error" msgstr "" -#: pretix/base/models/checkin.py:365 +#: pretix/base/models/checkin.py:368 msgid "Ticket blocked" msgstr "" -#: pretix/base/models/checkin.py:366 +#: pretix/base/models/checkin.py:369 msgid "Order not approved" msgstr "" -#: pretix/base/models/checkin.py:367 +#: pretix/base/models/checkin.py:370 msgid "Ticket not valid at this time" msgstr "" -#: pretix/base/models/checkin.py:368 +#: pretix/base/models/checkin.py:371 msgid "Check-in annulled" msgstr "" +#: pretix/base/models/checkin.py:372 +msgid "Ticket already exchanged" +msgstr "" + +#: pretix/base/models/checkin.py:373 +msgid "Reusable medium invalid" +msgstr "" + +#: pretix/base/models/checkin.py:374 +msgid "Reusable medium already exists" +msgstr "" + #: pretix/base/models/customers.py:63 msgid "Provider name" msgstr "" @@ -4447,7 +4534,7 @@ msgid "Single-sign-on method" msgstr "" #: pretix/base/models/customers.py:93 pretix/base/models/devices.py:74 -#: pretix/base/models/items.py:1676 pretix/base/models/items.py:1952 +#: pretix/base/models/items.py:1686 pretix/base/models/items.py:1962 msgid "" "You can enter any value here to make it easier to match the data with other " "sources. If you do not input one, we will generate one automatically." @@ -4459,22 +4546,22 @@ msgid "" "underscores. It must start and end with a letter or number." msgstr "" -#: pretix/base/models/customers.py:225 pretix/control/forms/filter.py:1657 -#: pretix/control/forms/filter.py:1729 +#: pretix/base/models/customers.py:225 pretix/control/forms/filter.py:1790 +#: pretix/control/forms/filter.py:1862 #: pretix/control/templates/pretixcontrol/organizers/customer.html:43 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:56 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:135 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:33 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:45 msgid "disabled" msgstr "" -#: pretix/base/models/customers.py:354 pretix/base/models/orders.py:1546 -#: pretix/base/models/orders.py:3348 pretix/base/settings.py:1308 +#: pretix/base/models/customers.py:354 pretix/base/models/orders.py:1568 +#: pretix/base/models/orders.py:3370 pretix/base/settings.py:1323 msgid "Company name" msgstr "" -#: pretix/base/models/customers.py:358 pretix/base/models/orders.py:1550 -#: pretix/base/models/orders.py:3355 pretix/base/settings.py:92 +#: pretix/base/models/customers.py:358 pretix/base/models/orders.py:1572 +#: pretix/base/models/orders.py:3377 pretix/base/settings.py:92 #: pretix/plugins/stripe/payment.py:291 msgid "Select country" msgstr "" @@ -4543,20 +4630,20 @@ msgstr "" msgid "System error, needs manual intervention" msgstr "" -#: pretix/base/models/devices.py:73 pretix/base/models/items.py:1675 +#: pretix/base/models/devices.py:73 pretix/base/models/items.py:1685 msgid "Internal identifier" msgstr "" -#: pretix/base/models/devices.py:93 pretix/base/models/items.py:1788 +#: pretix/base/models/devices.py:93 pretix/base/models/items.py:1798 msgid "This identifier is already used for a different question." msgstr "" #: pretix/base/models/devices.py:116 pretix/control/forms/checkin.py:196 -#: pretix/control/forms/checkin.py:217 pretix/control/forms/filter.py:2549 -#: pretix/control/forms/filter.py:2596 pretix/control/forms/filter.py:2756 +#: pretix/control/forms/checkin.py:217 pretix/control/forms/filter.py:2682 +#: pretix/control/forms/filter.py:2729 pretix/control/forms/filter.py:2889 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:67 #: pretix/control/templates/pretixcontrol/organizers/gates.html:18 -#: pretix/plugins/checkinlists/exporters.py:769 +#: pretix/plugins/checkinlists/exporters.py:768 msgid "Gate" msgstr "" @@ -4584,9 +4671,9 @@ msgctxt "subevent" msgid "Each matching product must be for a different date" msgstr "" -#: pretix/base/models/discount.py:69 pretix/base/models/items.py:1161 -#: pretix/base/models/items.py:1481 pretix/base/models/items.py:1708 -#: pretix/base/models/organizer.py:657 +#: pretix/base/models/discount.py:69 pretix/base/models/items.py:1171 +#: pretix/base/models/items.py:1491 pretix/base/models/items.py:1718 +#: pretix/base/models/organizer.py:664 msgid "Position" msgstr "" @@ -4740,7 +4827,8 @@ msgstr "" msgid "The slug may only contain letters, numbers, dots and dashes." msgstr "" -#: pretix/base/models/event.py:624 pretix/base/models/event.py:1551 +#: pretix/base/models/event.py:624 pretix/base/models/event.py:1568 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:63 msgid "Show in lists" msgstr "" @@ -4750,14 +4838,14 @@ msgid "" "organizer account." msgstr "" -#: pretix/base/models/event.py:629 pretix/base/models/event.py:1566 +#: pretix/base/models/event.py:629 pretix/base/models/event.py:1583 #: pretix/control/forms/subevents.py:100 msgid "" "Optional. No products will be sold after this date. If you do not set this " "value, the presale will end after the end date of your event." msgstr "" -#: pretix/base/models/event.py:635 pretix/base/models/event.py:1572 +#: pretix/base/models/event.py:635 pretix/base/models/event.py:1589 #: pretix/control/forms/subevents.py:94 msgid "Optional. No products will be sold before this date." msgstr "" @@ -4778,27 +4866,27 @@ msgid "Plugins" msgstr "" #: pretix/base/models/event.py:672 pretix/base/pdf.py:240 -#: pretix/control/forms/event.py:300 pretix/control/forms/filter.py:1834 +#: pretix/control/forms/event.py:300 pretix/control/forms/filter.py:1967 #: pretix/control/templates/pretixcontrol/event/index.html:13 #: pretix/control/templates/pretixcontrol/events/index.html:131 #: pretix/control/templates/pretixcontrol/organizers/detail.html:112 #: pretix/control/views/dashboards.py:554 #: pretix/presale/templates/pretixpresale/event/index.html:33 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:8 -#: pretix/presale/views/widget.py:732 +#: pretix/presale/views/widget.py:765 msgid "Event series" msgstr "" -#: pretix/base/models/event.py:676 pretix/base/models/event.py:1600 +#: pretix/base/models/event.py:676 pretix/base/models/event.py:1617 msgid "Seating plan" msgstr "" -#: pretix/base/models/event.py:683 pretix/base/models/items.py:675 +#: pretix/base/models/event.py:683 pretix/base/models/items.py:680 msgid "Sell on all sales channels" msgstr "" -#: pretix/base/models/event.py:688 pretix/base/models/items.py:680 -#: pretix/base/models/items.py:1230 pretix/base/payment.py:476 +#: pretix/base/models/event.py:688 pretix/base/models/items.py:685 +#: pretix/base/models/items.py:1240 pretix/base/payment.py:476 msgid "Restrict to specific sales channels" msgstr "" @@ -4809,150 +4897,154 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/devices.html:92 #: pretix/control/templates/pretixcontrol/organizers/teams.html:39 #: pretix/control/templates/pretixcontrol/organizers/webhooks.html:37 -#: pretix/control/views/organizer.py:2020 +#: pretix/control/views/organizer.py:2016 #: pretix/plugins/reports/accountingreport.py:105 #: pretix/plugins/reports/accountingreport.py:108 msgid "Events" msgstr "" -#: pretix/base/models/event.py:1372 +#: pretix/base/models/event.py:1389 msgid "" "You have configured at least one paid product but have not enabled any " "payment methods." msgstr "" -#: pretix/base/models/event.py:1375 +#: pretix/base/models/event.py:1392 msgid "" "You have configured at least one paid product but have not configured a " "currency." msgstr "" -#: pretix/base/models/event.py:1378 +#: pretix/base/models/event.py:1395 msgid "You need to configure at least one quota to sell anything." msgstr "" -#: pretix/base/models/event.py:1383 +#: pretix/base/models/event.py:1400 #, python-brace-format msgid "You need to fill the meta parameter \"{property}\"." msgstr "" -#: pretix/base/models/event.py:1497 +#: pretix/base/models/event.py:1514 msgid "" "Once created an event cannot change between an series and a single event." msgstr "" -#: pretix/base/models/event.py:1503 +#: pretix/base/models/event.py:1520 msgid "The event slug cannot be changed." msgstr "" -#: pretix/base/models/event.py:1506 +#: pretix/base/models/event.py:1523 msgid "This slug has already been used for a different event." msgstr "" -#: pretix/base/models/event.py:1512 +#: pretix/base/models/event.py:1529 msgid "The event cannot end before it starts." msgstr "" -#: pretix/base/models/event.py:1518 +#: pretix/base/models/event.py:1535 msgid "The event's presale cannot end before it starts." msgstr "" -#: pretix/base/models/event.py:1548 +#: pretix/base/models/event.py:1565 msgid "" "Only with this checkbox enabled, this date is visible in the frontend to " "users." msgstr "" -#: pretix/base/models/event.py:1552 +#: pretix/base/models/event.py:1569 msgid "" "If selected, this event will show up publicly on the list of dates for your " "event." msgstr "" -#: pretix/base/models/event.py:1597 pretix/base/settings.py:3332 +#: pretix/base/models/event.py:1614 pretix/base/settings.py:3347 msgid "Frontpage text" msgstr "" -#: pretix/base/models/event.py:1614 +#: pretix/base/models/event.py:1631 msgid "Date in event series" msgstr "" -#: pretix/base/models/event.py:1615 +#: pretix/base/models/event.py:1632 msgid "Dates in event series" msgstr "" -#: pretix/base/models/event.py:1756 +#: pretix/base/models/event.py:1773 msgid "One or more variations do not belong to this event." msgstr "" -#: pretix/base/models/event.py:1786 pretix/base/models/items.py:2236 +#: pretix/base/models/event.py:1803 pretix/base/models/items.py:2246 msgid "Can not contain spaces or special characters except underscores" msgstr "" -#: pretix/base/models/event.py:1791 pretix/base/models/items.py:2241 +#: pretix/base/models/event.py:1808 pretix/base/models/items.py:2251 msgid "The property name may only contain letters, numbers and underscores." msgstr "" -#: pretix/base/models/event.py:1796 +#: pretix/base/models/event.py:1813 msgid "Default value" msgstr "" -#: pretix/base/models/event.py:1798 +#: pretix/base/models/event.py:1815 #: pretix/control/templates/pretixcontrol/organizers/properties.html:50 msgid "Can only be changed by organizer-level administrators" msgstr "" -#: pretix/base/models/event.py:1800 +#: pretix/base/models/event.py:1817 msgid "Required for events" msgstr "" -#: pretix/base/models/event.py:1801 +#: pretix/base/models/event.py:1818 msgid "" "If checked, an event can only be taken live if the property is set. In event " "series, its always optional to set a value for individual dates" msgstr "" -#: pretix/base/models/event.py:1807 pretix/base/models/items.py:2253 +#: pretix/base/models/event.py:1824 pretix/base/models/items.py:2263 msgid "Valid values" msgstr "" -#: pretix/base/models/event.py:1810 +#: pretix/base/models/event.py:1827 #: pretix/control/templates/pretixcontrol/organizers/properties.html:45 msgid "Show filter option to customers" msgstr "" -#: pretix/base/models/event.py:1811 +#: pretix/base/models/event.py:1828 msgid "" "This field will be shown to filter events in the public event list and " "calendar." msgstr "" -#: pretix/base/models/event.py:1814 pretix/control/forms/organizer.py:272 -#: pretix/control/forms/organizer.py:276 +#: pretix/base/models/event.py:1831 pretix/control/forms/organizer.py:281 +#: pretix/control/forms/organizer.py:285 msgid "Public name" msgstr "" -#: pretix/base/models/event.py:1818 +#: pretix/base/models/event.py:1835 #: pretix/control/templates/pretixcontrol/organizers/properties.html:40 msgid "Can be used for filtering" msgstr "" -#: pretix/base/models/event.py:1819 +#: pretix/base/models/event.py:1836 msgid "" "This field will be shown to filter events or reports in the backend, and it " "can also be used for hidden filter parameters in the frontend (e.g. using " "the widget)." msgstr "" -#: pretix/base/models/event.py:1829 +#: pretix/base/models/event.py:1846 msgid "A property can either be required or have a default value, not both." msgstr "" -#: pretix/base/models/event.py:1909 pretix/base/models/organizer.py:620 +#: pretix/base/models/event.py:1884 +msgid "Property and event must belong to the same organizer." +msgstr "" + +#: pretix/base/models/event.py:1928 pretix/base/models/organizer.py:627 msgid "Link text" msgstr "" -#: pretix/base/models/event.py:1912 pretix/base/models/organizer.py:623 +#: pretix/base/models/event.py:1931 pretix/base/models/organizer.py:630 msgid "Link URL" msgstr "" @@ -4967,7 +5059,7 @@ msgstr "" #: pretix/base/models/exports.py:61 pretix/base/models/exports.py:66 #: pretix/base/models/exports.py:71 pretix/control/forms/event.py:1153 -#: pretix/control/forms/organizer.py:705 +#: pretix/control/forms/organizer.py:715 msgid "You can specify multiple recipients separated by commas." msgstr "" @@ -4982,10 +5074,10 @@ msgstr "" #: pretix/base/models/exports.py:74 pretix/control/forms/event.py:1259 #: pretix/control/forms/event.py:1333 pretix/control/forms/event.py:1343 #: pretix/control/forms/event.py:1353 pretix/control/forms/event.py:1368 -#: pretix/control/forms/orders.py:730 pretix/control/forms/orders.py:952 -#: pretix/control/forms/orders.py:979 pretix/control/forms/organizer.py:727 -#: pretix/control/forms/organizer.py:737 pretix/control/forms/organizer.py:747 -#: pretix/control/forms/organizer.py:757 pretix/control/forms/vouchers.py:282 +#: pretix/control/forms/orders.py:738 pretix/control/forms/orders.py:960 +#: pretix/control/forms/orders.py:987 pretix/control/forms/organizer.py:737 +#: pretix/control/forms/organizer.py:747 pretix/control/forms/organizer.py:757 +#: pretix/control/forms/organizer.py:767 pretix/control/forms/vouchers.py:282 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mail.html:33 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html:61 #: pretix/plugins/sendmail/forms.py:57 pretix/plugins/sendmail/forms.py:73 @@ -4993,9 +5085,9 @@ msgstr "" msgid "Subject" msgstr "" -#: pretix/base/models/exports.py:78 pretix/control/forms/orders.py:769 -#: pretix/control/forms/orders.py:792 pretix/control/forms/orders.py:960 -#: pretix/control/forms/orders.py:987 pretix/control/forms/vouchers.py:288 +#: pretix/base/models/exports.py:78 pretix/control/forms/orders.py:777 +#: pretix/control/forms/orders.py:800 pretix/control/forms/orders.py:968 +#: pretix/control/forms/orders.py:995 pretix/control/forms/vouchers.py:288 #: pretix/plugins/sendmail/forms.py:58 pretix/plugins/sendmail/forms.py:78 #: pretix/plugins/sendmail/models.py:242 msgid "Message" @@ -5070,7 +5162,7 @@ msgctxt "invoice" msgid "Tax ID: %s" msgstr "" -#: pretix/base/models/invoices.py:240 pretix/base/services/invoices.py:156 +#: pretix/base/models/invoices.py:240 pretix/base/services/invoices.py:157 #, python-format msgctxt "invoice" msgid "VAT-ID: %s" @@ -5080,7 +5172,7 @@ msgstr "" msgid "Category name" msgstr "" -#: pretix/base/models/items.py:97 pretix/base/models/items.py:484 +#: pretix/base/models/items.py:97 pretix/base/models/items.py:489 msgid "" "If you set this, this will be used instead of the public name in the backend." msgstr "" @@ -5101,15 +5193,15 @@ msgid "" msgstr "" #: pretix/base/models/items.py:114 pretix/base/models/items.py:159 -#: pretix/control/forms/item.py:98 +#: pretix/control/forms/item.py:99 msgid "Normal category" msgstr "" -#: pretix/base/models/items.py:115 pretix/control/forms/item.py:111 +#: pretix/base/models/items.py:115 pretix/control/forms/item.py:112 msgid "Normal + cross-selling category" msgstr "" -#: pretix/base/models/items.py:116 pretix/control/forms/item.py:106 +#: pretix/base/models/items.py:116 pretix/control/forms/item.py:107 msgid "Cross-selling category" msgstr "" @@ -5155,12 +5247,12 @@ msgid "Disable product for this date" msgstr "" #: pretix/base/models/items.py:226 pretix/base/models/items.py:282 -#: pretix/base/models/items.py:563 +#: pretix/base/models/items.py:568 msgid "This product will not be sold before the given date." msgstr "" #: pretix/base/models/items.py:231 pretix/base/models/items.py:287 -#: pretix/base/models/items.py:573 +#: pretix/base/models/items.py:578 msgid "This product will not be sold after the given date." msgstr "" @@ -5176,54 +5268,66 @@ msgstr "" msgid "Dynamic validity" msgstr "" -#: pretix/base/models/items.py:444 pretix/control/forms/item.py:671 +#: pretix/base/models/items.py:444 pretix/control/forms/item.py:726 #: pretix/control/templates/pretixcontrol/subevents/fragment_unavail_mode_indicator.html:3 msgid "Hide product if unavailable" msgstr "" -#: pretix/base/models/items.py:445 pretix/control/forms/item.py:672 +#: pretix/base/models/items.py:445 pretix/control/forms/item.py:727 #: pretix/control/templates/pretixcontrol/subevents/fragment_unavail_mode_indicator.html:5 msgid "Show product with info on why it’s unavailable" msgstr "" -#: pretix/base/models/items.py:456 pretix/base/models/items.py:781 -msgid "Don't use re-usable media, use regular one-off tickets" -msgstr "" - -#: pretix/base/models/items.py:457 -msgid "Require an existing medium to be re-used" -msgstr "" - -#: pretix/base/models/items.py:458 -msgid "Require a previously unknown medium to be newly added" +#: pretix/base/models/items.py:458 pretix/base/models/items.py:786 +msgid "Don't use reusable media, use regular one-off tickets" msgstr "" #: pretix/base/models/items.py:459 -msgid "Require either an existing or a new medium to be used" +msgid "Require a previously unknown medium to be newly added" msgstr "" -#: pretix/base/models/items.py:475 pretix/base/models/items.py:1458 +#: pretix/base/models/items.py:460 +msgid "Require an existing medium to be reused, replacing any previous tickets" +msgstr "" + +#: pretix/base/models/items.py:461 +msgid "" +"Require either an existing or a new medium to be used, replacing any " +"previous tickets" +msgstr "" + +#: pretix/base/models/items.py:462 +msgid "Require an existing medium to be reused, adding to any previous tickets" +msgstr "" + +#: pretix/base/models/items.py:464 +msgid "" +"Require either an existing or a new medium to be used, adding to any " +"previous tickets" +msgstr "" + +#: pretix/base/models/items.py:480 pretix/base/models/items.py:1468 msgid "Category" msgstr "" -#: pretix/base/models/items.py:476 +#: pretix/base/models/items.py:481 msgid "" "If you have many products, you can optionally sort them into categories to " "keep things organized." msgstr "" -#: pretix/base/models/items.py:493 +#: pretix/base/models/items.py:498 msgid "This is shown below the product name in lists." msgstr "" -#: pretix/base/models/items.py:498 +#: pretix/base/models/items.py:503 msgid "" "If this product has multiple variations, you can set different prices for " "each of the variations. If a variation does not have a special price or if " "you do not have variations, this price will be used." msgstr "" -#: pretix/base/models/items.py:506 +#: pretix/base/models/items.py:511 msgid "" "If this option is active, your users can choose the price themselves. The " "price configured above is then interpreted as the minimum price a user has " @@ -5231,11 +5335,11 @@ msgid "" "event." msgstr "" -#: pretix/base/models/items.py:511 pretix/base/models/items.py:1176 +#: pretix/base/models/items.py:516 pretix/base/models/items.py:1186 msgid "Suggested price" msgstr "" -#: pretix/base/models/items.py:512 pretix/base/models/items.py:1177 +#: pretix/base/models/items.py:517 pretix/base/models/items.py:1187 msgid "" "This price will be used as the default value of the input field. The user " "can choose a lower value, but not lower than the price this product would " @@ -5243,45 +5347,45 @@ msgid "" "used that lowers the price." msgstr "" -#: pretix/base/models/items.py:526 +#: pretix/base/models/items.py:531 msgid "Whether or not buying this product allows a person to enter your event" msgstr "" -#: pretix/base/models/items.py:531 +#: pretix/base/models/items.py:536 msgid "Is a personalized ticket" msgstr "" -#: pretix/base/models/items.py:533 +#: pretix/base/models/items.py:538 msgid "Whether or not buying this product allows to enter attendee information" msgstr "" -#: pretix/base/models/items.py:542 +#: pretix/base/models/items.py:547 msgid "Show a waiting list for this ticket" msgstr "" -#: pretix/base/models/items.py:543 +#: pretix/base/models/items.py:548 msgid "This will only work if waiting lists are enabled for this event." msgstr "" -#: pretix/base/models/items.py:547 pretix/base/settings.py:1591 +#: pretix/base/models/items.py:552 pretix/base/settings.py:1606 #: pretix/control/forms/event.py:1869 msgid "Show number of tickets left" msgstr "" -#: pretix/base/models/items.py:548 +#: pretix/base/models/items.py:553 msgid "Publicly show how many tickets are still available." msgstr "" -#: pretix/base/models/items.py:555 pretix/control/forms/item.py:636 +#: pretix/base/models/items.py:560 pretix/control/forms/item.py:691 msgid "Product picture" msgstr "" -#: pretix/base/models/items.py:584 +#: pretix/base/models/items.py:589 msgctxt "hidden_if_available_legacy" msgid "Only show after sellout of" msgstr "" -#: pretix/base/models/items.py:585 +#: pretix/base/models/items.py:590 msgid "" "If you select a quota here, this product will only be shown when that quota " "is unavailable. If combined with the option to hide sold-out products, this " @@ -5290,11 +5394,11 @@ msgid "" "all tickets in the referenced quota are reserved, but not yet sold." msgstr "" -#: pretix/base/models/items.py:595 +#: pretix/base/models/items.py:600 msgid "Only show after sellout of" msgstr "" -#: pretix/base/models/items.py:596 +#: pretix/base/models/items.py:601 msgid "" "If you select a product here, this product will only be shown when that " "product is no longer available. This will happen either because the other " @@ -5306,13 +5410,13 @@ msgid "" "reserved, but not yet sold." msgstr "" -#: pretix/base/models/items.py:611 +#: pretix/base/models/items.py:616 msgid "" "To buy this product, the user needs a voucher that applies to this product " "either directly or via a quota." msgstr "" -#: pretix/base/models/items.py:617 +#: pretix/base/models/items.py:622 msgid "" "If this product is part of an order, the order will be put into an " "\"approval\" state and will need to be confirmed by you before it can be " @@ -5320,34 +5424,34 @@ msgid "" "only available to specific groups." msgstr "" -#: pretix/base/models/items.py:624 +#: pretix/base/models/items.py:629 msgid "" "This product will be hidden from the event page until the user enters a " "voucher that unlocks this product." msgstr "" -#: pretix/base/models/items.py:630 +#: pretix/base/models/items.py:635 msgid "" "If this option is set, the product will only be sold as part of bundle " "products. Do not check this option if you want to use this " "product as an add-on product, but only for fixed bundles!" msgstr "" -#: pretix/base/models/items.py:637 +#: pretix/base/models/items.py:642 msgid "" "If this is checked, the usual cancellation and order change settings of this " "event apply. If this is unchecked, orders containing this product can not be " "canceled by users but only by you." msgstr "" -#: pretix/base/models/items.py:644 +#: pretix/base/models/items.py:649 msgid "" "This product can only be bought if it is added to the cart at least this " "many times. If you keep the field empty or set it to 0, there is no special " "limit for this product." msgstr "" -#: pretix/base/models/items.py:651 +#: pretix/base/models/items.py:656 msgid "" "This product can only be bought at most this many times within one order. If " "you keep the field empty or set it to 0, there is no special limit for this " @@ -5355,7 +5459,7 @@ msgid "" "applies regardless." msgstr "" -#: pretix/base/models/items.py:658 pretix/base/models/items.py:1244 +#: pretix/base/models/items.py:663 pretix/base/models/items.py:1254 msgid "" "If you set this, the check-in app will show a visible warning that this " "ticket requires special attention. You can use this for example for student " @@ -5363,62 +5467,62 @@ msgid "" "needs to be checked." msgstr "" -#: pretix/base/models/items.py:665 pretix/base/models/items.py:1251 +#: pretix/base/models/items.py:670 pretix/base/models/items.py:1261 msgid "" "This text will be shown by the check-in app if a ticket of this type is " "scanned." msgstr "" -#: pretix/base/models/items.py:671 pretix/base/models/items.py:1172 +#: pretix/base/models/items.py:676 pretix/base/models/items.py:1182 msgid "" "If set, this will be displayed next to the current price to show that the " "current price is a discounted one. This is just a cosmetic setting and will " "not actually impact pricing." msgstr "" -#: pretix/base/models/items.py:681 +#: pretix/base/models/items.py:686 msgid "Only sell tickets for this product on the selected sales channels." msgstr "" -#: pretix/base/models/items.py:686 +#: pretix/base/models/items.py:691 msgid "" "When a customer buys this product, they will get a gift card with a value " "corresponding to the product price." msgstr "" -#: pretix/base/models/items.py:696 +#: pretix/base/models/items.py:701 msgid "Allowed membership types" msgstr "" -#: pretix/base/models/items.py:701 pretix/base/models/items.py:1200 +#: pretix/base/models/items.py:706 pretix/base/models/items.py:1210 msgid "" "Do not show this unless the customer is logged in and has a valid " "membership. Be aware that this means it will never be visible in the widget." msgstr "" -#: pretix/base/models/items.py:710 +#: pretix/base/models/items.py:715 msgid "This product creates a membership of type" msgstr "" -#: pretix/base/models/items.py:713 +#: pretix/base/models/items.py:718 msgid "" "The duration of the membership is the same as the duration of the event or " "event series date" msgstr "" -#: pretix/base/models/items.py:717 +#: pretix/base/models/items.py:722 msgid "Membership duration in days" msgstr "" -#: pretix/base/models/items.py:721 +#: pretix/base/models/items.py:726 msgid "Membership duration in months" msgstr "" -#: pretix/base/models/items.py:728 +#: pretix/base/models/items.py:733 msgid "Validity" msgstr "" -#: pretix/base/models/items.py:730 +#: pretix/base/models/items.py:735 msgid "" "When setting up a regular event, or an event series with time slots, you " "typically do NOT need to change this value. The default setting means that " @@ -5430,53 +5534,53 @@ msgid "" "change but keep their current validity." msgstr "" -#: pretix/base/models/items.py:738 pretix/control/forms/item.py:739 +#: pretix/base/models/items.py:743 pretix/control/forms/item.py:794 msgid "Start of validity" msgstr "" -#: pretix/base/models/items.py:739 +#: pretix/base/models/items.py:744 msgid "End of validity" msgstr "" -#: pretix/base/models/items.py:742 +#: pretix/base/models/items.py:747 msgid "Minutes" msgstr "" -#: pretix/base/models/items.py:746 +#: pretix/base/models/items.py:751 msgid "Hours" msgstr "" -#: pretix/base/models/items.py:750 +#: pretix/base/models/items.py:755 msgid "Days" msgstr "" -#: pretix/base/models/items.py:754 +#: pretix/base/models/items.py:759 msgid "Months" msgstr "" -#: pretix/base/models/items.py:757 +#: pretix/base/models/items.py:762 msgid "Customers can select the validity start date" msgstr "" -#: pretix/base/models/items.py:758 +#: pretix/base/models/items.py:763 msgid "If not selected, the validity always starts at the time of purchase." msgstr "" -#: pretix/base/models/items.py:763 +#: pretix/base/models/items.py:768 msgid "Maximum future start" msgstr "" -#: pretix/base/models/items.py:764 +#: pretix/base/models/items.py:769 msgid "The selected start date may only be this many days in the future." msgstr "" -#: pretix/base/models/items.py:770 +#: pretix/base/models/items.py:775 msgid "Reusable media policy" msgstr "" -#: pretix/base/models/items.py:772 +#: pretix/base/models/items.py:777 msgid "" -"If this product should be stored on a re-usable physical medium, you can " +"If this product should be stored on a reusable physical medium, you can " "attach a physical media policy. This is not required for regular tickets, " "which just use a one-time barcode, but only for products like renewable " "season tickets or re-chargeable gift card wristbands. This is an advanced " @@ -5484,70 +5588,77 @@ msgid "" "settings." msgstr "" -#: pretix/base/models/items.py:782 +#: pretix/base/models/items.py:787 msgid "Reusable media type" msgstr "" -#: pretix/base/models/items.py:784 +#: pretix/base/models/items.py:789 msgid "" "Select the type of physical medium that should be used for this product. " "Note that not all media types support all types of products, and not all " "media types are supported across all sales channels or check-in processes." msgstr "" -#: pretix/base/models/items.py:989 +#: pretix/base/models/items.py:994 msgid "" "If you select a reusable media policy, you also need to select a reusable " "media type." msgstr "" -#: pretix/base/models/items.py:993 +#: pretix/base/models/items.py:998 msgid "The selected media type is not enabled in your organizer settings." msgstr "" -#: pretix/base/models/items.py:995 +#: pretix/base/models/items.py:1000 msgid "The selected media type does not support usage for tickets currently." msgstr "" -#: pretix/base/models/items.py:997 +#: pretix/base/models/items.py:1002 msgid "" "The selected media type does not support usage for gift cards currently." msgstr "" -#: pretix/base/models/items.py:999 +#: pretix/base/models/items.py:1005 +msgid "" +"The selected media type requires all media to be registered in the system " +"prior to their usage. Therefore, the selected media policy does not make " +"sense for this media type." +msgstr "" + +#: pretix/base/models/items.py:1009 msgid "" "You currently cannot create gift cards with a reusable media policy. " "Instead, gift cards for some reusable media types can be created or re-" "charged directly at the POS." msgstr "" -#: pretix/base/models/items.py:1007 +#: pretix/base/models/items.py:1017 msgid "" "The maximum number per order can not be lower than the minimum number per " "order." msgstr "" -#: pretix/base/models/items.py:1013 +#: pretix/base/models/items.py:1023 msgid "The item's category must belong to the same event as the item." msgstr "" -#: pretix/base/models/items.py:1018 +#: pretix/base/models/items.py:1028 msgid "The item's tax rule must belong to the same event as the item." msgstr "" -#: pretix/base/models/items.py:1024 +#: pretix/base/models/items.py:1034 msgid "The item's availability cannot end before it starts." msgstr "" -#: pretix/base/models/items.py:1156 +#: pretix/base/models/items.py:1166 msgid "This is shown below the variation name in lists." msgstr "" -#: pretix/base/models/items.py:1183 +#: pretix/base/models/items.py:1193 msgid "Require approval" msgstr "" -#: pretix/base/models/items.py:1185 +#: pretix/base/models/items.py:1195 msgid "" "If this variation is part of an order, the order will be put into an " "\"approval\" state and will need to be confirmed by you before it can be " @@ -5555,101 +5666,101 @@ msgid "" "only available to specific groups." msgstr "" -#: pretix/base/models/items.py:1195 pretix/control/navigation.py:618 +#: pretix/base/models/items.py:1205 pretix/control/navigation.py:618 #: pretix/control/templates/pretixcontrol/organizers/membershiptypes.html:4 #: pretix/control/templates/pretixcontrol/organizers/membershiptypes.html:6 msgid "Membership types" msgstr "" -#: pretix/base/models/items.py:1207 +#: pretix/base/models/items.py:1217 msgid "This variation will not be sold before the given date." msgstr "" -#: pretix/base/models/items.py:1217 +#: pretix/base/models/items.py:1227 msgid "This variation will not be sold after the given date." msgstr "" -#: pretix/base/models/items.py:1225 +#: pretix/base/models/items.py:1235 msgid "Sell on all sales channels the product is sold on" msgstr "" -#: pretix/base/models/items.py:1231 +#: pretix/base/models/items.py:1241 msgid "" "The sales channel selection for the product as a whole takes precedence, so " "if a sales channel is selected here but not on product level, the variation " "will not be available." msgstr "" -#: pretix/base/models/items.py:1236 +#: pretix/base/models/items.py:1246 msgid "Show only if a matching voucher is redeemed." msgstr "" -#: pretix/base/models/items.py:1238 +#: pretix/base/models/items.py:1248 msgid "" "This variation will be hidden from the event page until the user enters a " "voucher that unlocks this variation." msgstr "" -#: pretix/base/models/items.py:1258 +#: pretix/base/models/items.py:1268 #: pretix/control/templates/pretixcontrol/item/create.html:111 msgid "Product variations" msgstr "" -#: pretix/base/models/items.py:1463 +#: pretix/base/models/items.py:1473 msgid "Minimum number" msgstr "" -#: pretix/base/models/items.py:1467 +#: pretix/base/models/items.py:1477 msgid "Maximum number" msgstr "" -#: pretix/base/models/items.py:1471 +#: pretix/base/models/items.py:1481 msgid "Add-Ons are included in the price" msgstr "" -#: pretix/base/models/items.py:1472 +#: pretix/base/models/items.py:1482 msgid "" "If selected, adding add-ons to this ticket is free, even if the add-ons " "would normally cost money individually." msgstr "" -#: pretix/base/models/items.py:1477 +#: pretix/base/models/items.py:1487 msgid "Allow the same product to be selected multiple times" msgstr "" -#: pretix/base/models/items.py:1496 +#: pretix/base/models/items.py:1506 msgid "The add-on's category must belong to the same event as the item." msgstr "" -#: pretix/base/models/items.py:1501 +#: pretix/base/models/items.py:1511 msgid "The item already has an add-on of this category." msgstr "" -#: pretix/base/models/items.py:1506 +#: pretix/base/models/items.py:1516 msgid "The minimum count needs to be equal to or greater than zero." msgstr "" -#: pretix/base/models/items.py:1511 +#: pretix/base/models/items.py:1521 msgid "The maximum count needs to be equal to or greater than zero." msgstr "" -#: pretix/base/models/items.py:1516 +#: pretix/base/models/items.py:1526 msgid "The maximum count needs to be greater than the minimum count." msgstr "" -#: pretix/base/models/items.py:1543 +#: pretix/base/models/items.py:1553 msgid "Bundled item" msgstr "" -#: pretix/base/models/items.py:1549 +#: pretix/base/models/items.py:1559 msgid "Bundled variation" msgstr "" -#: pretix/base/models/items.py:1560 +#: pretix/base/models/items.py:1570 msgid "Designated price part" msgstr "" -#: pretix/base/models/items.py:1561 +#: pretix/base/models/items.py:1571 msgid "" "If set, it will be shown that this bundled item is responsible for the given " "value of the total gross price. This might be important in cases of mixed " @@ -5657,246 +5768,248 @@ msgid "" "the base item's price." msgstr "" -#: pretix/base/models/items.py:1584 +#: pretix/base/models/items.py:1594 msgid "The bundled item must belong to the same event as the item." msgstr "" -#: pretix/base/models/items.py:1586 +#: pretix/base/models/items.py:1596 msgid "A variation needs to be set for this item." msgstr "" -#: pretix/base/models/items.py:1588 +#: pretix/base/models/items.py:1598 msgid "The chosen variation does not belong to this item." msgstr "" -#: pretix/base/models/items.py:1593 +#: pretix/base/models/items.py:1603 msgid "The count needs to be equal to or greater than zero." msgstr "" -#: pretix/base/models/items.py:1648 +#: pretix/base/models/items.py:1658 msgid "Number" msgstr "" -#: pretix/base/models/items.py:1649 +#: pretix/base/models/items.py:1659 msgid "Text (one line)" msgstr "" -#: pretix/base/models/items.py:1650 +#: pretix/base/models/items.py:1660 msgid "Multiline text" msgstr "" -#: pretix/base/models/items.py:1651 +#: pretix/base/models/items.py:1661 msgid "Yes/No" msgstr "" -#: pretix/base/models/items.py:1652 +#: pretix/base/models/items.py:1662 msgid "Choose one from a list" msgstr "" -#: pretix/base/models/items.py:1653 +#: pretix/base/models/items.py:1663 msgid "Choose multiple from a list" msgstr "" -#: pretix/base/models/items.py:1654 +#: pretix/base/models/items.py:1664 msgid "File upload" msgstr "" -#: pretix/base/models/items.py:1657 +#: pretix/base/models/items.py:1667 #: pretix/control/templates/pretixcontrol/event/settings.html:240 msgid "Date and time" msgstr "" -#: pretix/base/models/items.py:1658 +#: pretix/base/models/items.py:1668 msgid "Country code (ISO 3166-1 alpha-2)" msgstr "" -#: pretix/base/models/items.py:1681 pretix/base/models/items.py:1957 -#: pretix/base/models/organizer.py:647 +#: pretix/base/models/items.py:1691 pretix/base/models/items.py:1967 +#: pretix/base/models/organizer.py:654 msgid "" "The identifier may only contain letters, numbers, dots, dashes, and " "underscores." msgstr "" -#: pretix/base/models/items.py:1686 +#: pretix/base/models/items.py:1696 msgid "Help text" msgstr "" -#: pretix/base/models/items.py:1687 +#: pretix/base/models/items.py:1697 msgid "If the question needs to be explained or clarified, do it here!" msgstr "" -#: pretix/base/models/items.py:1693 +#: pretix/base/models/items.py:1703 msgid "Question type" msgstr "" -#: pretix/base/models/items.py:1697 +#: pretix/base/models/items.py:1707 #: pretix/control/templates/pretixcontrol/items/questions.html:59 msgid "Required question" msgstr "" -#: pretix/base/models/items.py:1704 +#: pretix/base/models/items.py:1714 msgid "This question will be asked to buyers of the selected products" msgstr "" -#: pretix/base/models/items.py:1711 +#: pretix/base/models/items.py:1721 msgid "Ask during check-in instead of in the ticket buying process" msgstr "" -#: pretix/base/models/items.py:1712 pretix/base/models/items.py:1717 +#: pretix/base/models/items.py:1722 pretix/base/models/items.py:1727 msgid "Not supported by all check-in apps for all question types." msgstr "" -#: pretix/base/models/items.py:1716 +#: pretix/base/models/items.py:1726 msgid "Show answer during check-in" msgstr "" -#: pretix/base/models/items.py:1721 +#: pretix/base/models/items.py:1731 #: pretix/control/templates/pretixcontrol/items/questions.html:70 msgid "Hidden question" msgstr "" -#: pretix/base/models/items.py:1722 +#: pretix/base/models/items.py:1732 msgid "This question will only show up in the backend." msgstr "" -#: pretix/base/models/items.py:1726 +#: pretix/base/models/items.py:1736 msgid "Print answer on invoices" msgstr "" -#: pretix/base/models/items.py:1734 pretix/base/models/items.py:1740 -#: pretix/base/models/items.py:1746 +#: pretix/base/models/items.py:1744 pretix/base/models/items.py:1750 +#: pretix/base/models/items.py:1756 msgid "Minimum value" msgstr "" -#: pretix/base/models/items.py:1735 pretix/base/models/items.py:1738 -#: pretix/base/models/items.py:1741 pretix/base/models/items.py:1744 -#: pretix/base/models/items.py:1747 pretix/base/models/items.py:1750 -#: pretix/base/models/items.py:1754 +#: pretix/base/models/items.py:1745 pretix/base/models/items.py:1748 +#: pretix/base/models/items.py:1751 pretix/base/models/items.py:1754 +#: pretix/base/models/items.py:1757 pretix/base/models/items.py:1760 +#: pretix/base/models/items.py:1764 msgid "Currently not supported in our apps and during check-in" msgstr "" -#: pretix/base/models/items.py:1737 pretix/base/models/items.py:1743 -#: pretix/base/models/items.py:1749 +#: pretix/base/models/items.py:1747 pretix/base/models/items.py:1753 +#: pretix/base/models/items.py:1759 msgid "Maximum value" msgstr "" -#: pretix/base/models/items.py:1752 +#: pretix/base/models/items.py:1762 msgid "Maximum length" msgstr "" -#: pretix/base/models/items.py:1758 +#: pretix/base/models/items.py:1768 msgid "Validate file to be a portrait" msgstr "" -#: pretix/base/models/items.py:1759 +#: pretix/base/models/items.py:1769 msgid "" "If checked, files must be images with an aspect ratio of 3:4. This is " "commonly used for photos printed on badges." msgstr "" -#: pretix/base/models/items.py:1814 +#: pretix/base/models/items.py:1824 msgid "An answer to this question is required to proceed." msgstr "" -#: pretix/base/models/items.py:1824 +#: pretix/base/models/items.py:1834 msgid "Invalid input type." msgstr "" -#: pretix/base/models/items.py:1858 +#: pretix/base/models/items.py:1868 msgid "The number is to low." msgstr "" -#: pretix/base/models/items.py:1860 +#: pretix/base/models/items.py:1870 msgid "The number is to high." msgstr "" -#: pretix/base/models/items.py:1863 +#: pretix/base/models/items.py:1873 msgid "Invalid number input." msgstr "" -#: pretix/base/models/items.py:1870 pretix/base/models/items.py:1894 +#: pretix/base/models/items.py:1880 pretix/base/models/items.py:1904 msgid "Please choose a later date." msgstr "" -#: pretix/base/models/items.py:1872 pretix/base/models/items.py:1896 +#: pretix/base/models/items.py:1882 pretix/base/models/items.py:1906 msgid "Please choose an earlier date." msgstr "" -#: pretix/base/models/items.py:1875 +#: pretix/base/models/items.py:1885 msgid "Invalid date input." msgstr "" -#: pretix/base/models/items.py:1882 +#: pretix/base/models/items.py:1892 msgid "Invalid time input." msgstr "" -#: pretix/base/models/items.py:1891 +#: pretix/base/models/items.py:1901 msgid "Invalid datetime input." msgstr "" -#: pretix/base/models/items.py:1903 +#: pretix/base/models/items.py:1913 msgid "Unknown country code." msgstr "" -#: pretix/base/models/items.py:1921 pretix/base/models/items.py:1923 +#: pretix/base/models/items.py:1931 pretix/base/models/items.py:1933 msgid "The maximum date must not be before the minimum value." msgstr "" -#: pretix/base/models/items.py:1925 +#: pretix/base/models/items.py:1935 msgid "The maximum value must not be lower than the minimum value." msgstr "" -#: pretix/base/models/items.py:1943 +#: pretix/base/models/items.py:1953 msgid "" "The system already contains answers to this question that are not compatible " "with changing the type of question without data loss. Consider hiding this " "question and creating a new one instead." msgstr "" -#: pretix/base/models/items.py:1961 +#: pretix/base/models/items.py:1971 #: pretix/control/templates/pretixcontrol/items/question.html:87 msgid "Answer" msgstr "" -#: pretix/base/models/items.py:1985 +#: pretix/base/models/items.py:1995 #, python-brace-format msgid "The identifier \"{}\" is already used for a different option." msgstr "" -#: pretix/base/models/items.py:1988 +#: pretix/base/models/items.py:1998 msgid "Question option" msgstr "" -#: pretix/base/models/items.py:1989 +#: pretix/base/models/items.py:1999 msgid "Question options" msgstr "" -#: pretix/base/models/items.py:2074 pretix/control/forms/event.py:1903 -#: pretix/control/templates/pretixcontrol/items/quotas.html:60 +#: pretix/base/models/items.py:2084 pretix/control/forms/event.py:1903 +#: pretix/control/templates/pretixcontrol/items/quotas.html:104 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:83 msgid "Total capacity" msgstr "" -#: pretix/base/models/items.py:2076 pretix/control/forms/item.py:457 +#: pretix/base/models/items.py:2086 pretix/control/forms/item.py:512 msgid "Leave empty for an unlimited number of tickets." msgstr "" -#: pretix/base/models/items.py:2080 pretix/base/models/orders.py:1494 -#: pretix/base/models/orders.py:3033 +#: pretix/base/models/items.py:2090 pretix/base/models/orders.py:1516 +#: pretix/base/models/orders.py:3055 #: pretix/control/templates/pretixcontrol/checkin/index.html:97 msgid "Item" msgstr "" -#: pretix/base/models/items.py:2088 pretix/control/forms/item.py:918 +#: pretix/base/models/items.py:2098 pretix/control/forms/item.py:973 #: pretix/plugins/autocheckin/models.py:74 msgid "Variations" msgstr "" -#: pretix/base/models/items.py:2092 -#: pretix/control/templates/pretixcontrol/items/quotas.html:74 +#: pretix/base/models/items.py:2102 +#: pretix/control/templates/pretixcontrol/items/quotas.html:135 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:96 msgid "Ignore this quota when determining event availability" msgstr "" -#: pretix/base/models/items.py:2093 +#: pretix/base/models/items.py:2103 msgid "" "If you enable this, this quota will be ignored when determining event " "availability in your event calendar. This is useful e.g. for merchandise " @@ -5904,22 +6017,22 @@ msgid "" "as sold out." msgstr "" -#: pretix/base/models/items.py:2100 +#: pretix/base/models/items.py:2110 msgid "Close this quota permanently once it is sold out" msgstr "" -#: pretix/base/models/items.py:2101 +#: pretix/base/models/items.py:2111 msgid "" "If you enable this, when the quota is sold out once, no more tickets will be " "sold, even if tickets become available again through cancellations or " "expiring orders. Of course, you can always re-open it manually." msgstr "" -#: pretix/base/models/items.py:2109 +#: pretix/base/models/items.py:2119 msgid "Allow to sell more tickets once people have checked out" msgstr "" -#: pretix/base/models/items.py:2110 +#: pretix/base/models/items.py:2120 msgid "" "With this option, quota will be released as soon as people are scanned at an " "exit of your event. This will only happen if they have been scanned both at " @@ -5929,50 +6042,51 @@ msgid "" "prevent accidental overbooking." msgstr "" -#: pretix/base/models/items.py:2122 pretix/control/navigation.py:169 -#: pretix/control/templates/pretixcontrol/items/quotas.html:4 -#: pretix/control/templates/pretixcontrol/items/quotas.html:6 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:416 +#: pretix/base/models/items.py:2132 pretix/control/navigation.py:169 +#: pretix/control/templates/pretixcontrol/items/quotas.html:5 +#: pretix/control/templates/pretixcontrol/items/quotas.html:7 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:418 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:185 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:59 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:76 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:59 msgid "Quotas" msgstr "" -#: pretix/base/models/items.py:2195 +#: pretix/base/models/items.py:2205 msgid "All variations must belong to an item contained in the items list." msgstr "" -#: pretix/base/models/items.py:2206 +#: pretix/base/models/items.py:2216 msgid "" "One or more items has variations but none of these are in the variations " "list." msgstr "" -#: pretix/base/models/items.py:2212 pretix/base/models/waitinglist.py:304 +#: pretix/base/models/items.py:2222 pretix/base/models/waitinglist.py:304 msgid "Subevent cannot be null for event series." msgstr "" -#: pretix/base/models/items.py:2248 +#: pretix/base/models/items.py:2258 msgid "Required for products" msgstr "" -#: pretix/base/models/items.py:2249 +#: pretix/base/models/items.py:2259 msgid "" "If checked, this property must be set in each product. Does not apply if a " "default value is set." msgstr "" -#: pretix/base/models/items.py:2254 +#: pretix/base/models/items.py:2264 msgid "" "If you keep this empty, any value is allowed. Otherwise, enter one possible " "value per line." msgstr "" -#: pretix/base/models/items.py:2311 +#: pretix/base/models/items.py:2323 msgid "Start" msgstr "" -#: pretix/base/models/items.py:2312 +#: pretix/base/models/items.py:2324 #: pretix/plugins/reports/accountingreport.py:129 msgid "End" msgstr "" @@ -6017,6 +6131,27 @@ msgstr "" msgid "bounced" msgstr "" +#: pretix/base/models/media.py:77 +msgctxt "reusable_medium" +msgid "Claim token" +msgstr "" + +#: pretix/base/models/media.py:82 +msgctxt "reusable_medium" +msgid "Label" +msgstr "" + +#: pretix/base/models/media.py:105 +msgid "Linked tickets" +msgstr "" + +#: pretix/base/models/media.py:107 +msgid "" +"If you link to more than one ticket, make sure there is no overlap in " +"validity. If multiple tickets are valid at once, this will lead to failed " +"check-ins." +msgstr "" + #: pretix/base/models/memberships.py:44 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:28 msgid "Membership is transferable" @@ -6067,12 +6202,12 @@ msgid "pending" msgstr "" #: pretix/base/models/orders.py:202 pretix/base/payment.py:570 -#: pretix/base/services/invoices.py:593 +#: pretix/base/services/invoices.py:607 msgid "paid" msgstr "" -#: pretix/base/models/orders.py:203 pretix/control/forms/filter.py:1730 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:35 +#: pretix/base/models/orders.py:203 pretix/control/forms/filter.py:1863 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:47 msgid "expired" msgstr "" @@ -6110,7 +6245,7 @@ msgid "" "scanned." msgstr "" -#: pretix/base/models/orders.py:300 pretix/base/models/orders.py:1534 +#: pretix/base/models/orders.py:300 pretix/base/models/orders.py:1556 msgid "Meta information" msgstr "" @@ -6118,196 +6253,196 @@ msgstr "" msgid "API meta information" msgstr "" -#: pretix/base/models/orders.py:418 pretix/plugins/sendmail/forms.py:236 +#: pretix/base/models/orders.py:440 pretix/plugins/sendmail/forms.py:236 #: pretix/plugins/sendmail/forms.py:389 pretix/plugins/sendmail/views.py:269 msgid "approval pending" msgstr "" -#: pretix/base/models/orders.py:420 +#: pretix/base/models/orders.py:442 msgctxt "order state" msgid "pending (confirmed)" msgstr "" -#: pretix/base/models/orders.py:422 +#: pretix/base/models/orders.py:444 msgid "canceled (paid fee)" msgstr "" -#: pretix/base/models/orders.py:1035 +#: pretix/base/models/orders.py:1057 msgid "" "The payment can not be accepted as the last date of payments configured in " "the payment settings is over." msgstr "" -#: pretix/base/models/orders.py:1037 +#: pretix/base/models/orders.py:1059 msgid "" "The payment can not be accepted as the order is expired and you configured " "that no late payments should be accepted in the payment settings." msgstr "" -#: pretix/base/models/orders.py:1039 +#: pretix/base/models/orders.py:1061 msgid "This order is not yet approved by the event organizer." msgstr "" -#: pretix/base/models/orders.py:1064 +#: pretix/base/models/orders.py:1086 #, python-brace-format msgid "The ordered product \"{item}\" is no longer available." msgstr "" -#: pretix/base/models/orders.py:1065 +#: pretix/base/models/orders.py:1087 #, python-brace-format msgid "The seat \"{seat}\" is no longer available." msgstr "" -#: pretix/base/models/orders.py:1066 +#: pretix/base/models/orders.py:1088 #, python-brace-format msgid "The voucher \"{voucher}\" no longer has sufficient budget." msgstr "" -#: pretix/base/models/orders.py:1067 +#: pretix/base/models/orders.py:1089 #, python-brace-format msgid "The voucher \"{voucher}\" has been used in the meantime." msgstr "" -#: pretix/base/models/orders.py:1395 +#: pretix/base/models/orders.py:1417 msgid "" msgstr "" -#: pretix/base/models/orders.py:1514 pretix/base/models/orders.py:1522 +#: pretix/base/models/orders.py:1536 pretix/base/models/orders.py:1544 msgid "Empty, if this product is not an admission ticket" msgstr "" -#: pretix/base/models/orders.py:1731 +#: pretix/base/models/orders.py:1753 msgctxt "payment_state" msgid "created" msgstr "" -#: pretix/base/models/orders.py:1732 +#: pretix/base/models/orders.py:1754 msgctxt "payment_state" msgid "pending" msgstr "" -#: pretix/base/models/orders.py:1733 +#: pretix/base/models/orders.py:1755 msgctxt "payment_state" msgid "confirmed" msgstr "" -#: pretix/base/models/orders.py:1734 +#: pretix/base/models/orders.py:1756 msgctxt "payment_state" msgid "canceled" msgstr "" -#: pretix/base/models/orders.py:1735 +#: pretix/base/models/orders.py:1757 msgctxt "payment_state" msgid "failed" msgstr "" -#: pretix/base/models/orders.py:1736 +#: pretix/base/models/orders.py:1758 msgctxt "payment_state" msgid "refunded" msgstr "" -#: pretix/base/models/orders.py:1764 pretix/base/models/orders.py:2193 +#: pretix/base/models/orders.py:1786 pretix/base/models/orders.py:2215 #: pretix/base/shredder.py:637 msgid "Payment information" msgstr "" -#: pretix/base/models/orders.py:2134 +#: pretix/base/models/orders.py:2156 msgctxt "refund_state" msgid "started externally" msgstr "" -#: pretix/base/models/orders.py:2135 +#: pretix/base/models/orders.py:2157 msgctxt "refund_state" msgid "created" msgstr "" -#: pretix/base/models/orders.py:2136 +#: pretix/base/models/orders.py:2158 msgctxt "refund_state" msgid "in transit" msgstr "" -#: pretix/base/models/orders.py:2137 +#: pretix/base/models/orders.py:2159 msgctxt "refund_state" msgid "done" msgstr "" -#: pretix/base/models/orders.py:2138 +#: pretix/base/models/orders.py:2160 msgctxt "refund_state" msgid "failed" msgstr "" -#: pretix/base/models/orders.py:2140 +#: pretix/base/models/orders.py:2162 msgctxt "refund_state" msgid "canceled" msgstr "" -#: pretix/base/models/orders.py:2148 +#: pretix/base/models/orders.py:2170 msgctxt "refund_source" msgid "Organizer" msgstr "" -#: pretix/base/models/orders.py:2149 +#: pretix/base/models/orders.py:2171 msgctxt "refund_source" msgid "Customer" msgstr "" -#: pretix/base/models/orders.py:2150 +#: pretix/base/models/orders.py:2172 msgctxt "refund_source" msgid "External" msgstr "" -#: pretix/base/models/orders.py:2188 +#: pretix/base/models/orders.py:2210 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:198 msgid "Refund reason" msgstr "" -#: pretix/base/models/orders.py:2189 +#: pretix/base/models/orders.py:2211 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:199 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:201 msgid "" "May be shown to the end user or used e.g. as part of a payment reference." msgstr "" -#: pretix/base/models/orders.py:2309 +#: pretix/base/models/orders.py:2331 msgid "Service fee" msgstr "" -#: pretix/base/models/orders.py:2310 +#: pretix/base/models/orders.py:2332 msgid "Payment fee" msgstr "" -#: pretix/base/models/orders.py:2311 +#: pretix/base/models/orders.py:2333 msgid "Shipping fee" msgstr "" -#: pretix/base/models/orders.py:2312 -#: pretix/control/templates/pretixcontrol/order/index.html:157 +#: pretix/base/models/orders.py:2334 +#: pretix/control/templates/pretixcontrol/order/index.html:190 msgid "Cancellation fee" msgstr "" -#: pretix/base/models/orders.py:2313 +#: pretix/base/models/orders.py:2335 msgid "Insurance fee" msgstr "" -#: pretix/base/models/orders.py:2314 +#: pretix/base/models/orders.py:2336 msgid "Late fee" msgstr "" -#: pretix/base/models/orders.py:2315 +#: pretix/base/models/orders.py:2337 msgid "Other fees" msgstr "" -#: pretix/base/models/orders.py:2316 pretix/base/payment.py:1379 -#: pretix/base/payment.py:1455 pretix/base/settings.py:1099 +#: pretix/base/models/orders.py:2338 pretix/base/payment.py:1379 +#: pretix/base/payment.py:1455 pretix/base/settings.py:1114 #: pretix/control/templates/pretixcontrol/items/index.html:117 -#: pretix/control/templates/pretixcontrol/order/index.html:152 +#: pretix/control/templates/pretixcontrol/order/index.html:185 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:383 #: pretix/presale/templates/pretixpresale/event/order_giftcard.html:7 #: pretix/presale/templates/pretixpresale/event/position_giftcard.html:7 msgid "Gift card" msgstr "" -#: pretix/base/models/orders.py:2321 +#: pretix/base/models/orders.py:2343 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:84 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:126 #: pretix/control/views/vouchers.py:121 @@ -6315,56 +6450,56 @@ msgstr "" msgid "Value" msgstr "" -#: pretix/base/models/orders.py:2602 +#: pretix/base/models/orders.py:2624 msgid "Order position" msgstr "" -#: pretix/base/models/orders.py:3157 +#: pretix/base/models/orders.py:3179 msgid "Cart ID (e.g. session key)" msgstr "" -#: pretix/base/models/orders.py:3168 +#: pretix/base/models/orders.py:3190 msgid "Limit for extending expiration date" msgstr "" -#: pretix/base/models/orders.py:3204 +#: pretix/base/models/orders.py:3226 msgid "Cart position" msgstr "" -#: pretix/base/models/orders.py:3205 +#: pretix/base/models/orders.py:3227 msgid "Cart positions" msgstr "" -#: pretix/base/models/orders.py:3347 +#: pretix/base/models/orders.py:3369 msgid "Business customer" msgstr "" -#: pretix/base/models/orders.py:3363 +#: pretix/base/models/orders.py:3385 msgid "This reference will be printed on your invoice for your convenience." msgstr "" -#: pretix/base/models/orders.py:3489 +#: pretix/base/models/orders.py:3511 msgid "Transmission type" msgstr "" -#: pretix/base/models/orders.py:3580 +#: pretix/base/models/orders.py:3602 #: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html:9 msgid "Badge" msgstr "" -#: pretix/base/models/orders.py:3581 pretix/base/pdf.py:1140 +#: pretix/base/models/orders.py:3603 pretix/base/pdf.py:1162 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:66 #: pretix/plugins/ticketoutputpdf/ticketoutput.py:114 msgid "Ticket" msgstr "" -#: pretix/base/models/orders.py:3582 +#: pretix/base/models/orders.py:3604 msgid "Certificate" msgstr "" -#: pretix/base/models/orders.py:3583 pretix/control/views/event.py:393 -#: pretix/control/views/event.py:398 pretix/control/views/organizer.py:652 -#: pretix/control/views/organizer.py:657 +#: pretix/base/models/orders.py:3605 pretix/control/views/event.py:402 +#: pretix/control/views/event.py:407 pretix/control/views/organizer.py:653 +#: pretix/control/views/organizer.py:658 msgid "Other" msgstr "" @@ -6382,79 +6517,79 @@ msgstr "" msgid "Organizers" msgstr "" -#: pretix/base/models/organizer.py:363 +#: pretix/base/models/organizer.py:369 #: pretix/control/templates/pretixcontrol/organizers/teams.html:35 msgid "Team name" msgstr "" -#: pretix/base/models/organizer.py:364 +#: pretix/base/models/organizer.py:370 #: pretix/control/templates/pretixcontrol/organizers/team_members.html:13 msgid "Team members" msgstr "" -#: pretix/base/models/organizer.py:366 +#: pretix/base/models/organizer.py:372 msgid "Require all members of this team to use two-factor authentication" msgstr "" -#: pretix/base/models/organizer.py:367 +#: pretix/base/models/organizer.py:373 msgid "" "If you turn this on, all members of the team will be required to either set " "up two-factor authentication or leave the team. The setting may take a few " "minutes to become effective for all users." msgstr "" -#: pretix/base/models/organizer.py:378 +#: pretix/base/models/organizer.py:384 msgid "All event permissions" msgstr "" -#: pretix/base/models/organizer.py:379 -#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:34 +#: pretix/base/models/organizer.py:385 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:47 msgid "Event permissions" msgstr "" -#: pretix/base/models/organizer.py:380 +#: pretix/base/models/organizer.py:386 msgid "All organizer permissions" msgstr "" -#: pretix/base/models/organizer.py:381 -#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:25 +#: pretix/base/models/organizer.py:387 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:26 msgid "Organizer permissions" msgstr "" -#: pretix/base/models/organizer.py:401 +#: pretix/base/models/organizer.py:407 #, python-format msgid "%(name)s on %(object)s" msgstr "" -#: pretix/base/models/organizer.py:487 +#: pretix/base/models/organizer.py:493 #: pretix/control/templates/pretixcontrol/events/create_basics.html:67 msgid "Team" msgstr "" -#: pretix/base/models/organizer.py:488 pretix/base/permissions.py:282 +#: pretix/base/models/organizer.py:494 pretix/base/permissions.py:282 #: pretix/control/navigation.py:566 #: pretix/control/templates/pretixcontrol/organizers/teams.html:6 msgid "Teams" msgstr "" -#: pretix/base/models/organizer.py:508 +#: pretix/base/models/organizer.py:514 #, python-brace-format msgid "Invite to team '{team}' for '{email}'" msgstr "" -#: pretix/base/models/organizer.py:642 +#: pretix/base/models/organizer.py:649 #: pretix/control/templates/pretixcontrol/organizers/channels.html:23 msgid "Identifier" msgstr "" -#: pretix/base/models/organizer.py:652 +#: pretix/base/models/organizer.py:659 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:54 #: pretix/control/templates/pretixcontrol/items/questions.html:24 msgid "Type" msgstr "" #: pretix/base/models/seating.py:46 pretix/base/models/tax.py:306 -#: pretix/base/pdf.py:1319 +#: pretix/base/pdf.py:1341 msgid "Your layout file is not a valid JSON file." msgstr "" @@ -6473,12 +6608,12 @@ msgstr "" msgid "Multiple seats have the same ID: {id}" msgstr "" -#: pretix/base/models/seating.py:200 +#: pretix/base/models/seating.py:203 #, python-brace-format msgid "Row {number}" msgstr "" -#: pretix/base/models/seating.py:205 +#: pretix/base/models/seating.py:208 #, python-brace-format msgid "Seat {number}" msgstr "" @@ -6963,7 +7098,7 @@ msgid "Dates" msgstr "" #: pretix/base/notifications.py:200 -#: pretix/control/templates/pretixcontrol/order/index.html:755 +#: pretix/control/templates/pretixcontrol/order/index.html:790 #: pretix/plugins/reports/accountingreport.py:318 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:446 msgid "Net total" @@ -7319,7 +7454,7 @@ msgstr "" msgid "Offsetting" msgstr "" -#: pretix/base/payment.py:1339 pretix/control/views/orders.py:1262 +#: pretix/base/payment.py:1339 pretix/control/views/orders.py:1266 msgid "You entered an order that could not be found." msgstr "" @@ -7358,7 +7493,7 @@ msgid "Product name" msgstr "" #: pretix/base/pdf.py:124 pretix/base/services/tickets.py:98 -#: pretix/control/views/event.py:938 pretix/control/views/pdf.py:96 +#: pretix/control/views/event.py:942 pretix/control/views/pdf.py:96 msgid "Sample product" msgstr "" @@ -7375,7 +7510,7 @@ msgid "Product description" msgstr "" #: pretix/base/pdf.py:134 pretix/base/services/tickets.py:99 -#: pretix/control/views/event.py:939 pretix/control/views/pdf.py:97 +#: pretix/control/views/event.py:943 pretix/control/views/pdf.py:97 msgid "Sample product description" msgstr "" @@ -7412,11 +7547,11 @@ msgid "Price including add-ons and bundled products" msgstr "" #: pretix/base/pdf.py:184 pretix/base/pdf.py:342 -#: pretix/base/services/invoices.py:594 +#: pretix/base/services/invoices.py:608 #: pretix/base/services/placeholders.py:604 #: pretix/base/services/placeholders.py:689 #: pretix/base/services/placeholders.py:705 -#: pretix/base/services/placeholders.py:714 pretix/control/views/event.py:940 +#: pretix/base/services/placeholders.py:714 pretix/control/views/event.py:944 msgid "John Doe" msgstr "" @@ -7492,9 +7627,9 @@ msgstr "" msgid "Event begin date" msgstr "" -#: pretix/base/pdf.py:264 pretix/base/pdf.py:290 pretix/base/pdf.py:399 -#: pretix/base/pdf.py:423 pretix/base/pdf.py:447 pretix/base/pdf.py:471 -#: pretix/base/pdf.py:534 pretix/base/pdf.py:539 +#: pretix/base/pdf.py:264 pretix/base/pdf.py:290 pretix/base/pdf.py:411 +#: pretix/base/pdf.py:435 pretix/base/pdf.py:459 pretix/base/pdf.py:483 +#: pretix/base/pdf.py:546 pretix/base/pdf.py:551 msgid "2017-05-31" msgstr "" @@ -7511,7 +7646,8 @@ msgid "Event begin weekday" msgstr "" #: pretix/base/pdf.py:277 pretix/base/pdf.py:306 -#: pretix/base/services/checkin.py:362 pretix/control/forms/filter.py:1399 +#: pretix/base/services/checkin.py:362 pretix/control/forms/filter.py:1405 +#: pretix/control/forms/filter.py:1583 msgid "Friday" msgstr "" @@ -7535,8 +7671,8 @@ msgstr "" msgid "Event admission date and time" msgstr "" -#: pretix/base/pdf.py:311 pretix/base/pdf.py:407 pretix/base/pdf.py:431 -#: pretix/base/pdf.py:455 pretix/base/pdf.py:479 pretix/base/pdf.py:528 +#: pretix/base/pdf.py:311 pretix/base/pdf.py:419 pretix/base/pdf.py:443 +#: pretix/base/pdf.py:467 pretix/base/pdf.py:491 pretix/base/pdf.py:540 msgid "2017-05-31 19:00" msgstr "" @@ -7544,8 +7680,8 @@ msgstr "" msgid "Event admission time" msgstr "" -#: pretix/base/pdf.py:319 pretix/base/pdf.py:415 pretix/base/pdf.py:439 -#: pretix/base/pdf.py:463 pretix/base/pdf.py:487 +#: pretix/base/pdf.py:319 pretix/base/pdf.py:427 pretix/base/pdf.py:451 +#: pretix/base/pdf.py:475 pretix/base/pdf.py:499 msgid "19:00" msgstr "" @@ -7553,7 +7689,7 @@ msgstr "" msgid "Event location" msgstr "" -#: pretix/base/pdf.py:327 pretix/base/settings.py:1333 +#: pretix/base/pdf.py:327 pretix/base/settings.py:1348 msgid "Random City" msgstr "" @@ -7565,7 +7701,7 @@ msgstr "" msgid "12345" msgstr "" -#: pretix/base/pdf.py:362 pretix/base/services/invoices.py:597 +#: pretix/base/pdf.py:362 pretix/base/services/invoices.py:611 msgid "Sample city" msgstr "" @@ -7582,182 +7718,194 @@ msgid "Atlantis" msgstr "" #: pretix/base/pdf.py:376 -msgid "List of Add-Ons" +msgid "Invoice custom recipient field" msgstr "" #: pretix/base/pdf.py:377 +msgid "Custom recipient field" +msgstr "" + +#: pretix/base/pdf.py:381 +msgid "List of Add-Ons" +msgstr "" + +#: pretix/base/pdf.py:382 pretix/base/pdf.py:389 msgid "" "Add-on 1\n" "2x Add-on 2" msgstr "" -#: pretix/base/pdf.py:383 pretix/control/forms/filter.py:1537 -#: pretix/control/forms/filter.py:1539 +#: pretix/base/pdf.py:388 +msgid "List of Checked-In Add-Ons" +msgstr "" + +#: pretix/base/pdf.py:395 pretix/control/forms/filter.py:1670 +#: pretix/control/forms/filter.py:1672 #: pretix/control/templates/pretixcontrol/organizers/index.html:42 msgid "Organizer name" msgstr "" -#: pretix/base/pdf.py:384 +#: pretix/base/pdf.py:396 msgid "Event organizer company" msgstr "" -#: pretix/base/pdf.py:388 +#: pretix/base/pdf.py:400 msgid "Organizer info text" msgstr "" -#: pretix/base/pdf.py:389 +#: pretix/base/pdf.py:401 msgid "Event organizer info text" msgstr "" -#: pretix/base/pdf.py:393 pretix/base/pdf.py:394 +#: pretix/base/pdf.py:405 pretix/base/pdf.py:406 msgid "Event info text" msgstr "" -#: pretix/base/pdf.py:398 +#: pretix/base/pdf.py:410 msgid "Printing date" msgstr "" -#: pretix/base/pdf.py:406 +#: pretix/base/pdf.py:418 msgid "Printing date and time" msgstr "" -#: pretix/base/pdf.py:414 +#: pretix/base/pdf.py:426 msgid "Printing time" msgstr "" -#: pretix/base/pdf.py:422 pretix/control/forms/item.py:741 +#: pretix/base/pdf.py:434 pretix/control/forms/item.py:796 msgid "Purchase date" msgstr "" -#: pretix/base/pdf.py:430 +#: pretix/base/pdf.py:442 msgid "Purchase date and time" msgstr "" -#: pretix/base/pdf.py:438 +#: pretix/base/pdf.py:450 msgid "Purchase time" msgstr "" -#: pretix/base/pdf.py:446 +#: pretix/base/pdf.py:458 msgid "Validity start date" msgstr "" -#: pretix/base/pdf.py:454 +#: pretix/base/pdf.py:466 msgid "Validity start date and time" msgstr "" -#: pretix/base/pdf.py:462 +#: pretix/base/pdf.py:474 msgid "Validity start time" msgstr "" -#: pretix/base/pdf.py:470 +#: pretix/base/pdf.py:482 msgid "Validity end date" msgstr "" -#: pretix/base/pdf.py:478 +#: pretix/base/pdf.py:490 msgid "Validity end date and time" msgstr "" -#: pretix/base/pdf.py:486 +#: pretix/base/pdf.py:498 msgid "Validity end time" msgstr "" -#: pretix/base/pdf.py:494 -msgid "Program times: date and time" +#: pretix/base/pdf.py:506 pretix/control/forms/item.py:1386 +msgid "Program times" msgstr "" -#: pretix/base/pdf.py:496 +#: pretix/base/pdf.py:508 msgid "" -"2017-05-31 10:00 – 12:00\n" -"2017-05-31 14:00 – 16:00\n" -"2017-05-31 14:00 – 2017-06-01 14:00" -msgstr "" - -#: pretix/base/pdf.py:500 -msgid "Reusable Medium ID" -msgstr "" - -#: pretix/base/pdf.py:505 -msgid "Seat: Full name" -msgstr "" - -#: pretix/base/pdf.py:506 -msgid "Ground floor, Row 3, Seat 4" -msgstr "" - -#: pretix/base/pdf.py:508 pretix/base/pdf.py:514 -#: pretix/control/forms/orders.py:344 -msgid "General admission" -msgstr "" - -#: pretix/base/pdf.py:511 -msgid "Seat: zone" +"2017-05-31 10:00 – 12:00, Room 1\n" +"2017-05-31 14:00 – 16:00, Room 2\n" +"2017-05-31 14:00 – 2017-06-01 14:00, Building A" msgstr "" #: pretix/base/pdf.py:512 -msgid "Ground floor" +msgid "Reusable Medium ID" msgstr "" #: pretix/base/pdf.py:517 +msgid "Seat: Full name" +msgstr "" + +#: pretix/base/pdf.py:518 +msgid "Ground floor, Row 3, Seat 4" +msgstr "" + +#: pretix/base/pdf.py:520 pretix/base/pdf.py:526 +#: pretix/control/forms/orders.py:348 +msgid "General admission" +msgstr "" + +#: pretix/base/pdf.py:523 +msgid "Seat: zone" +msgstr "" + +#: pretix/base/pdf.py:524 +msgid "Ground floor" +msgstr "" + +#: pretix/base/pdf.py:529 msgid "Seat: row" msgstr "" -#: pretix/base/pdf.py:522 +#: pretix/base/pdf.py:534 msgid "Seat: seat number" msgstr "" -#: pretix/base/pdf.py:527 +#: pretix/base/pdf.py:539 msgid "Date and time of first scan" msgstr "" -#: pretix/base/pdf.py:533 +#: pretix/base/pdf.py:545 msgid "Gift card: Issuance date" msgstr "" -#: pretix/base/pdf.py:538 +#: pretix/base/pdf.py:550 msgid "Gift card: Expiration date" msgstr "" -#: pretix/base/pdf.py:579 pretix/base/pdf.py:617 pretix/base/pdf.py:623 -#: pretix/plugins/badges/exporters.py:504 +#: pretix/base/pdf.py:591 pretix/base/pdf.py:629 pretix/base/pdf.py:635 +#: pretix/plugins/badges/exporters.py:512 #: pretix/plugins/ticketoutputpdf/exporters.py:102 #, python-brace-format msgid "Question: {question}" msgstr "" -#: pretix/base/pdf.py:618 pretix/base/pdf.py:624 +#: pretix/base/pdf.py:630 pretix/base/pdf.py:636 #, python-brace-format msgid "" msgstr "" -#: pretix/base/pdf.py:665 +#: pretix/base/pdf.py:677 msgid "Attendee name for salutation" msgstr "" -#: pretix/base/pdf.py:666 pretix/base/pdf.py:689 +#: pretix/base/pdf.py:678 pretix/base/pdf.py:701 #: pretix/base/services/placeholders.py:732 -#: pretix/control/forms/organizer.py:799 +#: pretix/control/forms/organizer.py:809 msgid "Mr Doe" msgstr "" -#: pretix/base/pdf.py:672 pretix/base/pdf.py:679 -#: pretix/plugins/badges/exporters.py:501 -#: pretix/plugins/checkinlists/exporters.py:125 -#: pretix/plugins/checkinlists/exporters.py:499 +#: pretix/base/pdf.py:684 pretix/base/pdf.py:691 +#: pretix/plugins/badges/exporters.py:509 +#: pretix/plugins/checkinlists/exporters.py:126 +#: pretix/plugins/checkinlists/exporters.py:498 #: pretix/plugins/ticketoutputpdf/exporters.py:99 #, python-brace-format msgid "Attendee name: {part}" msgstr "" -#: pretix/base/pdf.py:688 +#: pretix/base/pdf.py:700 msgid "Invoice address name for salutation" msgstr "" -#: pretix/base/pdf.py:695 +#: pretix/base/pdf.py:707 #, python-brace-format msgid "Invoice address name: {part}" msgstr "" -#: pretix/base/pdf.py:1328 +#: pretix/base/pdf.py:1350 #, python-brace-format msgid "Your layout file is not a valid layout. Error message: {}" msgstr "" @@ -7939,24 +8087,24 @@ msgstr "" msgid "Outgoing emails" msgstr "" -#: pretix/base/plugins.py:138 +#: pretix/base/plugins.py:143 #: pretix/control/templates/pretixcontrol/event/quick_setup.html:132 msgid "Features" msgstr "" -#: pretix/base/plugins.py:140 +#: pretix/base/plugins.py:145 msgid "Integrations" msgstr "" -#: pretix/base/plugins.py:141 +#: pretix/base/plugins.py:146 msgid "Customizations" msgstr "" -#: pretix/base/plugins.py:142 +#: pretix/base/plugins.py:147 msgid "Output and export formats" msgstr "" -#: pretix/base/plugins.py:143 +#: pretix/base/plugins.py:148 msgid "API features" msgstr "" @@ -8088,7 +8236,7 @@ msgid_plural "You cannot select more than %s items per order." msgstr[0] "" msgstr[1] "" -#: pretix/base/services/cart.py:138 pretix/base/services/orders.py:1602 +#: pretix/base/services/cart.py:138 pretix/base/services/orders.py:1603 #, python-format msgid "You cannot select more than %(max)s item of the product %(product)s." msgid_plural "" @@ -8096,7 +8244,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: pretix/base/services/cart.py:143 pretix/base/services/orders.py:1607 +#: pretix/base/services/cart.py:143 pretix/base/services/orders.py:1608 #, python-format msgid "You need to select at least %(min)s item of the product %(product)s." msgid_plural "" @@ -8117,7 +8265,7 @@ msgstr[1] "" #: pretix/base/services/cart.py:152 pretix/base/services/orders.py:164 #: pretix/presale/templates/pretixpresale/event/index.html:170 -#: pretix/presale/views/waiting.py:145 pretix/presale/views/widget.py:813 +#: pretix/presale/views/waiting.py:150 pretix/presale/views/widget.py:846 msgid "The booking period for this event has not yet started." msgstr "" @@ -8155,11 +8303,11 @@ msgstr "" msgid "This voucher code is not known in our database." msgstr "" -#: pretix/base/services/cart.py:165 pretix/base/services/orders.py:167 +#: pretix/base/services/cart.py:165 #, python-format msgid "" "The voucher code \"%(voucher)s\" can only be used if you select at least " -"%(number)s matching products." +"%(number)s matching product." msgid_plural "" "The voucher code \"%(voucher)s\" can only be used if you select at least " "%(number)s matching products." @@ -8170,7 +8318,7 @@ msgstr[1] "" #, python-format msgid "" "The voucher code \"%(voucher)s\" can only be used if you select at least " -"%(number)s matching products. We have therefore removed some positions from " +"%(number)s matching product. We have therefore removed some positions from " "your cart that can no longer be purchased like this." msgid_plural "" "The voucher code \"%(voucher)s\" can only be used if you select at least " @@ -8393,27 +8541,33 @@ msgstr "" msgid "week day" msgstr "" -#: pretix/base/services/checkin.py:358 pretix/control/forms/filter.py:1395 +#: pretix/base/services/checkin.py:358 pretix/control/forms/filter.py:1401 +#: pretix/control/forms/filter.py:1579 msgid "Monday" msgstr "" -#: pretix/base/services/checkin.py:359 pretix/control/forms/filter.py:1396 +#: pretix/base/services/checkin.py:359 pretix/control/forms/filter.py:1402 +#: pretix/control/forms/filter.py:1580 msgid "Tuesday" msgstr "" -#: pretix/base/services/checkin.py:360 pretix/control/forms/filter.py:1397 +#: pretix/base/services/checkin.py:360 pretix/control/forms/filter.py:1403 +#: pretix/control/forms/filter.py:1581 msgid "Wednesday" msgstr "" -#: pretix/base/services/checkin.py:361 pretix/control/forms/filter.py:1398 +#: pretix/base/services/checkin.py:361 pretix/control/forms/filter.py:1404 +#: pretix/control/forms/filter.py:1582 msgid "Thursday" msgstr "" -#: pretix/base/services/checkin.py:363 pretix/control/forms/filter.py:1400 +#: pretix/base/services/checkin.py:363 pretix/control/forms/filter.py:1406 +#: pretix/control/forms/filter.py:1584 msgid "Saturday" msgstr "" -#: pretix/base/services/checkin.py:364 pretix/control/forms/filter.py:1401 +#: pretix/base/services/checkin.py:364 pretix/control/forms/filter.py:1407 +#: pretix/control/forms/filter.py:1585 msgid "Sunday" msgstr "" @@ -8437,54 +8591,64 @@ msgstr "" msgid "{variable} is {value}" msgstr "" -#: pretix/base/services/checkin.py:972 +#: pretix/base/services/checkin.py:982 msgid "This order position has been canceled." msgstr "" -#: pretix/base/services/checkin.py:981 +#: pretix/base/services/checkin.py:991 msgid "This ticket has been blocked." msgstr "" -#: pretix/base/services/checkin.py:990 +#: pretix/base/services/checkin.py:1000 msgid "This order is not yet approved." msgstr "" -#: pretix/base/services/checkin.py:999 pretix/base/services/checkin.py:1003 +#: pretix/base/services/checkin.py:1009 pretix/base/services/checkin.py:1013 #, python-brace-format msgid "This ticket is only valid after {datetime}." msgstr "" -#: pretix/base/services/checkin.py:1013 pretix/base/services/checkin.py:1017 +#: pretix/base/services/checkin.py:1023 pretix/base/services/checkin.py:1027 #, python-brace-format msgid "This ticket was only valid before {datetime}." msgstr "" -#: pretix/base/services/checkin.py:1048 +#: pretix/base/services/checkin.py:1058 msgid "This order position has an invalid product for this check-in list." msgstr "" -#: pretix/base/services/checkin.py:1057 +#: pretix/base/services/checkin.py:1067 msgid "This order position has an invalid date for this check-in list." msgstr "" -#: pretix/base/services/checkin.py:1068 +#: pretix/base/services/checkin.py:1078 msgid "This order is not marked as paid." msgstr "" -#: pretix/base/services/checkin.py:1080 +#: pretix/base/services/checkin.py:1090 msgid "Evaluation of custom rules has failed." msgstr "" -#: pretix/base/services/checkin.py:1090 +#: pretix/base/services/checkin.py:1100 #, python-brace-format msgid "Entry not permitted: {explanation}." msgstr "" -#: pretix/base/services/checkin.py:1099 +#: pretix/base/services/checkin.py:1109 msgid "You need to answer questions to complete this check-in." msgstr "" -#: pretix/base/services/checkin.py:1152 +#: pretix/base/services/checkin.py:1121 +msgid "Ticket needs to be exchanged to a suitable medium." +msgstr "" + +#: pretix/base/services/checkin.py:1128 +msgid "" +"This ticket has already been exchanged for a reusable medium that now needs " +"to be used instead." +msgstr "" + +#: pretix/base/services/checkin.py:1180 msgid "This ticket has already been redeemed." msgstr "" @@ -8496,36 +8660,40 @@ msgstr "" msgid "Czech National Bank" msgstr "" -#: pretix/base/services/export.py:94 pretix/base/services/export.py:154 +#: pretix/base/services/currencies.py:41 +msgid "National Bank of Poland" +msgstr "" + +#: pretix/base/services/export.py:95 pretix/base/services/export.py:155 msgid "" "Export not found or you do not have sufficient permission to perform this " "export." msgstr "" -#: pretix/base/services/export.py:107 pretix/base/services/export.py:179 -#: pretix/base/services/export.py:357 +#: pretix/base/services/export.py:108 pretix/base/services/export.py:180 +#: pretix/base/services/export.py:373 msgid "Your export did not contain any data." msgstr "" -#: pretix/base/services/export.py:327 +#: pretix/base/services/export.py:343 msgid "Export failed" msgstr "" -#: pretix/base/services/export.py:344 +#: pretix/base/services/export.py:360 msgid "Permission denied." msgstr "" -#: pretix/base/services/export.py:363 +#: pretix/base/services/export.py:379 msgid "Your exported data exceeded the size limit for scheduled exports." msgstr "" -#: pretix/base/services/invoices.py:117 +#: pretix/base/services/invoices.py:118 #, python-brace-format msgctxt "invoice" msgid "Please complete your payment before {expire_date}." msgstr "" -#: pretix/base/services/invoices.py:129 +#: pretix/base/services/invoices.py:130 #, python-brace-format msgctxt "invoice" msgid "" @@ -8536,51 +8704,51 @@ msgid "" "{country}" msgstr "" -#: pretix/base/services/invoices.py:239 pretix/base/services/invoices.py:282 +#: pretix/base/services/invoices.py:253 pretix/base/services/invoices.py:296 #, python-brace-format msgctxt "invoice" msgid "Event location: {location}" msgstr "" -#: pretix/base/services/invoices.py:255 +#: pretix/base/services/invoices.py:269 #, python-brace-format msgctxt "invoice" msgid "Attendee: {name}" msgstr "" -#: pretix/base/services/invoices.py:279 pretix/plugins/reports/exporters.py:308 +#: pretix/base/services/invoices.py:293 pretix/plugins/reports/exporters.py:308 #, python-brace-format msgctxt "subevent" msgid "Date: {}" msgstr "" -#: pretix/base/services/invoices.py:587 +#: pretix/base/services/invoices.py:601 msgid "A payment provider specific text might appear here." msgstr "" -#: pretix/base/services/invoices.py:595 +#: pretix/base/services/invoices.py:609 msgid "214th Example Street" msgstr "" -#: pretix/base/services/invoices.py:596 +#: pretix/base/services/invoices.py:610 msgid "012345" msgstr "" -#: pretix/base/services/invoices.py:613 +#: pretix/base/services/invoices.py:627 #, python-brace-format msgid "Sample product {}" msgstr "" -#: pretix/base/services/invoices.py:623 +#: pretix/base/services/invoices.py:637 msgid "Sample product A" msgstr "" -#: pretix/base/services/invoices.py:683 +#: pretix/base/services/invoices.py:697 #, python-brace-format msgid "New invoice: {number}" msgstr "" -#: pretix/base/services/invoices.py:685 +#: pretix/base/services/invoices.py:699 #, python-brace-format msgid "" "Hello,\n" @@ -8619,6 +8787,48 @@ msgstr "" msgid "You are receiving this email because you placed an order for {event}." msgstr "" +#: pretix/base/services/media.py:93 pretix/base/services/media.py:95 +msgid "Invalid medium type." +msgstr "" + +#: pretix/base/services/media.py:100 pretix/base/services/media.py:102 +msgid "Medium type is not enabled for organizer." +msgstr "" + +#: pretix/base/services/media.py:107 pretix/base/services/media.py:109 +msgid "Incorrect medium type for product." +msgstr "" + +#: pretix/base/services/media.py:114 pretix/base/services/media.py:116 +msgid "Ticket is already exchanged for reusable medium." +msgstr "" + +#: pretix/base/services/media.py:133 pretix/base/services/media.py:135 +msgid "Reusable medium not found." +msgstr "" + +#: pretix/base/services/media.py:140 pretix/base/services/media.py:142 +#: pretix/base/services/media.py:168 pretix/base/services/media.py:170 +msgid "Reusable medium is inactive or expired." +msgstr "" + +#: pretix/base/services/media.py:155 pretix/base/services/media.py:162 +#: pretix/base/services/media.py:176 +msgid "Reusable medium not found and could not be created." +msgstr "" + +#: pretix/base/services/media.py:183 +msgid "Reusable medium already exists." +msgstr "" + +#: pretix/base/services/media.py:189 +msgid "Reusable medium could not be created." +msgstr "" + +#: pretix/base/services/media.py:195 pretix/base/services/media.py:197 +msgid "Product does not support medium exchange." +msgstr "" + #: pretix/base/services/memberships.py:108 #, python-brace-format msgid "" @@ -8721,7 +8931,7 @@ msgid "" msgstr "" #: pretix/base/services/modelimport.py:92 -#: pretix/base/services/modelimport.py:140 pretix/base/services/orders.py:1611 +#: pretix/base/services/modelimport.py:140 pretix/base/services/orders.py:1612 #, python-format msgid "Orders cannot have more than %(max)s positions." msgstr "" @@ -8797,6 +9007,17 @@ msgstr[1] "" msgid "The booking period has ended." msgstr "" +#: pretix/base/services/orders.py:167 +#, python-format +msgid "" +"The voucher code \"%(voucher)s\" can only be used if you select at least " +"%(number)s matching products." +msgid_plural "" +"The voucher code \"%(voucher)s\" can only be used if you select at least " +"%(number)s matching products." +msgstr[0] "" +msgstr[1] "" + #: pretix/base/services/orders.py:171 msgid "" "The voucher code used for one of the items in your cart is not known in our " @@ -8884,96 +9105,96 @@ msgid "" "The cancellation fee cannot be higher than the total amount of this order." msgstr "" -#: pretix/base/services/orders.py:1017 +#: pretix/base/services/orders.py:1018 msgid "The selected payment methods do not cover the total balance." msgstr "" -#: pretix/base/services/orders.py:1083 +#: pretix/base/services/orders.py:1084 msgid "" "While trying to place your order, we noticed that the order total has " "changed. Either one of the prices changed just now, or a gift card you used " "has been used in the meantime. Please check the prices below and try again." msgstr "" -#: pretix/base/services/orders.py:1581 +#: pretix/base/services/orders.py:1582 msgid "You need to select a variation of the product." msgstr "" -#: pretix/base/services/orders.py:1582 +#: pretix/base/services/orders.py:1583 #, python-brace-format msgid "" "The quota {name} does not have enough capacity left to perform the operation." msgstr "" -#: pretix/base/services/orders.py:1583 +#: pretix/base/services/orders.py:1584 msgid "There is no quota defined that allows this operation." msgstr "" -#: pretix/base/services/orders.py:1584 +#: pretix/base/services/orders.py:1585 msgid "The selected product is not active or has no price set." msgstr "" -#: pretix/base/services/orders.py:1585 +#: pretix/base/services/orders.py:1586 msgid "" "This operation would leave the order empty. Please cancel the order itself " "instead." msgstr "" -#: pretix/base/services/orders.py:1587 +#: pretix/base/services/orders.py:1588 msgid "" "This operation would make the order free and therefore immediately paid, " "however no quota is available." msgstr "" -#: pretix/base/services/orders.py:1590 +#: pretix/base/services/orders.py:1591 msgid "" "This is an add-on product, please select the base position it should be " "added to." msgstr "" -#: pretix/base/services/orders.py:1591 +#: pretix/base/services/orders.py:1592 msgid "" "The selected base position does not allow you to add this product as an add-" "on." msgstr "" -#: pretix/base/services/orders.py:1592 +#: pretix/base/services/orders.py:1593 msgid "You need to choose a subevent for the new position." msgstr "" -#: pretix/base/services/orders.py:1595 +#: pretix/base/services/orders.py:1596 #, python-brace-format msgid "" "You selected seat \"{seat}\" for a date that does not match the selected " "ticket date. Please choose a seat again." msgstr "" -#: pretix/base/services/orders.py:1597 +#: pretix/base/services/orders.py:1598 msgid "The selected product requires you to select a seat." msgstr "" -#: pretix/base/services/orders.py:1598 +#: pretix/base/services/orders.py:1599 msgid "The selected product does not allow to select a seat." msgstr "" -#: pretix/base/services/orders.py:1599 +#: pretix/base/services/orders.py:1600 msgid "The selected country is blocked by your tax rule." msgstr "" -#: pretix/base/services/orders.py:1600 +#: pretix/base/services/orders.py:1601 msgid "" "You cannot change the price of a position that has been used to issue a gift " "card." msgstr "" -#: pretix/base/services/orders.py:2450 pretix/base/services/orders.py:2477 +#: pretix/base/services/orders.py:2463 pretix/base/services/orders.py:2490 #, python-brace-format msgid "" "A position can not be canceled since the gift card {card} purchased in this " "order has already been redeemed." msgstr "" -#: pretix/base/services/orders.py:3253 +#: pretix/base/services/orders.py:3273 msgid "" "There was an error while trying to send the money back to you. Please " "contact the event organizer for further information." @@ -9185,60 +9406,71 @@ msgid "" msgstr "" #: pretix/base/settings.py:214 -msgid "Activate re-usable media" +msgid "Activate reusable media" msgstr "" #: pretix/base/settings.py:215 msgid "" -"The re-usable media feature allows you to connect tickets and gift cards " -"with physical media such as wristbands or chip cards that may be re-used for " +"The reusable media feature allows you to connect tickets and gift cards with " +"physical media such as wristbands or chip cards that may be reused for " "different tickets or gift cards later." msgstr "" -#: pretix/base/settings.py:241 +#: pretix/base/settings.py:226 +msgid "Enforce the usage of issued reusable media for check-in" +msgstr "" + +#: pretix/base/settings.py:227 +msgid "" +"If enabled, a ticket barcode will not be accepted anymore, if a reusable " +"medium has been created and linked to a ticket. Keeping this option turned " +"off will treat the reusable medium and ticket as equals." +msgstr "" + +#: pretix/base/settings.py:254 msgid "Length of barcodes" msgstr "" -#: pretix/base/settings.py:270 +#: pretix/base/settings.py:283 msgid "" "Automatically create a new gift card if a previously unknown chip is seen" msgstr "" -#: pretix/base/settings.py:283 pretix/base/settings.py:314 +#: pretix/base/settings.py:296 pretix/base/settings.py:327 msgid "Gift card currency" msgstr "" -#: pretix/base/settings.py:301 +#: pretix/base/settings.py:314 msgid "Automatically create a new gift card if a new chip is encoded" msgstr "" -#: pretix/base/settings.py:323 +#: pretix/base/settings.py:336 msgid "Use UID protection feature of NFC chip" msgstr "" -#: pretix/base/settings.py:339 +#: pretix/base/settings.py:352 msgid "Maximum number of items per order" msgstr "" -#: pretix/base/settings.py:340 +#: pretix/base/settings.py:353 msgid "Add-on products will not be counted." msgstr "" -#: pretix/base/settings.py:350 +#: pretix/base/settings.py:363 msgid "Show net prices instead of gross prices in the product list" msgstr "" -#: pretix/base/settings.py:351 +#: pretix/base/settings.py:364 msgid "" "Independent of your choice, the cart will show gross prices as this is the " "price that needs to be paid." msgstr "" -#: pretix/base/settings.py:362 +#: pretix/base/settings.py:375 msgid "Hide prices on attendee ticket page" msgstr "" -#: pretix/base/settings.py:363 +#: pretix/base/settings.py:376 msgid "" "If a person buys multiple tickets and you send emails to all of the " "attendees, with this option the ticket price will not be shown on the ticket " @@ -9246,27 +9478,27 @@ msgid "" "price." msgstr "" -#: pretix/base/settings.py:381 +#: pretix/base/settings.py:394 msgid "Ask for attendee names" msgstr "" -#: pretix/base/settings.py:382 +#: pretix/base/settings.py:395 msgid "Ask for a name for all personalized tickets." msgstr "" -#: pretix/base/settings.py:391 +#: pretix/base/settings.py:404 msgid "Require attendee names" msgstr "" -#: pretix/base/settings.py:392 +#: pretix/base/settings.py:405 msgid "Require customers to fill in the names of all attendees." msgstr "" -#: pretix/base/settings.py:402 +#: pretix/base/settings.py:415 msgid "Ask for email addresses per ticket" msgstr "" -#: pretix/base/settings.py:403 +#: pretix/base/settings.py:416 msgid "" "Normally, pretix asks for one email address per order and the order " "confirmation will be sent only to that email address. If you enable this " @@ -9278,130 +9510,136 @@ msgid "" "enable this in the email settings." msgstr "" -#: pretix/base/settings.py:417 +#: pretix/base/settings.py:430 msgid "Require email addresses per ticket" msgstr "" -#: pretix/base/settings.py:418 +#: pretix/base/settings.py:431 msgid "" "Require customers to fill in individual email addresses for all personalized " "tickets. See the above option for more details. One email address for the " "order confirmation will always be required regardless of this setting." msgstr "" -#: pretix/base/settings.py:430 +#: pretix/base/settings.py:443 msgid "Ask for company per ticket" msgstr "" -#: pretix/base/settings.py:439 +#: pretix/base/settings.py:452 msgid "Require company per ticket" msgstr "" -#: pretix/base/settings.py:449 +#: pretix/base/settings.py:462 msgid "Ask for postal addresses per ticket" msgstr "" -#: pretix/base/settings.py:458 +#: pretix/base/settings.py:471 msgid "Require postal addresses per ticket" msgstr "" -#: pretix/base/settings.py:468 +#: pretix/base/settings.py:481 msgid "Ask for the order email address twice" msgstr "" -#: pretix/base/settings.py:469 +#: pretix/base/settings.py:482 msgid "" "Require customers to fill in the primary email address twice to avoid errors." msgstr "" -#: pretix/base/settings.py:478 +#: pretix/base/settings.py:491 msgid "Ask for a phone number per order" msgstr "" -#: pretix/base/settings.py:487 +#: pretix/base/settings.py:500 msgid "Require a phone number per order" msgstr "" -#: pretix/base/settings.py:498 +#: pretix/base/settings.py:511 msgid "Rounding of taxes" msgstr "" -#: pretix/base/settings.py:502 +#: pretix/base/settings.py:515 msgid "" "Note that if you transfer your sales data from pretix to an external system " "for tax reporting, you need to make sure to account for possible rounding " "differences if your external system rounds differently than pretix." msgstr "" -#: pretix/base/settings.py:518 +#: pretix/base/settings.py:531 msgid "Ask for invoice address" msgstr "" -#: pretix/base/settings.py:528 +#: pretix/base/settings.py:541 msgid "Do not ask for invoice address if an order is free" msgstr "" -#: pretix/base/settings.py:538 +#: pretix/base/settings.py:551 msgid "Require customer name" msgstr "" -#: pretix/base/settings.py:548 +#: pretix/base/settings.py:561 msgid "Show attendee names on invoices" msgstr "" -#: pretix/base/settings.py:558 +#: pretix/base/settings.py:571 msgid "Show event location on invoices" msgstr "" -#: pretix/base/settings.py:559 +#: pretix/base/settings.py:572 msgid "" "The event location will be shown below the list of products if it is the " "same for all lines. It will be shown on every line if there are different " "locations." msgstr "" -#: pretix/base/settings.py:570 +#: pretix/base/settings.py:583 msgid "Show exchange rates" msgstr "" -#: pretix/base/settings.py:573 pretix/base/settings.py:581 -#: pretix/control/forms/item.py:629 +#: pretix/base/settings.py:586 pretix/base/settings.py:595 +#: pretix/control/forms/item.py:684 msgid "Never" msgstr "" -#: pretix/base/settings.py:574 pretix/base/settings.py:582 +#: pretix/base/settings.py:587 pretix/base/settings.py:596 msgid "" "Based on European Central Bank daily rates, whenever the invoice recipient " "is in an EU country that uses a different currency." msgstr "" -#: pretix/base/settings.py:576 pretix/base/settings.py:584 +#: pretix/base/settings.py:589 pretix/base/settings.py:598 msgid "" "Based on Czech National Bank daily rates, whenever the invoice amount is not " "in CZK." msgstr "" -#: pretix/base/settings.py:595 +#: pretix/base/settings.py:590 pretix/base/settings.py:599 +msgid "" +"Based on National Bank of Poland daily rates, whenever the invoice amount is " +"not in PLN." +msgstr "" + +#: pretix/base/settings.py:610 msgid "Require invoice address" msgstr "" -#: pretix/base/settings.py:606 +#: pretix/base/settings.py:621 msgid "Require a business address" msgstr "" -#: pretix/base/settings.py:607 +#: pretix/base/settings.py:622 msgid "This will require users to enter a company name." msgstr "" -#: pretix/base/settings.py:618 +#: pretix/base/settings.py:633 msgid "Ask for beneficiary" msgstr "" -#: pretix/base/settings.py:629 +#: pretix/base/settings.py:644 msgid "Custom recipient field label" msgstr "" -#: pretix/base/settings.py:631 +#: pretix/base/settings.py:646 msgid "" "If you want to add a custom text field, e.g. for a country-specific " "registration number, to your invoice address form, please fill in the label " @@ -9410,100 +9648,100 @@ msgid "" "on the invoice below the headline. The field will not be required." msgstr "" -#: pretix/base/settings.py:645 +#: pretix/base/settings.py:660 msgid "Custom recipient field help text" msgstr "" -#: pretix/base/settings.py:647 +#: pretix/base/settings.py:662 msgid "" "If you use the custom recipient field, you can specify a help text which " "will be displayed underneath the field. It will not be displayed on the " "invoice." msgstr "" -#: pretix/base/settings.py:658 +#: pretix/base/settings.py:673 msgid "Ask for VAT ID" msgstr "" -#: pretix/base/settings.py:660 +#: pretix/base/settings.py:675 #, python-brace-format msgid "" "Only works if an invoice address is asked for. VAT ID is only requested from " "business customers in the following countries: {countries}." msgstr "" -#: pretix/base/settings.py:680 +#: pretix/base/settings.py:695 msgid "Require VAT ID in" msgstr "" -#: pretix/base/settings.py:686 +#: pretix/base/settings.py:701 msgid "" "VAT ID is optional by default, because not all businesses are assigned a VAT " "ID in all countries. VAT ID will be required for all business addresses in " "the selected countries." msgstr "" -#: pretix/base/settings.py:702 +#: pretix/base/settings.py:717 msgid "Invoice address explanation" msgstr "" -#: pretix/base/settings.py:705 +#: pretix/base/settings.py:720 msgid "This text will be shown above the invoice address form during checkout." msgstr "" -#: pretix/base/settings.py:715 +#: pretix/base/settings.py:730 msgid "Show paid amount on partially paid invoices" msgstr "" -#: pretix/base/settings.py:716 +#: pretix/base/settings.py:731 msgid "" "If an invoice has already been paid partially, this option will add the paid " "and pending amount to the invoice." msgstr "" -#: pretix/base/settings.py:727 +#: pretix/base/settings.py:742 msgid "Show free products on invoices" msgstr "" -#: pretix/base/settings.py:728 +#: pretix/base/settings.py:743 msgid "" "Note that invoices will never be generated for orders that contain only free " "products." msgstr "" -#: pretix/base/settings.py:739 +#: pretix/base/settings.py:754 msgid "Show expiration date of order" msgstr "" -#: pretix/base/settings.py:740 +#: pretix/base/settings.py:755 msgid "" "The expiration date will not be shown if the invoice is generated after the " "order is paid." msgstr "" -#: pretix/base/settings.py:751 +#: pretix/base/settings.py:766 msgid "Minimum length of invoice number after prefix" msgstr "" -#: pretix/base/settings.py:752 +#: pretix/base/settings.py:767 msgid "" "The part of your invoice number after your prefix will be filled up with " "leading zeros up to this length, e.g. INV-001 or INV-00001." msgstr "" -#: pretix/base/settings.py:765 +#: pretix/base/settings.py:780 msgid "Generate invoices with consecutive numbers" msgstr "" -#: pretix/base/settings.py:766 +#: pretix/base/settings.py:781 msgid "If deactivated, the order code will be used in the invoice number." msgstr "" -#: pretix/base/settings.py:776 +#: pretix/base/settings.py:791 msgid "Invoice number prefix" msgstr "" -#: pretix/base/settings.py:777 +#: pretix/base/settings.py:792 msgid "" "This will be prepended to invoice numbers. If you leave this field empty, " "your event slug will be used followed by a dash. Attention: If multiple " @@ -9514,97 +9752,97 @@ msgid "" "invoice, or %m and %d for the day of month." msgstr "" -#: pretix/base/settings.py:789 pretix/base/settings.py:813 +#: pretix/base/settings.py:804 pretix/base/settings.py:828 #, python-brace-format msgid "Please only use the characters {allowed} in this field." msgstr "" -#: pretix/base/settings.py:804 +#: pretix/base/settings.py:819 msgid "Invoice number prefix for cancellations" msgstr "" -#: pretix/base/settings.py:805 +#: pretix/base/settings.py:820 msgid "" "This will be prepended to invoice numbers of cancellations. If you leave " "this field empty, the same numbering scheme will be used that you configured " "for regular invoices." msgstr "" -#: pretix/base/settings.py:828 +#: pretix/base/settings.py:843 msgid "Highlight order code to make it stand out visibly" msgstr "" -#: pretix/base/settings.py:829 pretix/base/settings.py:841 +#: pretix/base/settings.py:844 pretix/base/settings.py:856 msgid "Only respected by some invoice renderers." msgstr "" -#: pretix/base/settings.py:840 pretix/base/settings.py:3174 -#: pretix/control/templates/pretixcontrol/pdf/index.html:441 +#: pretix/base/settings.py:855 pretix/base/settings.py:3189 +#: pretix/control/templates/pretixcontrol/pdf/index.html:439 msgid "Font" msgstr "" -#: pretix/base/settings.py:867 +#: pretix/base/settings.py:882 msgid "Length of ticket codes" msgstr "" -#: pretix/base/settings.py:894 +#: pretix/base/settings.py:909 msgid "Reservation period" msgstr "" -#: pretix/base/settings.py:896 +#: pretix/base/settings.py:911 msgid "" "The number of minutes the items in a user's cart are reserved for this user." msgstr "" -#: pretix/base/settings.py:905 +#: pretix/base/settings.py:920 msgid "" "Directly redirect to check-out after a product has been added to the cart." msgstr "" -#: pretix/base/settings.py:914 +#: pretix/base/settings.py:929 msgid "End of presale text" msgstr "" -#: pretix/base/settings.py:917 +#: pretix/base/settings.py:932 msgid "" "This text will be shown above the ticket shop once the designated sales " "timeframe for this event is over. You can use it to describe other options " "to get a ticket, such as a box office." msgstr "" -#: pretix/base/settings.py:932 +#: pretix/base/settings.py:947 msgid "Guidance text" msgstr "" -#: pretix/base/settings.py:933 +#: pretix/base/settings.py:948 msgid "" "This text will be shown above the payment options. You can explain the " "choices to the user here, if you want." msgstr "" -#: pretix/base/settings.py:944 pretix/base/settings.py:954 +#: pretix/base/settings.py:959 pretix/base/settings.py:969 msgid "in days" msgstr "" -#: pretix/base/settings.py:945 pretix/base/settings.py:955 +#: pretix/base/settings.py:960 pretix/base/settings.py:970 msgid "in minutes" msgstr "" -#: pretix/base/settings.py:950 +#: pretix/base/settings.py:965 msgid "Set payment term" msgstr "" -#: pretix/base/settings.py:957 +#: pretix/base/settings.py:972 msgid "" "If using days, the order will expire at the end of the last day. Using " "minutes is more exact, but should only be used for real-time payment methods." msgstr "" -#: pretix/base/settings.py:968 +#: pretix/base/settings.py:983 msgid "Payment term in days" msgstr "" -#: pretix/base/settings.py:975 +#: pretix/base/settings.py:990 msgid "" "The number of days after placing an order the user has to pay to preserve " "their reservation. If you use slow payment methods like bank transfer, we " @@ -9612,11 +9850,11 @@ msgid "" "still setting two or three days to allow people to retry failed payments." msgstr "" -#: pretix/base/settings.py:994 +#: pretix/base/settings.py:1009 msgid "Only end payment terms on weekdays" msgstr "" -#: pretix/base/settings.py:995 +#: pretix/base/settings.py:1010 msgid "" "If this is activated and the payment term of any order ends on a Saturday or " "Sunday, it will be moved to the next Monday instead. This is required in " @@ -9624,11 +9862,11 @@ msgid "" "configured below." msgstr "" -#: pretix/base/settings.py:1012 +#: pretix/base/settings.py:1027 msgid "Payment term in minutes" msgstr "" -#: pretix/base/settings.py:1013 +#: pretix/base/settings.py:1028 msgid "" "The number of minutes after placing an order the user has to pay to preserve " "their reservation. Only use this if you exclusively offer real-time payment " @@ -9636,33 +9874,33 @@ msgid "" "be a few minutes longer before the order is marked as expired." msgstr "" -#: pretix/base/settings.py:1037 +#: pretix/base/settings.py:1052 msgid "Last date of payments" msgstr "" -#: pretix/base/settings.py:1038 +#: pretix/base/settings.py:1053 msgid "" "The last date any payments are accepted. This has precedence over the terms " "configured above. If you use the event series feature and an order contains " "tickets for multiple dates, the earliest date will be used." msgstr "" -#: pretix/base/settings.py:1050 +#: pretix/base/settings.py:1065 msgid "Automatically expire unpaid orders" msgstr "" -#: pretix/base/settings.py:1051 +#: pretix/base/settings.py:1066 msgid "" "If checked, all unpaid orders will automatically go from 'pending' to " "'expired' after the end of their payment deadline. This means that those " "tickets go back to the pool and can be ordered by other people." msgstr "" -#: pretix/base/settings.py:1063 +#: pretix/base/settings.py:1078 msgid "Expiration delay" msgstr "" -#: pretix/base/settings.py:1064 +#: pretix/base/settings.py:1079 msgid "" "The order will only actually expire this many days after the expiration date " "communicated to the customer. If you select \"Only end payment terms on " @@ -9671,18 +9909,18 @@ msgid "" "enforced." msgstr "" -#: pretix/base/settings.py:1086 +#: pretix/base/settings.py:1101 msgid "Hide \"payment pending\" state on customer-facing pages" msgstr "" -#: pretix/base/settings.py:1087 +#: pretix/base/settings.py:1102 msgid "" "The payment instructions panel will still be shown to the primary customer, " "but no indication of missing payment will be visible on the ticket pages of " "attendees who did not buy the ticket themselves." msgstr "" -#: pretix/base/settings.py:1105 +#: pretix/base/settings.py:1120 msgid "" "If you have a gift card, please enter the gift card code here. If the gift " "card does not have enough credit to pay for the full order, you will be " @@ -9690,204 +9928,204 @@ msgid "" "a different payment method for the difference." msgstr "" -#: pretix/base/settings.py:1124 +#: pretix/base/settings.py:1139 msgid "Accept late payments" msgstr "" -#: pretix/base/settings.py:1125 +#: pretix/base/settings.py:1140 msgid "" "Accept payments for orders even when they are in 'expired' state as long as " "enough capacity is available. No payments will ever be accepted after the " "'Last date of payments' configured above." msgstr "" -#: pretix/base/settings.py:1136 +#: pretix/base/settings.py:1151 msgid "Show start date" msgstr "" -#: pretix/base/settings.py:1137 +#: pretix/base/settings.py:1152 msgid "Show the presale start date before presale has started." msgstr "" -#: pretix/base/settings.py:1148 pretix/base/settings.py:1157 -#: pretix/base/settings.py:1171 pretix/base/settings.py:1180 +#: pretix/base/settings.py:1163 pretix/base/settings.py:1172 +#: pretix/base/settings.py:1186 pretix/base/settings.py:1195 msgid "Use default tax rate" msgstr "" -#: pretix/base/settings.py:1149 pretix/base/settings.py:1158 -#: pretix/base/settings.py:1169 pretix/base/settings.py:1178 +#: pretix/base/settings.py:1164 pretix/base/settings.py:1173 +#: pretix/base/settings.py:1184 pretix/base/settings.py:1193 msgid "Charge no taxes" msgstr "" -#: pretix/base/settings.py:1154 +#: pretix/base/settings.py:1169 msgid "Tax handling on payment fees" msgstr "" -#: pretix/base/settings.py:1170 pretix/base/settings.py:1179 +#: pretix/base/settings.py:1185 pretix/base/settings.py:1194 msgid "Use same taxes as order positions (split according to net prices)" msgstr "" -#: pretix/base/settings.py:1175 +#: pretix/base/settings.py:1190 msgid "Tax handling on cancellation fees" msgstr "" -#: pretix/base/settings.py:1191 pretix/base/settings.py:1204 +#: pretix/base/settings.py:1206 pretix/base/settings.py:1219 msgid "Do not generate invoices" msgstr "" -#: pretix/base/settings.py:1192 pretix/base/settings.py:1209 +#: pretix/base/settings.py:1207 pretix/base/settings.py:1224 msgid "Only manually in admin panel" msgstr "" -#: pretix/base/settings.py:1193 pretix/base/settings.py:1207 +#: pretix/base/settings.py:1208 pretix/base/settings.py:1222 msgid "Automatically on user request" msgstr "" -#: pretix/base/settings.py:1194 pretix/base/settings.py:1208 +#: pretix/base/settings.py:1209 pretix/base/settings.py:1223 msgid "Automatically on user request for paid orders" msgstr "" -#: pretix/base/settings.py:1195 +#: pretix/base/settings.py:1210 msgid "Automatically for all created orders" msgstr "" -#: pretix/base/settings.py:1196 +#: pretix/base/settings.py:1211 msgid "Automatically on payment or when required by payment method" msgstr "" -#: pretix/base/settings.py:1201 +#: pretix/base/settings.py:1216 msgid "Generate invoices" msgstr "" -#: pretix/base/settings.py:1205 +#: pretix/base/settings.py:1220 msgid "Automatically after payment or when required by payment method" msgstr "" -#: pretix/base/settings.py:1206 +#: pretix/base/settings.py:1221 msgid "Automatically before payment for all created orders" msgstr "" -#: pretix/base/settings.py:1211 +#: pretix/base/settings.py:1226 msgid "Invoices will never be automatically generated for free orders." msgstr "" -#: pretix/base/settings.py:1221 pretix/base/settings.py:1233 +#: pretix/base/settings.py:1236 pretix/base/settings.py:1248 msgid "" "Automatic based on ticket-specific validity, membership validity, event " "series date, or event date" msgstr "" -#: pretix/base/settings.py:1222 pretix/base/settings.py:1234 +#: pretix/base/settings.py:1237 pretix/base/settings.py:1249 msgid "Automatic, but prefer invoice date over event date" msgstr "" -#: pretix/base/settings.py:1225 pretix/base/settings.py:1237 +#: pretix/base/settings.py:1240 pretix/base/settings.py:1252 msgid "Invoice date" msgstr "" -#: pretix/base/settings.py:1230 +#: pretix/base/settings.py:1245 msgid "Date of service" msgstr "" -#: pretix/base/settings.py:1239 +#: pretix/base/settings.py:1254 msgid "" "This controls what dates are shown on the invoice, but is especially " "important for electronic invoicing." msgstr "" -#: pretix/base/settings.py:1251 +#: pretix/base/settings.py:1266 msgid "Automatically cancel and reissue invoice on address changes" msgstr "" -#: pretix/base/settings.py:1252 +#: pretix/base/settings.py:1267 msgid "" "If customers change their invoice address on an existing order, the invoice " "will automatically be canceled and a new invoice will be issued. This " "setting does not affect changes made through the backend." msgstr "" -#: pretix/base/settings.py:1264 -msgid "Allow to update existing invoices" +#: pretix/base/settings.py:1279 +msgid "Allow updating existing invoices" msgstr "" -#: pretix/base/settings.py:1265 +#: pretix/base/settings.py:1280 msgid "" "By default, invoices can never again be changed once they are issued. In " "most countries, we recommend to leave this option turned off and always " "issue a new invoice if a change needs to be made." msgstr "" -#: pretix/base/settings.py:1281 +#: pretix/base/settings.py:1296 msgid "Only issue invoices to business customers" msgstr "" -#: pretix/base/settings.py:1291 +#: pretix/base/settings.py:1306 msgid "Address line" msgstr "" -#: pretix/base/settings.py:1295 +#: pretix/base/settings.py:1310 msgid "Albert Einstein Road 52" msgstr "" -#: pretix/base/settings.py:1375 +#: pretix/base/settings.py:1390 msgid "Domestic tax ID" msgstr "" -#: pretix/base/settings.py:1376 +#: pretix/base/settings.py:1391 msgid "e.g. tax number in Germany, ABN in Australia, …" msgstr "" -#: pretix/base/settings.py:1387 +#: pretix/base/settings.py:1402 msgid "EU VAT ID" msgstr "" -#: pretix/base/settings.py:1402 +#: pretix/base/settings.py:1417 msgid "e.g. With this document, we sent you the invoice for your ticket order." msgstr "" -#: pretix/base/settings.py:1405 +#: pretix/base/settings.py:1420 msgid "Introductory text" msgstr "" -#: pretix/base/settings.py:1406 +#: pretix/base/settings.py:1421 msgid "Will be printed on every invoice above the invoice rows." msgstr "" -#: pretix/base/settings.py:1420 +#: pretix/base/settings.py:1435 msgid "" "e.g. Thank you for your purchase! You can find more information on the event " "at ..." msgstr "" -#: pretix/base/settings.py:1423 +#: pretix/base/settings.py:1438 msgid "Additional text" msgstr "" -#: pretix/base/settings.py:1424 +#: pretix/base/settings.py:1439 msgid "Will be printed on every invoice below the invoice total." msgstr "" -#: pretix/base/settings.py:1438 +#: pretix/base/settings.py:1453 msgid "" "e.g. your bank details, legal details like your VAT ID, registration " "numbers, etc." msgstr "" -#: pretix/base/settings.py:1441 +#: pretix/base/settings.py:1456 msgid "Footer" msgstr "" -#: pretix/base/settings.py:1442 +#: pretix/base/settings.py:1457 msgid "" "Will be printed centered and in a smaller font at the end of every invoice " "page." msgstr "" -#: pretix/base/settings.py:1457 +#: pretix/base/settings.py:1472 msgid "Attach invoices to emails" msgstr "" -#: pretix/base/settings.py:1458 +#: pretix/base/settings.py:1473 msgid "" "If invoices are automatically generated for all orders, they will be " "attached to the order confirmation mail. If they are automatically generated " @@ -9895,39 +10133,39 @@ msgid "" "are not automatically generated, they will not be attached to emails." msgstr "" -#: pretix/base/settings.py:1471 +#: pretix/base/settings.py:1486 msgid "Email address to receive a copy of each invoice" msgstr "" -#: pretix/base/settings.py:1472 +#: pretix/base/settings.py:1487 msgid "" "Each newly created invoice will be sent to this email address shortly after " "creation. You can use this for an automated import of invoices to your " "accounting system. The invoice will be the only attachment of the email." msgstr "" -#: pretix/base/settings.py:1487 +#: pretix/base/settings.py:1502 msgid "Show items outside presale period" msgstr "" -#: pretix/base/settings.py:1488 +#: pretix/base/settings.py:1503 msgid "" "Show item details before presale has started and after presale has ended" msgstr "" -#: pretix/base/settings.py:1508 +#: pretix/base/settings.py:1523 msgid "Available languages" msgstr "" -#: pretix/base/settings.py:1524 pretix/control/forms/event.py:151 +#: pretix/base/settings.py:1539 pretix/control/forms/event.py:151 msgid "Default language" msgstr "" -#: pretix/base/settings.py:1534 +#: pretix/base/settings.py:1549 msgid "Region" msgstr "" -#: pretix/base/settings.py:1535 +#: pretix/base/settings.py:1550 msgid "" "Will be used to determine date and time formatting as well as default " "country for customer addresses and phone numbers. For formatting, this takes " @@ -9935,11 +10173,11 @@ msgid "" "languages used in different regions globally (like English)." msgstr "" -#: pretix/base/settings.py:1547 +#: pretix/base/settings.py:1562 msgid "This shop represents an event" msgstr "" -#: pretix/base/settings.py:1549 +#: pretix/base/settings.py:1564 msgid "" "Uncheck this box if you are only selling something that has no specific " "date, such as gift cards or a ticket that can be used any time. The system " @@ -9948,45 +10186,45 @@ msgid "" "may still show up in other places." msgstr "" -#: pretix/base/settings.py:1562 +#: pretix/base/settings.py:1577 msgid "Show event end date" msgstr "" -#: pretix/base/settings.py:1563 +#: pretix/base/settings.py:1578 msgid "If disabled, only event's start date will be displayed to the public." msgstr "" -#: pretix/base/settings.py:1572 +#: pretix/base/settings.py:1587 msgid "Show dates with time" msgstr "" -#: pretix/base/settings.py:1573 +#: pretix/base/settings.py:1588 msgid "" "If disabled, the event's start and end date will be displayed without the " "time of day." msgstr "" -#: pretix/base/settings.py:1582 +#: pretix/base/settings.py:1597 msgid "Hide all products that are sold out" msgstr "" -#: pretix/base/settings.py:1592 pretix/control/forms/event.py:1870 +#: pretix/base/settings.py:1607 pretix/control/forms/event.py:1870 msgid "Publicly show how many tickets of a certain type are still available." msgstr "" -#: pretix/base/settings.py:1601 +#: pretix/base/settings.py:1616 msgid "Ask search engines not to index the ticket shop" msgstr "" -#: pretix/base/settings.py:1610 +#: pretix/base/settings.py:1625 msgid "Show variations of a product expanded by default" msgstr "" -#: pretix/base/settings.py:1619 +#: pretix/base/settings.py:1634 msgid "Enable waiting list" msgstr "" -#: pretix/base/settings.py:1620 pretix/control/forms/event.py:1875 +#: pretix/base/settings.py:1635 pretix/control/forms/event.py:1875 msgid "" "Once a ticket is sold out, people can add themselves to a waiting list. As " "soon as a ticket becomes available again, it will be reserved for the first " @@ -9994,11 +10232,11 @@ msgid "" "notification with a voucher that can be used to buy a ticket." msgstr "" -#: pretix/base/settings.py:1631 +#: pretix/base/settings.py:1646 msgid "Automatic waiting list assignments" msgstr "" -#: pretix/base/settings.py:1632 +#: pretix/base/settings.py:1647 msgid "" "If ticket capacity becomes free, automatically create a voucher and send it " "to the first person on the waiting list for that product. If this is not " @@ -10007,22 +10245,22 @@ msgid "" "enabled, tickets will still be sent out." msgstr "" -#: pretix/base/settings.py:1648 +#: pretix/base/settings.py:1663 msgid "Waiting list response time" msgstr "" -#: pretix/base/settings.py:1651 +#: pretix/base/settings.py:1666 msgid "" "If a ticket voucher is sent to a person on the waiting list, it has to be " "redeemed within this number of hours until it expires and can be re-assigned " "to the next person on the list." msgstr "" -#: pretix/base/settings.py:1662 +#: pretix/base/settings.py:1677 msgid "Disable waiting list" msgstr "" -#: pretix/base/settings.py:1663 +#: pretix/base/settings.py:1678 msgid "" "The waiting list will be fully disabled after this date. This means that " "nobody can add themselves to the waiting list any more, but also that " @@ -10031,53 +10269,53 @@ msgid "" "remain active." msgstr "" -#: pretix/base/settings.py:1675 +#: pretix/base/settings.py:1690 msgid "Ask for a name" msgstr "" -#: pretix/base/settings.py:1676 +#: pretix/base/settings.py:1691 msgid "Ask for a name when signing up to the waiting list." msgstr "" -#: pretix/base/settings.py:1685 +#: pretix/base/settings.py:1700 msgid "Require name" msgstr "" -#: pretix/base/settings.py:1686 +#: pretix/base/settings.py:1701 msgid "Require a name when signing up to the waiting list.." msgstr "" -#: pretix/base/settings.py:1696 +#: pretix/base/settings.py:1711 msgid "Ask for a phone number" msgstr "" -#: pretix/base/settings.py:1697 +#: pretix/base/settings.py:1712 msgid "Ask for a phone number when signing up to the waiting list." msgstr "" -#: pretix/base/settings.py:1706 +#: pretix/base/settings.py:1721 msgid "Require phone number" msgstr "" -#: pretix/base/settings.py:1707 +#: pretix/base/settings.py:1722 msgid "Require a phone number when signing up to the waiting list.." msgstr "" -#: pretix/base/settings.py:1717 +#: pretix/base/settings.py:1732 msgid "Phone number explanation" msgstr "" -#: pretix/base/settings.py:1720 +#: pretix/base/settings.py:1735 msgid "" "If you ask for a phone number, explain why you do so and what you will use " "the phone number for." msgstr "" -#: pretix/base/settings.py:1732 +#: pretix/base/settings.py:1747 msgid "Maximum number of entries per email address for the same product" msgstr "" -#: pretix/base/settings.py:1736 +#: pretix/base/settings.py:1751 msgid "" "With an increased limit, a customer may request more than one ticket for a " "specific product using the same, unique email address. However, regardless " @@ -10086,11 +10324,11 @@ msgid "" "ticket at a time." msgstr "" -#: pretix/base/settings.py:1748 +#: pretix/base/settings.py:1763 msgid "Show number of check-ins to customer" msgstr "" -#: pretix/base/settings.py:1749 +#: pretix/base/settings.py:1764 msgid "" "With this option enabled, your customers will be able to see how many times " "they entered the event. This is usually not necessary, but might be useful " @@ -10100,62 +10338,62 @@ msgid "" "check-in lists." msgstr "" -#: pretix/base/settings.py:1762 +#: pretix/base/settings.py:1777 msgid "Allow users to download tickets" msgstr "" -#: pretix/base/settings.py:1763 +#: pretix/base/settings.py:1778 msgid "If this is off, nobody can download a ticket." msgstr "" -#: pretix/base/settings.py:1772 +#: pretix/base/settings.py:1787 msgid "Download date" msgstr "" -#: pretix/base/settings.py:1773 +#: pretix/base/settings.py:1788 msgid "" "Ticket download will be offered after this date. If you use the event series " "feature and an order contains tickets for multiple event dates, download of " "all tickets will be available if at least one of the event dates allows it." msgstr "" -#: pretix/base/settings.py:1784 +#: pretix/base/settings.py:1799 msgid "Generate tickets for add-on products and bundled products" msgstr "" -#: pretix/base/settings.py:1785 +#: pretix/base/settings.py:1800 msgid "" "By default, tickets are only issued for products selected individually, not " "for add-on products or bundled products. With this option, a separate ticket " "is issued for every add-on product or bundled product as well." msgstr "" -#: pretix/base/settings.py:1798 +#: pretix/base/settings.py:1813 msgid "Generate tickets for all products" msgstr "" -#: pretix/base/settings.py:1799 +#: pretix/base/settings.py:1814 msgid "" "If turned off, tickets are only issued for products that are marked as an " "\"admission ticket\"in the product settings. You can also turn off ticket " "issuing in every product separately." msgstr "" -#: pretix/base/settings.py:1811 +#: pretix/base/settings.py:1826 msgid "Generate tickets for pending orders" msgstr "" -#: pretix/base/settings.py:1812 +#: pretix/base/settings.py:1827 msgid "" "If turned off, ticket downloads are only possible after an order has been " "marked as paid." msgstr "" -#: pretix/base/settings.py:1823 +#: pretix/base/settings.py:1838 msgid "Do not issue ticket before email address is validated" msgstr "" -#: pretix/base/settings.py:1824 +#: pretix/base/settings.py:1839 msgid "" "If turned on, tickets will not be offered for download directly after " "purchase. They will be attached to the payment confirmation email (if the " @@ -10164,11 +10402,11 @@ msgid "" "orders performed through other sales channels." msgstr "" -#: pretix/base/settings.py:1840 +#: pretix/base/settings.py:1855 msgid "Low availability threshold" msgstr "" -#: pretix/base/settings.py:1841 +#: pretix/base/settings.py:1856 msgid "" "If the availability of tickets falls below this percentage, the event (or a " "date, if it is an event series) will be highlighted to have low availability " @@ -10176,95 +10414,95 @@ msgid "" "availability will not be shown publicly." msgstr "" -#: pretix/base/settings.py:1855 +#: pretix/base/settings.py:1870 msgid "Show availability in event overviews" msgstr "" -#: pretix/base/settings.py:1856 +#: pretix/base/settings.py:1871 msgid "" "If checked, the list of events will show if events are sold out. This might " "make for longer page loading times if you have lots of events and the shown " "status might be out of date for up to two minutes." msgstr "" -#: pretix/base/settings.py:1869 pretix/base/settings.py:1877 +#: pretix/base/settings.py:1884 pretix/base/settings.py:1892 #: pretix/presale/templates/pretixpresale/fragment_calendar_nav.html:8 msgid "List" msgstr "" -#: pretix/base/settings.py:1870 pretix/base/settings.py:1878 +#: pretix/base/settings.py:1885 pretix/base/settings.py:1893 msgid "Week calendar" msgstr "" -#: pretix/base/settings.py:1871 pretix/base/settings.py:1879 +#: pretix/base/settings.py:1886 pretix/base/settings.py:1894 msgid "Month calendar" msgstr "" -#: pretix/base/settings.py:1875 +#: pretix/base/settings.py:1890 msgid "Default overview style" msgstr "" -#: pretix/base/settings.py:1881 +#: pretix/base/settings.py:1896 msgid "" "If your event series has more than 50 dates in the future, only the month or " "week calendar can be used." msgstr "" -#: pretix/base/settings.py:1890 +#: pretix/base/settings.py:1905 msgid "Show filter options for calendar or list view" msgstr "" -#: pretix/base/settings.py:1891 +#: pretix/base/settings.py:1906 msgid "" "You can set up possible filters as meta properties in your organizer " "settings." msgstr "" -#: pretix/base/settings.py:1900 +#: pretix/base/settings.py:1915 msgid "Hide all unavailable dates from calendar or list views" msgstr "" -#: pretix/base/settings.py:1901 pretix/base/settings.py:1912 +#: pretix/base/settings.py:1916 pretix/base/settings.py:1927 msgid "" "This option currently only affects the calendar of this event series, not " "the organizer-wide calendar." msgstr "" -#: pretix/base/settings.py:1911 +#: pretix/base/settings.py:1926 msgid "Hide all past dates from calendar" msgstr "" -#: pretix/base/settings.py:1923 pretix/base/settings.py:1932 +#: pretix/base/settings.py:1938 pretix/base/settings.py:1947 msgid "No modifications after order was submitted" msgstr "" -#: pretix/base/settings.py:1924 pretix/base/settings.py:1933 +#: pretix/base/settings.py:1939 pretix/base/settings.py:1948 msgid "Only the person who ordered can make changes" msgstr "" -#: pretix/base/settings.py:1925 pretix/base/settings.py:1934 +#: pretix/base/settings.py:1940 pretix/base/settings.py:1949 msgid "Both the attendee and the person who ordered can make changes" msgstr "" -#: pretix/base/settings.py:1929 +#: pretix/base/settings.py:1944 msgid "Allow customers to modify their information" msgstr "" -#: pretix/base/settings.py:1944 +#: pretix/base/settings.py:1959 msgid "Allow customers to modify their information after they checked in." msgstr "" -#: pretix/base/settings.py:1945 +#: pretix/base/settings.py:1960 msgid "" "By default, no more modifications are possible for an order as soon as one " "of the tickets in the order has been checked in." msgstr "" -#: pretix/base/settings.py:1955 +#: pretix/base/settings.py:1970 msgid "Last date of modifications" msgstr "" -#: pretix/base/settings.py:1956 +#: pretix/base/settings.py:1971 msgid "" "The last date users can modify details of their orders, such as attendee " "names or answers to questions. If you use the event series feature and an " @@ -10272,53 +10510,53 @@ msgid "" "used." msgstr "" -#: pretix/base/settings.py:1967 +#: pretix/base/settings.py:1982 msgid "Customers can change the variation of the products they purchased" msgstr "" -#: pretix/base/settings.py:1976 +#: pretix/base/settings.py:1991 msgid "Customers can change their selected add-on products" msgstr "" -#: pretix/base/settings.py:1986 pretix/base/settings.py:1997 +#: pretix/base/settings.py:2001 pretix/base/settings.py:2012 msgid "" "Only allow changes if the resulting price is higher or equal than the " "previous price." msgstr "" -#: pretix/base/settings.py:1987 pretix/base/settings.py:1998 +#: pretix/base/settings.py:2002 pretix/base/settings.py:2013 msgid "" "Only allow changes if the resulting price is higher than the previous price." msgstr "" -#: pretix/base/settings.py:1988 pretix/base/settings.py:1999 +#: pretix/base/settings.py:2003 pretix/base/settings.py:2014 msgid "" "Only allow changes if the resulting price is equal to the previous price." msgstr "" -#: pretix/base/settings.py:1989 pretix/base/settings.py:2000 +#: pretix/base/settings.py:2004 pretix/base/settings.py:2015 msgid "" "Allow changes regardless of price, as long as no refund is required (i.e. " "the resulting price is not lower than what has already been paid)." msgstr "" -#: pretix/base/settings.py:1991 pretix/base/settings.py:2002 +#: pretix/base/settings.py:2006 pretix/base/settings.py:2017 msgid "Allow changes regardless of price, even if this results in a refund." msgstr "" -#: pretix/base/settings.py:1995 +#: pretix/base/settings.py:2010 msgid "Requirement for changed prices" msgstr "" -#: pretix/base/settings.py:2013 +#: pretix/base/settings.py:2028 msgid "Do not allow changes after" msgstr "" -#: pretix/base/settings.py:2022 +#: pretix/base/settings.py:2037 msgid "Allow change even though the ticket has already been checked in" msgstr "" -#: pretix/base/settings.py:2023 +#: pretix/base/settings.py:2038 msgid "" "By default, order changes are disabled after any ticket in the order has " "been checked in. If you check this box, this requirement is lifted. It is " @@ -10327,11 +10565,11 @@ msgid "" "limitation on price changes above." msgstr "" -#: pretix/base/settings.py:2035 +#: pretix/base/settings.py:2050 msgid "Allow individual attendees to change their ticket" msgstr "" -#: pretix/base/settings.py:2036 +#: pretix/base/settings.py:2051 msgid "" "By default, only the person who ordered the tickets can make any changes. If " "you check this box, individual attendees can also make changes. However, " @@ -10340,77 +10578,77 @@ msgid "" "customer." msgstr "" -#: pretix/base/settings.py:2048 +#: pretix/base/settings.py:2063 msgid "Customers can cancel their unpaid orders" msgstr "" -#: pretix/base/settings.py:2060 +#: pretix/base/settings.py:2075 msgid "Charge a fixed cancellation fee" msgstr "" -#: pretix/base/settings.py:2061 pretix/base/settings.py:2072 -#: pretix/base/settings.py:2086 +#: pretix/base/settings.py:2076 pretix/base/settings.py:2087 +#: pretix/base/settings.py:2101 msgid "" "Only affects orders pending payments, a cancellation fee for free orders is " "never charged. Note that it will be your responsibility to claim the " "cancellation fee from the user." msgstr "" -#: pretix/base/settings.py:2071 +#: pretix/base/settings.py:2086 msgid "Charge payment, shipping and service fees" msgstr "" -#: pretix/base/settings.py:2085 +#: pretix/base/settings.py:2100 msgid "Charge a percentual cancellation fee" msgstr "" -#: pretix/base/settings.py:2096 pretix/base/settings.py:2235 +#: pretix/base/settings.py:2111 pretix/base/settings.py:2250 msgid "Do not allow cancellations after" msgstr "" -#: pretix/base/settings.py:2105 +#: pretix/base/settings.py:2120 msgid "Customers can cancel their paid orders" msgstr "" -#: pretix/base/settings.py:2106 +#: pretix/base/settings.py:2121 msgid "" "Paid money will be automatically paid back if the payment method allows it. " "Otherwise, a manual refund will be created for you to process manually." msgstr "" -#: pretix/base/settings.py:2119 pretix/control/forms/orders.py:909 +#: pretix/base/settings.py:2134 pretix/control/forms/orders.py:917 msgid "Keep a fixed cancellation fee" msgstr "" -#: pretix/base/settings.py:2128 +#: pretix/base/settings.py:2143 msgid "Keep payment, shipping and service fees" msgstr "" -#: pretix/base/settings.py:2140 pretix/control/forms/orders.py:920 +#: pretix/base/settings.py:2155 pretix/control/forms/orders.py:928 msgid "Keep a percentual cancellation fee" msgstr "" -#: pretix/base/settings.py:2149 +#: pretix/base/settings.py:2164 msgid "Allow customers to voluntarily choose a lower refund" msgstr "" -#: pretix/base/settings.py:2150 +#: pretix/base/settings.py:2165 msgid "" "With this option enabled, your customers can choose to get a smaller refund " "to support you." msgstr "" -#: pretix/base/settings.py:2155 +#: pretix/base/settings.py:2170 msgid "" "However, if you want us to help keep the lights on here, please consider " "using the slider below to request a smaller refund. Thank you!" msgstr "" -#: pretix/base/settings.py:2162 +#: pretix/base/settings.py:2177 msgid "Voluntary lower refund explanation" msgstr "" -#: pretix/base/settings.py:2165 +#: pretix/base/settings.py:2180 msgid "" "This text will be shown in between the explanation of how the refunds work " "and the slider which your customers can use to choose the amount they would " @@ -10418,107 +10656,107 @@ msgid "" "help your organization." msgstr "" -#: pretix/base/settings.py:2180 +#: pretix/base/settings.py:2195 msgid "Step size for reduction amount" msgstr "" -#: pretix/base/settings.py:2181 +#: pretix/base/settings.py:2196 msgid "" "By default, customers can choose an arbitrary amount for you to keep. If you " "set this to e.g. 10, they will only be able to choose values in increments " "of 10." msgstr "" -#: pretix/base/settings.py:2191 +#: pretix/base/settings.py:2206 msgid "" "Customers can only request a cancellation that needs to be approved by the " "event organizer before the order is canceled and a refund is issued." msgstr "" -#: pretix/base/settings.py:2201 +#: pretix/base/settings.py:2216 msgid "" "Do not show the cancellation fee to users when they request cancellation." msgstr "" -#: pretix/base/settings.py:2210 pretix/base/settings.py:2220 +#: pretix/base/settings.py:2225 pretix/base/settings.py:2235 msgid "All refunds are issued to the original payment method" msgstr "" -#: pretix/base/settings.py:2211 pretix/base/settings.py:2221 +#: pretix/base/settings.py:2226 pretix/base/settings.py:2236 msgid "" "Customers can choose between a gift card and a refund to their payment method" msgstr "" -#: pretix/base/settings.py:2212 pretix/base/settings.py:2222 +#: pretix/base/settings.py:2227 pretix/base/settings.py:2237 msgid "All refunds are issued as gift cards" msgstr "" -#: pretix/base/settings.py:2213 pretix/base/settings.py:2223 +#: pretix/base/settings.py:2228 pretix/base/settings.py:2238 msgid "Do not handle refunds automatically at all" msgstr "" -#: pretix/base/settings.py:2218 -#: pretix/control/templates/pretixcontrol/order/index.html:149 +#: pretix/base/settings.py:2233 +#: pretix/control/templates/pretixcontrol/order/index.html:182 msgid "Refund method" msgstr "" -#: pretix/base/settings.py:2244 pretix/base/settings.py:2257 +#: pretix/base/settings.py:2259 pretix/base/settings.py:2272 msgid "Terms of cancellation" msgstr "" -#: pretix/base/settings.py:2247 +#: pretix/base/settings.py:2262 msgid "" "This text will be shown when cancellation is allowed for a paid order. Leave " "empty if you want pretix to automatically generate the terms of cancellation " "based on your settings." msgstr "" -#: pretix/base/settings.py:2260 +#: pretix/base/settings.py:2275 msgid "" "This text will be shown when cancellation is allowed for an unpaid or free " "order. Leave empty if you want pretix to automatically generate the terms of " "cancellation based on your settings." msgstr "" -#: pretix/base/settings.py:2270 pretix/control/forms/event.py:1898 +#: pretix/base/settings.py:2285 pretix/control/forms/event.py:1898 msgid "Contact address" msgstr "" -#: pretix/base/settings.py:2271 pretix/control/forms/event.py:1900 +#: pretix/base/settings.py:2286 pretix/control/forms/event.py:1900 msgid "We'll show this publicly to allow attendees to contact you." msgstr "" -#: pretix/base/settings.py:2279 pretix/control/forms/event.py:1892 +#: pretix/base/settings.py:2294 pretix/control/forms/event.py:1892 msgid "Imprint URL" msgstr "" -#: pretix/base/settings.py:2280 pretix/control/forms/event.py:1893 +#: pretix/base/settings.py:2295 pretix/control/forms/event.py:1893 msgid "" "This should point e.g. to a part of your website that has your contact " "details and legal information." msgstr "" -#: pretix/base/settings.py:2290 +#: pretix/base/settings.py:2305 msgid "Privacy Policy URL" msgstr "" -#: pretix/base/settings.py:2291 +#: pretix/base/settings.py:2306 msgid "" "This should point e.g. to a part of your website that explains how you use " "data gathered in your ticket shop." msgstr "" -#: pretix/base/settings.py:2302 +#: pretix/base/settings.py:2317 msgid "Accessibility information URL" msgstr "" -#: pretix/base/settings.py:2303 +#: pretix/base/settings.py:2318 msgid "" "This should point e.g. to a part of your website that explains how your " "ticket shop complies with accessibility regulation." msgstr "" -#: pretix/base/settings.py:2310 +#: pretix/base/settings.py:2325 #: pretix/presale/templates/pretixpresale/event/base.html:229 #: pretix/presale/templates/pretixpresale/event/base.html:234 #: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6 @@ -10527,52 +10765,52 @@ msgstr "" msgid "Accessibility information" msgstr "" -#: pretix/base/settings.py:2314 +#: pretix/base/settings.py:2329 msgid "Accessibility information title" msgstr "" -#: pretix/base/settings.py:2324 +#: pretix/base/settings.py:2339 msgid "Accessibility information text" msgstr "" -#: pretix/base/settings.py:2345 +#: pretix/base/settings.py:2360 msgid "Attach ticket files" msgstr "" -#: pretix/base/settings.py:2347 +#: pretix/base/settings.py:2362 #, python-brace-format msgid "" "Tickets will never be attached if they're larger than {size} to avoid email " "delivery problems." msgstr "" -#: pretix/base/settings.py:2358 pretix/plugins/sendmail/forms.py:201 +#: pretix/base/settings.py:2373 pretix/plugins/sendmail/forms.py:201 #: pretix/plugins/sendmail/models.py:263 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:66 msgid "Attach calendar files" msgstr "" -#: pretix/base/settings.py:2359 +#: pretix/base/settings.py:2374 msgid "" "If enabled, we will attach an .ics calendar file to order confirmation " "emails." msgstr "" -#: pretix/base/settings.py:2368 +#: pretix/base/settings.py:2383 msgid "Attach calendar files only after order has been paid" msgstr "" -#: pretix/base/settings.py:2369 +#: pretix/base/settings.py:2384 msgid "" "Use this if you e.g. put a private access link into the calendar file to " "make sure people only receive it after their payment was confirmed." msgstr "" -#: pretix/base/settings.py:2378 +#: pretix/base/settings.py:2393 msgid "Event description" msgstr "" -#: pretix/base/settings.py:2381 +#: pretix/base/settings.py:2396 msgid "" "You can use this to share information with your attendees, such as travel " "information or the link to a digital event. If you keep it empty, we will " @@ -10582,52 +10820,52 @@ msgid "" "people." msgstr "" -#: pretix/base/settings.py:2394 +#: pretix/base/settings.py:2409 msgid "Subject prefix" msgstr "" -#: pretix/base/settings.py:2395 +#: pretix/base/settings.py:2410 msgid "" "This will be prepended to the subject of all outgoing emails, formatted as " "[prefix]. Choose, for example, a short form of your event name." msgstr "" -#: pretix/base/settings.py:2409 pretix/control/forms/mailsetup.py:37 +#: pretix/base/settings.py:2424 pretix/control/forms/mailsetup.py:37 #: pretix/control/forms/mailsetup.py:119 #: pretix/control/templates/pretixcontrol/event/mail.html:39 #: pretix/control/templates/pretixcontrol/organizers/mail.html:40 msgid "Sender address" msgstr "" -#: pretix/base/settings.py:2410 pretix/control/forms/mailsetup.py:38 +#: pretix/base/settings.py:2425 pretix/control/forms/mailsetup.py:38 #: pretix/control/forms/mailsetup.py:120 msgid "Sender address for outgoing emails" msgstr "" -#: pretix/base/settings.py:2419 +#: pretix/base/settings.py:2434 msgid "Sender name" msgstr "" -#: pretix/base/settings.py:2420 +#: pretix/base/settings.py:2435 msgid "" "Sender name used in conjunction with the sender address for outgoing emails. " "Defaults to your event name." msgstr "" -#: pretix/base/settings.py:2438 pretix/base/settings.py:2495 -#: pretix/base/settings.py:2512 pretix/base/settings.py:2530 +#: pretix/base/settings.py:2453 pretix/base/settings.py:2510 +#: pretix/base/settings.py:2527 pretix/base/settings.py:2545 #, python-brace-format msgid "Your order: {code}" msgstr "" -#: pretix/base/settings.py:2442 pretix/base/settings.py:2475 -#: pretix/base/settings.py:2580 pretix/base/settings.py:2813 -#: pretix/base/settings.py:2850 +#: pretix/base/settings.py:2457 pretix/base/settings.py:2490 +#: pretix/base/settings.py:2595 pretix/base/settings.py:2828 +#: pretix/base/settings.py:2865 #, python-brace-format msgid "Your event registration: {code}" msgstr "" -#: pretix/base/settings.py:2446 +#: pretix/base/settings.py:2461 #, python-brace-format msgid "" "Hello,\n" @@ -10642,12 +10880,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2459 +#: pretix/base/settings.py:2474 #, python-brace-format msgid "Your orders for {event}" msgstr "" -#: pretix/base/settings.py:2463 +#: pretix/base/settings.py:2478 #, python-brace-format msgid "" "Hello,\n" @@ -10661,7 +10899,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2479 +#: pretix/base/settings.py:2494 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -10675,7 +10913,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2499 +#: pretix/base/settings.py:2514 #, python-brace-format msgid "" "Hello,\n" @@ -10690,7 +10928,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2516 +#: pretix/base/settings.py:2531 #, python-brace-format msgid "" "Hello,\n" @@ -10706,7 +10944,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2534 +#: pretix/base/settings.py:2549 #, python-brace-format msgid "" "Hello,\n" @@ -10724,11 +10962,11 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2552 +#: pretix/base/settings.py:2567 msgid "Attachment for new orders" msgstr "" -#: pretix/base/settings.py:2557 +#: pretix/base/settings.py:2572 #, python-brace-format msgid "" "This file will be attached to the first email that we send for every new " @@ -10740,7 +10978,7 @@ msgid "" "vital email going to spam, you can only upload PDF files of up to {size} MB." msgstr "" -#: pretix/base/settings.py:2584 +#: pretix/base/settings.py:2599 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -10754,12 +10992,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2596 +#: pretix/base/settings.py:2611 #, python-brace-format msgid "Your order has been changed: {code}" msgstr "" -#: pretix/base/settings.py:2600 +#: pretix/base/settings.py:2615 #, python-brace-format msgid "" "Hello,\n" @@ -10773,12 +11011,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2612 +#: pretix/base/settings.py:2627 #, python-brace-format msgid "Payment received for your order: {code}" msgstr "" -#: pretix/base/settings.py:2616 +#: pretix/base/settings.py:2631 #, python-brace-format msgid "" "Hello,\n" @@ -10794,12 +11032,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2634 +#: pretix/base/settings.py:2649 #, python-brace-format msgid "Event registration confirmed: {code}" msgstr "" -#: pretix/base/settings.py:2638 +#: pretix/base/settings.py:2653 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -10813,23 +11051,23 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2655 pretix/control/forms/event.py:1294 +#: pretix/base/settings.py:2670 pretix/control/forms/event.py:1294 #: pretix/control/forms/event.py:1416 pretix/plugins/sendmail/models.py:268 msgid "Number of days" msgstr "" -#: pretix/base/settings.py:2657 pretix/control/forms/event.py:1297 +#: pretix/base/settings.py:2672 pretix/control/forms/event.py:1297 msgid "" "This email will be sent out this many days before the order expires. If the " "value is 0, the mail will never be sent." msgstr "" -#: pretix/base/settings.py:2665 +#: pretix/base/settings.py:2680 #, python-brace-format msgid "Your order is about to expire: {code}" msgstr "" -#: pretix/base/settings.py:2669 +#: pretix/base/settings.py:2684 #, python-brace-format msgid "" "Hello,\n" @@ -10845,12 +11083,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2683 +#: pretix/base/settings.py:2698 #, python-brace-format msgid "Your order is pending payment: {code}" msgstr "" -#: pretix/base/settings.py:2687 +#: pretix/base/settings.py:2702 #, python-brace-format msgid "" "Hello,\n" @@ -10865,12 +11103,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2700 +#: pretix/base/settings.py:2715 #, python-brace-format msgid "Incomplete payment received: {code}" msgstr "" -#: pretix/base/settings.py:2704 +#: pretix/base/settings.py:2719 #, python-brace-format msgid "" "Hello,\n" @@ -10888,12 +11126,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2720 +#: pretix/base/settings.py:2735 #, python-brace-format msgid "Payment failed for your order: {code}" msgstr "" -#: pretix/base/settings.py:2724 +#: pretix/base/settings.py:2739 #, python-brace-format msgid "" "Hello,\n" @@ -10911,12 +11149,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2738 +#: pretix/base/settings.py:2753 #, python-brace-format msgid "You have been selected from the waitinglist for {event}" msgstr "" -#: pretix/base/settings.py:2742 +#: pretix/base/settings.py:2757 #, python-brace-format msgid "" "Hello,\n" @@ -10947,12 +11185,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2771 +#: pretix/base/settings.py:2786 #, python-brace-format msgid "Order canceled: {code}" msgstr "" -#: pretix/base/settings.py:2775 +#: pretix/base/settings.py:2790 #, python-brace-format msgid "" "Hello,\n" @@ -10968,12 +11206,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2789 +#: pretix/base/settings.py:2804 #, python-brace-format msgid "Order approved and awaiting payment: {code}" msgstr "" -#: pretix/base/settings.py:2793 +#: pretix/base/settings.py:2808 #, python-brace-format msgid "" "Hello,\n" @@ -10991,7 +11229,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2817 pretix/base/settings.py:2854 +#: pretix/base/settings.py:2832 pretix/base/settings.py:2869 #, python-brace-format msgid "" "Hello,\n" @@ -11005,12 +11243,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2829 +#: pretix/base/settings.py:2844 #, python-brace-format msgid "Order approved and confirmed: {code}" msgstr "" -#: pretix/base/settings.py:2833 +#: pretix/base/settings.py:2848 #, python-brace-format msgid "" "Hello,\n" @@ -11025,12 +11263,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2866 +#: pretix/base/settings.py:2881 #, python-brace-format msgid "Order denied: {code}" msgstr "" -#: pretix/base/settings.py:2870 +#: pretix/base/settings.py:2885 #, python-brace-format msgid "" "Hello,\n" @@ -11047,7 +11285,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2885 +#: pretix/base/settings.py:2900 #, python-brace-format msgid "" "Hello,\n" @@ -11059,12 +11297,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2895 +#: pretix/base/settings.py:2910 #, python-brace-format msgid "Invoice {invoice_number}" msgstr "" -#: pretix/base/settings.py:2899 +#: pretix/base/settings.py:2914 #, python-brace-format msgid "" "Hello,\n" @@ -11077,12 +11315,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2917 pretix/base/settings.py:2933 +#: pretix/base/settings.py:2932 pretix/base/settings.py:2948 #, python-brace-format msgid "Your ticket is ready for download: {code}" msgstr "" -#: pretix/base/settings.py:2921 +#: pretix/base/settings.py:2936 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -11096,7 +11334,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2937 +#: pretix/base/settings.py:2952 #, python-brace-format msgid "" "Hello,\n" @@ -11110,12 +11348,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2949 +#: pretix/base/settings.py:2964 #, python-brace-format msgid "Activate your account at {organizer}" msgstr "" -#: pretix/base/settings.py:2953 +#: pretix/base/settings.py:2968 #, python-brace-format msgid "" "Hello {name},\n" @@ -11135,12 +11373,12 @@ msgid "" "Your {organizer} team" msgstr "" -#: pretix/base/settings.py:2971 +#: pretix/base/settings.py:2986 #, python-brace-format msgid "Confirm email address for your account at {organizer}" msgstr "" -#: pretix/base/settings.py:2975 +#: pretix/base/settings.py:2990 #, python-brace-format msgid "" "Hello {name},\n" @@ -11160,12 +11398,12 @@ msgid "" "Your {organizer} team" msgstr "" -#: pretix/base/settings.py:2993 +#: pretix/base/settings.py:3008 #, python-brace-format msgid "Set a new password for your account at {organizer}" msgstr "" -#: pretix/base/settings.py:2997 +#: pretix/base/settings.py:3012 #, python-brace-format msgid "" "Hello {name},\n" @@ -11185,12 +11423,12 @@ msgid "" "Your {organizer} team" msgstr "" -#: pretix/base/settings.py:3015 +#: pretix/base/settings.py:3030 #, python-brace-format msgid "Changes to your account at {organizer}" msgstr "" -#: pretix/base/settings.py:3019 +#: pretix/base/settings.py:3034 #, python-brace-format msgid "" "Hello {name},\n" @@ -11210,57 +11448,57 @@ msgid "" "Your {organizer} team" msgstr "" -#: pretix/base/settings.py:3071 pretix/base/settings.py:3078 -#: pretix/base/settings.py:3092 pretix/base/settings.py:3100 -#: pretix/base/settings.py:3114 pretix/base/settings.py:3122 -#: pretix/base/settings.py:3136 pretix/base/settings.py:3143 +#: pretix/base/settings.py:3086 pretix/base/settings.py:3093 +#: pretix/base/settings.py:3107 pretix/base/settings.py:3115 +#: pretix/base/settings.py:3129 pretix/base/settings.py:3137 +#: pretix/base/settings.py:3151 pretix/base/settings.py:3158 msgid "Please enter the hexadecimal code of a color, e.g. #990000." msgstr "" -#: pretix/base/settings.py:3075 +#: pretix/base/settings.py:3090 msgid "Primary color" msgstr "" -#: pretix/base/settings.py:3096 +#: pretix/base/settings.py:3111 msgid "Accent color for success" msgstr "" -#: pretix/base/settings.py:3097 +#: pretix/base/settings.py:3112 msgid "We strongly suggest to use a shade of green." msgstr "" -#: pretix/base/settings.py:3118 +#: pretix/base/settings.py:3133 msgid "Accent color for errors" msgstr "" -#: pretix/base/settings.py:3119 +#: pretix/base/settings.py:3134 msgid "We strongly suggest to use a shade of red." msgstr "" -#: pretix/base/settings.py:3140 +#: pretix/base/settings.py:3155 msgid "Page background color" msgstr "" -#: pretix/base/settings.py:3155 +#: pretix/base/settings.py:3170 msgid "Use round edges" msgstr "" -#: pretix/base/settings.py:3164 +#: pretix/base/settings.py:3179 msgid "" "Use native spinners in the widget instead of custom ones for numeric inputs " "such as quantity." msgstr "" -#: pretix/base/settings.py:3175 +#: pretix/base/settings.py:3190 msgid "Only respected by modern browsers." msgstr "" -#: pretix/base/settings.py:3186 pretix/base/settings.py:3230 -#: pretix/control/forms/organizer.py:642 +#: pretix/base/settings.py:3201 pretix/base/settings.py:3245 +#: pretix/control/forms/organizer.py:652 msgid "Header image" msgstr "" -#: pretix/base/settings.py:3189 +#: pretix/base/settings.py:3204 msgid "" "If you provide a logo image, we will by default not show your event name and " "date in the page header. If you use a white background, we show your logo " @@ -11269,26 +11507,26 @@ msgid "" "using small details on the picture as it will be resized on smaller screens." msgstr "" -#: pretix/base/settings.py:3210 pretix/base/settings.py:3253 +#: pretix/base/settings.py:3225 pretix/base/settings.py:3268 msgid "Use header image in its full size" msgstr "" -#: pretix/base/settings.py:3211 pretix/base/settings.py:3254 +#: pretix/base/settings.py:3226 pretix/base/settings.py:3269 msgid "We recommend to upload a picture at least 1170 pixels wide." msgstr "" -#: pretix/base/settings.py:3220 +#: pretix/base/settings.py:3235 msgid "Show event title even if a header image is present" msgstr "" -#: pretix/base/settings.py:3221 +#: pretix/base/settings.py:3236 msgid "" "The title will only be shown on the event front page. If no header image is " "uploaded for the event, but the header image from the organizer profile is " "used, this option will be ignored and the event title will always be shown." msgstr "" -#: pretix/base/settings.py:3233 pretix/control/forms/organizer.py:646 +#: pretix/base/settings.py:3248 pretix/control/forms/organizer.py:656 msgid "" "If you provide a logo image, we will by default not show your organization " "name in the page header. If you use a white background, we show your logo " @@ -11297,25 +11535,25 @@ msgid "" "using small details on the picture as it will be resized on smaller screens." msgstr "" -#: pretix/base/settings.py:3263 +#: pretix/base/settings.py:3278 msgid "Use header image also for events without an individually uploaded logo" msgstr "" -#: pretix/base/settings.py:3271 +#: pretix/base/settings.py:3286 msgid "Favicon" msgstr "" -#: pretix/base/settings.py:3274 +#: pretix/base/settings.py:3289 msgid "" "If you provide a favicon, we will show it instead of the default pretix " "icon. We recommend a size of at least 200x200px to accommodate most devices." msgstr "" -#: pretix/base/settings.py:3290 +#: pretix/base/settings.py:3305 msgid "Social media image" msgstr "" -#: pretix/base/settings.py:3293 +#: pretix/base/settings.py:3308 msgid "" "This picture will be used as a preview if you post links to your ticket shop " "on social media. Facebook advises to use a picture size of 1200 x 630 " @@ -11324,93 +11562,93 @@ msgid "" "square is shown. If you do not fill this, we will use the logo given above." msgstr "" -#: pretix/base/settings.py:3311 +#: pretix/base/settings.py:3326 msgid "Logo image" msgstr "" -#: pretix/base/settings.py:3315 +#: pretix/base/settings.py:3330 msgid "We will show your logo with a maximal height and width of 2.5 cm." msgstr "" -#: pretix/base/settings.py:3342 pretix/base/settings.py:3448 +#: pretix/base/settings.py:3357 pretix/base/settings.py:3463 msgid "Info text" msgstr "" -#: pretix/base/settings.py:3345 pretix/base/settings.py:3450 +#: pretix/base/settings.py:3360 pretix/base/settings.py:3465 msgid "" "Not displayed anywhere by default, but if you want to, you can use this e.g. " "in ticket templates." msgstr "" -#: pretix/base/settings.py:3354 +#: pretix/base/settings.py:3369 msgid "Banner text (top)" msgstr "" -#: pretix/base/settings.py:3357 +#: pretix/base/settings.py:3372 msgid "" "This text will be shown above every page of your shop. Please only use this " "for very important messages." msgstr "" -#: pretix/base/settings.py:3367 +#: pretix/base/settings.py:3382 msgid "Banner text (bottom)" msgstr "" -#: pretix/base/settings.py:3370 +#: pretix/base/settings.py:3385 msgid "" "This text will be shown below every page of your shop. Please only use this " "for very important messages." msgstr "" -#: pretix/base/settings.py:3380 +#: pretix/base/settings.py:3395 msgid "Voucher explanation" msgstr "" -#: pretix/base/settings.py:3383 +#: pretix/base/settings.py:3398 msgid "" "This text will be shown next to the input for a voucher code. You can use it " "e.g. to explain how to obtain a voucher code." msgstr "" -#: pretix/base/settings.py:3393 +#: pretix/base/settings.py:3408 msgid "Attendee data explanation" msgstr "" -#: pretix/base/settings.py:3396 +#: pretix/base/settings.py:3411 msgid "" "This text will be shown above the questions asked for every personalized " "product. You can use it e.g. to explain why you need information from them." msgstr "" -#: pretix/base/settings.py:3406 +#: pretix/base/settings.py:3421 msgid "Additional success message" msgstr "" -#: pretix/base/settings.py:3407 +#: pretix/base/settings.py:3422 msgid "" "This message will be shown after an order has been created successfully. It " "will be shown in additional to the default text." msgstr "" -#: pretix/base/settings.py:3419 +#: pretix/base/settings.py:3434 msgid "Help text of the phone number field" msgstr "" -#: pretix/base/settings.py:3426 +#: pretix/base/settings.py:3441 msgid "" "Make sure to enter a valid email address. We will send you an order " "confirmation including a link that you need to access your order later." msgstr "" -#: pretix/base/settings.py:3433 +#: pretix/base/settings.py:3448 msgid "Help text of the email field" msgstr "" -#: pretix/base/settings.py:3459 +#: pretix/base/settings.py:3474 msgid "Allow creating a new team during event creation" msgstr "" -#: pretix/base/settings.py:3460 +#: pretix/base/settings.py:3475 msgid "" "Users that do not have access to all events under this organizer, must " "select one of their teams to have access to the created event. This setting " @@ -11418,68 +11656,68 @@ msgid "" "not have \"Can change teams and permissions\" permission." msgstr "" -#: pretix/base/settings.py:3532 pretix/base/settings.py:3542 +#: pretix/base/settings.py:3547 pretix/base/settings.py:3557 msgid "Event start time (descending)" msgstr "" -#: pretix/base/settings.py:3534 pretix/base/settings.py:3544 +#: pretix/base/settings.py:3549 pretix/base/settings.py:3559 msgid "Name (descending)" msgstr "" -#: pretix/base/settings.py:3539 +#: pretix/base/settings.py:3554 msgctxt "subevent" msgid "Date ordering" msgstr "" -#: pretix/base/settings.py:3555 +#: pretix/base/settings.py:3570 msgid "Link back to organizer overview on all event pages" msgstr "" -#: pretix/base/settings.py:3564 +#: pretix/base/settings.py:3579 msgid "Homepage text" msgstr "" -#: pretix/base/settings.py:3566 +#: pretix/base/settings.py:3581 msgid "This will be displayed on the organizer homepage." msgstr "" -#: pretix/base/settings.py:3581 +#: pretix/base/settings.py:3596 msgid "Length of gift card codes" msgstr "" -#: pretix/base/settings.py:3582 +#: pretix/base/settings.py:3597 #, python-brace-format msgid "" "The system generates by default {}-character long gift card codes. However, " "if a different length is required, it can be set here." msgstr "" -#: pretix/base/settings.py:3598 +#: pretix/base/settings.py:3613 msgid "Validity of gift card codes in years" msgstr "" -#: pretix/base/settings.py:3599 +#: pretix/base/settings.py:3614 msgid "" "If you set a number here, gift cards will by default expire at the end of " "the year after this many years. If you keep it empty, gift cards do not have " "an explicit expiry date." msgstr "" -#: pretix/base/settings.py:3610 +#: pretix/base/settings.py:3625 msgid "Enable cookie consent management features" msgstr "" -#: pretix/base/settings.py:3616 +#: pretix/base/settings.py:3631 msgid "" "By clicking \"Accept all cookies\", you agree to the storing of cookies and " "use of similar technologies on your device." msgstr "" -#: pretix/base/settings.py:3623 +#: pretix/base/settings.py:3638 msgid "Dialog text" msgstr "" -#: pretix/base/settings.py:3630 +#: pretix/base/settings.py:3645 msgid "" "We use cookies and similar technologies to gather data that allows us to " "improve this website and our offerings. If you do not agree, we will only " @@ -11487,197 +11725,197 @@ msgid "" "offers." msgstr "" -#: pretix/base/settings.py:3638 +#: pretix/base/settings.py:3653 msgid "Secondary dialog text" msgstr "" -#: pretix/base/settings.py:3644 +#: pretix/base/settings.py:3659 msgid "Privacy settings" msgstr "" -#: pretix/base/settings.py:3649 +#: pretix/base/settings.py:3664 msgid "Dialog title" msgstr "" -#: pretix/base/settings.py:3655 +#: pretix/base/settings.py:3670 msgid "Accept all cookies" msgstr "" -#: pretix/base/settings.py:3660 +#: pretix/base/settings.py:3675 msgid "\"Accept\" button description" msgstr "" -#: pretix/base/settings.py:3666 +#: pretix/base/settings.py:3681 msgid "Required cookies only" msgstr "" -#: pretix/base/settings.py:3671 +#: pretix/base/settings.py:3686 msgid "\"Reject\" button description" msgstr "" -#: pretix/base/settings.py:3681 +#: pretix/base/settings.py:3696 msgid "Customers can choose their own seats" msgstr "" -#: pretix/base/settings.py:3682 +#: pretix/base/settings.py:3697 msgid "" "If disabled, you will need to manually assign seats in the backend. Note " "that this can mean people will not know their seat after their purchase and " "it might not be written on their ticket." msgstr "" -#: pretix/base/settings.py:3708 +#: pretix/base/settings.py:3723 msgid "Show button to copy user input from other products" msgstr "" -#: pretix/base/settings.py:3718 +#: pretix/base/settings.py:3737 msgid "Most common English titles" msgstr "" -#: pretix/base/settings.py:3728 +#: pretix/base/settings.py:3747 msgid "Most common German titles" msgstr "" -#: pretix/base/settings.py:3741 +#: pretix/base/settings.py:3760 msgctxt "person_name_salutation" msgid "Ms" msgstr "" -#: pretix/base/settings.py:3742 +#: pretix/base/settings.py:3761 msgctxt "person_name_salutation" msgid "Mr" msgstr "" -#: pretix/base/settings.py:3743 +#: pretix/base/settings.py:3762 msgctxt "person_name_salutation" msgid "Mx" msgstr "" -#: pretix/base/settings.py:3780 pretix/base/settings.py:3796 -#: pretix/base/settings.py:3812 pretix/base/settings.py:3827 -#: pretix/base/settings.py:3845 pretix/base/settings.py:3860 -#: pretix/base/settings.py:3890 pretix/base/settings.py:3914 -#: pretix/base/settings.py:3946 pretix/base/settings.py:3968 -#: pretix/base/settings.py:3999 +#: pretix/base/settings.py:3799 pretix/base/settings.py:3815 +#: pretix/base/settings.py:3831 pretix/base/settings.py:3846 +#: pretix/base/settings.py:3864 pretix/base/settings.py:3879 +#: pretix/base/settings.py:3909 pretix/base/settings.py:3933 +#: pretix/base/settings.py:3965 pretix/base/settings.py:3987 +#: pretix/base/settings.py:4018 msgctxt "person_name_sample" msgid "John" msgstr "" -#: pretix/base/settings.py:3781 pretix/base/settings.py:3797 -#: pretix/base/settings.py:3813 pretix/base/settings.py:3829 -#: pretix/base/settings.py:3847 pretix/base/settings.py:3861 -#: pretix/base/settings.py:3891 pretix/base/settings.py:3947 -#: pretix/base/settings.py:3969 pretix/base/settings.py:4000 +#: pretix/base/settings.py:3800 pretix/base/settings.py:3816 +#: pretix/base/settings.py:3832 pretix/base/settings.py:3848 +#: pretix/base/settings.py:3866 pretix/base/settings.py:3880 +#: pretix/base/settings.py:3910 pretix/base/settings.py:3966 +#: pretix/base/settings.py:3988 pretix/base/settings.py:4019 msgctxt "person_name_sample" msgid "Doe" msgstr "" -#: pretix/base/settings.py:3787 pretix/base/settings.py:3803 -#: pretix/base/settings.py:3835 pretix/base/settings.py:3954 -#: pretix/base/settings.py:3976 +#: pretix/base/settings.py:3806 pretix/base/settings.py:3822 +#: pretix/base/settings.py:3854 pretix/base/settings.py:3973 +#: pretix/base/settings.py:3995 msgctxt "person_name" msgid "Title" msgstr "" -#: pretix/base/settings.py:3795 pretix/base/settings.py:3811 -#: pretix/base/settings.py:3844 pretix/base/settings.py:3967 -#: pretix/base/settings.py:3998 +#: pretix/base/settings.py:3814 pretix/base/settings.py:3830 +#: pretix/base/settings.py:3863 pretix/base/settings.py:3986 +#: pretix/base/settings.py:4017 msgctxt "person_name_sample" msgid "Dr" msgstr "" -#: pretix/base/settings.py:3819 pretix/base/settings.py:3836 +#: pretix/base/settings.py:3838 pretix/base/settings.py:3855 msgid "First name" msgstr "" -#: pretix/base/settings.py:3820 pretix/base/settings.py:3837 +#: pretix/base/settings.py:3839 pretix/base/settings.py:3856 msgid "Middle name" msgstr "" -#: pretix/base/settings.py:3901 pretix/base/settings.py:3913 -#: pretix/control/forms/organizer.py:793 +#: pretix/base/settings.py:3920 pretix/base/settings.py:3932 +#: pretix/control/forms/organizer.py:803 msgctxt "person_name_sample" msgid "John Doe" msgstr "" -#: pretix/base/settings.py:3907 +#: pretix/base/settings.py:3926 msgid "Calling name" msgstr "" -#: pretix/base/settings.py:3921 +#: pretix/base/settings.py:3940 msgid "Latin transcription" msgstr "" -#: pretix/base/settings.py:3933 pretix/base/settings.py:3953 -#: pretix/base/settings.py:3975 +#: pretix/base/settings.py:3952 pretix/base/settings.py:3972 +#: pretix/base/settings.py:3994 msgctxt "person_name" msgid "Salutation" msgstr "" -#: pretix/base/settings.py:3945 pretix/base/settings.py:3966 -#: pretix/base/settings.py:3997 +#: pretix/base/settings.py:3964 pretix/base/settings.py:3985 +#: pretix/base/settings.py:4016 msgctxt "person_name_sample" msgid "Mr" msgstr "" -#: pretix/base/settings.py:3979 +#: pretix/base/settings.py:3998 msgctxt "person_name" msgid "Degree (after name)" msgstr "" -#: pretix/base/settings.py:4001 +#: pretix/base/settings.py:4020 msgctxt "person_name_sample" msgid "MA" msgstr "" -#: pretix/base/settings.py:4027 pretix/base/settings.py:4029 +#: pretix/base/settings.py:4046 pretix/base/settings.py:4048 msgctxt "address" msgid "Province" msgstr "" -#: pretix/base/settings.py:4028 +#: pretix/base/settings.py:4047 msgctxt "address" msgid "Prefecture" msgstr "" -#: pretix/base/settings.py:4119 pretix/control/forms/event.py:242 +#: pretix/base/settings.py:4138 pretix/control/forms/event.py:242 msgid "" "Your default locale must also be enabled for your event (see box above)." msgstr "" -#: pretix/base/settings.py:4123 +#: pretix/base/settings.py:4142 msgid "" "You cannot require specifying attendee names if you do not ask for them." msgstr "" -#: pretix/base/settings.py:4127 +#: pretix/base/settings.py:4146 msgid "You have to ask for attendee emails if you want to make them required." msgstr "" -#: pretix/base/settings.py:4131 +#: pretix/base/settings.py:4150 msgid "" "You have to ask for invoice addresses if you want to make them required." msgstr "" -#: pretix/base/settings.py:4135 +#: pretix/base/settings.py:4154 msgid "You have to require invoice addresses to require for company names." msgstr "" -#: pretix/base/settings.py:4157 +#: pretix/base/settings.py:4176 #, python-brace-format msgid "VAT-ID is not supported for \"{}\"." msgstr "" -#: pretix/base/settings.py:4164 +#: pretix/base/settings.py:4183 msgid "The last payment date cannot be before the end of presale." msgstr "" -#: pretix/base/settings.py:4172 +#: pretix/base/settings.py:4191 #, python-brace-format msgid "The value \"{identifier}\" is not a valid sales channel." msgstr "" -#: pretix/base/settings.py:4187 +#: pretix/base/settings.py:4206 msgid "This needs to be disabled if other NFC-based types are active." msgstr "" @@ -11837,7 +12075,7 @@ msgid "You do not have access to this page." msgstr "" #: pretix/base/templates/403.html:20 pretix/base/templates/404.html:16 -#: pretix/control/templates/pretixcontrol/base.html:197 +#: pretix/control/templates/pretixcontrol/base.html:200 #: pretix/control/templates/pretixcontrol/user/staff_session_start.html:4 #: pretix/control/templates/pretixcontrol/user/staff_session_start.html:6 #: pretix/presale/templates/pretixpresale/event/offline.html:21 @@ -11939,7 +12177,7 @@ msgstr "" msgid "Click here to view and change your notification settings" msgstr "" -#: pretix/base/templates/pretixbase/email/notification.html:60 +#: pretix/base/templates/pretixbase/email/notification.html:61 msgid "Click here disable all notifications immediately." msgstr "" @@ -11989,6 +12227,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:98 #: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:114 #: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:21 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:214 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:390 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:114 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:95 @@ -12048,23 +12287,23 @@ msgstr "" msgid "%(number)s days %(relation)s %(relation_to)s at %(time_of_day)s" msgstr "" -#: pretix/base/templates/pretixbase/redirect.html:5 -#: pretix/base/templates/pretixbase/redirect.html:9 +#: pretix/base/templates/pretixbase/redirect.html:6 +#: pretix/base/templates/pretixbase/redirect.html:10 msgid "Redirect" msgstr "" -#: pretix/base/templates/pretixbase/redirect.html:11 +#: pretix/base/templates/pretixbase/redirect.html:12 #, python-format msgid "" "The link you clicked on wants to redirect you to a destination on the " "website %(host)s." msgstr "" -#: pretix/base/templates/pretixbase/redirect.html:14 +#: pretix/base/templates/pretixbase/redirect.html:15 msgid "Please only proceed if you trust this website to be safe." msgstr "" -#: pretix/base/templates/pretixbase/redirect.html:20 +#: pretix/base/templates/pretixbase/redirect.html:21 #, python-format msgid "Proceed to %(host)s" msgstr "" @@ -12394,11 +12633,18 @@ msgctxt "timeline" msgid "Payment provider \"{name}\" can no longer be selected" msgstr "" -#: pretix/base/validators.py:51 +#: pretix/base/validators.py:53 #, python-format msgid "This field has an invalid value: %(value)s." msgstr "" +#: pretix/base/validators.py:139 +#, python-format +msgid "" +"You entered an URL, which is not allowed. Please remove %(match)s from your " +"input." +msgstr "" + #: pretix/base/views/errors.py:48 msgid "" "You are seeing this message because this HTTPS site requires a 'Referer " @@ -12457,11 +12703,11 @@ msgctxt "tax_id_portugal" msgid "VAT ID / NIF" msgstr "" -#: pretix/base/views/tasks.py:185 +#: pretix/base/views/tasks.py:189 msgid "An unexpected error has occurred, please try again later." msgstr "" -#: pretix/base/views/tasks.py:188 +#: pretix/base/views/tasks.py:192 msgid "The task has been completed." msgstr "" @@ -12525,8 +12771,8 @@ msgid "Support for check-in questions" msgstr "" #: pretix/control/forms/checkin.py:197 pretix/control/forms/checkin.py:213 -#: pretix/control/forms/filter.py:2550 pretix/control/forms/filter.py:2592 -#: pretix/control/forms/filter.py:2757 +#: pretix/control/forms/filter.py:2683 pretix/control/forms/filter.py:2725 +#: pretix/control/forms/filter.py:2890 msgid "All gates" msgstr "" @@ -12623,7 +12869,7 @@ msgid "Copy configuration from" msgstr "" #: pretix/control/forms/event.py:350 pretix/control/forms/event.py:353 -#: pretix/control/forms/item.py:414 +#: pretix/control/forms/item.py:469 msgid "Do not copy" msgstr "" @@ -12633,8 +12879,8 @@ msgid "" "selected in the previous step." msgstr "" -#: pretix/control/forms/event.py:387 pretix/control/forms/item.py:1304 -#: pretix/control/forms/subevents.py:411 +#: pretix/control/forms/event.py:387 pretix/control/forms/item.py:1359 +#: pretix/control/forms/subevents.py:421 #, python-brace-format msgid "Default ({value})" msgstr "" @@ -12666,33 +12912,33 @@ msgid "" "{error}" msgstr "" -#: pretix/control/forms/event.py:587 pretix/control/forms/organizer.py:579 +#: pretix/control/forms/event.py:587 pretix/control/forms/organizer.py:588 msgid "Name format" msgstr "" -#: pretix/control/forms/event.py:588 pretix/control/forms/organizer.py:580 +#: pretix/control/forms/event.py:588 pretix/control/forms/organizer.py:589 msgid "" "This defines how pretix will ask for human names. Changing this after you " "already received orders might lead to unexpected behavior when sorting or " "changing names." msgstr "" -#: pretix/control/forms/event.py:593 pretix/control/forms/organizer.py:585 +#: pretix/control/forms/event.py:593 pretix/control/forms/organizer.py:594 msgid "Allowed titles" msgstr "" -#: pretix/control/forms/event.py:594 pretix/control/forms/organizer.py:586 +#: pretix/control/forms/event.py:594 pretix/control/forms/organizer.py:595 msgid "" "If the naming scheme you defined above allows users to input a title, you " "can use this to restrict the set of selectable titles." msgstr "" -#: pretix/control/forms/event.py:712 pretix/control/forms/organizer.py:661 +#: pretix/control/forms/event.py:712 pretix/control/forms/organizer.py:671 #, python-brace-format msgid "Ask for {fields}, display like {example}" msgstr "" -#: pretix/control/forms/event.py:718 pretix/control/forms/organizer.py:667 +#: pretix/control/forms/event.py:718 pretix/control/forms/organizer.py:677 msgid "Free text input" msgstr "" @@ -12828,15 +13074,15 @@ msgid "" "shop must be enabled." msgstr "" -#: pretix/control/forms/event.py:1150 pretix/control/forms/organizer.py:702 +#: pretix/control/forms/event.py:1150 pretix/control/forms/organizer.py:712 msgid "Bcc address" msgstr "" -#: pretix/control/forms/event.py:1152 pretix/control/forms/organizer.py:704 +#: pretix/control/forms/event.py:1152 pretix/control/forms/organizer.py:714 msgid "All emails will be sent to this address as a Bcc copy." msgstr "" -#: pretix/control/forms/event.py:1160 pretix/control/forms/organizer.py:713 +#: pretix/control/forms/event.py:1160 pretix/control/forms/organizer.py:723 msgid "Signature" msgstr "" @@ -12845,7 +13091,7 @@ msgstr "" msgid "This will be attached to every email. Available placeholders: {event}" msgstr "" -#: pretix/control/forms/event.py:1168 pretix/control/forms/organizer.py:721 +#: pretix/control/forms/event.py:1168 pretix/control/forms/organizer.py:731 msgid "e.g. your contact details" msgstr "" @@ -12893,8 +13139,8 @@ msgstr "" #: pretix/control/forms/event.py:1264 pretix/control/forms/event.py:1338 #: pretix/control/forms/event.py:1348 pretix/control/forms/event.py:1358 #: pretix/control/forms/event.py:1363 pretix/control/forms/event.py:1375 -#: pretix/control/forms/organizer.py:732 pretix/control/forms/organizer.py:742 -#: pretix/control/forms/organizer.py:752 pretix/control/forms/organizer.py:762 +#: pretix/control/forms/organizer.py:742 pretix/control/forms/organizer.py:752 +#: pretix/control/forms/organizer.py:762 pretix/control/forms/organizer.py:772 #: pretix/control/templates/pretixcontrol/event/mail.html:88 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:122 msgid "Text" @@ -13287,8 +13533,8 @@ msgid "Follow-up due" msgstr "" #: pretix/control/forms/filter.py:483 pretix/control/forms/filter.py:1267 -#: pretix/control/forms/filter.py:2053 pretix/control/forms/filter.py:2308 -#: pretix/control/forms/filter.py:2612 pretix/control/forms/filter.py:2631 +#: pretix/control/forms/filter.py:2186 pretix/control/forms/filter.py:2441 +#: pretix/control/forms/filter.py:2745 pretix/control/forms/filter.py:2764 #: pretix/control/forms/vouchers.py:151 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:121 #: pretix/plugins/sendmail/models.py:244 @@ -13296,19 +13542,19 @@ msgid "All products" msgstr "" #: pretix/control/forms/filter.py:487 pretix/control/forms/filter.py:1271 -#: pretix/control/forms/filter.py:2312 pretix/control/forms/filter.py:2616 -#: pretix/control/forms/vouchers.py:139 pretix/control/views/typeahead.py:663 -#: pretix/control/views/typeahead.py:780 +#: pretix/control/forms/filter.py:2445 pretix/control/forms/filter.py:2749 +#: pretix/control/forms/vouchers.py:139 pretix/control/views/typeahead.py:682 +#: pretix/control/views/typeahead.py:799 #, python-brace-format msgid "{product} – Any variation" msgstr "" -#: pretix/control/forms/filter.py:566 pretix/control/forms/orders.py:862 +#: pretix/control/forms/filter.py:566 pretix/control/forms/orders.py:870 msgctxt "subevent" msgid "All dates starting at or after" msgstr "" -#: pretix/control/forms/filter.py:572 pretix/control/forms/orders.py:869 +#: pretix/control/forms/filter.py:572 pretix/control/forms/orders.py:877 msgctxt "subevent" msgid "All dates starting before" msgstr "" @@ -13347,12 +13593,12 @@ msgstr "" #: pretix/control/forms/filter.py:927 pretix/control/forms/filter.py:932 #: pretix/control/forms/filter.py:1045 pretix/control/forms/filter.py:1050 -#: pretix/control/forms/filter.py:1842 pretix/control/forms/filter.py:1847 +#: pretix/control/forms/filter.py:1975 pretix/control/forms/filter.py:1980 msgid "All organizers" msgstr "" -#: pretix/control/forms/filter.py:1037 pretix/control/forms/filter.py:1826 -#: pretix/control/forms/filter.py:2836 +#: pretix/control/forms/filter.py:1037 pretix/control/forms/filter.py:1959 +#: pretix/control/forms/filter.py:2969 msgid "All events" msgstr "" @@ -13379,8 +13625,8 @@ msgstr "" #: pretix/control/forms/filter.py:1230 #: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html:31 #: pretix/control/templates/pretixcontrol/orders/overview.html:88 -#: pretix/plugins/checkinlists/exporters.py:504 -#: pretix/plugins/checkinlists/exporters.py:699 +#: pretix/plugins/checkinlists/exporters.py:503 +#: pretix/plugins/checkinlists/exporters.py:698 #: pretix/plugins/reports/exporters.py:397 #: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:23 msgid "Paid" @@ -13391,322 +13637,311 @@ msgctxt "subevent" msgid "Date doesn't start in selected date range." msgstr "" -#: pretix/control/forms/filter.py:1361 pretix/control/forms/filter.py:1828 +#: pretix/control/forms/filter.py:1367 pretix/control/forms/filter.py:1961 msgid "Shop live and presale running" msgstr "" -#: pretix/control/forms/filter.py:1362 pretix/control/forms/filter.py:2166 +#: pretix/control/forms/filter.py:1368 pretix/control/forms/filter.py:2299 msgid "Inactive" msgstr "" -#: pretix/control/forms/filter.py:1363 pretix/control/forms/filter.py:1830 -#: pretix/control/templates/pretixcontrol/events/index.html:170 -#: pretix/control/templates/pretixcontrol/organizers/detail.html:139 -#: pretix/control/templates/pretixcontrol/subevents/index.html:174 -msgid "Presale not started" -msgstr "" - -#: pretix/control/forms/filter.py:1364 pretix/control/forms/filter.py:1831 -#: pretix/control/templates/pretixcontrol/events/index.html:168 -#: pretix/control/templates/pretixcontrol/organizers/detail.html:137 -#: pretix/control/templates/pretixcontrol/subevents/index.html:172 -msgid "Presale over" -msgstr "" - -#: pretix/control/forms/filter.py:1369 pretix/control/forms/filter.py:1372 -#: pretix/control/forms/filter.py:1857 pretix/control/forms/filter.py:1860 -#: pretix/control/forms/filter.py:2490 +#: pretix/control/forms/filter.py:1375 pretix/control/forms/filter.py:1378 +#: pretix/control/forms/filter.py:1553 pretix/control/forms/filter.py:1556 +#: pretix/control/forms/filter.py:1990 pretix/control/forms/filter.py:1993 +#: pretix/control/forms/filter.py:2623 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html:84 msgid "Date from" msgstr "" -#: pretix/control/forms/filter.py:1376 pretix/control/forms/filter.py:1379 -#: pretix/control/forms/filter.py:1864 pretix/control/forms/filter.py:1867 -#: pretix/control/forms/filter.py:2495 +#: pretix/control/forms/filter.py:1382 pretix/control/forms/filter.py:1385 +#: pretix/control/forms/filter.py:1560 pretix/control/forms/filter.py:1563 +#: pretix/control/forms/filter.py:1997 pretix/control/forms/filter.py:2000 +#: pretix/control/forms/filter.py:2628 msgid "Date until" msgstr "" -#: pretix/control/forms/filter.py:1383 +#: pretix/control/forms/filter.py:1389 pretix/control/forms/filter.py:1567 msgid "Start time from" msgstr "" -#: pretix/control/forms/filter.py:1388 +#: pretix/control/forms/filter.py:1394 pretix/control/forms/filter.py:1572 msgid "Start time until" msgstr "" -#: pretix/control/forms/filter.py:1393 pretix/control/forms/rrule.py:112 -#: pretix/control/forms/rrule.py:151 +#: pretix/control/forms/filter.py:1399 pretix/control/forms/filter.py:1577 +#: pretix/control/forms/rrule.py:112 pretix/control/forms/rrule.py:151 msgid "Weekday" msgstr "" -#: pretix/control/forms/filter.py:1594 pretix/control/forms/filter.py:1596 -#: pretix/control/forms/filter.py:1645 pretix/control/forms/filter.py:1647 -#: pretix/control/forms/filter.py:1717 pretix/control/forms/filter.py:1719 -#: pretix/control/forms/filter.py:1771 pretix/control/forms/filter.py:1773 -#: pretix/control/forms/filter.py:2180 pretix/control/forms/filter.py:2182 -#: pretix/control/forms/filter.py:2748 pretix/control/forms/filter.py:2750 +#: pretix/control/forms/filter.py:1727 pretix/control/forms/filter.py:1729 +#: pretix/control/forms/filter.py:1778 pretix/control/forms/filter.py:1780 +#: pretix/control/forms/filter.py:1850 pretix/control/forms/filter.py:1852 +#: pretix/control/forms/filter.py:1904 pretix/control/forms/filter.py:1906 +#: pretix/control/forms/filter.py:2313 pretix/control/forms/filter.py:2315 +#: pretix/control/forms/filter.py:2881 pretix/control/forms/filter.py:2883 msgid "Search query" msgstr "" -#: pretix/control/forms/filter.py:1656 pretix/control/forms/filter.py:1728 +#: pretix/control/forms/filter.py:1789 pretix/control/forms/filter.py:1861 #: pretix/control/templates/pretixcontrol/organizers/customer.html:47 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:47 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:54 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:126 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:133 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:37 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:49 msgid "active" msgstr "" -#: pretix/control/forms/filter.py:1658 +#: pretix/control/forms/filter.py:1791 #: pretix/control/templates/pretixcontrol/organizers/customer.html:45 msgid "not yet activated" msgstr "" -#: pretix/control/forms/filter.py:1662 +#: pretix/control/forms/filter.py:1795 #: pretix/control/templates/pretixcontrol/organizers/customer.html:113 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:6 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:12 -#: pretix/presale/views/customer.py:368 +#: pretix/presale/views/customer.py:370 msgid "Memberships" msgstr "" -#: pretix/control/forms/filter.py:1666 +#: pretix/control/forms/filter.py:1799 msgid "Has no memberships" msgstr "" -#: pretix/control/forms/filter.py:1667 +#: pretix/control/forms/filter.py:1800 msgid "Has any membership" msgstr "" -#: pretix/control/forms/filter.py:1668 +#: pretix/control/forms/filter.py:1801 msgid "Has valid membership" msgstr "" -#: pretix/control/forms/filter.py:1827 +#: pretix/control/forms/filter.py:1960 msgid "Shop live" msgstr "" -#: pretix/control/forms/filter.py:1829 +#: pretix/control/forms/filter.py:1962 msgid "Shop not live" msgstr "" -#: pretix/control/forms/filter.py:1832 +#: pretix/control/forms/filter.py:1965 msgid "Single event running or in the future" msgstr "" -#: pretix/control/forms/filter.py:1833 +#: pretix/control/forms/filter.py:1966 msgid "Single event in the past" msgstr "" -#: pretix/control/forms/filter.py:2032 pretix/control/forms/filter.py:2034 +#: pretix/control/forms/filter.py:2165 pretix/control/forms/filter.py:2167 msgid "Search attendee…" msgstr "" -#: pretix/control/forms/filter.py:2039 -#: pretix/plugins/checkinlists/exporters.py:106 +#: pretix/control/forms/filter.py:2172 +#: pretix/plugins/checkinlists/exporters.py:107 msgid "Check-in status" msgstr "" -#: pretix/control/forms/filter.py:2041 -#: pretix/plugins/checkinlists/exporters.py:108 +#: pretix/control/forms/filter.py:2174 +#: pretix/plugins/checkinlists/exporters.py:109 msgid "All attendees" msgstr "" -#: pretix/control/forms/filter.py:2042 +#: pretix/control/forms/filter.py:2175 #: pretix/control/templates/pretixcontrol/checkin/index.html:183 #: pretix/control/templates/pretixcontrol/checkin/lists.html:104 -#: pretix/plugins/checkinlists/exporters.py:109 -#: pretix/plugins/checkinlists/exporters.py:501 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:138 +#: pretix/plugins/checkinlists/exporters.py:110 +#: pretix/plugins/checkinlists/exporters.py:500 msgid "Checked in" msgstr "" -#: pretix/control/forms/filter.py:2043 -#: pretix/plugins/checkinlists/exporters.py:110 +#: pretix/control/forms/filter.py:2176 +#: pretix/plugins/checkinlists/exporters.py:111 msgctxt "checkin state" msgid "Present" msgstr "" -#: pretix/control/forms/filter.py:2044 -#: pretix/plugins/checkinlists/exporters.py:111 +#: pretix/control/forms/filter.py:2177 +#: pretix/plugins/checkinlists/exporters.py:112 msgctxt "checkin state" msgid "Checked in but left" msgstr "" -#: pretix/control/forms/filter.py:2045 +#: pretix/control/forms/filter.py:2178 #: pretix/control/templates/pretixcontrol/checkin/index.html:178 -#: pretix/plugins/checkinlists/exporters.py:112 +#: pretix/plugins/checkinlists/exporters.py:113 msgid "Not checked in" msgstr "" -#: pretix/control/forms/filter.py:2064 +#: pretix/control/forms/filter.py:2197 msgctxt "subevent" msgid "Date start from" msgstr "" -#: pretix/control/forms/filter.py:2070 +#: pretix/control/forms/filter.py:2203 msgctxt "subevent" msgid "Date start until" msgstr "" -#: pretix/control/forms/filter.py:2171 pretix/control/forms/filter.py:2174 +#: pretix/control/forms/filter.py:2304 pretix/control/forms/filter.py:2307 #: pretix/control/templates/pretixcontrol/users/index.html:52 msgid "Administrator" msgstr "" -#: pretix/control/forms/filter.py:2175 +#: pretix/control/forms/filter.py:2308 msgid "No administrator" msgstr "" -#: pretix/control/forms/filter.py:2245 +#: pretix/control/forms/filter.py:2378 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:51 msgid "Valid" msgstr "" -#: pretix/control/forms/filter.py:2246 +#: pretix/control/forms/filter.py:2379 msgid "Unredeemed" msgstr "" -#: pretix/control/forms/filter.py:2247 +#: pretix/control/forms/filter.py:2380 msgid "Redeemed at least once" msgstr "" -#: pretix/control/forms/filter.py:2248 +#: pretix/control/forms/filter.py:2381 msgid "Fully redeemed" msgstr "" -#: pretix/control/forms/filter.py:2250 +#: pretix/control/forms/filter.py:2383 msgid "Redeemed and checked in with ticket" msgstr "" -#: pretix/control/forms/filter.py:2255 +#: pretix/control/forms/filter.py:2388 msgid "Quota handling" msgstr "" -#: pretix/control/forms/filter.py:2259 +#: pretix/control/forms/filter.py:2392 msgid "Allow to ignore quota" msgstr "" -#: pretix/control/forms/filter.py:2264 pretix/control/forms/filter.py:2266 +#: pretix/control/forms/filter.py:2397 pretix/control/forms/filter.py:2399 msgid "Filter by tag" msgstr "" -#: pretix/control/forms/filter.py:2271 pretix/control/forms/filter.py:2273 +#: pretix/control/forms/filter.py:2404 pretix/control/forms/filter.py:2406 msgid "Search voucher" msgstr "" -#: pretix/control/forms/filter.py:2318 pretix/control/forms/vouchers.py:130 -#: pretix/control/views/typeahead.py:788 pretix/control/views/typeahead.py:792 +#: pretix/control/forms/filter.py:2451 pretix/control/forms/vouchers.py:130 +#: pretix/control/views/typeahead.py:807 pretix/control/views/typeahead.py:811 #: pretix/control/views/vouchers.py:133 #, python-brace-format msgid "Any product in quota \"{quota}\"" msgstr "" -#: pretix/control/forms/filter.py:2440 +#: pretix/control/forms/filter.py:2573 msgid "Refund status" msgstr "" -#: pretix/control/forms/filter.py:2442 +#: pretix/control/forms/filter.py:2575 msgid "All open refunds" msgstr "" -#: pretix/control/forms/filter.py:2443 +#: pretix/control/forms/filter.py:2576 msgid "All refunds" msgstr "" -#: pretix/control/forms/filter.py:2481 pretix/plugins/reports/exporters.py:704 +#: pretix/control/forms/filter.py:2614 pretix/plugins/reports/exporters.py:704 msgid "Date filter" msgstr "" -#: pretix/control/forms/filter.py:2483 pretix/plugins/reports/exporters.py:706 +#: pretix/control/forms/filter.py:2616 pretix/plugins/reports/exporters.py:706 msgid "Filter by…" msgstr "" -#: pretix/control/forms/filter.py:2485 pretix/plugins/reports/exporters.py:708 +#: pretix/control/forms/filter.py:2618 pretix/plugins/reports/exporters.py:708 msgid "Date of last successful payment" msgstr "" -#: pretix/control/forms/filter.py:2525 +#: pretix/control/forms/filter.py:2658 msgid "All check-ins" msgstr "" -#: pretix/control/forms/filter.py:2526 +#: pretix/control/forms/filter.py:2659 msgid "Successful check-ins" msgstr "" -#: pretix/control/forms/filter.py:2527 +#: pretix/control/forms/filter.py:2660 msgid "Unsuccessful check-ins" msgstr "" -#: pretix/control/forms/filter.py:2532 +#: pretix/control/forms/filter.py:2665 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:64 -#: pretix/plugins/checkinlists/exporters.py:759 +#: pretix/plugins/checkinlists/exporters.py:758 msgid "Scan type" msgstr "" -#: pretix/control/forms/filter.py:2534 +#: pretix/control/forms/filter.py:2667 msgid "All directions" msgstr "" -#: pretix/control/forms/filter.py:2543 pretix/control/forms/filter.py:2583 +#: pretix/control/forms/filter.py:2676 pretix/control/forms/filter.py:2716 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:67 -#: pretix/plugins/checkinlists/exporters.py:765 +#: pretix/plugins/checkinlists/exporters.py:764 msgid "Device" msgstr "" -#: pretix/control/forms/filter.py:2544 pretix/control/forms/filter.py:2579 -#: pretix/control/forms/filter.py:2770 +#: pretix/control/forms/filter.py:2677 pretix/control/forms/filter.py:2712 +#: pretix/control/forms/filter.py:2903 msgid "All devices" msgstr "" -#: pretix/control/forms/filter.py:2558 +#: pretix/control/forms/filter.py:2691 msgctxt "filter" msgid "Start date" msgstr "" -#: pretix/control/forms/filter.py:2564 +#: pretix/control/forms/filter.py:2697 msgctxt "filter" msgid "End date" msgstr "" -#: pretix/control/forms/filter.py:2606 -#: pretix/plugins/checkinlists/exporters.py:883 +#: pretix/control/forms/filter.py:2739 +#: pretix/plugins/checkinlists/exporters.py:882 msgid "All check-in lists" msgstr "" -#: pretix/control/forms/filter.py:2610 +#: pretix/control/forms/filter.py:2743 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:64 -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:10 -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:25 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:11 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:26 #: pretix/plugins/autocheckin/forms.py:182 #: pretix/plugins/autocheckin/models.py:46 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:29 #: pretix/plugins/checkinlists/exporters.py:81 #: pretix/plugins/checkinlists/exporters.py:154 -#: pretix/plugins/checkinlists/exporters.py:475 -#: pretix/plugins/checkinlists/exporters.py:758 -#: pretix/plugins/checkinlists/exporters.py:846 +#: pretix/plugins/checkinlists/exporters.py:474 +#: pretix/plugins/checkinlists/exporters.py:757 +#: pretix/plugins/checkinlists/exporters.py:845 msgid "Check-in list" msgstr "" -#: pretix/control/forms/filter.py:2761 +#: pretix/control/forms/filter.py:2894 #: pretix/control/templates/pretixcontrol/organizers/devices.html:86 msgid "Software" msgstr "" -#: pretix/control/forms/filter.py:2768 +#: pretix/control/forms/filter.py:2901 msgid "Device status" msgstr "" -#: pretix/control/forms/filter.py:2771 +#: pretix/control/forms/filter.py:2904 msgid "Active devices" msgstr "" -#: pretix/control/forms/filter.py:2772 +#: pretix/control/forms/filter.py:2905 msgid "Revoked devices" msgstr "" -#: pretix/control/forms/filter.py:2827 pretix/control/forms/filter.py:2829 +#: pretix/control/forms/filter.py:2960 pretix/control/forms/filter.py:2962 msgid "Search email address or subject" msgstr "" @@ -13767,11 +14002,11 @@ msgid "" "association" msgstr "" -#: pretix/control/forms/global_settings.py:122 +#: pretix/control/forms/global_settings.py:129 msgid "Perform update checks" msgstr "" -#: pretix/control/forms/global_settings.py:123 +#: pretix/control/forms/global_settings.py:130 msgid "" "During the update check, pretix will report an anonymous, unique " "installation ID, the current version of pretix and your installed plugins " @@ -13781,297 +14016,297 @@ msgid "" "instance. You can disable this behavior here at any time." msgstr "" -#: pretix/control/forms/global_settings.py:131 +#: pretix/control/forms/global_settings.py:138 msgid "Email notifications" msgstr "" -#: pretix/control/forms/global_settings.py:132 +#: pretix/control/forms/global_settings.py:139 msgid "" "We will notify you at this address if we detect that a new update is " "available. This address will not be transmitted to pretix.eu, the emails " "will be sent by this server locally." msgstr "" -#: pretix/control/forms/global_settings.py:145 +#: pretix/control/forms/global_settings.py:152 msgid "Changes to pretix" msgstr "" -#: pretix/control/forms/global_settings.py:148 +#: pretix/control/forms/global_settings.py:155 msgid "" "This installation of pretix is running without any custom modifications or " "extensions (except for installed plugins)." msgstr "" -#: pretix/control/forms/global_settings.py:150 +#: pretix/control/forms/global_settings.py:157 msgid "" "This installation of pretix includes changes or extensions made to the " "source code." msgstr "" -#: pretix/control/forms/global_settings.py:155 +#: pretix/control/forms/global_settings.py:162 msgid "Usage of pretix" msgstr "" -#: pretix/control/forms/global_settings.py:158 +#: pretix/control/forms/global_settings.py:165 msgid "" "I only use pretix to organize events which are executed by my own company or " "its affiliated companies, or to sell products sold by my own company." msgstr "" -#: pretix/control/forms/global_settings.py:160 +#: pretix/control/forms/global_settings.py:167 msgid "" "I use pretix to sell tickets of other event organizers (e.g. a ticketing " "company) or I offer the functionality of pretix to others (e.g. a Software-" "as-a-Service company)." msgstr "" -#: pretix/control/forms/global_settings.py:162 +#: pretix/control/forms/global_settings.py:169 msgid "I'm not sure which option applies." msgstr "" -#: pretix/control/forms/global_settings.py:167 +#: pretix/control/forms/global_settings.py:174 msgid "License choice" msgstr "" -#: pretix/control/forms/global_settings.py:170 +#: pretix/control/forms/global_settings.py:177 msgid "" "I want to use pretix under the additional permission granted to everyone by " "the copyright holders which allows me to not share modifications if I only " "use pretix internally." msgstr "" -#: pretix/control/forms/global_settings.py:173 +#: pretix/control/forms/global_settings.py:180 msgid "" "I want to use pretix under the terms of the AGPLv3 license without " "restriction on the scope of usage and therefore without making use of any " "additional permission." msgstr "" -#: pretix/control/forms/global_settings.py:175 +#: pretix/control/forms/global_settings.py:182 msgid "" "I have obtained a paid pretix Enterprise license which is currently valid." msgstr "" -#: pretix/control/forms/global_settings.py:180 +#: pretix/control/forms/global_settings.py:187 msgid "" "This installation of pretix has installed plugins which are available freely " "under a non-copyleft license (Apache License, MIT License, BSD license, …)." msgstr "" -#: pretix/control/forms/global_settings.py:185 +#: pretix/control/forms/global_settings.py:192 msgid "" "This installation of pretix has installed plugins which are available freely " "under a license with strong copyleft (GPL, AGPL, …)." msgstr "" -#: pretix/control/forms/global_settings.py:190 +#: pretix/control/forms/global_settings.py:197 msgid "" "This installation of pretix has installed plugins which have been created " "internally or obtained under a proprietary license by a third party." msgstr "" -#: pretix/control/forms/global_settings.py:195 +#: pretix/control/forms/global_settings.py:202 msgid "" "This installation of pretix has installed pretix Enterprise plugins with a " "valid license." msgstr "" -#: pretix/control/forms/global_settings.py:199 +#: pretix/control/forms/global_settings.py:206 msgid "Footer: \"powered by\" name (optional)" msgstr "" -#: pretix/control/forms/global_settings.py:200 +#: pretix/control/forms/global_settings.py:207 msgid "" "If you want the \"powered by\" message in the page footer to include the " "name of your company or organization (if you made any changes to pretix), " "set the name here." msgstr "" -#: pretix/control/forms/global_settings.py:205 +#: pretix/control/forms/global_settings.py:212 msgid "Link for powered by name" msgstr "" -#: pretix/control/forms/global_settings.py:206 +#: pretix/control/forms/global_settings.py:213 msgid "" "If you used the previous option, you can set an URL to link to in the footer." msgstr "" -#: pretix/control/forms/global_settings.py:210 +#: pretix/control/forms/global_settings.py:217 msgid "Source code instructions" msgstr "" -#: pretix/control/forms/global_settings.py:212 +#: pretix/control/forms/global_settings.py:219 msgid "" "If you use pretix under AGPLv3 terms, describe exactly how to download the " "current source code of the site including all modifications and installed " "plugins. This will be publicly available. Make sure to keep it up to date!" msgstr "" -#: pretix/control/forms/item.py:99 +#: pretix/control/forms/item.py:100 msgid "" "Products in this category are regular products displayed on the front page." msgstr "" -#: pretix/control/forms/item.py:102 +#: pretix/control/forms/item.py:103 msgid "Add-on product category" msgstr "" -#: pretix/control/forms/item.py:103 +#: pretix/control/forms/item.py:104 msgid "" "Products in this category are add-on products and can only be bought as add-" "ons." msgstr "" -#: pretix/control/forms/item.py:107 +#: pretix/control/forms/item.py:108 msgid "" "Products in this category are regular products, but are only shown in the " "cross-selling step, according to the configuration below." msgstr "" -#: pretix/control/forms/item.py:112 +#: pretix/control/forms/item.py:113 msgid "" "Products in this category are regular products displayed on the front page, " "but are additionally shown in the cross-selling step, according to the " "configuration below." msgstr "" -#: pretix/control/forms/item.py:141 pretix/control/forms/item.py:217 +#: pretix/control/forms/item.py:142 pretix/control/forms/item.py:218 msgid "This field is required" msgstr "" -#: pretix/control/forms/item.py:219 +#: pretix/control/forms/item.py:220 msgid "Dependencies between questions are not supported during check-in." msgstr "" -#: pretix/control/forms/item.py:314 +#: pretix/control/forms/item.py:315 msgid "No products" msgstr "" -#: pretix/control/forms/item.py:354 +#: pretix/control/forms/item.py:355 #: pretix/control/templates/pretixcontrol/items/fragment_quota_availability.html:11 msgid "Unlimited" msgstr "" -#: pretix/control/forms/item.py:382 +#: pretix/control/forms/item.py:437 msgid "The product should exist in multiple variations" msgstr "" -#: pretix/control/forms/item.py:383 +#: pretix/control/forms/item.py:438 msgid "" "Select this option e.g. for t-shirts that come in multiple sizes. You can " "select the variations in the next step." msgstr "" -#: pretix/control/forms/item.py:403 pretix/control/forms/item.py:731 +#: pretix/control/forms/item.py:458 pretix/control/forms/item.py:786 msgid "No category" msgstr "" -#: pretix/control/forms/item.py:411 +#: pretix/control/forms/item.py:466 msgid "Copy product information" msgstr "" -#: pretix/control/forms/item.py:420 +#: pretix/control/forms/item.py:475 msgid "No taxation" msgstr "" -#: pretix/control/forms/item.py:424 +#: pretix/control/forms/item.py:479 msgid "Do not add to a quota now" msgstr "" -#: pretix/control/forms/item.py:425 +#: pretix/control/forms/item.py:480 msgid "Add product to an existing quota" msgstr "" -#: pretix/control/forms/item.py:426 +#: pretix/control/forms/item.py:481 msgid "Create a new quota for this product" msgstr "" -#: pretix/control/forms/item.py:432 +#: pretix/control/forms/item.py:487 msgid "Quota options" msgstr "" -#: pretix/control/forms/item.py:440 +#: pretix/control/forms/item.py:495 msgid "Add to existing quota" msgstr "" -#: pretix/control/forms/item.py:449 +#: pretix/control/forms/item.py:504 msgid "New quota name" msgstr "" -#: pretix/control/forms/item.py:455 +#: pretix/control/forms/item.py:510 msgid "Size" msgstr "" -#: pretix/control/forms/item.py:456 +#: pretix/control/forms/item.py:511 msgid "Number of tickets" msgstr "" -#: pretix/control/forms/item.py:590 +#: pretix/control/forms/item.py:645 msgid "Quota name is required." msgstr "" -#: pretix/control/forms/item.py:595 +#: pretix/control/forms/item.py:650 msgid "Please select a quota." msgstr "" -#: pretix/control/forms/item.py:617 pretix/plugins/badges/forms.py:85 +#: pretix/control/forms/item.py:672 pretix/plugins/badges/forms.py:85 #: pretix/plugins/ticketoutputpdf/forms.py:55 msgid "(Event default)" msgstr "" -#: pretix/control/forms/item.py:627 +#: pretix/control/forms/item.py:682 msgid "Choose automatically depending on event settings" msgstr "" -#: pretix/control/forms/item.py:628 +#: pretix/control/forms/item.py:683 msgid "Yes, if ticket generation is enabled in general" msgstr "" -#: pretix/control/forms/item.py:646 +#: pretix/control/forms/item.py:701 msgid "" "e.g. This reduced price is available for full-time students, jobless and " "people over 65. This ticket includes access to all parts of the event, " "except the VIP area." msgstr "" -#: pretix/control/forms/item.py:690 +#: pretix/control/forms/item.py:745 msgid "" "This option is deprecated. For new products, use the newer option below that " "refers to another product instead of a quota." msgstr "" -#: pretix/control/forms/item.py:701 pretix/control/forms/item.py:717 +#: pretix/control/forms/item.py:756 pretix/control/forms/item.py:772 msgid "Shown independently of other products" msgstr "" -#: pretix/control/forms/item.py:742 +#: pretix/control/forms/item.py:797 msgid "Date chosen by customer" msgstr "" -#: pretix/control/forms/item.py:751 +#: pretix/control/forms/item.py:806 msgid "No membership granted" msgstr "" -#: pretix/control/forms/item.py:770 +#: pretix/control/forms/item.py:825 msgid "" "Gift card products should use a tax rule with a rate of 0 percent since " "sales tax will be applied when the gift card is redeemed." msgstr "" -#: pretix/control/forms/item.py:776 +#: pretix/control/forms/item.py:831 msgid "" "Do not set a specific validity for gift card products as it will not " "restrict the validity of the gift card. A validity of gift cards can be set " "in your organizer settings." msgstr "" -#: pretix/control/forms/item.py:795 pretix/control/forms/item.py:1062 +#: pretix/control/forms/item.py:850 pretix/control/forms/item.py:1117 msgid "" "If a valid membership is required, at least one valid membership type needs " "to be selected." msgstr "" -#: pretix/control/forms/item.py:806 +#: pretix/control/forms/item.py:861 msgid "" "Your product grants a non-transferable membership and should therefore be a " "personalized admission ticket. Otherwise customers might not be able to use " @@ -14079,17 +14314,17 @@ msgid "" "the membership type to be transferable." msgstr "" -#: pretix/control/forms/item.py:815 +#: pretix/control/forms/item.py:870 msgid "The start of validity must be before the end of validity." msgstr "" -#: pretix/control/forms/item.py:822 +#: pretix/control/forms/item.py:877 msgid "" "You have selected dynamic validity but have not entered a time period. This " "would render the tickets unusable." msgstr "" -#: pretix/control/forms/item.py:927 +#: pretix/control/forms/item.py:982 #, python-format msgid "" "The variation \"%s\" cannot be deleted because it has already been ordered " @@ -14097,45 +14332,45 @@ msgid "" "\"inactive\" instead." msgstr "" -#: pretix/control/forms/item.py:1004 +#: pretix/control/forms/item.py:1059 msgid "Use value from product" msgstr "" -#: pretix/control/forms/item.py:1089 +#: pretix/control/forms/item.py:1144 msgid "Add-ons" msgstr "" -#: pretix/control/forms/item.py:1113 +#: pretix/control/forms/item.py:1168 msgid "You added the same add-on category twice" msgstr "" -#: pretix/control/forms/item.py:1158 +#: pretix/control/forms/item.py:1213 msgid "" "Be aware that setting a minimal number makes it impossible to buy this " "product if all available add-ons are sold out." msgstr "" -#: pretix/control/forms/item.py:1165 +#: pretix/control/forms/item.py:1220 msgid "Bundled products" msgstr "" -#: pretix/control/forms/item.py:1215 +#: pretix/control/forms/item.py:1270 msgid "You added the same bundled product twice." msgstr "" -#: pretix/control/forms/item.py:1221 +#: pretix/control/forms/item.py:1276 #: pretix/control/templates/pretixcontrol/item/include_bundles.html:23 #: pretix/control/templates/pretixcontrol/item/include_bundles.html:50 msgid "Bundled product" msgstr "" -#: pretix/control/forms/item.py:1246 pretix/control/forms/orders.py:379 -#: pretix/control/forms/orders.py:568 +#: pretix/control/forms/item.py:1301 pretix/control/forms/orders.py:383 +#: pretix/control/forms/orders.py:576 msgid "inactive" msgstr "" -#: pretix/control/forms/item.py:1331 -msgid "Program times" +#: pretix/control/forms/item.py:1414 +msgid "Sample Conference Center, Heidelberg, Germany" msgstr "" #: pretix/control/forms/mailsetup.py:42 @@ -14404,11 +14639,15 @@ msgstr "" msgid "Allow to overbook quotas when performing this operation" msgstr "" -#: pretix/control/forms/orders.py:340 +#: pretix/control/forms/orders.py:335 +msgid "Number of products to add" +msgstr "" + +#: pretix/control/forms/orders.py:344 msgid "Add-on to" msgstr "" -#: pretix/control/forms/orders.py:345 +#: pretix/control/forms/orders.py:349 #: pretix/control/templates/pretixcontrol/checkin/index.html:104 #: pretix/control/templates/pretixcontrol/order/change.html:127 #: pretix/control/views/vouchers.py:121 @@ -14417,161 +14656,165 @@ msgstr "" msgid "Seat" msgstr "" -#: pretix/control/forms/orders.py:348 +#: pretix/control/forms/orders.py:352 #: pretix/control/templates/pretixcontrol/order/change.html:182 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:5 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:9 #: pretix/control/templates/pretixcontrol/organizers/customer_membership_delete.html:5 #: pretix/control/templates/pretixcontrol/organizers/customer_membership_delete.html:9 -#: pretix/presale/forms/checkout.py:238 +#: pretix/presale/forms/checkout.py:195 msgid "Membership" msgstr "" -#: pretix/control/forms/orders.py:356 +#: pretix/control/forms/orders.py:360 msgid "Including taxes, if any. Keep empty for the product's default price" msgstr "" -#: pretix/control/forms/orders.py:470 pretix/control/forms/orders.py:474 -#: pretix/control/forms/orders.py:502 pretix/control/forms/orders.py:544 -#: pretix/control/forms/orders.py:563 pretix/control/forms/orders.py:581 -#: pretix/control/forms/orders.py:609 +#: pretix/control/forms/orders.py:441 +msgid "You can not choose a seat when adding multiple products at once." +msgstr "" + +#: pretix/control/forms/orders.py:478 pretix/control/forms/orders.py:482 +#: pretix/control/forms/orders.py:510 pretix/control/forms/orders.py:552 +#: pretix/control/forms/orders.py:571 pretix/control/forms/orders.py:589 +#: pretix/control/forms/orders.py:617 msgid "(Unchanged)" msgstr "" -#: pretix/control/forms/orders.py:480 pretix/control/forms/orders.py:604 +#: pretix/control/forms/orders.py:488 pretix/control/forms/orders.py:612 msgid "New price (gross)" msgstr "" -#: pretix/control/forms/orders.py:484 +#: pretix/control/forms/orders.py:492 msgid "Ticket is blocked" msgstr "" -#: pretix/control/forms/orders.py:489 +#: pretix/control/forms/orders.py:497 msgid "Validity start" msgstr "" -#: pretix/control/forms/orders.py:494 +#: pretix/control/forms/orders.py:502 msgid "Validity end" msgstr "" -#: pretix/control/forms/orders.py:506 +#: pretix/control/forms/orders.py:514 msgid "Generate a new secret" msgstr "" -#: pretix/control/forms/orders.py:507 +#: pretix/control/forms/orders.py:515 msgid "" "This affects both the ticket secret (often used as a QR code) as well as the " "link used to individually access the ticket." msgstr "" -#: pretix/control/forms/orders.py:512 +#: pretix/control/forms/orders.py:520 msgid "Cancel this position" msgstr "" -#: pretix/control/forms/orders.py:516 +#: pretix/control/forms/orders.py:524 msgid "Split into new order" msgstr "" -#: pretix/control/forms/orders.py:582 +#: pretix/control/forms/orders.py:590 msgid "(No membership)" msgstr "" -#: pretix/control/forms/orders.py:613 +#: pretix/control/forms/orders.py:621 msgid "Remove this fee" msgstr "" -#: pretix/control/forms/orders.py:631 +#: pretix/control/forms/orders.py:639 msgid "" "Note that payment fees have a special semantic and might automatically be " "changed if the payment method of the order is changed." msgstr "" -#: pretix/control/forms/orders.py:639 +#: pretix/control/forms/orders.py:647 #: pretix/control/templates/pretixcontrol/order/change.html:214 -#: pretix/control/templates/pretixcontrol/order/change.html:438 +#: pretix/control/templates/pretixcontrol/order/change.html:440 msgid "including all taxes" msgstr "" -#: pretix/control/forms/orders.py:677 +#: pretix/control/forms/orders.py:685 msgid "Invalidate secrets" msgstr "" -#: pretix/control/forms/orders.py:678 +#: pretix/control/forms/orders.py:686 msgid "" "Regenerates the order and ticket secrets. You will need to re-send the link " "to the order page to the user and the user will need to download his tickets " "again. The old versions will be invalid." msgstr "" -#: pretix/control/forms/orders.py:734 pretix/plugins/sendmail/forms.py:196 +#: pretix/control/forms/orders.py:742 pretix/plugins/sendmail/forms.py:196 msgid "Attach tickets" msgstr "" -#: pretix/control/forms/orders.py:735 pretix/plugins/sendmail/forms.py:197 +#: pretix/control/forms/orders.py:743 pretix/plugins/sendmail/forms.py:197 msgid "" "Will be ignored if tickets exceed a given size limit to ensure email " "deliverability." msgstr "" -#: pretix/control/forms/orders.py:742 +#: pretix/control/forms/orders.py:750 msgid "Attach invoices" msgstr "" -#: pretix/control/forms/orders.py:763 +#: pretix/control/forms/orders.py:771 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:20 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:30 msgid "Recipient" msgstr "" -#: pretix/control/forms/orders.py:778 +#: pretix/control/forms/orders.py:786 #, python-brace-format msgid "Attach {file}" msgstr "" -#: pretix/control/forms/orders.py:806 +#: pretix/control/forms/orders.py:814 msgid "" "Cancel the order. All tickets will no longer work. This can not be reverted." msgstr "" -#: pretix/control/forms/orders.py:807 +#: pretix/control/forms/orders.py:815 msgid "" "Mark the order as pending and allow the user to pay the open amount with " "another payment method." msgstr "" -#: pretix/control/forms/orders.py:809 +#: pretix/control/forms/orders.py:817 msgid "Do nothing and keep the order as it is." msgstr "" -#: pretix/control/forms/orders.py:836 +#: pretix/control/forms/orders.py:844 #, python-brace-format msgid "The refund amount needs to be positive and less than {}." msgstr "" -#: pretix/control/forms/orders.py:842 +#: pretix/control/forms/orders.py:850 msgid "You need to specify an amount for a partial refund." msgstr "" -#: pretix/control/forms/orders.py:854 +#: pretix/control/forms/orders.py:862 msgid "Cancel all dates" msgstr "" -#: pretix/control/forms/orders.py:873 +#: pretix/control/forms/orders.py:881 msgid "Automatically refund money if possible" msgstr "" -#: pretix/control/forms/orders.py:876 +#: pretix/control/forms/orders.py:884 msgid "" "Only available for payment method that support automatic refunds. Tickets " "that have been blocked (manually or by a plugin) are not auto-canceled and " "you will need to deal with them manually." msgstr "" -#: pretix/control/forms/orders.py:880 +#: pretix/control/forms/orders.py:888 msgid "Create refund in the manual refund to-do list" msgstr "" -#: pretix/control/forms/orders.py:883 +#: pretix/control/forms/orders.py:891 msgid "" "Manual refunds will be created which will be listed in the manual refund to-" "do list. When combined with the automatic refund functionally, only payments " @@ -14580,29 +14823,29 @@ msgid "" "orders by offsetting with different orders or issuing gift cards." msgstr "" -#: pretix/control/forms/orders.py:889 +#: pretix/control/forms/orders.py:897 msgid "" "Refund order value to a gift card instead instead of the original payment " "method" msgstr "" -#: pretix/control/forms/orders.py:895 +#: pretix/control/forms/orders.py:903 msgid "Gift card validity" msgstr "" -#: pretix/control/forms/orders.py:914 +#: pretix/control/forms/orders.py:922 msgid "Keep a fixed cancellation fee per ticket" msgstr "" -#: pretix/control/forms/orders.py:915 +#: pretix/control/forms/orders.py:923 msgid "Free tickets and add-on products are not counted" msgstr "" -#: pretix/control/forms/orders.py:925 +#: pretix/control/forms/orders.py:933 msgid "Keep fees" msgstr "" -#: pretix/control/forms/orders.py:928 +#: pretix/control/forms/orders.py:936 msgid "" "The selected types of fees will not be refunded but instead added to the " "cancellation fee. Fees are never refunded in when an order in an event " @@ -14610,20 +14853,20 @@ msgid "" "dates." msgstr "" -#: pretix/control/forms/orders.py:934 +#: pretix/control/forms/orders.py:942 msgid "Send information via email" msgstr "" -#: pretix/control/forms/orders.py:940 +#: pretix/control/forms/orders.py:948 msgid "Send information to waiting list" msgstr "" -#: pretix/control/forms/orders.py:955 pretix/control/forms/orders.py:981 +#: pretix/control/forms/orders.py:963 pretix/control/forms/orders.py:989 #, python-brace-format msgid "Canceled: {event}" msgstr "" -#: pretix/control/forms/orders.py:966 +#: pretix/control/forms/orders.py:974 #, python-brace-format msgid "" "Hello,\n" @@ -14641,7 +14884,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/control/forms/orders.py:993 +#: pretix/control/forms/orders.py:1001 #, python-brace-format msgid "" "Hello,\n" @@ -14655,37 +14898,37 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/control/forms/orders.py:1025 pretix/plugins/sendmail/forms.py:115 +#: pretix/control/forms/orders.py:1033 pretix/plugins/sendmail/forms.py:115 #: pretix/plugins/sendmail/forms.py:208 msgctxt "subevent" msgid "Please either select a specific date or a date range, not both." msgstr "" -#: pretix/control/forms/orders.py:1027 +#: pretix/control/forms/orders.py:1035 msgctxt "subevent" msgid "Please either select all dates or a date range, not both." msgstr "" -#: pretix/control/forms/orders.py:1029 pretix/plugins/sendmail/forms.py:117 +#: pretix/control/forms/orders.py:1037 pretix/plugins/sendmail/forms.py:117 #: pretix/plugins/sendmail/forms.py:210 msgctxt "subevent" msgid "If you set a date range, please set both a start and an end." msgstr "" -#: pretix/control/forms/orders.py:1031 +#: pretix/control/forms/orders.py:1039 msgid "Please confirm that you want to cancel ALL dates in this event series." msgstr "" -#: pretix/control/forms/orders.py:1037 +#: pretix/control/forms/orders.py:1045 msgid "I understand that this is not reversible and want to continue" msgstr "" -#: pretix/control/forms/orders.py:1042 +#: pretix/control/forms/orders.py:1050 msgid "" "We have just emailed you a confirmation code to enter to confirm this action" msgstr "" -#: pretix/control/forms/orders.py:1055 +#: pretix/control/forms/orders.py:1063 msgid "The confirmation code is incorrect." msgstr "" @@ -14719,111 +14962,111 @@ msgstr "" msgid "You may set only one organizer domain." msgstr "" -#: pretix/control/forms/organizer.py:322 +#: pretix/control/forms/organizer.py:331 msgid "Provided by a plugin" msgstr "" -#: pretix/control/forms/organizer.py:438 +#: pretix/control/forms/organizer.py:447 msgid "" "The changes could not be saved because there would be no remaining team with " "the permission to change teams and permissions." msgstr "" -#: pretix/control/forms/organizer.py:487 pretix/control/forms/organizer.py:525 +#: pretix/control/forms/organizer.py:496 pretix/control/forms/organizer.py:534 msgid "" "Your device will not have access to anything, please select some events." msgstr "" -#: pretix/control/forms/organizer.py:677 pretix/plugins/stripe/payment.py:330 +#: pretix/control/forms/organizer.py:687 pretix/plugins/stripe/payment.py:330 msgid "experimental" msgstr "" -#: pretix/control/forms/organizer.py:683 +#: pretix/control/forms/organizer.py:693 msgid "" "This feature is currently in an experimental stage. It only supports very " "limited use cases and might change at any point." msgstr "" -#: pretix/control/forms/organizer.py:706 +#: pretix/control/forms/organizer.py:716 msgid "Sensitive emails like password resets will not be sent in Bcc." msgstr "" -#: pretix/control/forms/organizer.py:716 +#: pretix/control/forms/organizer.py:726 msgid "This will be attached to every email." msgstr "" -#: pretix/control/forms/organizer.py:790 pretix/control/logdisplay.py:671 +#: pretix/control/forms/organizer.py:800 pretix/control/logdisplay.py:671 #: pretix/control/views/user.py:850 pretix/presale/views/customer.py:289 -#: pretix/presale/views/customer.py:545 +#: pretix/presale/views/customer.py:547 msgid "Your password has been changed." msgstr "" -#: pretix/control/forms/organizer.py:823 +#: pretix/control/forms/organizer.py:833 msgctxt "webhooks" msgid "Event types" msgstr "" -#: pretix/control/forms/organizer.py:857 +#: pretix/control/forms/organizer.py:867 msgid "Gift card value" msgstr "" -#: pretix/control/forms/organizer.py:961 +#: pretix/control/forms/organizer.py:971 msgid "An medium with this type and identifier is already registered." msgstr "" -#: pretix/control/forms/organizer.py:1059 +#: pretix/control/forms/organizer.py:1069 msgid "An account with this customer ID is already registered." msgstr "" -#: pretix/control/forms/organizer.py:1076 +#: pretix/control/forms/organizer.py:1086 #: pretix/control/templates/pretixcontrol/organizers/customer.html:62 -#: pretix/presale/forms/customer.py:169 pretix/presale/forms/customer.py:506 +#: pretix/presale/forms/customer.py:169 pretix/presale/forms/customer.py:507 msgid "Phone" msgstr "" -#: pretix/control/forms/organizer.py:1190 +#: pretix/control/forms/organizer.py:1200 msgctxt "sso_oidc" msgid "Base URL" msgstr "" -#: pretix/control/forms/organizer.py:1194 +#: pretix/control/forms/organizer.py:1204 msgctxt "sso_oidc" msgid "Client ID" msgstr "" -#: pretix/control/forms/organizer.py:1198 +#: pretix/control/forms/organizer.py:1208 msgctxt "sso_oidc" msgid "Client secret" msgstr "" -#: pretix/control/forms/organizer.py:1202 +#: pretix/control/forms/organizer.py:1212 msgctxt "sso_oidc" msgid "Scope" msgstr "" -#: pretix/control/forms/organizer.py:1203 +#: pretix/control/forms/organizer.py:1213 msgctxt "sso_oidc" msgid "Multiple scopes separated with spaces." msgstr "" -#: pretix/control/forms/organizer.py:1207 +#: pretix/control/forms/organizer.py:1217 msgctxt "sso_oidc" msgid "User ID field" msgstr "" -#: pretix/control/forms/organizer.py:1208 +#: pretix/control/forms/organizer.py:1218 msgctxt "sso_oidc" msgid "" "We will assume that the contents of the user ID fields are unique and can " "never change for a user." msgstr "" -#: pretix/control/forms/organizer.py:1214 +#: pretix/control/forms/organizer.py:1224 msgctxt "sso_oidc" msgid "Email field" msgstr "" -#: pretix/control/forms/organizer.py:1215 +#: pretix/control/forms/organizer.py:1225 msgctxt "sso_oidc" msgid "" "We will assume that all email addresses received from the SSO provider are " @@ -14831,17 +15074,17 @@ msgid "" "security issues might arise." msgstr "" -#: pretix/control/forms/organizer.py:1222 +#: pretix/control/forms/organizer.py:1232 msgctxt "sso_oidc" msgid "Phone field" msgstr "" -#: pretix/control/forms/organizer.py:1226 +#: pretix/control/forms/organizer.py:1236 msgctxt "sso_oidc" msgid "Query parameters" msgstr "" -#: pretix/control/forms/organizer.py:1227 +#: pretix/control/forms/organizer.py:1237 #, python-brace-format msgctxt "sso_oidc" msgid "" @@ -14849,19 +15092,19 @@ msgid "" "endpoint. Enter as: {example}" msgstr "" -#: pretix/control/forms/organizer.py:1288 +#: pretix/control/forms/organizer.py:1298 msgid "Invalidate old client secret and generate a new one" msgstr "" -#: pretix/control/forms/organizer.py:1321 +#: pretix/control/forms/organizer.py:1331 msgid "Organizer short name" msgstr "" -#: pretix/control/forms/organizer.py:1325 +#: pretix/control/forms/organizer.py:1335 msgid "Allow access to reusable media" msgstr "" -#: pretix/control/forms/organizer.py:1326 +#: pretix/control/forms/organizer.py:1336 msgid "" "This is required if you want the other organizer to participate in a shared " "system with e.g. NFC payment chips. You should only use this option for " @@ -14870,19 +15113,19 @@ msgid "" "to interact with the media type." msgstr "" -#: pretix/control/forms/organizer.py:1342 +#: pretix/control/forms/organizer.py:1352 msgid "The selected organizer does not exist or cannot be invited." msgstr "" -#: pretix/control/forms/organizer.py:1344 +#: pretix/control/forms/organizer.py:1354 msgid "The selected organizer has already been invited." msgstr "" -#: pretix/control/forms/organizer.py:1379 +#: pretix/control/forms/organizer.py:1389 msgid "A sales channel with the same identifier already exists." msgstr "" -#: pretix/control/forms/organizer.py:1391 +#: pretix/control/forms/organizer.py:1401 msgid "Events with active plugin" msgstr "" @@ -14958,23 +15201,37 @@ msgstr "" msgid "Weekend day" msgstr "" -#: pretix/control/forms/subevents.py:118 +#: pretix/control/forms/subevents.py:106 +msgctxt "subevent" +msgid "Skip dates that overlap with any existing date" +msgstr "" + +#: pretix/control/forms/subevents.py:109 +msgctxt "subevent" +msgid "" +"This can be useful if all your dates happen in the same location and no " +"repeated dates should be created in conflict with existing special events. " +"This respects even inactive dates and works best if all dates have both a " +"start and end time." +msgstr "" + +#: pretix/control/forms/subevents.py:128 msgid "Keep the current values" msgstr "" -#: pretix/control/forms/subevents.py:135 pretix/control/forms/subevents.py:141 +#: pretix/control/forms/subevents.py:145 pretix/control/forms/subevents.py:151 msgid "Selection contains various values" msgstr "" -#: pretix/control/forms/subevents.py:288 pretix/control/forms/subevents.py:317 +#: pretix/control/forms/subevents.py:298 pretix/control/forms/subevents.py:327 msgid "The end of availability should be after the start of availability." msgstr "" -#: pretix/control/forms/subevents.py:350 +#: pretix/control/forms/subevents.py:360 msgid "Available_until" msgstr "" -#: pretix/control/forms/subevents.py:470 +#: pretix/control/forms/subevents.py:480 msgid "Exclude these dates instead of adding them." msgstr "" @@ -15335,7 +15592,7 @@ msgid "The check-in of position #{posid} on list \"{list}\" has been reverted." msgstr "" #: pretix/control/logdisplay.py:359 pretix/control/logdisplay.py:361 -#: pretix/control/logdisplay.py:995 pretix/control/logdisplay.py:997 +#: pretix/control/logdisplay.py:998 pretix/control/logdisplay.py:1000 msgid "(unknown)" msgstr "" @@ -15385,7 +15642,7 @@ msgstr "" msgid "The order has been canceled (comment: \"{comment}\")." msgstr "" -#: pretix/control/logdisplay.py:422 pretix/control/views/orders.py:1569 +#: pretix/control/logdisplay.py:422 pretix/control/views/orders.py:1573 #: pretix/presale/views/order.py:1138 msgid "The order has been canceled." msgstr "" @@ -15424,11 +15681,11 @@ msgstr "" msgid "Internal error while transferring data to {provider_display_name}." msgstr "" -#: pretix/control/logdisplay.py:489 pretix/control/logdisplay.py:842 +#: pretix/control/logdisplay.py:489 pretix/control/logdisplay.py:845 msgid "The settings of a payment provider have been changed." msgstr "" -#: pretix/control/logdisplay.py:492 pretix/control/logdisplay.py:841 +#: pretix/control/logdisplay.py:492 pretix/control/logdisplay.py:844 msgid "The settings of a ticket output provider have been changed." msgstr "" @@ -15469,11 +15726,11 @@ msgstr "" msgid "The order has been set to require payment before use." msgstr "" -#: pretix/control/logdisplay.py:511 pretix/control/views/orders.py:1574 +#: pretix/control/logdisplay.py:511 pretix/control/views/orders.py:1578 msgid "The order has been marked as expired." msgstr "" -#: pretix/control/logdisplay.py:512 pretix/control/views/orders.py:1476 +#: pretix/control/logdisplay.py:512 pretix/control/views/orders.py:1480 msgid "The order has been marked as paid." msgstr "" @@ -15485,7 +15742,7 @@ msgstr "" msgid "The order has been refunded." msgstr "" -#: pretix/control/logdisplay.py:515 pretix/control/views/orders.py:1914 +#: pretix/control/logdisplay.py:515 pretix/control/views/orders.py:1918 msgid "The order has been reactivated." msgstr "" @@ -15497,7 +15754,7 @@ msgstr "" msgid "The order requires approval before it can continue to be processed." msgstr "" -#: pretix/control/logdisplay.py:519 pretix/control/views/orders.py:796 +#: pretix/control/logdisplay.py:519 pretix/control/views/orders.py:800 msgid "The order has been approved." msgstr "" @@ -15536,7 +15793,7 @@ msgstr "" msgid "The order locale has been changed." msgstr "" -#: pretix/control/logdisplay.py:531 pretix/control/views/orders.py:1613 +#: pretix/control/logdisplay.py:531 pretix/control/views/orders.py:1617 #: pretix/presale/views/order.py:797 pretix/presale/views/order.py:877 msgid "The invoice has been generated." msgstr "" @@ -15545,11 +15802,11 @@ msgstr "" msgid "The invoice could not be generated." msgstr "" -#: pretix/control/logdisplay.py:533 pretix/control/views/orders.py:1694 +#: pretix/control/logdisplay.py:533 pretix/control/views/orders.py:1698 msgid "The invoice has been regenerated." msgstr "" -#: pretix/control/logdisplay.py:534 pretix/control/views/orders.py:1751 +#: pretix/control/logdisplay.py:534 pretix/control/views/orders.py:1755 #: pretix/presale/views/order.py:897 msgid "The invoice has been reissued." msgstr "" @@ -15607,7 +15864,7 @@ msgid "An unidentified type email has been sent." msgstr "" #: pretix/control/logdisplay.py:549 pretix/control/logdisplay.py:742 -#: pretix/control/logdisplay.py:748 pretix/control/logdisplay.py:776 +#: pretix/control/logdisplay.py:751 pretix/control/logdisplay.py:779 msgid "Sending of an email has failed." msgstr "" @@ -15803,7 +16060,7 @@ msgstr "" msgid "Your account has been disabled." msgstr "" -#: pretix/control/logdisplay.py:680 pretix/presale/views/customer.py:642 +#: pretix/control/logdisplay.py:680 pretix/presale/views/customer.py:644 #, python-brace-format msgid "Your email address has been changed from {old_email} to {email}." msgstr "" @@ -15835,27 +16092,27 @@ msgstr "" msgid "The organizer settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:704 pretix/control/logdisplay.py:849 +#: pretix/control/logdisplay.py:704 pretix/control/logdisplay.py:852 msgid "The footer links have been changed." msgstr "" -#: pretix/control/logdisplay.py:705 pretix/control/logdisplay.py:754 +#: pretix/control/logdisplay.py:705 pretix/control/logdisplay.py:757 msgid "A scheduled export has been added." msgstr "" -#: pretix/control/logdisplay.py:706 pretix/control/logdisplay.py:755 +#: pretix/control/logdisplay.py:706 pretix/control/logdisplay.py:758 msgid "A scheduled export has been changed." msgstr "" -#: pretix/control/logdisplay.py:707 pretix/control/logdisplay.py:756 +#: pretix/control/logdisplay.py:707 pretix/control/logdisplay.py:759 msgid "A scheduled export has been deleted." msgstr "" -#: pretix/control/logdisplay.py:708 pretix/control/logdisplay.py:757 +#: pretix/control/logdisplay.py:708 pretix/control/logdisplay.py:760 msgid "A scheduled export has been executed." msgstr "" -#: pretix/control/logdisplay.py:709 pretix/control/logdisplay.py:758 +#: pretix/control/logdisplay.py:709 pretix/control/logdisplay.py:761 #, python-brace-format msgid "A scheduled export has failed: {reason}." msgstr "" @@ -15932,7 +16189,7 @@ msgstr "" msgid "The SSO client has been deleted." msgstr "" -#: pretix/control/logdisplay.py:728 pretix/control/views/organizer.py:2719 +#: pretix/control/logdisplay.py:728 pretix/control/views/organizer.py:2715 msgid "The membership type has been created." msgstr "" @@ -15944,7 +16201,7 @@ msgstr "" msgid "The membership type has been deleted." msgstr "" -#: pretix/control/logdisplay.py:731 pretix/control/views/organizer.py:3560 +#: pretix/control/logdisplay.py:731 pretix/control/views/organizer.py:3591 msgid "The sales channel has been created." msgstr "" @@ -16001,539 +16258,554 @@ msgid "The reusable medium has been changed." msgstr "" #: pretix/control/logdisplay.py:746 -msgid "The medium has been connected to a new ticket." +msgid "A new ticket has been added to the medium." msgstr "" #: pretix/control/logdisplay.py:747 -msgid "The medium has been connected to a new gift card." +msgid "A ticket has been removed from the medium." +msgstr "" + +#: pretix/control/logdisplay.py:748 +msgid "The medium has been connected to a new ticket." msgstr "" #: pretix/control/logdisplay.py:749 -msgid "The event's internal comment has been updated." +#, python-brace-format +msgid "" +"The ticket #{positionid} was exchanged for reusable medium " +"{medium_identifier}." msgstr "" #: pretix/control/logdisplay.py:750 -msgid "The event has been canceled." -msgstr "" - -#: pretix/control/logdisplay.py:751 -msgid "An event has been deleted." +msgid "The medium has been connected to a new gift card." msgstr "" #: pretix/control/logdisplay.py:752 -msgid "A removal process for personal data has been started." +msgid "The event's internal comment has been updated." msgstr "" #: pretix/control/logdisplay.py:753 +msgid "The event has been canceled." +msgstr "" + +#: pretix/control/logdisplay.py:754 +msgid "An event has been deleted." +msgstr "" + +#: pretix/control/logdisplay.py:755 +msgid "A removal process for personal data has been started." +msgstr "" + +#: pretix/control/logdisplay.py:756 msgid "A removal process for personal data has been completed." msgstr "" -#: pretix/control/logdisplay.py:759 +#: pretix/control/logdisplay.py:762 msgid "The user has been created." msgstr "" -#: pretix/control/logdisplay.py:760 +#: pretix/control/logdisplay.py:763 #, python-brace-format msgid "" "A first login using {agent_type} on {os_type} from {country} has been " "detected." msgstr "" -#: pretix/control/logdisplay.py:762 pretix/control/views/user.py:474 +#: pretix/control/logdisplay.py:765 pretix/control/views/user.py:474 #: pretix/control/views/user.py:534 pretix/control/views/user.py:593 msgid "Two-factor authentication has been enabled." msgstr "" -#: pretix/control/logdisplay.py:763 pretix/control/views/user.py:377 +#: pretix/control/logdisplay.py:766 pretix/control/views/user.py:377 #: pretix/control/views/user.py:609 msgid "Two-factor authentication has been disabled." msgstr "" -#: pretix/control/logdisplay.py:764 pretix/control/views/user.py:626 +#: pretix/control/logdisplay.py:767 pretix/control/views/user.py:626 msgid "Your two-factor emergency codes have been regenerated." msgstr "" -#: pretix/control/logdisplay.py:765 +#: pretix/control/logdisplay.py:768 msgid "A two-factor emergency code has been generated." msgstr "" -#: pretix/control/logdisplay.py:766 +#: pretix/control/logdisplay.py:769 #, python-brace-format msgid "" "A new two-factor authentication device \"{name}\" has been added to your " "account." msgstr "" -#: pretix/control/logdisplay.py:768 +#: pretix/control/logdisplay.py:771 #, python-brace-format msgid "" "The two-factor authentication device \"{name}\" has been removed from your " "account." msgstr "" -#: pretix/control/logdisplay.py:770 +#: pretix/control/logdisplay.py:773 msgid "Notifications have been enabled." msgstr "" -#: pretix/control/logdisplay.py:771 +#: pretix/control/logdisplay.py:774 msgid "Notifications have been disabled." msgstr "" -#: pretix/control/logdisplay.py:772 +#: pretix/control/logdisplay.py:775 msgid "Your notification settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:773 +#: pretix/control/logdisplay.py:776 msgid "This user has been anonymized." msgstr "" -#: pretix/control/logdisplay.py:777 +#: pretix/control/logdisplay.py:780 msgid "Password reset mail sent." msgstr "" -#: pretix/control/logdisplay.py:778 +#: pretix/control/logdisplay.py:781 msgid "The password has been reset." msgstr "" -#: pretix/control/logdisplay.py:779 +#: pretix/control/logdisplay.py:782 msgid "" "A repeated password reset has been denied, as the last request was less than " "24 hours ago." msgstr "" -#: pretix/control/logdisplay.py:781 +#: pretix/control/logdisplay.py:784 #, python-brace-format msgid "The organizer \"{name}\" has been deleted." msgstr "" -#: pretix/control/logdisplay.py:782 pretix/control/logdisplay.py:1013 +#: pretix/control/logdisplay.py:785 pretix/control/logdisplay.py:1016 msgid "A voucher has been sent to a person on the waiting list." msgstr "" -#: pretix/control/logdisplay.py:783 +#: pretix/control/logdisplay.py:786 msgid "An entry has been transferred to another waiting list." msgstr "" -#: pretix/control/logdisplay.py:784 +#: pretix/control/logdisplay.py:787 msgid "The team has been created." msgstr "" -#: pretix/control/logdisplay.py:785 +#: pretix/control/logdisplay.py:788 msgid "The team settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:786 +#: pretix/control/logdisplay.py:789 msgid "The team has been deleted." msgstr "" -#: pretix/control/logdisplay.py:787 pretix/control/views/organizer.py:2385 +#: pretix/control/logdisplay.py:790 pretix/control/views/organizer.py:2381 msgid "The gate has been created." msgstr "" -#: pretix/control/logdisplay.py:788 +#: pretix/control/logdisplay.py:791 msgid "The gate has been changed." msgstr "" -#: pretix/control/logdisplay.py:789 -msgid "The gate has been deleted." -msgstr "" - -#: pretix/control/logdisplay.py:790 -msgctxt "subevent" -msgid "The event date has been deleted." -msgstr "" - -#: pretix/control/logdisplay.py:791 -msgctxt "subevent" -msgid "The event date has been canceled." -msgstr "" - #: pretix/control/logdisplay.py:792 -msgctxt "subevent" -msgid "The event date has been changed." +msgid "The gate has been deleted." msgstr "" #: pretix/control/logdisplay.py:793 msgctxt "subevent" -msgid "The event date has been created." +msgid "The event date has been deleted." msgstr "" #: pretix/control/logdisplay.py:794 msgctxt "subevent" -msgid "A quota has been added to the event date." +msgid "The event date has been canceled." msgstr "" #: pretix/control/logdisplay.py:795 msgctxt "subevent" -msgid "A quota has been changed on the event date." +msgid "The event date has been changed." msgstr "" #: pretix/control/logdisplay.py:796 msgctxt "subevent" -msgid "A quota has been removed from the event date." +msgid "The event date has been created." msgstr "" #: pretix/control/logdisplay.py:797 -msgid "The device has been created." +msgctxt "subevent" +msgid "A quota has been added to the event date." msgstr "" #: pretix/control/logdisplay.py:798 -msgid "The device has been changed." +msgctxt "subevent" +msgid "A quota has been changed on the event date." msgstr "" #: pretix/control/logdisplay.py:799 -msgid "Access of the device has been revoked." +msgctxt "subevent" +msgid "A quota has been removed from the event date." msgstr "" #: pretix/control/logdisplay.py:800 -msgid "The device has been initialized." +msgid "The device has been created." msgstr "" #: pretix/control/logdisplay.py:801 -msgid "The access token of the device has been regenerated." +msgid "The device has been changed." msgstr "" #: pretix/control/logdisplay.py:802 -msgid "The device has notified the server of an hardware or software update." +msgid "Access of the device has been revoked." msgstr "" #: pretix/control/logdisplay.py:803 -msgid "The gift card has been created." +msgid "The device has been initialized." msgstr "" -#: pretix/control/logdisplay.py:804 pretix/control/views/organizer.py:1947 -msgid "The gift card has been changed." +#: pretix/control/logdisplay.py:804 +msgid "The access token of the device has been regenerated." msgstr "" #: pretix/control/logdisplay.py:805 -msgid "A manual transaction has been performed." +msgid "The device has notified the server of an hardware or software update." msgstr "" #: pretix/control/logdisplay.py:806 -msgid "A payment has been performed." +msgid "The gift card has been created." msgstr "" -#: pretix/control/logdisplay.py:807 -msgid "A refund has been performed. " +#: pretix/control/logdisplay.py:807 pretix/control/views/organizer.py:1943 +msgid "The gift card has been changed." msgstr "" #: pretix/control/logdisplay.py:808 +msgid "A manual transaction has been performed." +msgstr "" + +#: pretix/control/logdisplay.py:809 +msgid "A payment has been performed." +msgstr "" + +#: pretix/control/logdisplay.py:810 +msgid "A refund has been performed. " +msgstr "" + +#: pretix/control/logdisplay.py:811 #, python-brace-format msgid "The token \"{name}\" has been created." msgstr "" -#: pretix/control/logdisplay.py:809 +#: pretix/control/logdisplay.py:812 #, python-brace-format msgid "The token \"{name}\" has been revoked." msgstr "" -#: pretix/control/logdisplay.py:810 +#: pretix/control/logdisplay.py:813 msgid "The check-in and print log state has been reset." msgstr "" -#: pretix/control/logdisplay.py:817 pretix/control/logdisplay.py:876 +#: pretix/control/logdisplay.py:820 pretix/control/logdisplay.py:879 msgid "The plugin has been enabled." msgstr "" -#: pretix/control/logdisplay.py:818 pretix/control/logdisplay.py:877 -#: pretix/control/views/event.py:489 pretix/control/views/organizer.py:756 +#: pretix/control/logdisplay.py:821 pretix/control/logdisplay.py:880 +#: pretix/control/views/event.py:498 pretix/control/views/organizer.py:757 msgid "The plugin has been disabled." msgstr "" -#: pretix/control/logdisplay.py:821 pretix/control/logdisplay.py:880 +#: pretix/control/logdisplay.py:824 pretix/control/logdisplay.py:883 #, python-brace-format msgid "Plugin {val}" msgstr "" -#: pretix/control/logdisplay.py:836 +#: pretix/control/logdisplay.py:839 msgid "A meta property has been added to this event." msgstr "" -#: pretix/control/logdisplay.py:837 +#: pretix/control/logdisplay.py:840 msgid "A meta property has been removed from this event." msgstr "" -#: pretix/control/logdisplay.py:838 +#: pretix/control/logdisplay.py:841 msgid "A meta property has been changed on this event." msgstr "" -#: pretix/control/logdisplay.py:839 +#: pretix/control/logdisplay.py:842 msgid "The event settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:840 +#: pretix/control/logdisplay.py:843 msgid "The ticket download settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:843 +#: pretix/control/logdisplay.py:846 msgid "The shop has been taken live." msgstr "" -#: pretix/control/logdisplay.py:844 +#: pretix/control/logdisplay.py:847 msgid "The shop has been taken offline." msgstr "" -#: pretix/control/logdisplay.py:845 +#: pretix/control/logdisplay.py:848 msgid "The shop has been taken into test mode." msgstr "" -#: pretix/control/logdisplay.py:846 +#: pretix/control/logdisplay.py:849 msgid "The test mode has been disabled." msgstr "" -#: pretix/control/logdisplay.py:847 +#: pretix/control/logdisplay.py:850 msgid "The event has been created." msgstr "" -#: pretix/control/logdisplay.py:848 +#: pretix/control/logdisplay.py:851 msgid "The event details have been changed." msgstr "" -#: pretix/control/logdisplay.py:850 +#: pretix/control/logdisplay.py:853 msgid "An answer option has been added to the question." msgstr "" -#: pretix/control/logdisplay.py:851 +#: pretix/control/logdisplay.py:854 msgid "An answer option has been removed from the question." msgstr "" -#: pretix/control/logdisplay.py:852 +#: pretix/control/logdisplay.py:855 msgid "An answer option has been changed." msgstr "" -#: pretix/control/logdisplay.py:853 +#: pretix/control/logdisplay.py:856 msgid "A user has been added to the event team." msgstr "" -#: pretix/control/logdisplay.py:854 +#: pretix/control/logdisplay.py:857 msgid "A user has been invited to the event team." msgstr "" -#: pretix/control/logdisplay.py:855 +#: pretix/control/logdisplay.py:858 msgid "A user's permissions have been changed." msgstr "" -#: pretix/control/logdisplay.py:856 +#: pretix/control/logdisplay.py:859 msgid "A user has been removed from the event team." msgstr "" -#: pretix/control/logdisplay.py:863 +#: pretix/control/logdisplay.py:866 msgid "The check-in list has been added." msgstr "" -#: pretix/control/logdisplay.py:864 pretix/control/logdisplay.py:865 +#: pretix/control/logdisplay.py:867 pretix/control/logdisplay.py:868 msgid "The check-in list has been deleted." msgstr "" -#: pretix/control/logdisplay.py:866 +#: pretix/control/logdisplay.py:869 msgid "The check-in list has been changed." msgstr "" -#: pretix/control/logdisplay.py:869 +#: pretix/control/logdisplay.py:872 #, python-brace-format msgid "Check-in list {val}" msgstr "" -#: pretix/control/logdisplay.py:896 +#: pretix/control/logdisplay.py:899 msgid "The product has been created." msgstr "" -#: pretix/control/logdisplay.py:897 +#: pretix/control/logdisplay.py:900 msgid "The product has been changed." msgstr "" -#: pretix/control/logdisplay.py:898 +#: pretix/control/logdisplay.py:901 msgid "The product has been reordered." msgstr "" -#: pretix/control/logdisplay.py:899 +#: pretix/control/logdisplay.py:902 msgid "The product has been deleted." msgstr "" -#: pretix/control/logdisplay.py:900 +#: pretix/control/logdisplay.py:903 msgid "An add-on has been added to this product." msgstr "" -#: pretix/control/logdisplay.py:901 +#: pretix/control/logdisplay.py:904 msgid "An add-on has been removed from this product." msgstr "" -#: pretix/control/logdisplay.py:902 +#: pretix/control/logdisplay.py:905 msgid "An add-on has been changed on this product." msgstr "" -#: pretix/control/logdisplay.py:903 +#: pretix/control/logdisplay.py:906 msgid "A bundled item has been added to this product." msgstr "" -#: pretix/control/logdisplay.py:904 +#: pretix/control/logdisplay.py:907 msgid "A bundled item has been removed from this product." msgstr "" -#: pretix/control/logdisplay.py:905 +#: pretix/control/logdisplay.py:908 msgid "A bundled item has been changed on this product." msgstr "" -#: pretix/control/logdisplay.py:906 +#: pretix/control/logdisplay.py:909 msgid "A program time has been added to this product." msgstr "" -#: pretix/control/logdisplay.py:907 +#: pretix/control/logdisplay.py:910 msgid "A program time has been changed on this product." msgstr "" -#: pretix/control/logdisplay.py:908 +#: pretix/control/logdisplay.py:911 msgid "A program time has been removed from this product." msgstr "" -#: pretix/control/logdisplay.py:915 +#: pretix/control/logdisplay.py:918 #, python-brace-format msgid "The variation \"{value}\" has been created." msgstr "" -#: pretix/control/logdisplay.py:916 +#: pretix/control/logdisplay.py:919 #, python-brace-format msgid "The variation \"{value}\" has been deleted." msgstr "" -#: pretix/control/logdisplay.py:917 +#: pretix/control/logdisplay.py:920 #, python-brace-format msgid "The variation \"{value}\" has been changed." msgstr "" -#: pretix/control/logdisplay.py:934 +#: pretix/control/logdisplay.py:937 #, python-brace-format msgid "Payment {local_id} has been confirmed." msgstr "" -#: pretix/control/logdisplay.py:935 +#: pretix/control/logdisplay.py:938 #, python-brace-format msgid "Payment {local_id} has been canceled." msgstr "" -#: pretix/control/logdisplay.py:936 +#: pretix/control/logdisplay.py:939 #, python-brace-format msgid "Canceling payment {local_id} has failed." msgstr "" -#: pretix/control/logdisplay.py:937 +#: pretix/control/logdisplay.py:940 #, python-brace-format msgid "Payment {local_id} has been started." msgstr "" -#: pretix/control/logdisplay.py:938 +#: pretix/control/logdisplay.py:941 #, python-brace-format msgid "Payment {local_id} has failed." msgstr "" -#: pretix/control/logdisplay.py:939 +#: pretix/control/logdisplay.py:942 #, python-brace-format msgid "The order could not be marked as paid: {message}" msgstr "" -#: pretix/control/logdisplay.py:940 -msgid "The order has been overpaid." -msgstr "" - -#: pretix/control/logdisplay.py:941 -#, python-brace-format -msgid "Refund {local_id} has been created." -msgstr "" - -#: pretix/control/logdisplay.py:942 -#, python-brace-format -msgid "Refund {local_id} has been created by an external entity." -msgstr "" - #: pretix/control/logdisplay.py:943 -msgid "The customer requested you to issue a refund." +msgid "The order has been overpaid." msgstr "" #: pretix/control/logdisplay.py:944 #, python-brace-format -msgid "Refund {local_id} has been completed." +msgid "Refund {local_id} has been created." msgstr "" #: pretix/control/logdisplay.py:945 #, python-brace-format -msgid "Refund {local_id} has been canceled." +msgid "Refund {local_id} has been created by an external entity." msgstr "" #: pretix/control/logdisplay.py:946 +msgid "The customer requested you to issue a refund." +msgstr "" + +#: pretix/control/logdisplay.py:947 +#, python-brace-format +msgid "Refund {local_id} has been completed." +msgstr "" + +#: pretix/control/logdisplay.py:948 +#, python-brace-format +msgid "Refund {local_id} has been canceled." +msgstr "" + +#: pretix/control/logdisplay.py:949 #, python-brace-format msgid "Refund {local_id} has failed." msgstr "" -#: pretix/control/logdisplay.py:953 +#: pretix/control/logdisplay.py:956 msgid "The quota has been added." msgstr "" -#: pretix/control/logdisplay.py:954 +#: pretix/control/logdisplay.py:957 msgid "The quota has been deleted." msgstr "" -#: pretix/control/logdisplay.py:955 +#: pretix/control/logdisplay.py:958 msgid "The quota has been changed." msgstr "" -#: pretix/control/logdisplay.py:956 +#: pretix/control/logdisplay.py:959 msgid "The quota has closed." msgstr "" -#: pretix/control/logdisplay.py:957 pretix/control/views/item.py:1065 +#: pretix/control/logdisplay.py:960 pretix/control/views/item.py:1236 msgid "The quota has been re-opened." msgstr "" -#: pretix/control/logdisplay.py:964 +#: pretix/control/logdisplay.py:967 msgid "The question has been added." msgstr "" -#: pretix/control/logdisplay.py:965 +#: pretix/control/logdisplay.py:968 msgid "The question has been deleted." msgstr "" -#: pretix/control/logdisplay.py:966 +#: pretix/control/logdisplay.py:969 msgid "The question has been changed." msgstr "" -#: pretix/control/logdisplay.py:967 +#: pretix/control/logdisplay.py:970 msgid "The question has been reordered." msgstr "" -#: pretix/control/logdisplay.py:974 +#: pretix/control/logdisplay.py:977 msgid "The discount has been added." msgstr "" -#: pretix/control/logdisplay.py:975 +#: pretix/control/logdisplay.py:978 msgid "The discount has been deleted." msgstr "" -#: pretix/control/logdisplay.py:976 +#: pretix/control/logdisplay.py:979 msgid "The discount has been changed." msgstr "" -#: pretix/control/logdisplay.py:1000 +#: pretix/control/logdisplay.py:1003 #, python-brace-format msgid "" "Position #{posid} has been checked in manually at {datetime} on list \"{list}" "\"." msgstr "" -#: pretix/control/logdisplay.py:1005 +#: pretix/control/logdisplay.py:1008 #, python-brace-format msgid "" "Position #{posid} has been checked in again at {datetime} on list \"{list}\"." msgstr "" -#: pretix/control/logdisplay.py:1014 +#: pretix/control/logdisplay.py:1017 msgid "An entry has been removed from the waiting list." msgstr "" -#: pretix/control/logdisplay.py:1015 +#: pretix/control/logdisplay.py:1018 msgid "An entry has been changed on the waiting list." msgstr "" -#: pretix/control/logdisplay.py:1016 +#: pretix/control/logdisplay.py:1019 msgid "An entry has been added to the waiting list." msgstr "" @@ -16557,7 +16829,7 @@ msgstr "" #: pretix/control/navigation.py:49 pretix/control/navigation.py:409 #: pretix/control/navigation.py:519 -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:38 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:39 #: pretix/control/templates/pretixcontrol/event/mail.html:14 #: pretix/control/templates/pretixcontrol/event/tax_edit.html:25 #: pretix/control/templates/pretixcontrol/item/index.html:13 @@ -16572,7 +16844,7 @@ msgstr "" #: pretix/control/navigation.py:59 #: pretix/control/templates/pretixcontrol/event/quick_setup.html:151 -#: pretix/control/templates/pretixcontrol/order/index.html:921 +#: pretix/control/templates/pretixcontrol/order/index.html:956 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:37 #: pretix/plugins/banktransfer/apps.py:43 #: pretix/plugins/manualpayment/apps.py:39 pretix/plugins/paypal2/apps.py:45 @@ -16583,9 +16855,9 @@ msgstr "" msgid "Payment" msgstr "" -#: pretix/control/navigation.py:78 pretix/control/views/event.py:1650 -#: pretix/control/views/event.py:1652 pretix/control/views/event.py:1684 -#: pretix/control/views/event.py:1689 pretix/control/views/subevents.py:310 +#: pretix/control/navigation.py:78 pretix/control/views/event.py:1657 +#: pretix/control/views/event.py:1659 pretix/control/views/event.py:1691 +#: pretix/control/views/event.py:1696 pretix/control/views/subevents.py:316 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:60 #: pretix/plugins/ticketoutputpdf/apps.py:55 #: pretix/plugins/ticketoutputpdf/exporters.py:68 @@ -16598,7 +16870,7 @@ msgstr "" #: pretix/control/navigation.py:97 #: pretix/control/templates/pretixcontrol/event/tax.html:4 #: pretix/control/templates/pretixcontrol/event/tax.html:6 -#: pretix/control/templates/pretixcontrol/order/index.html:764 +#: pretix/control/templates/pretixcontrol/order/index.html:799 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:457 msgid "Taxes" msgstr "" @@ -16630,7 +16902,7 @@ msgid "Overview" msgstr "" #: pretix/control/navigation.py:233 -#: pretix/control/templates/pretixcontrol/order/index.html:908 +#: pretix/control/templates/pretixcontrol/order/index.html:943 #: pretix/control/templates/pretixcontrol/orders/refunds.html:7 #: pretix/control/templates/pretixcontrol/orders/refunds.html:9 #: pretix/plugins/reports/accountingreport.py:498 @@ -16671,7 +16943,7 @@ msgid "Search" msgstr "" #: pretix/control/navigation.py:393 -#: pretix/control/templates/pretixcontrol/order/index.html:814 +#: pretix/control/templates/pretixcontrol/order/index.html:849 #: pretix/plugins/reports/accountingreport.py:497 #: pretix/plugins/reports/accountingreport.py:680 #: pretix/plugins/reports/accountingreport.py:884 @@ -16767,13 +17039,13 @@ msgid "You do not have permission to view this content." msgstr "" #: pretix/control/templates/pretixcontrol/auth/base.html:42 -#: pretix/control/templates/pretixcontrol/base.html:360 +#: pretix/control/templates/pretixcontrol/base.html:363 #, python-format msgid "You are currently working on behalf of %(user)s." msgstr "" #: pretix/control/templates/pretixcontrol/auth/base.html:47 -#: pretix/control/templates/pretixcontrol/base.html:365 +#: pretix/control/templates/pretixcontrol/base.html:368 msgid "Stop impersonating" msgstr "" @@ -16919,7 +17191,7 @@ msgid "Set new password" msgstr "" #: pretix/control/templates/pretixcontrol/auth/recover.html:16 -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:124 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:88 #: pretix/control/templates/pretixcontrol/email_setup_simple.html:82 #: pretix/control/templates/pretixcontrol/email_setup_smtp.html:38 #: pretix/control/templates/pretixcontrol/event/cancel.html:91 @@ -16938,6 +17210,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/items/category.html:49 #: pretix/control/templates/pretixcontrol/items/discount.html:79 #: pretix/control/templates/pretixcontrol/items/question_edit.html:153 +#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html:45 #: pretix/control/templates/pretixcontrol/items/quota_edit.html:48 #: pretix/control/templates/pretixcontrol/oauth/app_register.html:12 #: pretix/control/templates/pretixcontrol/oauth/app_update.html:12 @@ -16953,7 +17226,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:25 #: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html:42 #: pretix/control/templates/pretixcontrol/organizers/device_edit.html:30 -#: pretix/control/templates/pretixcontrol/organizers/edit.html:384 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:385 #: pretix/control/templates/pretixcontrol/organizers/export_form.html:50 #: pretix/control/templates/pretixcontrol/organizers/gate_edit.html:15 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_invite.html:15 @@ -16966,12 +17239,12 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/reusable_medium_edit.html:28 #: pretix/control/templates/pretixcontrol/organizers/ssoclient_edit.html:15 #: pretix/control/templates/pretixcontrol/organizers/ssoprovider_edit.html:28 -#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:47 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:71 #: pretix/control/templates/pretixcontrol/organizers/webhook_edit.html:21 -#: pretix/control/templates/pretixcontrol/pdf/index.html:46 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:632 +#: pretix/control/templates/pretixcontrol/pdf/index.html:44 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:634 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:368 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:289 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:292 #: pretix/control/templates/pretixcontrol/user/notifications.html:85 #: pretix/control/templates/pretixcontrol/user/settings.html:109 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:13 @@ -16997,76 +17270,76 @@ msgstr "" msgid "Create a new account" msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:101 +#: pretix/control/templates/pretixcontrol/base.html:104 msgid "Toggle navigation" msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:116 -#: pretix/control/templates/pretixcontrol/base.html:141 -#: pretix/control/templates/pretixcontrol/base.html:145 -#: pretix/control/templates/pretixcontrol/base.html:146 +#: pretix/control/templates/pretixcontrol/base.html:119 +#: pretix/control/templates/pretixcontrol/base.html:144 +#: pretix/control/templates/pretixcontrol/base.html:148 +#: pretix/control/templates/pretixcontrol/base.html:149 msgid "Go to shop" msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:122 -#: pretix/control/templates/pretixcontrol/base.html:152 -#: pretix/control/templates/pretixcontrol/base.html:153 +#: pretix/control/templates/pretixcontrol/base.html:125 +#: pretix/control/templates/pretixcontrol/base.html:155 +#: pretix/control/templates/pretixcontrol/base.html:156 msgid "Public profile" msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:204 +#: pretix/control/templates/pretixcontrol/base.html:207 msgid "End admin session" msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:216 +#: pretix/control/templates/pretixcontrol/base.html:219 msgid "Account Settings" msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:221 -#: pretix/control/templates/pretixcontrol/base.html:223 +#: pretix/control/templates/pretixcontrol/base.html:224 +#: pretix/control/templates/pretixcontrol/base.html:226 #: pretix/presale/templates/pretixpresale/fragment_login_status.html:14 msgid "Log out" msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:249 +#: pretix/control/templates/pretixcontrol/base.html:252 msgid "Organizer account" msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:272 +#: pretix/control/templates/pretixcontrol/base.html:275 msgid "Search for events" msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:329 +#: pretix/control/templates/pretixcontrol/base.html:332 #: pretix/presale/templates/pretixpresale/base.html:51 msgid "" "We've detected that you are using Microsoft Internet Explorer." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:332 +#: pretix/control/templates/pretixcontrol/base.html:335 #: pretix/presale/templates/pretixpresale/base.html:54 msgid "" "Internet Explorer is an old browser that does not support lots of recent web-" "based technologies and is no longer supported by this website." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:336 +#: pretix/control/templates/pretixcontrol/base.html:339 #: pretix/presale/templates/pretixpresale/base.html:58 msgid "" "We kindly ask you to move to one of our supported browsers, such as " "Microsoft Edge, Mozilla Firefox, Google Chrome, or Safari." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:345 +#: pretix/control/templates/pretixcontrol/base.html:348 msgid "" "Please leave a short comment on what you did in the following admin sessions:" msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:376 +#: pretix/control/templates/pretixcontrol/base.html:379 msgid "Read more" msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:393 +#: pretix/control/templates/pretixcontrol/base.html:396 msgid "" "Your event contains test mode orders even though " "test mode has been disabled. You should delete those orders " @@ -17074,11 +17347,11 @@ msgid "" "people from actually buying tickets." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:400 +#: pretix/control/templates/pretixcontrol/base.html:403 msgid "Show all test mode orders" msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:408 +#: pretix/control/templates/pretixcontrol/base.html:411 msgid "" "Starting with version 1.2.0, pretix automatically checks for updates in the " "background. During this check, anonymous data is transmitted to servers " @@ -17087,41 +17360,41 @@ msgid "" "if a new update arrives. This message will disappear once you clicked it." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:421 +#: pretix/control/templates/pretixcontrol/base.html:424 msgid "" "Click here to do a license compliance check to make sure your usage of " "pretix is in line with pretix' license." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:430 +#: pretix/control/templates/pretixcontrol/base.html:433 msgid "" "The cronjob component of pretix was not executed in the last hours. Please " "check that you have completed all installation steps and your cronjob is " "executed correctly." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:439 +#: pretix/control/templates/pretixcontrol/base.html:442 msgid "" "pretix is running in debug mode. For security reasons, please never run " "debug mode on a production instance." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:445 +#: pretix/control/templates/pretixcontrol/base.html:448 msgid "" "For security reasons, please change your password before you continue. " "Afterwards you will be redirected to your original destination." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:457 +#: pretix/control/templates/pretixcontrol/base.html:460 #, python-format msgid "Times displayed in %(tz)s" msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:463 +#: pretix/control/templates/pretixcontrol/base.html:466 msgid "running in development mode" msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:472 +#: pretix/control/templates/pretixcontrol/base.html:475 #: pretix/presale/templates/pretixpresale/fragment_modals.html:38 #: pretix/presale/templates/pretixpresale/postmessage.html:27 #: pretix/presale/templates/pretixpresale/waiting.html:42 @@ -17138,6 +17411,7 @@ msgid "Receipt ID" msgstr "" #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:11 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:29 msgid "ID" msgstr "" @@ -17294,10 +17568,11 @@ msgstr[1] "" #: pretix/control/templates/pretixcontrol/items/discount_delete.html:33 #: pretix/control/templates/pretixcontrol/items/question_delete.html:22 #: pretix/control/templates/pretixcontrol/items/quota_delete.html:37 +#: pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html:27 #: pretix/control/templates/pretixcontrol/oauth/app_delete.html:12 #: pretix/control/templates/pretixcontrol/oauth/app_rollkeys.html:12 #: pretix/control/templates/pretixcontrol/oauth/auth_revoke.html:12 -#: pretix/control/templates/pretixcontrol/order/change.html:543 +#: pretix/control/templates/pretixcontrol/order/change.html:545 #: pretix/control/templates/pretixcontrol/order/change_contact.html:25 #: pretix/control/templates/pretixcontrol/order/change_locale.html:30 #: pretix/control/templates/pretixcontrol/order/change_questions.html:84 @@ -17324,10 +17599,11 @@ msgstr[1] "" #: pretix/control/templates/pretixcontrol/organizers/ssoprovider_delete.html:16 #: pretix/control/templates/pretixcontrol/organizers/team_delete.html:10 #: pretix/control/templates/pretixcontrol/organizers/team_delete.html:21 -#: pretix/control/templates/pretixcontrol/pdf/index.html:153 +#: pretix/control/templates/pretixcontrol/pdf/index.html:151 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:378 #: pretix/control/templates/pretixcontrol/subevents/delete.html:12 #: pretix/control/templates/pretixcontrol/subevents/delete_bulk.html:41 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:289 #: pretix/control/templates/pretixcontrol/user/2fa_delete.html:18 #: pretix/control/templates/pretixcontrol/user/2fa_disable.html:17 #: pretix/control/templates/pretixcontrol/user/2fa_enable.html:18 @@ -17368,6 +17644,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/items/discount_delete.html:36 #: pretix/control/templates/pretixcontrol/items/index.html:177 #: pretix/control/templates/pretixcontrol/items/quota_delete.html:40 +#: pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html:30 #: pretix/control/templates/pretixcontrol/order/index.html:39 #: pretix/control/templates/pretixcontrol/orders/export.html:80 #: pretix/control/templates/pretixcontrol/orders/export_delete.html:15 @@ -17383,7 +17660,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/ssoclient_delete.html:20 #: pretix/control/templates/pretixcontrol/organizers/ssoprovider_delete.html:20 #: pretix/control/templates/pretixcontrol/organizers/team_delete.html:24 -#: pretix/control/templates/pretixcontrol/pdf/index.html:111 +#: pretix/control/templates/pretixcontrol/pdf/index.html:109 #: pretix/control/templates/pretixcontrol/subevents/delete.html:15 #: pretix/control/templates/pretixcontrol/subevents/delete_bulk.html:44 #: pretix/control/templates/pretixcontrol/user/2fa_delete.html:21 @@ -17392,7 +17669,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:16 #: pretix/control/templates/pretixcontrol/waitinglist/delete.html:15 #: pretix/control/templates/pretixcontrol/waitinglist/delete_bulk.html:36 -#: pretix/control/views/orders.py:390 +#: pretix/control/views/orders.py:391 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/delete.html:15 #: pretix/plugins/badges/templates/pretixplugins/badges/delete.html:16 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_delete.html:15 @@ -17415,6 +17692,8 @@ msgstr "" #: pretix/control/templates/pretixcontrol/events/index.html:54 #: pretix/control/templates/pretixcontrol/items/question.html:22 #: pretix/control/templates/pretixcontrol/items/question.html:44 +#: pretix/control/templates/pretixcontrol/items/quotas.html:35 +#: pretix/control/templates/pretixcontrol/items/quotas.html:68 #: pretix/control/templates/pretixcontrol/orders/index.html:56 #: pretix/control/templates/pretixcontrol/orders/index.html:93 #: pretix/control/templates/pretixcontrol/orders/overview.html:25 @@ -17468,20 +17747,20 @@ msgid "Time of scan" msgstr "" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:65 -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:49 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:50 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:14 -#: pretix/plugins/checkinlists/exporters.py:770 +#: pretix/plugins/checkinlists/exporters.py:769 msgid "Result" msgstr "" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:78 -#: pretix/control/templates/pretixcontrol/order/index.html:437 +#: pretix/control/templates/pretixcontrol/order/index.html:470 #, python-format msgid "Automatically marked not present: %(date)s" msgstr "" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:82 -#: pretix/control/templates/pretixcontrol/order/index.html:442 +#: pretix/control/templates/pretixcontrol/order/index.html:475 #, python-format msgid "Additional entry scan: %(date)s" msgstr "" @@ -17492,7 +17771,7 @@ msgid "Offline scan. Upload time: %(date)s" msgstr "" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:88 -#: pretix/control/templates/pretixcontrol/order/index.html:444 +#: pretix/control/templates/pretixcontrol/order/index.html:477 #, python-format msgid "Automatically checked in: %(date)s" msgstr "" @@ -17515,28 +17794,29 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/index.html:24 #: pretix/control/templates/pretixcontrol/organizers/device_connect.html:27 #: pretix/control/templates/pretixcontrol/organizers/device_connect.html:33 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:33 msgid "Copy to clipboard" msgstr "" #: pretix/control/templates/pretixcontrol/checkin/index.html:7 #: pretix/control/templates/pretixcontrol/checkin/index.html:11 -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:8 -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:16 -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:11 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:9 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:17 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:12 #, python-format msgid "Check-in list: %(name)s" msgstr "" #: pretix/control/templates/pretixcontrol/checkin/index.html:16 -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:16 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:17 msgid "Edit list configuration" msgstr "" #: pretix/control/templates/pretixcontrol/checkin/index.html:22 -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:21 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:22 #: pretix/control/templates/pretixcontrol/checkin/lists.html:167 -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:8 -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:20 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:9 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:21 msgid "Check-in simulator" msgstr "" @@ -17556,6 +17836,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/checkin/index.html:91 #: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:19 +#: pretix/control/templates/pretixcontrol/items/quotas.html:90 #: pretix/control/templates/pretixcontrol/orders/index.html:127 #: pretix/control/templates/pretixcontrol/organizers/devices.html:71 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html:58 @@ -17571,6 +17852,7 @@ msgid "Timestamp" msgstr "" #: pretix/control/templates/pretixcontrol/checkin/index.html:125 +#: pretix/control/templates/pretixcontrol/items/quotas.html:118 #: pretix/control/templates/pretixcontrol/orders/index.html:165 #: pretix/control/templates/pretixcontrol/organizers/devices.html:103 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html:80 @@ -17630,75 +17912,36 @@ msgstr "" msgid "Delete list and all check-ins" msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:48 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:49 #: pretix/control/templates/pretixcontrol/event/payment.html:84 #: pretix/control/templates/pretixcontrol/event/tax_edit.html:33 #: pretix/control/templates/pretixcontrol/items/question_edit.html:128 msgid "Advanced" msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:50 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:51 msgid "" "These settings on this page are intended for professional users with very " "specific check-in situations. Please reach out to support if you have " "questions about setting this up." msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:57 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:58 msgid "" "Make sure to always use the latest version of our scanning apps for these " "options to work." msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:61 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:62 msgid "" "If you make use of these advanced options, we recommend using our Android " "and Desktop apps." msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:76 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:77 msgid "Custom check-in rule" msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:83 -#: pretix/control/templates/pretixcontrol/event/mail.html:33 -#: pretix/control/templates/pretixcontrol/event/mail.html:47 -#: pretix/control/templates/pretixcontrol/event/mail_settings_fragment.html:26 -#: pretix/control/templates/pretixcontrol/items/categories.html:64 -#: pretix/control/templates/pretixcontrol/items/index.html:59 -#: pretix/control/templates/pretixcontrol/items/index.html:175 -#: pretix/control/templates/pretixcontrol/orders/export.html:73 -#: pretix/control/templates/pretixcontrol/orders/index.html:40 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:100 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:170 -#: pretix/control/templates/pretixcontrol/organizers/export.html:73 -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:16 -#: pretix/control/templates/pretixcontrol/organizers/mail.html:34 -#: pretix/control/templates/pretixcontrol/organizers/mail.html:48 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:83 -#: pretix/control/templates/pretixcontrol/organizers/team_members.html:10 -#: pretix/control/templates/pretixcontrol/organizers/webhooks.html:72 -#: pretix/control/templates/pretixcontrol/vouchers/bulk.html:94 -#: pretix/control/templates/pretixcontrol/vouchers/bulk.html:117 -#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:85 -msgid "Edit" -msgstr "" - -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:89 -msgid "Visualize" -msgstr "" - -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:107 -msgid "" -"Your rule always filters by product or variation, but the following products " -"or variations are not contained in any of your rule parts so people with " -"these tickets will not get in:" -msgstr "" - -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:113 -msgid "Please double-check if this was intentional." -msgstr "" - #: pretix/control/templates/pretixcontrol/checkin/lists.html:10 msgid "" "You can create check-in lists that you can use e.g. at the entrance of your " @@ -17754,7 +17997,8 @@ msgstr "" #: pretix/control/templates/pretixcontrol/items/categories.html:66 #: pretix/control/templates/pretixcontrol/items/discounts.html:158 #: pretix/control/templates/pretixcontrol/items/index.html:176 -#: pretix/control/templates/pretixcontrol/items/quotas.html:101 +#: pretix/control/templates/pretixcontrol/items/quotas.html:162 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:185 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:89 #: pretix/plugins/badges/templates/pretixplugins/badges/index.html:72 #: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/index.html:69 @@ -17800,7 +18044,7 @@ msgstr "" msgid "Proceed with reset" msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:22 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:23 msgid "" "This tool allows you to validate your check-in configuration. You can enter " "a barcode plus some optional parameters and we will show you the response of " @@ -17808,24 +18052,35 @@ msgid "" "to the system state is made." msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:40 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:41 msgid "Simulate" msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:66 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:69 msgid "Valid check-in" msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:68 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:71 msgid "Additional information required" msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:70 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:73 msgid "" "The following questions must be answered before check-in can be completed:" msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:92 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:85 +msgid "Media exchange required" +msgstr "" + +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:87 +#, python-format +msgid "" +"This ticket needs to be exchanged into a %(media_type)s " +"reusable medium. %(media_policy)s." +msgstr "" + +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:103 msgid "Special attention required" msgstr "" @@ -18262,20 +18517,20 @@ msgid "Cancel or delete event" msgstr "" #: pretix/control/templates/pretixcontrol/event/dangerzone.html:9 -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:25 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:27 #: pretix/control/templates/pretixcontrol/event/delete.html:60 #: pretix/control/templates/pretixcontrol/event/live.html:31 msgid "Go offline" msgstr "" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:13 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:14 msgid "" "You can take your event offline. Nobody except your team will be able to see " "or access it any more." msgstr "" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:34 -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:48 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:35 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:51 #: pretix/control/templates/pretixcontrol/orders/cancel.html:5 #: pretix/control/templates/pretixcontrol/orders/cancel.html:7 #: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:6 @@ -18283,37 +18538,37 @@ msgstr "" msgid "Cancel event" msgstr "" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:38 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:40 msgid "" "If you need to call off your event you want to cancel and refund all " "tickets, you can do so through this option." msgstr "" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:51 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:53 msgid "No permission" msgstr "" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:59 -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:72 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:62 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:76 #: pretix/control/templates/pretixcontrol/event/delete.html:56 #: pretix/control/templates/pretixcontrol/event/delete.html:70 msgid "Delete personal data" msgstr "" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:63 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:67 msgid "" "You can remove personal data such as names and email addresses from your " "event and only retain the financial information such as the number and type " "of tickets sold." msgstr "" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:80 -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:93 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:84 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:99 #: pretix/control/templates/pretixcontrol/event/delete.html:5 msgid "Delete event" msgstr "" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:84 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:89 msgid "" "You can delete your event completely only as long as it does not contain any " "undeletable data, such as orders not performed in test mode." @@ -18433,6 +18688,7 @@ msgid "Shop URL:" msgstr "" #: pretix/control/templates/pretixcontrol/event/index.html:27 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:38 #: pretix/control/templates/pretixcontrol/vouchers/detail.html:57 msgid "Create QR code" msgstr "" @@ -18501,7 +18757,7 @@ msgid "Show sync problems" msgstr "" #: pretix/control/templates/pretixcontrol/event/index.html:151 -#: pretix/control/templates/pretixcontrol/order/index.html:1093 +#: pretix/control/templates/pretixcontrol/order/index.html:1128 msgid "Update comment" msgstr "" @@ -18710,10 +18966,10 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/logs.html:86 #: pretix/control/templates/pretixcontrol/event/logs_embed.html:47 #: pretix/control/templates/pretixcontrol/includes/logs.html:42 -#: pretix/control/templates/pretixcontrol/order/index.html:367 -#: pretix/control/templates/pretixcontrol/order/index.html:876 -#: pretix/control/templates/pretixcontrol/order/index.html:888 -#: pretix/control/templates/pretixcontrol/order/index.html:993 +#: pretix/control/templates/pretixcontrol/order/index.html:400 +#: pretix/control/templates/pretixcontrol/order/index.html:911 +#: pretix/control/templates/pretixcontrol/order/index.html:923 +#: pretix/control/templates/pretixcontrol/order/index.html:1028 #: pretix/control/templates/pretixcontrol/organizers/device_logs.html:42 #: pretix/control/templates/pretixcontrol/organizers/logs.html:72 #: pretix/control/templates/pretixcontrol/search/payments.html:147 @@ -18746,6 +19002,30 @@ msgstr "" msgid "System-provided email server" msgstr "" +#: pretix/control/templates/pretixcontrol/event/mail.html:33 +#: pretix/control/templates/pretixcontrol/event/mail.html:47 +#: pretix/control/templates/pretixcontrol/event/mail_settings_fragment.html:26 +#: pretix/control/templates/pretixcontrol/items/categories.html:64 +#: pretix/control/templates/pretixcontrol/items/index.html:59 +#: pretix/control/templates/pretixcontrol/items/index.html:175 +#: pretix/control/templates/pretixcontrol/orders/export.html:73 +#: pretix/control/templates/pretixcontrol/orders/index.html:40 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:100 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:170 +#: pretix/control/templates/pretixcontrol/organizers/export.html:73 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:16 +#: pretix/control/templates/pretixcontrol/organizers/mail.html:34 +#: pretix/control/templates/pretixcontrol/organizers/mail.html:48 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:95 +#: pretix/control/templates/pretixcontrol/organizers/team_members.html:10 +#: pretix/control/templates/pretixcontrol/organizers/webhooks.html:72 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:18 +#: pretix/control/templates/pretixcontrol/vouchers/bulk.html:94 +#: pretix/control/templates/pretixcontrol/vouchers/bulk.html:117 +#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:85 +msgid "Edit" +msgstr "" + #: pretix/control/templates/pretixcontrol/event/mail.html:60 msgid "Calendar invites" msgstr "" @@ -18757,7 +19037,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/mail.html:79 #: pretix/control/templates/pretixcontrol/event/mail_settings_fragment.html:29 #: pretix/control/templates/pretixcontrol/event/tickets.html:35 -#: pretix/control/templates/pretixcontrol/pdf/index.html:41 +#: pretix/control/templates/pretixcontrol/pdf/index.html:39 #: pretix/control/templates/pretixcontrol/vouchers/bulk.html:97 #: pretix/control/templates/pretixcontrol/vouchers/bulk.html:120 msgid "Preview" @@ -18781,8 +19061,8 @@ msgid "Free order" msgstr "" #: pretix/control/templates/pretixcontrol/event/mail.html:99 -#: pretix/control/templates/pretixcontrol/order/index.html:249 -#: pretix/control/templates/pretixcontrol/order/index.html:589 +#: pretix/control/templates/pretixcontrol/order/index.html:282 +#: pretix/control/templates/pretixcontrol/order/index.html:624 msgid "Resend link" msgstr "" @@ -18822,6 +19102,7 @@ msgid "Enabled" msgstr "" #: pretix/control/templates/pretixcontrol/event/payment.html:28 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:34 #: pretix/control/templates/pretixcontrol/subevents/index.html:170 #: pretix/control/templates/pretixcontrol/user/settings.html:81 msgid "Disabled" @@ -18884,41 +19165,42 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/plugins.html:15 #: pretix/control/templates/pretixcontrol/organizers/plugins.html:15 -#: pretix/control/views/checkin.py:425 pretix/control/views/discounts.py:113 -#: pretix/control/views/event.py:246 pretix/control/views/event.py:575 -#: pretix/control/views/event.py:614 pretix/control/views/event.py:816 -#: pretix/control/views/event.py:1057 pretix/control/views/event.py:1420 -#: pretix/control/views/event.py:1460 +#: pretix/control/views/checkin.py:426 pretix/control/views/discounts.py:113 +#: pretix/control/views/event.py:255 pretix/control/views/event.py:584 +#: pretix/control/views/event.py:623 pretix/control/views/event.py:820 +#: pretix/control/views/event.py:1061 pretix/control/views/event.py:1427 +#: pretix/control/views/event.py:1467 #: pretix/control/views/global_settings.py:65 -#: pretix/control/views/global_settings.py:88 pretix/control/views/item.py:266 -#: pretix/control/views/item.py:779 pretix/control/views/item.py:1105 -#: pretix/control/views/item.py:1283 pretix/control/views/item.py:1434 -#: pretix/control/views/mailsetup.py:151 pretix/control/views/mailsetup.py:163 -#: pretix/control/views/mailsetup.py:190 pretix/control/views/mailsetup.py:258 -#: pretix/control/views/organizer.py:278 pretix/control/views/organizer.py:306 -#: pretix/control/views/organizer.py:522 pretix/control/views/organizer.py:853 -#: pretix/control/views/organizer.py:942 pretix/control/views/organizer.py:1337 -#: pretix/control/views/organizer.py:1435 -#: pretix/control/views/organizer.py:1599 -#: pretix/control/views/organizer.py:2425 -#: pretix/control/views/organizer.py:2562 -#: pretix/control/views/organizer.py:2759 -#: pretix/control/views/organizer.py:2875 -#: pretix/control/views/organizer.py:3004 -#: pretix/control/views/organizer.py:3201 -#: pretix/control/views/organizer.py:3230 -#: pretix/control/views/organizer.py:3270 -#: pretix/control/views/organizer.py:3347 -#: pretix/control/views/organizer.py:3444 -#: pretix/control/views/organizer.py:3473 -#: pretix/control/views/organizer.py:3611 pretix/control/views/subevents.py:542 -#: pretix/control/views/subevents.py:1617 pretix/control/views/user.py:241 +#: pretix/control/views/global_settings.py:88 pretix/control/views/item.py:271 +#: pretix/control/views/item.py:784 pretix/control/views/item.py:1035 +#: pretix/control/views/item.py:1276 pretix/control/views/item.py:1454 +#: pretix/control/views/item.py:1605 pretix/control/views/mailsetup.py:151 +#: pretix/control/views/mailsetup.py:163 pretix/control/views/mailsetup.py:190 +#: pretix/control/views/mailsetup.py:258 pretix/control/views/organizer.py:278 +#: pretix/control/views/organizer.py:306 pretix/control/views/organizer.py:522 +#: pretix/control/views/organizer.py:849 pretix/control/views/organizer.py:938 +#: pretix/control/views/organizer.py:1333 +#: pretix/control/views/organizer.py:1431 +#: pretix/control/views/organizer.py:1595 +#: pretix/control/views/organizer.py:2421 +#: pretix/control/views/organizer.py:2558 +#: pretix/control/views/organizer.py:2755 +#: pretix/control/views/organizer.py:2873 +#: pretix/control/views/organizer.py:3002 +#: pretix/control/views/organizer.py:3199 +#: pretix/control/views/organizer.py:3228 +#: pretix/control/views/organizer.py:3268 +#: pretix/control/views/organizer.py:3345 +#: pretix/control/views/organizer.py:3448 +#: pretix/control/views/organizer.py:3504 +#: pretix/control/views/organizer.py:3642 pretix/control/views/subevents.py:608 +#: pretix/control/views/subevents.py:1739 pretix/control/views/user.py:241 #: pretix/control/views/user.py:857 pretix/control/views/users.py:113 #: pretix/control/views/vouchers.py:306 pretix/plugins/autocheckin/views.py:164 #: pretix/plugins/badges/views.py:158 pretix/plugins/sendmail/views.py:645 #: pretix/plugins/stripe/views.py:699 #: pretix/plugins/ticketoutputpdf/views.py:172 -#: pretix/presale/views/customer.py:544 pretix/presale/views/customer.py:597 +#: pretix/presale/views/customer.py:546 pretix/presale/views/customer.py:599 msgid "Your changes have been saved." msgstr "" @@ -18986,7 +19268,7 @@ msgid "Disable" msgstr "" #: pretix/control/templates/pretixcontrol/event/plugins.html:141 -#: pretix/control/views/organizer.py:810 +#: pretix/control/views/organizer.py:803 msgid "This plugin can only be enabled for the entire organizer account." msgstr "" @@ -19099,9 +19381,9 @@ msgstr "" #: pretix/control/templates/pretixcontrol/item/include_variations.html:97 #: pretix/control/templates/pretixcontrol/item/include_variations.html:202 #: pretix/control/templates/pretixcontrol/item/index.html:127 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:392 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:394 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:77 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:35 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:35 msgid "Meta data" msgstr "" @@ -19173,9 +19455,9 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/settings.html:232 #: pretix/control/templates/pretixcontrol/events/create_basics.html:59 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:411 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:413 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:96 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:54 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:54 msgid "Timeline" msgstr "" @@ -19416,7 +19698,7 @@ msgid "Add a new rule" msgstr "" #: pretix/control/templates/pretixcontrol/event/tax_edit.html:153 -#: pretix/control/templates/pretixcontrol/organizers/edit.html:392 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:393 msgid "Change history" msgstr "" @@ -19521,12 +19803,14 @@ msgstr "" #: pretix/control/templates/pretixcontrol/item/create.html:11 #: pretix/control/templates/pretixcontrol/items/category.html:13 #: pretix/control/templates/pretixcontrol/items/discount.html:13 +#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html:22 #: pretix/control/templates/pretixcontrol/items/quota_edit.html:21 #: pretix/control/templates/pretixcontrol/organizers/create.html:11 -#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:20 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:384 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:21 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:386 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:31 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:23 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:25 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:23 msgid "General information" msgstr "" @@ -19643,19 +19927,6 @@ msgstr "" msgid "More quotas" msgstr "" -#: pretix/control/templates/pretixcontrol/events/index.html:166 -#: pretix/control/templates/pretixcontrol/organizers/detail.html:135 -#: pretix/control/views/dashboards.py:543 -msgid "Shop disabled" -msgstr "" - -#: pretix/control/templates/pretixcontrol/events/index.html:172 -#: pretix/control/templates/pretixcontrol/organizers/detail.html:141 -#: pretix/control/templates/pretixcontrol/subevents/index.html:176 -#: pretix/control/views/dashboards.py:549 -msgid "On sale" -msgstr "" - #: pretix/control/templates/pretixcontrol/events/index.html:177 #: pretix/control/templates/pretixcontrol/organizers/detail.html:146 msgid "Open event dashboard" @@ -19899,8 +20170,8 @@ msgstr "" #: pretix/control/templates/pretixcontrol/item/base.html:27 #: pretix/control/templates/pretixcontrol/item/include_variations.html:82 -#: pretix/control/templates/pretixcontrol/items/quotas.html:35 -#: pretix/control/templates/pretixcontrol/items/quotas.html:41 +#: pretix/control/templates/pretixcontrol/items/quotas.html:27 +#: pretix/control/templates/pretixcontrol/items/quotas.html:75 msgid "Create a new quota" msgstr "" @@ -20126,11 +20397,11 @@ msgid "" msgstr "" #: pretix/control/templates/pretixcontrol/item/include_program_times.html:25 -#: pretix/control/templates/pretixcontrol/item/include_program_times.html:51 +#: pretix/control/templates/pretixcontrol/item/include_program_times.html:52 msgid "Program time" msgstr "" -#: pretix/control/templates/pretixcontrol/item/include_program_times.html:68 +#: pretix/control/templates/pretixcontrol/item/include_program_times.html:70 msgid "Add a program time" msgstr "" @@ -20212,8 +20483,8 @@ msgid "" msgstr "" #: pretix/control/templates/pretixcontrol/item/index.html:254 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:619 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:262 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:621 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:262 msgid "Additional settings" msgstr "" @@ -20423,7 +20694,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:108 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:36 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:72 -#: pretix/presale/views/widget.py:461 +#: pretix/presale/views/widget.py:493 msgid "Sold out" msgstr "" @@ -20484,8 +20755,8 @@ msgid "Can only be bought using a voucher" msgstr "" #: pretix/control/templates/pretixcontrol/items/index.html:159 -#: pretix/control/templates/pretixcontrol/order/index.html:673 -#: pretix/control/templates/pretixcontrol/order/index.html:723 +#: pretix/control/templates/pretixcontrol/order/index.html:708 +#: pretix/control/templates/pretixcontrol/order/index.html:758 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:360 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:419 #, python-format @@ -20493,8 +20764,8 @@ msgid "plus %(rate)s%% %(taxname)s" msgstr "" #: pretix/control/templates/pretixcontrol/items/index.html:163 -#: pretix/control/templates/pretixcontrol/order/index.html:683 -#: pretix/control/templates/pretixcontrol/order/index.html:733 +#: pretix/control/templates/pretixcontrol/order/index.html:718 +#: pretix/control/templates/pretixcontrol/order/index.html:768 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:370 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:429 #, python-format @@ -20705,6 +20976,35 @@ msgstr "" msgid "Quota history" msgstr "" +#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html:6 +msgid "Change multiple quotas" +msgstr "" + +#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html:8 +#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html:8 +#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:14 +#, python-format +msgid "%(number)s selected" +msgstr "" + +#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html:27 +#: pretix/control/templates/pretixcontrol/items/quota_edit.html:29 +msgid "Items" +msgstr "" + +#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html:29 +#: pretix/control/templates/pretixcontrol/items/quota_edit.html:31 +msgid "" +"Please select the products or product variations this quota should be " +"applied to. If you apply two quotas to the same product, it will only be " +"available if both quotas have capacity left." +msgstr "" + +#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html:38 +#: pretix/control/templates/pretixcontrol/items/quota_edit.html:41 +msgid "Advanced options" +msgstr "" + #: pretix/control/templates/pretixcontrol/items/quota_delete.html:4 #: pretix/control/templates/pretixcontrol/items/quota_delete.html:6 msgid "Delete quota" @@ -20719,22 +21019,19 @@ msgstr "" msgid "The following products might be no longer available for sale:" msgstr "" -#: pretix/control/templates/pretixcontrol/items/quota_edit.html:29 -msgid "Items" +#: pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html:4 +#: pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html:6 +msgid "Delete quotas" msgstr "" -#: pretix/control/templates/pretixcontrol/items/quota_edit.html:31 -msgid "" -"Please select the products or product variations this quota should be " -"applied to. If you apply two quotas to the same product, it will only be " -"available if both quotas have capacity left." -msgstr "" +#: pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html:10 +#, python-format +msgid "Are you sure you want to delete the following quota?" +msgid_plural "Are you sure you want to delete the following %(num)s quotas?" +msgstr[0] "" +msgstr[1] "" -#: pretix/control/templates/pretixcontrol/items/quota_edit.html:41 -msgid "Advanced options" -msgstr "" - -#: pretix/control/templates/pretixcontrol/items/quotas.html:8 +#: pretix/control/templates/pretixcontrol/items/quotas.html:9 msgid "" "To make your products actually available, you also need quotas. Quotas " "define, how many instances of your product pretix will sell. This way, you " @@ -20745,18 +21042,38 @@ msgid "" "same time." msgstr "" -#: pretix/control/templates/pretixcontrol/items/quotas.html:25 -msgid "Your search did not match any quotas." -msgstr "" - -#: pretix/control/templates/pretixcontrol/items/quotas.html:27 +#: pretix/control/templates/pretixcontrol/items/quotas.html:20 msgid "You haven't created any quotas yet." msgstr "" -#: pretix/control/templates/pretixcontrol/items/quotas.html:64 +#: pretix/control/templates/pretixcontrol/items/quotas.html:108 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:84 msgid "Capacity left" msgstr "" +#: pretix/control/templates/pretixcontrol/items/quotas.html:129 +#: pretix/control/templates/pretixcontrol/orders/index.html:176 +#: pretix/control/templates/pretixcontrol/organizers/devices.html:114 +#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html:90 +#: pretix/control/templates/pretixcontrol/subevents/index.html:132 +#: pretix/control/templates/pretixcontrol/vouchers/index.html:153 +#: pretix/control/templates/pretixcontrol/waitinglist/index.html:195 +msgid "select row for batch-operation" +msgstr "" + +#: pretix/control/templates/pretixcontrol/items/quotas.html:176 +#: pretix/control/templates/pretixcontrol/subevents/index.html:215 +#: pretix/control/templates/pretixcontrol/vouchers/index.html:212 +#: pretix/control/templates/pretixcontrol/waitinglist/index.html:303 +msgid "Delete selected" +msgstr "" + +#: pretix/control/templates/pretixcontrol/items/quotas.html:180 +#: pretix/control/templates/pretixcontrol/organizers/devices.html:199 +#: pretix/control/templates/pretixcontrol/subevents/index.html:219 +msgid "Edit selected" +msgstr "" + #: pretix/control/templates/pretixcontrol/multi_languages_widget.html:12 msgid "" "This percentage of texts is translated across all parts of the system " @@ -20853,16 +21170,16 @@ msgstr "" msgid "No applications have access to your pretix account." msgstr "" -#: pretix/control/templates/pretixcontrol/order/approve.html:4 -#: pretix/control/templates/pretixcontrol/order/approve.html:8 +#: pretix/control/templates/pretixcontrol/order/approve.html:5 +#: pretix/control/templates/pretixcontrol/order/approve.html:9 msgid "Approve order" msgstr "" -#: pretix/control/templates/pretixcontrol/order/approve.html:10 +#: pretix/control/templates/pretixcontrol/order/approve.html:14 msgid "Do you really want to approve this order?" msgstr "" -#: pretix/control/templates/pretixcontrol/order/approve.html:20 +#: pretix/control/templates/pretixcontrol/order/approve.html:24 #: pretix/control/templates/pretixcontrol/order/cancel.html:46 #: pretix/control/templates/pretixcontrol/order/cancellation_request_delete.html:21 #: pretix/control/templates/pretixcontrol/order/delete.html:20 @@ -20873,14 +21190,14 @@ msgstr "" msgid "No, take me back" msgstr "" -#: pretix/control/templates/pretixcontrol/order/approve.html:25 +#: pretix/control/templates/pretixcontrol/order/approve.html:29 msgid "Yes, approve order" msgstr "" #: pretix/control/templates/pretixcontrol/order/cancel.html:6 #: pretix/control/templates/pretixcontrol/order/cancel.html:10 #: pretix/control/templates/pretixcontrol/order/index.html:68 -#: pretix/control/templates/pretixcontrol/order/index.html:166 +#: pretix/control/templates/pretixcontrol/order/index.html:199 #: pretix/presale/templates/pretixpresale/event/order.html:483 #: pretix/presale/templates/pretixpresale/event/order_cancel.html:7 msgid "Cancel order" @@ -21003,7 +21320,7 @@ msgid "" msgstr "" #: pretix/control/templates/pretixcontrol/order/change.html:101 -#: pretix/control/templates/pretixcontrol/order/change.html:413 +#: pretix/control/templates/pretixcontrol/order/change.html:415 msgid "Change to" msgstr "" @@ -21039,14 +21356,14 @@ msgid "Validity time" msgstr "" #: pretix/control/templates/pretixcontrol/order/change.html:247 -#: pretix/control/templates/pretixcontrol/order/index.html:500 +#: pretix/control/templates/pretixcontrol/order/index.html:535 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:107 #, python-format msgid "Valid from %(datetime)s" msgstr "" #: pretix/control/templates/pretixcontrol/order/change.html:255 -#: pretix/control/templates/pretixcontrol/order/index.html:504 +#: pretix/control/templates/pretixcontrol/order/index.html:539 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:111 #, python-format msgid "Valid until %(datetime)s" @@ -21074,30 +21391,30 @@ msgid "" msgstr "" #: pretix/control/templates/pretixcontrol/order/change.html:317 -#: pretix/control/templates/pretixcontrol/order/change.html:358 -#: pretix/control/templates/pretixcontrol/order/change.html:386 +#: pretix/control/templates/pretixcontrol/order/change.html:359 +#: pretix/control/templates/pretixcontrol/order/change.html:388 msgid "Add product" msgstr "" -#: pretix/control/templates/pretixcontrol/order/change.html:446 +#: pretix/control/templates/pretixcontrol/order/change.html:448 msgid "" "Manually modifying payment fees is discouraged since they might " "automatically be updated on subsequent order changes or when choosing a " "different payment method." msgstr "" -#: pretix/control/templates/pretixcontrol/order/change.html:466 -#: pretix/control/templates/pretixcontrol/order/change.html:493 -#: pretix/control/templates/pretixcontrol/order/change.html:513 +#: pretix/control/templates/pretixcontrol/order/change.html:468 +#: pretix/control/templates/pretixcontrol/order/change.html:495 +#: pretix/control/templates/pretixcontrol/order/change.html:515 msgid "Add fee" msgstr "" -#: pretix/control/templates/pretixcontrol/order/change.html:520 +#: pretix/control/templates/pretixcontrol/order/change.html:522 #: pretix/control/templates/pretixcontrol/order/change_questions.html:66 msgid "Other operations" msgstr "" -#: pretix/control/templates/pretixcontrol/order/change.html:546 +#: pretix/control/templates/pretixcontrol/order/change.html:548 #: pretix/presale/templates/pretixpresale/event/order_change_confirm.html:30 #: pretix/presale/templates/pretixpresale/event/position_change_confirm.html:30 msgid "Perform changes" @@ -21123,7 +21440,7 @@ msgid "Change order information" msgstr "" #: pretix/control/templates/pretixcontrol/order/change_questions.html:25 -#: pretix/control/templates/pretixcontrol/order/index.html:1023 +#: pretix/control/templates/pretixcontrol/order/index.html:1058 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:74 #: pretix/presale/templates/pretixpresale/event/checkout_questions.html:35 #: pretix/presale/templates/pretixpresale/event/order_modify.html:29 @@ -21174,13 +21491,13 @@ msgstr "" #: pretix/control/templates/pretixcontrol/order/index.html:46 #: pretix/control/templates/pretixcontrol/orders/index.html:297 -#: pretix/control/views/orders.py:314 +#: pretix/control/views/orders.py:315 msgid "Approve" msgstr "" #: pretix/control/templates/pretixcontrol/order/index.html:51 #: pretix/control/templates/pretixcontrol/orders/index.html:304 -#: pretix/control/views/orders.py:328 +#: pretix/control/views/orders.py:329 msgid "Deny" msgstr "" @@ -21219,7 +21536,7 @@ msgid "" msgstr "" #: pretix/control/templates/pretixcontrol/order/index.html:116 -#: pretix/control/views/orders.py:376 +#: pretix/control/views/orders.py:377 msgid "Refund for overpayment" msgstr "" @@ -21241,202 +21558,216 @@ msgid "" "payment deadline." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:143 +#: pretix/control/templates/pretixcontrol/order/index.html:140 +msgid "" +"This order was changed after the last invoice was generated. A new invoice " +"was not generated yet, because invoices are configured to be generated on " +"payment or if required by the payment method. A new invoice will be " +"generated once the customer pays the invoice or selects a payment method " +"that requires an invoice." +msgstr "" + +#: pretix/control/templates/pretixcontrol/order/index.html:152 +msgid "Reissue invoice" +msgstr "" + +#: pretix/control/templates/pretixcontrol/order/index.html:161 +#: pretix/control/templates/pretixcontrol/order/index.html:413 +#: pretix/control/templates/pretixcontrol/order/index.html:425 +msgid "Generate invoice" +msgstr "" + +#: pretix/control/templates/pretixcontrol/order/index.html:176 msgid "Cancellation request" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:147 +#: pretix/control/templates/pretixcontrol/order/index.html:180 msgid "The customer asked you to cancel the order with the following settings:" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:154 +#: pretix/control/templates/pretixcontrol/order/index.html:187 msgid "Original payment method" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:163 +#: pretix/control/templates/pretixcontrol/order/index.html:196 msgid "Delete request" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:186 +#: pretix/control/templates/pretixcontrol/order/index.html:219 msgid "Cancellation date" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:208 +#: pretix/control/templates/pretixcontrol/order/index.html:241 msgid "" "This order will not expire automatically since it is already confirmed and " "can be used." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:211 +#: pretix/control/templates/pretixcontrol/order/index.html:244 msgid "" "This order will not expire automatically as it has an open cancellation fee." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:230 +#: pretix/control/templates/pretixcontrol/order/index.html:263 msgid "Contact email" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:234 +#: pretix/control/templates/pretixcontrol/order/index.html:267 msgid "" "We know that this email address works because the user clicked a link we " "sent them." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:278 +#: pretix/control/templates/pretixcontrol/order/index.html:311 msgid "" "We don't know if this invoice was emailed to the customer since it was " "created before our system tracked this information" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:283 +#: pretix/control/templates/pretixcontrol/order/index.html:316 msgid "Invoice was emailed to customer" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:288 +#: pretix/control/templates/pretixcontrol/order/index.html:321 msgid "Invoice was not yet emailed to customer" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:294 +#: pretix/control/templates/pretixcontrol/order/index.html:327 msgid "Invoice is scheduled to be transmitted" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:299 +#: pretix/control/templates/pretixcontrol/order/index.html:332 msgid "Invoice is not yet transmitted" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:302 +#: pretix/control/templates/pretixcontrol/order/index.html:335 msgid "Invoice is currently in transmission" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:307 +#: pretix/control/templates/pretixcontrol/order/index.html:340 msgid "Invoice not transmitted in test mode" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:312 +#: pretix/control/templates/pretixcontrol/order/index.html:345 msgid "Invoice transmission failed" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:317 +#: pretix/control/templates/pretixcontrol/order/index.html:350 msgid "Invoice has been transmitted" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:329 +#: pretix/control/templates/pretixcontrol/order/index.html:362 msgid "Transmit" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:331 +#: pretix/control/templates/pretixcontrol/order/index.html:364 msgid "Retransmit" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:342 +#: pretix/control/templates/pretixcontrol/order/index.html:375 msgid "Rebuild the invoice with updated data but the same invoice number." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:343 +#: pretix/control/templates/pretixcontrol/order/index.html:376 #: pretix/control/templates/pretixcontrol/user/2fa_regenemergency.html:20 msgid "Regenerate" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:354 +#: pretix/control/templates/pretixcontrol/order/index.html:387 msgid "" "Generate a cancellation document for this invoice and create a new invoice " "with a new invoice number." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:357 +#: pretix/control/templates/pretixcontrol/order/index.html:390 msgid "Generate cancellation" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:359 +#: pretix/control/templates/pretixcontrol/order/index.html:392 msgid "Cancel and reissue" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:380 -#: pretix/control/templates/pretixcontrol/order/index.html:392 -msgid "Generate invoice" -msgstr "" - -#: pretix/control/templates/pretixcontrol/order/index.html:406 +#: pretix/control/templates/pretixcontrol/order/index.html:439 msgid "Change answers" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:410 +#: pretix/control/templates/pretixcontrol/order/index.html:443 msgid "Change products" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:415 +#: pretix/control/templates/pretixcontrol/order/index.html:448 #: pretix/presale/templates/pretixpresale/event/order.html:197 msgid "Ordered items" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:434 +#: pretix/control/templates/pretixcontrol/order/index.html:467 #, python-format msgid "Denied scan: %(date)s" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:439 +#: pretix/control/templates/pretixcontrol/order/index.html:472 #, python-format msgid "Exit scan: %(date)s" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:446 +#: pretix/control/templates/pretixcontrol/order/index.html:479 #, python-format msgid "Entry scan: %(date)s" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:465 +#: pretix/control/templates/pretixcontrol/order/index.html:498 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:55 msgid "Voucher code used:" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:467 +#: pretix/control/templates/pretixcontrol/order/index.html:500 #, python-format msgid "Used %(amount)s discount from budget" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:484 +#: pretix/control/templates/pretixcontrol/order/index.html:519 msgid "" "The price of this product was reduced because of an automatic discount or " "this product was part of the discount calculation for a different product in " "this order." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:496 +#: pretix/control/templates/pretixcontrol/order/index.html:531 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:103 #, python-format msgid "Valid %(datetime_range)s" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:542 +#: pretix/control/templates/pretixcontrol/order/index.html:577 msgid "Ticket page" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:573 -#: pretix/control/templates/pretixcontrol/order/index.html:594 -#: pretix/control/templates/pretixcontrol/order/index.html:603 -#: pretix/control/templates/pretixcontrol/order/index.html:617 -#: pretix/control/templates/pretixcontrol/order/index.html:655 -#: pretix/control/templates/pretixcontrol/order/index.html:662 +#: pretix/control/templates/pretixcontrol/order/index.html:608 +#: pretix/control/templates/pretixcontrol/order/index.html:629 +#: pretix/control/templates/pretixcontrol/order/index.html:638 +#: pretix/control/templates/pretixcontrol/order/index.html:652 +#: pretix/control/templates/pretixcontrol/order/index.html:690 +#: pretix/control/templates/pretixcontrol/order/index.html:697 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:228 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:234 msgid "not answered" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:627 +#: pretix/control/templates/pretixcontrol/order/index.html:662 msgid "This question will be asked during check-in." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:639 +#: pretix/control/templates/pretixcontrol/order/index.html:674 msgid "" "This file has been uploaded by a user and could contain viruses or other " "malicious content." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:640 +#: pretix/control/templates/pretixcontrol/order/index.html:675 msgid "UNSAFE" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:773 +#: pretix/control/templates/pretixcontrol/order/index.html:808 #: pretix/control/templates/pretixcontrol/orders/overview.html:89 #: pretix/control/templates/pretixcontrol/orders/overview.html:177 #: pretix/plugins/reports/accountingreport.py:499 @@ -21448,93 +21779,93 @@ msgstr "" msgid "Total" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:789 +#: pretix/control/templates/pretixcontrol/order/index.html:824 #: pretix/presale/templates/pretixpresale/event/order.html:210 msgid "Successful payments" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:798 +#: pretix/control/templates/pretixcontrol/order/index.html:833 #: pretix/presale/templates/pretixpresale/event/order.html:219 msgid "Pending total" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:824 +#: pretix/control/templates/pretixcontrol/order/index.html:859 #: pretix/control/templates/pretixcontrol/search/payments.html:88 msgid "Confirmation date" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:837 +#: pretix/control/templates/pretixcontrol/order/index.html:872 #: pretix/control/templates/pretixcontrol/search/payments.html:125 msgid "" "This payment was created with an older version of pretix, therefore accurate " "data might not be available." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:838 +#: pretix/control/templates/pretixcontrol/order/index.html:873 #: pretix/control/templates/pretixcontrol/search/payments.html:126 msgid "MIGRATED" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:850 +#: pretix/control/templates/pretixcontrol/order/index.html:885 #: pretix/control/templates/pretixcontrol/order/pay_cancel.html:4 #: pretix/control/templates/pretixcontrol/order/pay_cancel.html:8 msgid "Cancel payment" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:855 +#: pretix/control/templates/pretixcontrol/order/index.html:890 msgid "Confirm as paid" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:898 +#: pretix/control/templates/pretixcontrol/order/index.html:933 msgid "Create a refund" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:919 +#: pretix/control/templates/pretixcontrol/order/index.html:954 #: pretix/control/templates/pretixcontrol/orders/refunds.html:60 msgid "Source" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:952 +#: pretix/control/templates/pretixcontrol/order/index.html:987 msgid "Cancel transfer" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:957 +#: pretix/control/templates/pretixcontrol/order/index.html:992 #: pretix/control/templates/pretixcontrol/orders/refunds.html:113 msgid "Confirm as done" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:964 +#: pretix/control/templates/pretixcontrol/order/index.html:999 #: pretix/control/templates/pretixcontrol/orders/refunds.html:119 msgid "Ignore" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:970 +#: pretix/control/templates/pretixcontrol/order/index.html:1005 #: pretix/control/templates/pretixcontrol/order/refund_process.html:58 #: pretix/control/templates/pretixcontrol/orders/refunds.html:124 msgid "Process refund" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:1018 +#: pretix/control/templates/pretixcontrol/order/index.html:1053 #: pretix/presale/templates/pretixpresale/event/base.html:142 #: pretix/presale/templates/pretixpresale/event/timemachine.html:31 msgid "Change" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:1034 +#: pretix/control/templates/pretixcontrol/order/index.html:1069 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:90 #: pretix/presale/templates/pretixpresale/event/order.html:318 msgid "ZIP code and city" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:1047 +#: pretix/control/templates/pretixcontrol/order/index.html:1082 msgid "Valid EU VAT ID" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:1053 +#: pretix/control/templates/pretixcontrol/order/index.html:1088 msgid "Check" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:1107 +#: pretix/control/templates/pretixcontrol/order/index.html:1142 msgid "Order history" msgstr "" @@ -21639,10 +21970,10 @@ msgstr "" #: pretix/control/templates/pretixcontrol/order/refund_choose.html:25 msgid "" -"Any payments that you selected for automatical refunds will be immediately " -"communicate the refund request to the respective payment provider. Manual " -"refunds will be created as pending refunds, you can then later mark them as " -"done once you actually transferred the money back to the customer." +"Any payments you selected for automatic refunds will have the refund request " +"sent immediately to the respective payment provider. Manual refunds will be " +"created as pending refunds, which you can later mark as done once you have " +"actually transferred the money back to the customer." msgstr "" #: pretix/control/templates/pretixcontrol/order/refund_choose.html:32 @@ -22294,19 +22625,12 @@ msgstr "" msgid "Order paid / total" msgstr "" -#: pretix/control/templates/pretixcontrol/orders/index.html:176 -#: pretix/control/templates/pretixcontrol/organizers/devices.html:114 -#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html:90 -#: pretix/control/templates/pretixcontrol/subevents/index.html:132 -#: pretix/control/templates/pretixcontrol/vouchers/index.html:153 -#: pretix/control/templates/pretixcontrol/waitinglist/index.html:195 -msgid "select row for batch-operation" -msgstr "" - #: pretix/control/templates/pretixcontrol/orders/index.html:192 #: pretix/control/templates/pretixcontrol/orders/index.html:194 #: pretix/control/templates/pretixcontrol/search/orders.html:80 #: pretix/control/templates/pretixcontrol/search/orders.html:82 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:265 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:269 #, python-format msgctxt "followup" msgid "TODO %(date)s" @@ -22373,12 +22697,12 @@ msgid "Select action" msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:311 -#: pretix/control/views/orders.py:360 +#: pretix/control/views/orders.py:361 msgid "Refund overpaid amount" msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:319 -#: pretix/control/views/orders.py:345 +#: pretix/control/views/orders.py:346 msgid "Mark as expired if overdue" msgstr "" @@ -22621,12 +22945,6 @@ msgstr "" msgid "Change multiple devices" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html:8 -#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:14 -#, python-format -msgid "%(number)s selected" -msgstr "" - #: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html:36 #: pretix/control/templates/pretixcontrol/organizers/device_edit.html:24 #: pretix/control/templates/pretixcontrol/vouchers/bulk.html:73 @@ -22761,11 +23079,6 @@ msgstr "" msgid "Logs" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/devices.html:199 -#: pretix/control/templates/pretixcontrol/subevents/index.html:219 -msgid "Edit selected" -msgstr "" - #: pretix/control/templates/pretixcontrol/organizers/edit.html:12 msgid "Organizer settings" msgstr "" @@ -22838,11 +23151,11 @@ msgid "" "pretix. This will be ignored if a URL is configured." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:229 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:230 msgid "Barcode media" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:233 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:234 msgid "" "A \"barcode medium\" can be any printed or digital representation of a " "barcode. The medium will initially be created through the sale of a product " @@ -22851,55 +23164,55 @@ msgid "" "same barcode may be re-used during the sale of a different product." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:240 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:241 msgid "Barcode media can currently only be connected to tickets." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:243 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:244 msgid "" "This subsequent reuse of the barcode is currently only supported during POS " "sales." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:260 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:261 msgid "" "This medium type can work with almost any type of NFC chip. With this " "option, only the UID of the NFC chip is used for identification." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:264 -#: pretix/control/templates/pretixcontrol/organizers/edit.html:296 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:265 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:297 msgid "NFC media can currently only be connected to gift cards." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:270 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:271 msgid "" "This method does not provide a high level of protection against abuse since " "it is possible for malicious users to clone someone's chip with the same UID." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:291 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:292 msgid "" "This medium type works only with NFC chips of the type Mifare Ultralight AES " "made by NXP. This provides a higher level of security than other approaches, " "but requires all chips to be encoded prior to use." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:318 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:319 msgid "Domains" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:320 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:321 msgid "This dialog is intended for advanced users." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:321 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:322 msgid "" "The domain needs to be configured on your webserver before it can be used " "here." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:377 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:378 msgid "Add domain" msgstr "" @@ -23343,7 +23656,7 @@ msgid "Media type" msgstr "" #: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:63 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:40 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:52 msgctxt "reusable_media" msgid "Connections" msgstr "" @@ -23357,7 +23670,7 @@ msgctxt "reusable_media" msgid "Medium %(id)s" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:94 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:106 msgctxt "reusable_media" msgid "Medium history" msgstr "" @@ -23442,20 +23755,41 @@ msgstr "" msgid "Are you sure you want to delete the team?" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:7 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:8 #: pretix/control/templates/pretixcontrol/organizers/team_members.html:6 msgid "Team:" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:9 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:10 #: pretix/control/templates/pretixcontrol/organizers/teams.html:30 msgid "Create a new team" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:11 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:12 msgid "You will be able to add team members in the next step." msgstr "" +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:31 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:55 +msgid "" +"Even if a team has no access to a certain category of data, they might still " +"be able to see parts of this data when it is linked to data they can see." +msgstr "" + +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:35 +msgid "" +"For example, someone with access to customer accounts will be able to see " +"some information about gift cards linked to a customer account, even if they " +"generally can't see gift cards directly." +msgstr "" + +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:59 +msgid "" +"For example, someone with access to orders will be able to see some " +"information about vouchers used to create an order, even if they generally " +"can't see vouchers directly." +msgstr "" + #: pretix/control/templates/pretixcontrol/organizers/team_members.html:21 msgid "Member" msgstr "" @@ -23630,89 +23964,89 @@ msgstr "" msgid "PDF Editor" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:36 +#: pretix/control/templates/pretixcontrol/pdf/index.html:34 #: pretix/plugins/banktransfer/refund_export.py:47 msgid "Code" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:52 +#: pretix/control/templates/pretixcontrol/pdf/index.html:50 msgid "Text box" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:59 +#: pretix/control/templates/pretixcontrol/pdf/index.html:57 msgid "QR Code" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:64 +#: pretix/control/templates/pretixcontrol/pdf/index.html:62 msgid "QR code for Check-In" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:71 +#: pretix/control/templates/pretixcontrol/pdf/index.html:69 msgid "QR code for Lead Scanning" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:78 +#: pretix/control/templates/pretixcontrol/pdf/index.html:76 msgid "Other QR code" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:87 +#: pretix/control/templates/pretixcontrol/pdf/index.html:85 msgid "Image" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:92 +#: pretix/control/templates/pretixcontrol/pdf/index.html:90 msgid "" "You can use this to add user-uploaded pictures from questions or pictures " "generated by plugins. If you want to embed a logo or other images, use a " "custom background instead." msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:93 +#: pretix/control/templates/pretixcontrol/pdf/index.html:91 msgid "Dynamic image" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:100 +#: pretix/control/templates/pretixcontrol/pdf/index.html:98 msgid "pretix Logo" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:107 +#: pretix/control/templates/pretixcontrol/pdf/index.html:105 msgid "Duplicate" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:117 +#: pretix/control/templates/pretixcontrol/pdf/index.html:115 msgid "Undo" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:121 +#: pretix/control/templates/pretixcontrol/pdf/index.html:119 msgid "Redo" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:142 +#: pretix/control/templates/pretixcontrol/pdf/index.html:140 msgid "" "This feature is only intended for advanced users. We recommend to only use " "it to copy and share ticket designs, not to modify the design source code." msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:156 +#: pretix/control/templates/pretixcontrol/pdf/index.html:154 #: pretix/presale/templates/pretixpresale/giftcard/checkout.html:26 msgid "Apply" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:164 +#: pretix/control/templates/pretixcontrol/pdf/index.html:162 msgid "Uploading new PDF background…" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:172 +#: pretix/control/templates/pretixcontrol/pdf/index.html:170 msgid "Welcome to the PDF ticket editor!" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:174 +#: pretix/control/templates/pretixcontrol/pdf/index.html:172 msgid "" "This editor allows you to create a design for the PDF tickets of your event. " "You can upload a background PDF and then use this tool to place texts and a " "QR code on the ticket." msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:185 +#: pretix/control/templates/pretixcontrol/pdf/index.html:183 msgid "" "Please note that the editor can only provide a rough preview. Some details, " "for example in text rendering, might look slightly different in the final " @@ -23720,7 +24054,7 @@ msgid "" "preview." msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:199 +#: pretix/control/templates/pretixcontrol/pdf/index.html:197 msgid "" "The editor is tested with recent versions of Google Chrome, Mozilla Firefox " "and Opera. Other browsers, especially Internet Explorer or Microsoft Edge, " @@ -23728,174 +24062,174 @@ msgid "" "fonts." msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:207 +#: pretix/control/templates/pretixcontrol/pdf/index.html:205 msgid "" "The editor requires JavaScript to work. Please enable JavaScript in your " "browser to continue." msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:217 -#: pretix/control/templates/pretixcontrol/pdf/index.html:233 +#: pretix/control/templates/pretixcontrol/pdf/index.html:215 +#: pretix/control/templates/pretixcontrol/pdf/index.html:231 msgid "Loading…" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:220 +#: pretix/control/templates/pretixcontrol/pdf/index.html:218 msgid "Start editing" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:240 +#: pretix/control/templates/pretixcontrol/pdf/index.html:238 msgid "Layout name" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:247 +#: pretix/control/templates/pretixcontrol/pdf/index.html:245 msgid "Preferred language" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:260 -#: pretix/control/templates/pretixcontrol/pdf/index.html:270 +#: pretix/control/templates/pretixcontrol/pdf/index.html:258 +#: pretix/control/templates/pretixcontrol/pdf/index.html:268 msgid "Upload PDF as background" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:262 +#: pretix/control/templates/pretixcontrol/pdf/index.html:260 msgid "" "You can upload a PDF to use as a custom background. The paper size will " "match the PDF." msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:274 +#: pretix/control/templates/pretixcontrol/pdf/index.html:272 #, python-format msgid "max. %(size)s, smaller is better" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:282 +#: pretix/control/templates/pretixcontrol/pdf/index.html:280 msgid "Download current background" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:289 +#: pretix/control/templates/pretixcontrol/pdf/index.html:287 msgid "Or choose custom paper size" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:291 +#: pretix/control/templates/pretixcontrol/pdf/index.html:289 msgid "" "To manually change the paper size, you need to create a new, empty " "background." msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:299 -#: pretix/control/templates/pretixcontrol/pdf/index.html:386 -#: pretix/control/templates/pretixcontrol/pdf/index.html:428 +#: pretix/control/templates/pretixcontrol/pdf/index.html:297 +#: pretix/control/templates/pretixcontrol/pdf/index.html:384 +#: pretix/control/templates/pretixcontrol/pdf/index.html:426 msgid "Width (mm)" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:303 -#: pretix/control/templates/pretixcontrol/pdf/index.html:391 +#: pretix/control/templates/pretixcontrol/pdf/index.html:301 +#: pretix/control/templates/pretixcontrol/pdf/index.html:389 msgid "Height (mm)" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:312 +#: pretix/control/templates/pretixcontrol/pdf/index.html:310 msgid "Create empty background" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:319 +#: pretix/control/templates/pretixcontrol/pdf/index.html:317 msgid "Style" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:321 +#: pretix/control/templates/pretixcontrol/pdf/index.html:319 msgid "Dark" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:322 +#: pretix/control/templates/pretixcontrol/pdf/index.html:320 msgid "Light" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:328 +#: pretix/control/templates/pretixcontrol/pdf/index.html:326 msgid "Image content" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:339 +#: pretix/control/templates/pretixcontrol/pdf/index.html:337 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:20 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:34 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:29 msgid "Content" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:348 +#: pretix/control/templates/pretixcontrol/pdf/index.html:346 #: pretix/control/templates/pretixcontrol/pdf/placeholders.html:50 msgid "Event attribute:" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:353 +#: pretix/control/templates/pretixcontrol/pdf/index.html:351 #: pretix/control/templates/pretixcontrol/pdf/placeholders.html:59 msgid "Item attribute:" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:356 +#: pretix/control/templates/pretixcontrol/pdf/index.html:354 msgid "Other… (multilingual)" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:357 +#: pretix/control/templates/pretixcontrol/pdf/index.html:355 msgid "Other…" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:367 +#: pretix/control/templates/pretixcontrol/pdf/index.html:365 msgid "Show available placeholders" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:374 +#: pretix/control/templates/pretixcontrol/pdf/index.html:372 msgid "x (mm)" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:379 +#: pretix/control/templates/pretixcontrol/pdf/index.html:377 msgid "y (mm)" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:398 +#: pretix/control/templates/pretixcontrol/pdf/index.html:396 msgid "Size (mm)" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:405 +#: pretix/control/templates/pretixcontrol/pdf/index.html:403 msgid "QR color" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:420 +#: pretix/control/templates/pretixcontrol/pdf/index.html:418 msgid "Render without whitespace" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:422 +#: pretix/control/templates/pretixcontrol/pdf/index.html:420 msgid "" "Required for consistent size across platforms. Supported on Android starting " "with pretixPRINT 2.3.3 and on Desktop with pretixSCAN 1.9.3." msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:433 +#: pretix/control/templates/pretixcontrol/pdf/index.html:431 msgid "Rotation (°)" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:452 +#: pretix/control/templates/pretixcontrol/pdf/index.html:450 msgid "Font size (pt)" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:457 +#: pretix/control/templates/pretixcontrol/pdf/index.html:455 msgid "Line height" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:464 +#: pretix/control/templates/pretixcontrol/pdf/index.html:462 msgid "Text color" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:487 +#: pretix/control/templates/pretixcontrol/pdf/index.html:485 msgid "Flow multiple lines downward from specified position" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:541 +#: pretix/control/templates/pretixcontrol/pdf/index.html:539 msgid "Automatically reduce font size to fit content" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:547 +#: pretix/control/templates/pretixcontrol/pdf/index.html:545 msgid "Allow long words to be split (preview is not accurate)" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:558 +#: pretix/control/templates/pretixcontrol/pdf/index.html:556 #, python-format msgid "" "This layout uses new features. If you print from your device, make sure you " @@ -24099,26 +24433,26 @@ msgstr "" msgid "Add many time slots" msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:481 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:483 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:266 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:124 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:124 msgid "Add a new quota" msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:485 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:128 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:487 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:128 msgid "Product settings" msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:487 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:130 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:489 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:130 msgid "" "These settings are optional, if you leave them empty, the default values " "from the product settings will be used." msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:523 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:166 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:525 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:166 msgid "" "You can choose to either add one or more check-in lists for every date in " "your series individually, or use just one check-in list for all your dates " @@ -24130,9 +24464,9 @@ msgid "" "will be easier." msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:602 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:604 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:359 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:245 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:245 msgid "Add a new check-in list" msgstr "" @@ -24208,16 +24542,36 @@ msgid "" "be disabled instead." msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/detail.html:10 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:9 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:13 +#, python-format msgctxt "subevent" -msgid "Create date" +msgid "Date: %(name)s" msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/detail.html:279 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:234 +msgid "partially canceled" +msgstr "" + +#: pretix/control/templates/pretixcontrol/subevents/detail.html:282 +msgid "View all" +msgstr "" + +#: pretix/control/templates/pretixcontrol/subevents/detail.html:289 +msgid "No orders found." +msgstr "" + +#: pretix/control/templates/pretixcontrol/subevents/detail.html:302 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:279 msgctxt "subevent" msgid "Date history" msgstr "" +#: pretix/control/templates/pretixcontrol/subevents/edit.html:10 +msgctxt "subevent" +msgid "Create date" +msgstr "" + #: pretix/control/templates/pretixcontrol/subevents/fragment_unavail_mode_indicator.html:3 #: pretix/control/templates/pretixcontrol/subevents/fragment_unavail_mode_indicator.html:5 msgid "You can change this option in the variation settings." @@ -24263,12 +24617,6 @@ msgctxt "subevent" msgid "Use as a template for many new dates" msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/index.html:215 -#: pretix/control/templates/pretixcontrol/vouchers/index.html:212 -#: pretix/control/templates/pretixcontrol/waitinglist/index.html:303 -msgid "Delete selected" -msgstr "" - #: pretix/control/templates/pretixcontrol/subevents/index.html:222 msgid "Activate selected" msgstr "" @@ -25254,20 +25602,21 @@ msgstr "" msgid "The new check-in list has been created." msgstr "" -#: pretix/control/views/checkin.py:382 pretix/control/views/checkin.py:442 +#: pretix/control/views/checkin.py:382 pretix/control/views/checkin.py:443 #: pretix/control/views/discounts.py:134 pretix/control/views/discounts.py:182 -#: pretix/control/views/event.py:275 pretix/control/views/event.py:578 -#: pretix/control/views/event.py:617 pretix/control/views/event.py:819 -#: pretix/control/views/event.py:1023 pretix/control/views/event.py:1373 -#: pretix/control/views/event.py:1439 pretix/control/views/event.py:1591 -#: pretix/control/views/item.py:282 pretix/control/views/item.py:329 -#: pretix/control/views/item.py:789 pretix/control/views/item.py:815 -#: pretix/control/views/item.py:935 pretix/control/views/item.py:1139 -#: pretix/control/views/item.py:1305 pretix/control/views/item.py:1501 -#: pretix/control/views/organizer.py:281 pretix/control/views/organizer.py:309 -#: pretix/control/views/organizer.py:1454 pretix/control/views/subevents.py:521 -#: pretix/control/views/subevents.py:647 pretix/control/views/subevents.py:1063 -#: pretix/control/views/subevents.py:1525 pretix/control/views/user.py:342 +#: pretix/control/views/event.py:284 pretix/control/views/event.py:587 +#: pretix/control/views/event.py:626 pretix/control/views/event.py:823 +#: pretix/control/views/event.py:1027 pretix/control/views/event.py:1380 +#: pretix/control/views/event.py:1446 pretix/control/views/event.py:1598 +#: pretix/control/views/item.py:287 pretix/control/views/item.py:334 +#: pretix/control/views/item.py:794 pretix/control/views/item.py:820 +#: pretix/control/views/item.py:1054 pretix/control/views/item.py:1106 +#: pretix/control/views/item.py:1310 pretix/control/views/item.py:1476 +#: pretix/control/views/item.py:1668 pretix/control/views/organizer.py:281 +#: pretix/control/views/organizer.py:309 pretix/control/views/organizer.py:1450 +#: pretix/control/views/subevents.py:586 pretix/control/views/subevents.py:740 +#: pretix/control/views/subevents.py:1185 +#: pretix/control/views/subevents.py:1647 pretix/control/views/user.py:342 #: pretix/control/views/user.py:861 pretix/control/views/user.py:901 #: pretix/control/views/vouchers.py:278 pretix/control/views/vouchers.py:352 #: pretix/control/views/vouchers.py:535 pretix/control/views/waitinglist.py:427 @@ -25279,11 +25628,11 @@ msgstr "" msgid "We could not save your changes. See below for details." msgstr "" -#: pretix/control/views/checkin.py:421 pretix/control/views/checkin.py:458 +#: pretix/control/views/checkin.py:422 pretix/control/views/checkin.py:459 msgid "The requested list does not exist." msgstr "" -#: pretix/control/views/checkin.py:467 +#: pretix/control/views/checkin.py:468 msgid "The selected list has been deleted." msgstr "" @@ -25369,7 +25718,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:117 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:48 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:80 -#: pretix/presale/views/widget.py:475 +#: pretix/presale/views/widget.py:507 msgid "Sale over" msgstr "" @@ -25377,7 +25726,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/fragment_calendar.html:119 #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:125 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:88 -#: pretix/presale/views/widget.py:486 +#: pretix/presale/views/widget.py:518 msgid "Soon" msgstr "" @@ -25434,10 +25783,10 @@ msgstr "" msgid "The order of discounts has been updated." msgstr "" -#: pretix/control/views/discounts.py:260 pretix/control/views/item.py:192 -#: pretix/control/views/item.py:404 pretix/control/views/item.py:538 -#: pretix/control/views/organizer.py:2645 -#: pretix/control/views/organizer.py:3706 +#: pretix/control/views/discounts.py:260 pretix/control/views/item.py:197 +#: pretix/control/views/item.py:409 pretix/control/views/item.py:543 +#: pretix/control/views/organizer.py:2641 +#: pretix/control/views/organizer.py:3737 msgid "Some of the provided object ids are invalid." msgstr "" @@ -25445,133 +25794,133 @@ msgstr "" msgid "Not all discounts have been selected." msgstr "" -#: pretix/control/views/event.py:455 +#: pretix/control/views/event.py:464 msgid "" "You do not have sufficient permission to enable plugins that need to be " "enabled for the entire organizer account." msgstr "" -#: pretix/control/views/event.py:472 pretix/control/views/organizer.py:716 +#: pretix/control/views/event.py:481 pretix/control/views/organizer.py:717 #, python-brace-format msgid "The plugin {} is now active, you can configure it here:" msgstr "" -#: pretix/control/views/event.py:481 pretix/control/views/organizer.py:725 +#: pretix/control/views/event.py:490 pretix/control/views/organizer.py:726 #, python-brace-format msgid "The plugin {} is now active." msgstr "" -#: pretix/control/views/event.py:546 +#: pretix/control/views/event.py:555 msgid "" "This payment provider does not exist or the respective plugin is disabled." msgstr "" -#: pretix/control/views/event.py:858 pretix/control/views/organizer.py:362 +#: pretix/control/views/event.py:862 pretix/control/views/organizer.py:362 #: pretix/control/views/vouchers.py:562 msgid "invalid item" msgstr "" -#: pretix/control/views/event.py:945 +#: pretix/control/views/event.py:949 #, python-format msgid "Your order: %(code)s" msgstr "" -#: pretix/control/views/event.py:954 +#: pretix/control/views/event.py:958 msgid "Unknown email renderer." msgstr "" -#: pretix/control/views/event.py:970 pretix/control/views/orders.py:684 +#: pretix/control/views/event.py:974 pretix/control/views/orders.py:701 #: pretix/presale/views/order.py:1177 pretix/presale/views/order.py:1184 msgid "You requested an invalid ticket output type." msgstr "" -#: pretix/control/views/event.py:1118 +#: pretix/control/views/event.py:1122 msgid "Your shop is live now!" msgstr "" -#: pretix/control/views/event.py:1126 +#: pretix/control/views/event.py:1130 msgid "We've taken your shop down. You can re-enable it whenever you want!" msgstr "" -#: pretix/control/views/event.py:1134 +#: pretix/control/views/event.py:1138 msgid "Your shop is now in test mode!" msgstr "" -#: pretix/control/views/event.py:1151 +#: pretix/control/views/event.py:1158 msgid "" "An order could not be deleted as some constraints (e.g. data created by plug-" "ins) do not allow it." msgstr "" -#: pretix/control/views/event.py:1157 +#: pretix/control/views/event.py:1164 msgid "We've disabled test mode for you. Let's sell some real tickets!" msgstr "" -#: pretix/control/views/event.py:1179 +#: pretix/control/views/event.py:1186 msgid "This event can not be deleted." msgstr "" -#: pretix/control/views/event.py:1202 +#: pretix/control/views/event.py:1209 msgid "The event has been deleted." msgstr "" -#: pretix/control/views/event.py:1205 +#: pretix/control/views/event.py:1212 msgid "" "The event could not be deleted as some constraints (e.g. data created by " "plug-ins) do not allow it." msgstr "" -#: pretix/control/views/event.py:1221 +#: pretix/control/views/event.py:1228 #, python-brace-format msgid "" "Specifically, the following plugins still contain data depends on this " "event: {plugin_names}" msgstr "" -#: pretix/control/views/event.py:1301 pretix/control/views/orders.py:777 +#: pretix/control/views/event.py:1308 pretix/control/views/orders.py:781 msgid "The comment has been updated." msgstr "" -#: pretix/control/views/event.py:1303 pretix/control/views/orders.py:779 +#: pretix/control/views/event.py:1310 pretix/control/views/orders.py:783 msgid "Could not update the comment." msgstr "" -#: pretix/control/views/event.py:1331 pretix/control/views/main.py:362 +#: pretix/control/views/event.py:1338 pretix/control/views/main.py:362 msgid "VAT" msgstr "" -#: pretix/control/views/event.py:1367 +#: pretix/control/views/event.py:1374 msgid "The new tax rule has been created." msgstr "" -#: pretix/control/views/event.py:1390 pretix/control/views/event.py:1453 -#: pretix/control/views/event.py:1499 +#: pretix/control/views/event.py:1397 pretix/control/views/event.py:1460 +#: pretix/control/views/event.py:1506 msgid "The requested tax rule does not exist." msgstr "" -#: pretix/control/views/event.py:1508 +#: pretix/control/views/event.py:1515 msgid "The selected tax rule has been deleted." msgstr "" -#: pretix/control/views/event.py:1510 +#: pretix/control/views/event.py:1517 msgid "The selected tax rule can not be deleted." msgstr "" -#: pretix/control/views/event.py:1561 +#: pretix/control/views/event.py:1568 msgid "Your event is not empty, you need to set it up manually." msgstr "" -#: pretix/control/views/event.py:1696 +#: pretix/control/views/event.py:1703 msgid "" "Your changes have been saved. You can now go on with looking at the details " "or take your event live to start selling!" msgstr "" -#: pretix/control/views/event.py:1717 +#: pretix/control/views/event.py:1724 msgid "Regular ticket" msgstr "" -#: pretix/control/views/event.py:1722 +#: pretix/control/views/event.py:1729 msgid "Reduced ticket" msgstr "" @@ -25651,130 +26000,134 @@ msgid "" "plugin \"{plugin}\" with license \"{license}\"." msgstr "" -#: pretix/control/views/item.py:141 pretix/control/views/item.py:1606 +#: pretix/control/views/item.py:146 pretix/control/views/item.py:1773 msgid "The requested product does not exist." msgstr "" -#: pretix/control/views/item.py:159 +#: pretix/control/views/item.py:164 msgid "The order of items has been updated." msgstr "" -#: pretix/control/views/item.py:227 pretix/control/views/item.py:262 -#: pretix/control/views/item.py:353 +#: pretix/control/views/item.py:232 pretix/control/views/item.py:267 +#: pretix/control/views/item.py:358 msgid "The requested product category does not exist." msgstr "" -#: pretix/control/views/item.py:238 +#: pretix/control/views/item.py:243 msgid "The selected category has been deleted." msgstr "" -#: pretix/control/views/item.py:323 +#: pretix/control/views/item.py:328 msgid "The new category has been created." msgstr "" -#: pretix/control/views/item.py:371 +#: pretix/control/views/item.py:376 msgid "The order of categories has been updated." msgstr "" -#: pretix/control/views/item.py:407 pretix/control/views/item.py:541 -#: pretix/control/views/organizer.py:2648 -#: pretix/control/views/organizer.py:3709 +#: pretix/control/views/item.py:412 pretix/control/views/item.py:546 +#: pretix/control/views/organizer.py:2644 +#: pretix/control/views/organizer.py:3740 msgid "Not all objects have been selected." msgstr "" -#: pretix/control/views/item.py:480 +#: pretix/control/views/item.py:485 msgid "Street" msgstr "" -#: pretix/control/views/item.py:582 pretix/control/views/item.py:743 -#: pretix/control/views/item.py:765 +#: pretix/control/views/item.py:587 pretix/control/views/item.py:748 +#: pretix/control/views/item.py:770 msgid "The requested question does not exist." msgstr "" -#: pretix/control/views/item.py:600 +#: pretix/control/views/item.py:605 msgid "The selected question has been deleted." msgstr "" -#: pretix/control/views/item.py:690 +#: pretix/control/views/item.py:695 msgid "File uploaded" msgstr "" -#: pretix/control/views/item.py:824 +#: pretix/control/views/item.py:829 msgid "The new question has been created." msgstr "" -#: pretix/control/views/item.py:903 +#: pretix/control/views/item.py:918 +msgid "The selected quotas have been deleted or disabled." +msgstr "" + +#: pretix/control/views/item.py:1074 msgid "The new quota has been created." msgstr "" -#: pretix/control/views/item.py:966 +#: pretix/control/views/item.py:1137 msgid "Exit scans" msgstr "" -#: pretix/control/views/item.py:973 +#: pretix/control/views/item.py:1144 msgid "Vouchers and waiting list reservations" msgstr "" -#: pretix/control/views/item.py:988 +#: pretix/control/views/item.py:1159 msgid "Available quota" msgstr "" -#: pretix/control/views/item.py:994 +#: pretix/control/views/item.py:1165 msgid "Waiting list (pending)" msgstr "" -#: pretix/control/views/item.py:1001 +#: pretix/control/views/item.py:1172 msgid "Currently for sale" msgstr "" -#: pretix/control/views/item.py:1055 pretix/control/views/item.py:1101 -#: pretix/control/views/item.py:1155 +#: pretix/control/views/item.py:1226 pretix/control/views/item.py:1272 +#: pretix/control/views/item.py:1326 msgid "The requested quota does not exist." msgstr "" -#: pretix/control/views/item.py:1076 +#: pretix/control/views/item.py:1247 msgid "The quota has been re-opened and will not close again." msgstr "" -#: pretix/control/views/item.py:1169 +#: pretix/control/views/item.py:1340 msgid "The selected quota has been deleted." msgstr "" -#: pretix/control/views/item.py:1192 +#: pretix/control/views/item.py:1363 msgid "The requested item does not exist." msgstr "" -#: pretix/control/views/item.py:1364 +#: pretix/control/views/item.py:1535 msgid "" "You cannot add add-ons to a product that is only available as an add-on " "itself." msgstr "" -#: pretix/control/views/item.py:1374 +#: pretix/control/views/item.py:1545 msgid "" "You cannot add bundles to a product that is only available as an add-on " "itself." msgstr "" -#: pretix/control/views/item.py:1517 +#: pretix/control/views/item.py:1684 msgid "" "You disabled this item, but it is still part of a product bundle. Your " "participants won't be able to buy the bundle unless you remove this item " "from it." msgstr "" -#: pretix/control/views/item.py:1626 +#: pretix/control/views/item.py:1793 msgid "" "The product could not be deleted as some constraints (e.g. data created by " "plug-ins) did not allow it. Deleting it could break reporting or other " "functionality, so the product has been disabled instead." msgstr "" -#: pretix/control/views/item.py:1630 +#: pretix/control/views/item.py:1797 msgid "The selected product has been deleted." msgstr "" -#: pretix/control/views/item.py:1639 +#: pretix/control/views/item.py:1806 msgid "The selected product has been deactivated." msgstr "" @@ -25889,81 +26242,81 @@ msgstr "" msgid "Access for the selected application has been revoked." msgstr "" -#: pretix/control/views/orders.py:196 +#: pretix/control/views/orders.py:197 msgid "We could not process your input. See below for details." msgstr "" -#: pretix/control/views/orders.py:269 +#: pretix/control/views/orders.py:270 #, python-brace-format msgid "" "Successfully executed the action \"{label}\" on {success} of {total} orders." msgstr "" -#: pretix/control/views/orders.py:686 pretix/presale/views/order.py:114 +#: pretix/control/views/orders.py:703 pretix/presale/views/order.py:114 #: pretix/presale/views/order.py:382 pretix/presale/views/order.py:1006 -#: pretix/presale/views/order.py:1186 pretix/presale/views/order.py:1797 +#: pretix/presale/views/order.py:1186 pretix/presale/views/order.py:1794 msgid "Unknown order code or not authorized to access this order." msgstr "" -#: pretix/control/views/orders.py:688 pretix/presale/views/order.py:1191 +#: pretix/control/views/orders.py:705 pretix/presale/views/order.py:1191 msgid "Ticket download is not enabled for this product." msgstr "" -#: pretix/control/views/orders.py:813 +#: pretix/control/views/orders.py:817 msgid "The order has been deleted." msgstr "" -#: pretix/control/views/orders.py:820 +#: pretix/control/views/orders.py:824 msgid "" "The order could not be deleted as some constraints (e.g. data created by " "plug-ins) do not allow it." msgstr "" -#: pretix/control/views/orders.py:828 +#: pretix/control/views/orders.py:832 msgid "Only orders created in test mode can be deleted." msgstr "" -#: pretix/control/views/orders.py:849 +#: pretix/control/views/orders.py:853 msgid "The order has been denied and is therefore now canceled." msgstr "" -#: pretix/control/views/orders.py:889 +#: pretix/control/views/orders.py:893 msgid "This payment has been canceled." msgstr "" -#: pretix/control/views/orders.py:891 +#: pretix/control/views/orders.py:895 msgid "This payment can not be canceled at the moment." msgstr "" -#: pretix/control/views/orders.py:917 +#: pretix/control/views/orders.py:921 msgid "The refund has been canceled." msgstr "" -#: pretix/control/views/orders.py:919 +#: pretix/control/views/orders.py:923 msgid "This refund can not be canceled at the moment." msgstr "" -#: pretix/control/views/orders.py:953 +#: pretix/control/views/orders.py:957 msgid "The refund has been processed." msgstr "" -#: pretix/control/views/orders.py:955 pretix/control/views/orders.py:981 +#: pretix/control/views/orders.py:959 pretix/control/views/orders.py:985 msgid "This refund can not be processed at the moment." msgstr "" -#: pretix/control/views/orders.py:979 +#: pretix/control/views/orders.py:983 msgid "The refund has been marked as done." msgstr "" -#: pretix/control/views/orders.py:1005 +#: pretix/control/views/orders.py:1009 msgid "The request has been removed. If you want, you can now inform the user." msgstr "" -#: pretix/control/views/orders.py:1012 +#: pretix/control/views/orders.py:1016 msgid "Your cancellation request" msgstr "" -#: pretix/control/views/orders.py:1013 +#: pretix/control/views/orders.py:1017 #, python-brace-format msgid "" "Hello,\n" @@ -25974,66 +26327,66 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/control/views/orders.py:1068 +#: pretix/control/views/orders.py:1072 msgid "The payment has been marked as complete." msgstr "" -#: pretix/control/views/orders.py:1070 +#: pretix/control/views/orders.py:1074 msgid "This payment can not be confirmed at the moment." msgstr "" -#: pretix/control/views/orders.py:1161 +#: pretix/control/views/orders.py:1165 msgid "" "The refund was prevented due to a refund already being processed at the same " "time. Please have a look at the order details and check if your refund is " "still necessary." msgstr "" -#: pretix/control/views/orders.py:1266 +#: pretix/control/views/orders.py:1270 msgid "You entered an order in an event with a different currency." msgstr "" -#: pretix/control/views/orders.py:1317 +#: pretix/control/views/orders.py:1321 msgid "" "You can not refund more than the amount of a payment that is not yet " "refunded." msgstr "" -#: pretix/control/views/orders.py:1322 +#: pretix/control/views/orders.py:1326 msgid "" "You selected a partial refund for a payment method that only supports full " "refunds." msgstr "" -#: pretix/control/views/orders.py:1352 +#: pretix/control/views/orders.py:1356 #, python-brace-format msgid "" "One of the refunds failed to be processed. You should retry to refund in a " "different way. The error message was: {}" msgstr "" -#: pretix/control/views/orders.py:1358 +#: pretix/control/views/orders.py:1362 #, python-brace-format msgid "A refund of {} has been processed." msgstr "" -#: pretix/control/views/orders.py:1362 +#: pretix/control/views/orders.py:1366 #, python-brace-format msgid "" "A refund of {} has been saved, but not yet fully executed. You can mark it " "as complete below." msgstr "" -#: pretix/control/views/orders.py:1391 +#: pretix/control/views/orders.py:1395 msgid "" "A new gift card was created. You can now send the user their gift card code." msgstr "" -#: pretix/control/views/orders.py:1399 +#: pretix/control/views/orders.py:1403 msgid "Your gift card code" msgstr "" -#: pretix/control/views/orders.py:1401 +#: pretix/control/views/orders.py:1405 #, python-brace-format msgid "" "Hello,\n" @@ -26046,206 +26399,206 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/control/views/orders.py:1412 +#: pretix/control/views/orders.py:1416 msgid "The refunds you selected do not match the selected total refund amount." msgstr "" -#: pretix/control/views/orders.py:1542 +#: pretix/control/views/orders.py:1546 msgid "The payment has been created successfully." msgstr "" -#: pretix/control/views/orders.py:1556 +#: pretix/control/views/orders.py:1560 msgid "" "The order has been canceled. You can now select how you want to transfer the " "money back to the user." msgstr "" -#: pretix/control/views/orders.py:1627 pretix/control/views/orders.py:1631 +#: pretix/control/views/orders.py:1631 pretix/control/views/orders.py:1635 msgid "No VAT ID specified." msgstr "" -#: pretix/control/views/orders.py:1635 +#: pretix/control/views/orders.py:1639 msgid "No country specified." msgstr "" -#: pretix/control/views/orders.py:1639 +#: pretix/control/views/orders.py:1643 msgid "VAT ID could not be checked since this country is not supported." msgstr "" -#: pretix/control/views/orders.py:1658 +#: pretix/control/views/orders.py:1662 msgid "" "The VAT ID could not be checked, as the VAT checking service of the country " "is currently not available." msgstr "" -#: pretix/control/views/orders.py:1661 +#: pretix/control/views/orders.py:1665 msgid "This VAT ID is valid." msgstr "" -#: pretix/control/views/orders.py:1675 pretix/control/views/orders.py:1709 -#: pretix/control/views/orders.py:1741 +#: pretix/control/views/orders.py:1679 pretix/control/views/orders.py:1713 +#: pretix/control/views/orders.py:1745 msgid "Unknown invoice." msgstr "" -#: pretix/control/views/orders.py:1678 +#: pretix/control/views/orders.py:1682 msgid "Invoices may not be changed after they are created." msgstr "" -#: pretix/control/views/orders.py:1680 +#: pretix/control/views/orders.py:1684 msgid "Invoices may not be changed after they are transmitted." msgstr "" -#: pretix/control/views/orders.py:1682 pretix/control/views/orders.py:1744 +#: pretix/control/views/orders.py:1686 pretix/control/views/orders.py:1748 msgid "The invoice has already been canceled." msgstr "" -#: pretix/control/views/orders.py:1684 +#: pretix/control/views/orders.py:1688 msgid "The invoice file has already been exported." msgstr "" -#: pretix/control/views/orders.py:1686 +#: pretix/control/views/orders.py:1690 msgid "The invoice file is too old to be regenerated." msgstr "" -#: pretix/control/views/orders.py:1688 pretix/control/views/orders.py:1746 +#: pretix/control/views/orders.py:1692 pretix/control/views/orders.py:1750 msgid "The invoice has been cleaned of personal data." msgstr "" -#: pretix/control/views/orders.py:1713 +#: pretix/control/views/orders.py:1717 msgid "" "The invoice is currently being transmitted. You can start a new attempt " "after the current one has been completed." msgstr "" -#: pretix/control/views/orders.py:1720 +#: pretix/control/views/orders.py:1724 msgid "The invoice has been scheduled for retransmission." msgstr "" -#: pretix/control/views/orders.py:1754 +#: pretix/control/views/orders.py:1758 msgid "The invoice has been canceled." msgstr "" -#: pretix/control/views/orders.py:1793 +#: pretix/control/views/orders.py:1797 msgid "The email has been queued to be sent." msgstr "" -#: pretix/control/views/orders.py:1817 pretix/presale/views/order.py:1369 +#: pretix/control/views/orders.py:1821 pretix/presale/views/order.py:1365 msgid "This invoice has not been found" msgstr "" -#: pretix/control/views/orders.py:1824 pretix/presale/views/order.py:1376 +#: pretix/control/views/orders.py:1828 pretix/presale/views/order.py:1372 msgid "The invoice file is no longer stored on the server." msgstr "" -#: pretix/control/views/orders.py:1829 pretix/presale/views/order.py:1381 +#: pretix/control/views/orders.py:1833 pretix/presale/views/order.py:1377 msgid "" "The invoice file has not yet been generated, we will generate it for you " "now. Please try again in a few seconds." msgstr "" -#: pretix/control/views/orders.py:1857 +#: pretix/control/views/orders.py:1861 msgid "The payment term has been changed." msgstr "" -#: pretix/control/views/orders.py:1862 pretix/control/views/orders.py:1919 +#: pretix/control/views/orders.py:1866 pretix/control/views/orders.py:1923 msgid "" "We were not able to process the request completely as the server was too " "busy." msgstr "" -#: pretix/control/views/orders.py:1870 +#: pretix/control/views/orders.py:1874 msgid "This action is only allowed for pending orders." msgstr "" -#: pretix/control/views/orders.py:1925 +#: pretix/control/views/orders.py:1929 msgid "This action is only allowed for canceled orders." msgstr "" -#: pretix/control/views/orders.py:2183 pretix/presale/views/order.py:1664 +#: pretix/control/views/orders.py:2188 pretix/presale/views/order.py:1661 msgid "An error occurred. Please see the details below." msgstr "" -#: pretix/control/views/orders.py:2191 +#: pretix/control/views/orders.py:2196 msgid "The order has been changed and the user has been notified." msgstr "" -#: pretix/control/views/orders.py:2193 pretix/control/views/orders.py:2329 -#: pretix/control/views/orders.py:2366 pretix/presale/views/order.py:1700 +#: pretix/control/views/orders.py:2198 pretix/control/views/orders.py:2334 +#: pretix/control/views/orders.py:2371 pretix/presale/views/order.py:1697 msgid "The order has been changed." msgstr "" -#: pretix/control/views/orders.py:2220 pretix/presale/checkoutflow.py:943 +#: pretix/control/views/orders.py:2225 pretix/presale/checkoutflow.py:964 #: pretix/presale/views/order.py:845 pretix/presale/views/order.py:981 msgid "" "We had difficulties processing your input. Please review the errors below." msgstr "" -#: pretix/control/views/orders.py:2331 +#: pretix/control/views/orders.py:2336 msgid "Nothing about the order had to be changed." msgstr "" -#: pretix/control/views/orders.py:2412 pretix/plugins/sendmail/views.py:176 +#: pretix/control/views/orders.py:2417 pretix/plugins/sendmail/views.py:176 msgid "We could not send the email. See below for details." msgstr "" -#: pretix/control/views/orders.py:2428 pretix/control/views/orders.py:2492 +#: pretix/control/views/orders.py:2433 pretix/control/views/orders.py:2497 #: pretix/plugins/sendmail/views.py:204 pretix/plugins/sendmail/views.py:671 #, python-brace-format msgid "Subject: {subject}" msgstr "" -#: pretix/control/views/orders.py:2446 pretix/control/views/orders.py:2511 +#: pretix/control/views/orders.py:2451 pretix/control/views/orders.py:2516 #, python-brace-format msgid "Your message has been queued and will be sent to {}." msgstr "" -#: pretix/control/views/orders.py:2564 pretix/presale/views/order.py:1151 +#: pretix/control/views/orders.py:2569 pretix/presale/views/order.py:1151 msgid "" "This link is no longer valid. Please go back, refresh the page, and try " "again." msgstr "" -#: pretix/control/views/orders.py:2645 +#: pretix/control/views/orders.py:2650 msgid "There is no order with the given order code." msgstr "" -#: pretix/control/views/orders.py:2754 pretix/control/views/organizer.py:2088 +#: pretix/control/views/orders.py:2759 pretix/control/views/organizer.py:2084 msgid "The selected exporter was not found." msgstr "" -#: pretix/control/views/orders.py:2764 pretix/control/views/organizer.py:2098 +#: pretix/control/views/orders.py:2769 pretix/control/views/organizer.py:2094 msgid "There was a problem processing your input. See below for error details." msgstr "" -#: pretix/control/views/orders.py:2801 pretix/control/views/organizer.py:2134 +#: pretix/control/views/orders.py:2806 pretix/control/views/organizer.py:2130 msgid "" "Your user account does not have sufficient permission to run this report, " "therefore you cannot change it." msgstr "" -#: pretix/control/views/orders.py:2810 pretix/control/views/organizer.py:2143 +#: pretix/control/views/orders.py:2815 pretix/control/views/organizer.py:2139 msgid "" "Your user account does not have sufficient permission to run this report, " "therefore you cannot schedule it." msgstr "" -#: pretix/control/views/orders.py:2826 pretix/control/views/organizer.py:2159 +#: pretix/control/views/orders.py:2831 pretix/control/views/organizer.py:2155 #, python-brace-format msgid "" "Your export schedule has been saved. The next export will start around " "{datetime}." msgstr "" -#: pretix/control/views/orders.py:2831 pretix/control/views/organizer.py:2164 +#: pretix/control/views/orders.py:2836 pretix/control/views/organizer.py:2160 msgid "Your export schedule has been saved, but no next export is planned." msgstr "" -#: pretix/control/views/orders.py:2876 pretix/control/views/organizer.py:2210 +#: pretix/control/views/orders.py:2881 pretix/control/views/organizer.py:2206 #, python-brace-format msgid "Export: {title}" msgstr "" -#: pretix/control/views/orders.py:2877 pretix/control/views/organizer.py:2212 +#: pretix/control/views/orders.py:2882 pretix/control/views/organizer.py:2208 #, python-brace-format msgid "" "Hello,\n" @@ -26253,25 +26606,25 @@ msgid "" "attached to this email, you can find a new scheduled report for {name}." msgstr "" -#: pretix/control/views/orders.py:2983 pretix/control/views/organizer.py:2346 +#: pretix/control/views/orders.py:2988 pretix/control/views/organizer.py:2342 msgid "" "Your export is queued to start soon. The results will be send via email. " "Depending on system load and type and size of export, this may take a few " "minutes." msgstr "" -#: pretix/control/views/orders.py:3070 pretix/control/views/orders.py:3151 +#: pretix/control/views/orders.py:3075 pretix/control/views/orders.py:3156 msgid "All orders have been canceled." msgstr "" -#: pretix/control/views/orders.py:3072 pretix/control/views/orders.py:3153 +#: pretix/control/views/orders.py:3077 pretix/control/views/orders.py:3158 #, python-brace-format msgid "" "The orders have been canceled. An error occurred with {count} orders, please " "check all uncanceled orders." msgstr "" -#: pretix/control/views/orders.py:3100 pretix/control/views/orders.py:3174 +#: pretix/control/views/orders.py:3105 pretix/control/views/orders.py:3179 msgid "Your input was not valid." msgstr "" @@ -26308,107 +26661,112 @@ msgstr "" msgid "Administrators" msgstr "" -#: pretix/control/views/organizer.py:806 +#: pretix/control/views/organizer.py:800 msgid "Unknown plugin." msgstr "" -#: pretix/control/views/organizer.py:812 +#: pretix/control/views/organizer.py:805 msgid "This plugin is currently not active on the organizer account." msgstr "" -#: pretix/control/views/organizer.py:816 +#: pretix/control/views/organizer.py:809 msgid "This plugin is currently not allowed for this organizer account." msgstr "" -#: pretix/control/views/organizer.py:905 +#: pretix/control/views/organizer.py:832 +#, python-brace-format +msgid "This plugin cannot be activated for event {}." +msgstr "" + +#: pretix/control/views/organizer.py:901 msgid "The team has been created. You can now add members to the team." msgstr "" -#: pretix/control/views/organizer.py:913 pretix/control/views/organizer.py:946 -#: pretix/control/views/organizer.py:1182 -#: pretix/control/views/organizer.py:1270 -#: pretix/control/views/organizer.py:1341 -#: pretix/control/views/organizer.py:1560 -#: pretix/control/views/organizer.py:1603 -#: pretix/control/views/organizer.py:2394 -#: pretix/control/views/organizer.py:2429 -#: pretix/control/views/organizer.py:2535 -#: pretix/control/views/organizer.py:2566 -#: pretix/control/views/organizer.py:2728 -#: pretix/control/views/organizer.py:2763 -#: pretix/control/views/organizer.py:2837 -#: pretix/control/views/organizer.py:2879 -#: pretix/control/views/organizer.py:2959 -#: pretix/control/views/organizer.py:3009 -#: pretix/control/views/organizer.py:3571 -#: pretix/control/views/organizer.py:3615 +#: pretix/control/views/organizer.py:909 pretix/control/views/organizer.py:942 +#: pretix/control/views/organizer.py:1178 +#: pretix/control/views/organizer.py:1266 +#: pretix/control/views/organizer.py:1337 +#: pretix/control/views/organizer.py:1556 +#: pretix/control/views/organizer.py:1599 +#: pretix/control/views/organizer.py:2390 +#: pretix/control/views/organizer.py:2425 +#: pretix/control/views/organizer.py:2531 +#: pretix/control/views/organizer.py:2562 +#: pretix/control/views/organizer.py:2724 +#: pretix/control/views/organizer.py:2759 +#: pretix/control/views/organizer.py:2833 +#: pretix/control/views/organizer.py:2877 +#: pretix/control/views/organizer.py:2957 +#: pretix/control/views/organizer.py:3007 +#: pretix/control/views/organizer.py:3602 +#: pretix/control/views/organizer.py:3646 msgid "Your changes could not be saved." msgstr "" -#: pretix/control/views/organizer.py:980 +#: pretix/control/views/organizer.py:976 msgid "The selected team cannot be deleted." msgstr "" -#: pretix/control/views/organizer.py:992 +#: pretix/control/views/organizer.py:988 msgid "" "The team could not be deleted because the team or one of its API tokens is " "part of historical audit logs." msgstr "" -#: pretix/control/views/organizer.py:1000 +#: pretix/control/views/organizer.py:996 msgid "" "The team could not be deleted as some constraints (e.g. data created by plug-" "ins) do not allow it." msgstr "" -#: pretix/control/views/organizer.py:1006 +#: pretix/control/views/organizer.py:1002 msgid "The selected team has been deleted." msgstr "" -#: pretix/control/views/organizer.py:1069 +#: pretix/control/views/organizer.py:1065 msgid "" "You cannot remove the last member from this team as no one would be left " "with the permission to change teams." msgstr "" -#: pretix/control/views/organizer.py:1080 +#: pretix/control/views/organizer.py:1076 msgid "The member has been removed from the team." msgstr "" -#: pretix/control/views/organizer.py:1087 -#: pretix/control/views/organizer.py:1103 +#: pretix/control/views/organizer.py:1083 +#: pretix/control/views/organizer.py:1099 msgid "Invalid invite selected." msgstr "" -#: pretix/control/views/organizer.py:1096 +#: pretix/control/views/organizer.py:1092 msgid "The invite has been revoked." msgstr "" -#: pretix/control/views/organizer.py:1112 +#: pretix/control/views/organizer.py:1108 msgid "The invite has been resent." msgstr "" -#: pretix/control/views/organizer.py:1119 +#: pretix/control/views/organizer.py:1115 msgid "Invalid token selected." msgstr "" -#: pretix/control/views/organizer.py:1129 +#: pretix/control/views/organizer.py:1125 msgid "The token has been revoked." msgstr "" -#: pretix/control/views/organizer.py:1141 +#: pretix/control/views/organizer.py:1137 msgid "Users need to have a pretix account before they can be invited." msgstr "" -#: pretix/control/views/organizer.py:1151 +#: pretix/control/views/organizer.py:1147 msgid "The new member has been invited to the team." msgstr "" -#: pretix/control/views/organizer.py:1166 +#: pretix/control/views/organizer.py:1162 msgid "The new member has been added to the team." msgstr "" -#: pretix/control/views/organizer.py:1177 +#: pretix/control/views/organizer.py:1173 #, python-brace-format msgid "" "A new API token has been created with the following secret: {}\n" @@ -26416,140 +26774,140 @@ msgid "" "again here." msgstr "" -#: pretix/control/views/organizer.py:1474 +#: pretix/control/views/organizer.py:1470 msgid "This device has been set up successfully." msgstr "" -#: pretix/control/views/organizer.py:1502 +#: pretix/control/views/organizer.py:1498 msgid "This device currently does not have access." msgstr "" -#: pretix/control/views/organizer.py:1514 +#: pretix/control/views/organizer.py:1510 msgid "Access for this device has been revoked." msgstr "" -#: pretix/control/views/organizer.py:1635 +#: pretix/control/views/organizer.py:1631 msgid "" "All requests will now be scheduled for an immediate attempt. Please allow " "for a few minutes before they are processed." msgstr "" -#: pretix/control/views/organizer.py:1642 +#: pretix/control/views/organizer.py:1638 msgid "All unprocessed webhooks have been stopped from retrying." msgstr "" -#: pretix/control/views/organizer.py:1677 +#: pretix/control/views/organizer.py:1673 msgid "The selected organizer has been invited." msgstr "" -#: pretix/control/views/organizer.py:1717 -#: pretix/control/views/organizer.py:1731 +#: pretix/control/views/organizer.py:1713 +#: pretix/control/views/organizer.py:1727 msgid "The selected connection has been removed." msgstr "" -#: pretix/control/views/organizer.py:1745 +#: pretix/control/views/organizer.py:1741 msgid "The selected connection has been accepted." msgstr "" -#: pretix/control/views/organizer.py:1805 -#: pretix/control/views/organizer.py:1842 +#: pretix/control/views/organizer.py:1801 +#: pretix/control/views/organizer.py:1838 msgid "Gift cards are not allowed to have negative values." msgstr "" -#: pretix/control/views/organizer.py:1832 +#: pretix/control/views/organizer.py:1828 msgid "The transaction could not be reversed." msgstr "" -#: pretix/control/views/organizer.py:1834 +#: pretix/control/views/organizer.py:1830 msgid "The transaction has been reversed." msgstr "" -#: pretix/control/views/organizer.py:1839 +#: pretix/control/views/organizer.py:1835 msgid "Your input was invalid, please try again." msgstr "" -#: pretix/control/views/organizer.py:1859 +#: pretix/control/views/organizer.py:1855 msgid "The manual transaction has been saved." msgstr "" -#: pretix/control/views/organizer.py:1901 +#: pretix/control/views/organizer.py:1897 msgid "The gift card has been created and can now be used." msgstr "" -#: pretix/control/views/organizer.py:2008 +#: pretix/control/views/organizer.py:2004 msgid "All events (that I have access to)" msgstr "" -#: pretix/control/views/organizer.py:2453 +#: pretix/control/views/organizer.py:2449 msgid "The selected gate has been deleted." msgstr "" -#: pretix/control/views/organizer.py:2496 +#: pretix/control/views/organizer.py:2492 msgid "You cannot set a default value that is not a valid value." msgstr "" -#: pretix/control/views/organizer.py:2523 +#: pretix/control/views/organizer.py:2519 msgid "The property has been created." msgstr "" -#: pretix/control/views/organizer.py:2590 +#: pretix/control/views/organizer.py:2586 msgid "The selected property has been deleted." msgstr "" -#: pretix/control/views/organizer.py:2614 +#: pretix/control/views/organizer.py:2610 msgid "The order of properties has been updated." msgstr "" -#: pretix/control/views/organizer.py:2793 -#: pretix/control/views/organizer.py:2909 -#: pretix/control/views/organizer.py:3039 -#: pretix/control/views/organizer.py:3308 +#: pretix/control/views/organizer.py:2789 +#: pretix/control/views/organizer.py:2907 +#: pretix/control/views/organizer.py:3037 +#: pretix/control/views/organizer.py:3306 msgid "The selected object has been deleted." msgstr "" -#: pretix/control/views/organizer.py:2828 +#: pretix/control/views/organizer.py:2824 msgid "The provider has been created." msgstr "" -#: pretix/control/views/organizer.py:2948 +#: pretix/control/views/organizer.py:2946 #, python-brace-format msgid "" "The SSO client has been created. Please note down the following client " "secret, it will never be shown again: {secret}" msgstr "" -#: pretix/control/views/organizer.py:2998 +#: pretix/control/views/organizer.py:2996 #, python-brace-format msgid "" "Your changes have been saved. Please note down the following client secret, " "it will never be shown again: {secret}" msgstr "" -#: pretix/control/views/organizer.py:3108 +#: pretix/control/views/organizer.py:3106 msgid "" "We've sent the customer an email with further instructions on resetting your " "password." msgstr "" -#: pretix/control/views/organizer.py:3373 +#: pretix/control/views/organizer.py:3371 msgid "The customer account has been anonymized." msgstr "" -#: pretix/control/views/organizer.py:3643 +#: pretix/control/views/organizer.py:3674 msgid "This channel can not be deleted." msgstr "" -#: pretix/control/views/organizer.py:3648 +#: pretix/control/views/organizer.py:3679 msgid "The selected sales channel has been deleted." msgstr "" -#: pretix/control/views/organizer.py:3650 +#: pretix/control/views/organizer.py:3681 msgid "" "The channel could not be deleted as some constraints (e.g. data created by " "plug-ins) did not allow it." msgstr "" -#: pretix/control/views/organizer.py:3675 +#: pretix/control/views/organizer.py:3706 msgid "The order of sales channels has been updated." msgstr "" @@ -26574,53 +26932,58 @@ msgstr "" msgid "The selected data was deleted successfully." msgstr "" -#: pretix/control/views/subevents.py:168 pretix/control/views/subevents.py:530 +#: pretix/control/views/subevents.py:174 pretix/control/views/subevents.py:526 +#: pretix/control/views/subevents.py:595 msgctxt "subevent" msgid "The requested date does not exist." msgstr "" -#: pretix/control/views/subevents.py:172 pretix/control/views/subevents.py:184 +#: pretix/control/views/subevents.py:178 pretix/control/views/subevents.py:190 msgctxt "subevent" msgid "A date can not be deleted if orders already have been placed." msgstr "" -#: pretix/control/views/subevents.py:203 +#: pretix/control/views/subevents.py:209 msgctxt "subevent" msgid "" "The date could not be deleted as some constraints (e.g. data created by plug-" "ins) did not allow it. The date was disabled instead." msgstr "" -#: pretix/control/views/subevents.py:207 +#: pretix/control/views/subevents.py:213 msgctxt "subevent" msgid "The selected date has been deleted." msgstr "" -#: pretix/control/views/subevents.py:619 +#: pretix/control/views/subevents.py:704 msgctxt "subevent" msgid "The new date has been created." msgstr "" -#: pretix/control/views/subevents.py:688 +#: pretix/control/views/subevents.py:781 msgctxt "subevent" msgid "The selected dates have been disabled." msgstr "" -#: pretix/control/views/subevents.py:701 +#: pretix/control/views/subevents.py:794 msgctxt "subevent" msgid "The selected dates have been enabled." msgstr "" -#: pretix/control/views/subevents.py:730 +#: pretix/control/views/subevents.py:823 msgctxt "subevent" msgid "The selected dates have been deleted or disabled." msgstr "" -#: pretix/control/views/subevents.py:918 +#: pretix/control/views/subevents.py:1011 msgid "Please do not create more than 100.000 dates at once." msgstr "" -#: pretix/control/views/subevents.py:1054 +#: pretix/control/views/subevents.py:1040 +msgid "All dates would be skipped because they conflict with existing dates." +msgstr "" + +#: pretix/control/views/subevents.py:1176 #, python-brace-format msgctxt "subevent" msgid "{} new dates have been created." @@ -26640,6 +27003,10 @@ msgstr "" msgid "Voucher {}" msgstr "" +#: pretix/control/views/typeahead.py:179 pretix/control/views/typeahead.py:180 +msgid "No event" +msgstr "" + #: pretix/control/views/user.py:169 msgid "The password you entered was invalid, please try again." msgstr "" @@ -26959,7 +27326,7 @@ msgid "Automatically check-in specific tickets after they have been sold." msgstr "" #: pretix/plugins/autocheckin/apps.py:42 pretix/plugins/webcheckin/apps.py:40 -#: pretix/plugins/webcheckin/templates/pretixplugins/webcheckin/index.html:10 +#: pretix/plugins/webcheckin/templates/pretixplugins/webcheckin/index.html:11 msgid "Check-in" msgstr "" @@ -27111,38 +27478,38 @@ msgstr "" msgid "8 portrait A7 pages on one A4 page" msgstr "" -#: pretix/plugins/badges/exporters.py:353 +#: pretix/plugins/badges/exporters.py:361 msgid "None of the selected products is configured to print badges." msgstr "" -#: pretix/plugins/badges/exporters.py:421 +#: pretix/plugins/badges/exporters.py:429 msgid "Attendee badges" msgstr "" -#: pretix/plugins/badges/exporters.py:422 +#: pretix/plugins/badges/exporters.py:430 #: pretix/plugins/ticketoutputpdf/exporters.py:69 msgctxt "export_category" msgid "PDF collections" msgstr "" -#: pretix/plugins/badges/exporters.py:423 +#: pretix/plugins/badges/exporters.py:431 msgid "Download all attendee badges as one large PDF for printing." msgstr "" -#: pretix/plugins/badges/exporters.py:444 +#: pretix/plugins/badges/exporters.py:452 #: pretix/plugins/ticketoutputpdf/exporters.py:80 msgid "Include pending orders" msgstr "" -#: pretix/plugins/badges/exporters.py:449 +#: pretix/plugins/badges/exporters.py:457 msgid "Include add-on or bundled positions" msgstr "" -#: pretix/plugins/badges/exporters.py:454 +#: pretix/plugins/badges/exporters.py:462 msgid "Rendering option" msgstr "" -#: pretix/plugins/badges/exporters.py:459 +#: pretix/plugins/badges/exporters.py:467 msgid "" "This option allows you to align multiple badges on one page, for example if " "you want to print to a sheet of stickers with a regular office printer. " @@ -27150,47 +27517,47 @@ msgid "" "correct size." msgstr "" -#: pretix/plugins/badges/exporters.py:465 +#: pretix/plugins/badges/exporters.py:473 msgid "Start event date" msgstr "" -#: pretix/plugins/badges/exporters.py:468 +#: pretix/plugins/badges/exporters.py:476 msgid "Only include tickets for dates on or after this date." msgstr "" -#: pretix/plugins/badges/exporters.py:472 +#: pretix/plugins/badges/exporters.py:480 msgid "End event date" msgstr "" -#: pretix/plugins/badges/exporters.py:475 +#: pretix/plugins/badges/exporters.py:483 msgid "Only include tickets ordered on or before this date." msgstr "" -#: pretix/plugins/badges/exporters.py:479 +#: pretix/plugins/badges/exporters.py:487 msgid "Start order date" msgstr "" -#: pretix/plugins/badges/exporters.py:482 +#: pretix/plugins/badges/exporters.py:490 msgid "Only include tickets ordered on or after this date." msgstr "" -#: pretix/plugins/badges/exporters.py:486 +#: pretix/plugins/badges/exporters.py:494 msgid "End order date" msgstr "" -#: pretix/plugins/badges/exporters.py:489 +#: pretix/plugins/badges/exporters.py:497 msgid "Only include tickets for dates on or before this date." msgstr "" -#: pretix/plugins/badges/exporters.py:493 -#: pretix/plugins/checkinlists/exporters.py:118 +#: pretix/plugins/badges/exporters.py:501 +#: pretix/plugins/checkinlists/exporters.py:119 #: pretix/plugins/reports/exporters.py:510 #: pretix/plugins/reports/exporters.py:693 #: pretix/plugins/ticketoutputpdf/exporters.py:92 msgid "Sort by" msgstr "" -#: pretix/plugins/badges/exporters.py:661 +#: pretix/plugins/badges/exporters.py:669 #: pretix/plugins/ticketoutputpdf/exporters.py:242 msgid "" "Your data could not be converted as requested. This could be caused by " @@ -27272,6 +27639,11 @@ msgstr "" msgid "{width} x {height} mm label" msgstr "" +#: pretix/plugins/badges/templates.py:265 +#, python-brace-format +msgid "{width} x {height} inch label" +msgstr "" + #: pretix/plugins/badges/templates/pretixplugins/badges/control_order_info.html:16 #: pretix/plugins/badges/templates/pretixplugins/badges/index.html:27 msgid "Print badges" @@ -27997,118 +28369,118 @@ msgstr "" msgid "This plugin allows you to generate check-in lists for your conference." msgstr "" -#: pretix/plugins/checkinlists/exporters.py:92 +#: pretix/plugins/checkinlists/exporters.py:93 #: pretix/plugins/ticketoutputpdf/exporters.py:88 msgid "Only include tickets for dates within this range." msgstr "" -#: pretix/plugins/checkinlists/exporters.py:96 +#: pretix/plugins/checkinlists/exporters.py:97 msgid "Include QR-code secret" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:101 +#: pretix/plugins/checkinlists/exporters.py:102 msgid "Only tickets requiring special attention" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:134 +#: pretix/plugins/checkinlists/exporters.py:135 msgid "Include questions" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:304 +#: pretix/plugins/checkinlists/exporters.py:303 msgid "Check-in list (PDF)" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:305 -#: pretix/plugins/checkinlists/exporters.py:476 -#: pretix/plugins/checkinlists/exporters.py:674 -#: pretix/plugins/checkinlists/exporters.py:745 +#: pretix/plugins/checkinlists/exporters.py:304 +#: pretix/plugins/checkinlists/exporters.py:475 +#: pretix/plugins/checkinlists/exporters.py:673 +#: pretix/plugins/checkinlists/exporters.py:744 msgctxt "export_category" msgid "Check-in" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:306 +#: pretix/plugins/checkinlists/exporters.py:305 msgid "" "Download a PDF version of a check-in list that can be used to check people " "in at the event without digital methods." msgstr "" #. Translators: maximum 5 characters -#: pretix/plugins/checkinlists/exporters.py:374 +#: pretix/plugins/checkinlists/exporters.py:373 msgctxt "tablehead" msgid "paid" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:477 +#: pretix/plugins/checkinlists/exporters.py:476 msgid "" "Download a spreadsheet with all attendees that are included in a check-in " "list." msgstr "" -#: pretix/plugins/checkinlists/exporters.py:501 +#: pretix/plugins/checkinlists/exporters.py:500 msgid "Checked out" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:501 -#: pretix/plugins/checkinlists/exporters.py:768 +#: pretix/plugins/checkinlists/exporters.py:500 +#: pretix/plugins/checkinlists/exporters.py:767 msgid "Automatically checked in" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:507 -#: pretix/plugins/checkinlists/exporters.py:696 -#: pretix/plugins/checkinlists/exporters.py:762 +#: pretix/plugins/checkinlists/exporters.py:506 +#: pretix/plugins/checkinlists/exporters.py:695 +#: pretix/plugins/checkinlists/exporters.py:761 #: pretix/plugins/paypal/payment.py:123 pretix/plugins/paypal2/payment.py:120 msgid "Secret" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:673 +#: pretix/plugins/checkinlists/exporters.py:672 msgid "Valid check-in codes" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:675 +#: pretix/plugins/checkinlists/exporters.py:674 msgid "" "Download a spreadsheet with all valid check-in barcodes e.g. for import into " "a different system. Does not included blocked codes or personal data." msgstr "" -#: pretix/plugins/checkinlists/exporters.py:744 +#: pretix/plugins/checkinlists/exporters.py:743 msgid "Check-in log (all scans)" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:746 +#: pretix/plugins/checkinlists/exporters.py:745 msgid "" "Download a spreadsheet with one line for every scan that happened at your " "check-in stations." msgstr "" -#: pretix/plugins/checkinlists/exporters.py:766 +#: pretix/plugins/checkinlists/exporters.py:765 msgid "Offline" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:767 +#: pretix/plugins/checkinlists/exporters.py:766 msgid "Offline override" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:771 +#: pretix/plugins/checkinlists/exporters.py:770 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:83 msgid "Error message" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:772 +#: pretix/plugins/checkinlists/exporters.py:771 msgid "Upload date" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:773 +#: pretix/plugins/checkinlists/exporters.py:772 msgid "Upload time" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:830 +#: pretix/plugins/checkinlists/exporters.py:829 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:534 #: pretix/presale/templates/pretixpresale/fragment_modals.html:52 #: pretix/presale/templates/pretixpresale/fragment_modals.html:148 msgid "OK" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:862 +#: pretix/plugins/checkinlists/exporters.py:861 msgid "Successful scans only" msgstr "" @@ -29600,13 +29972,13 @@ msgid "iDEAL" msgstr "" #: pretix/plugins/stripe/payment.py:363 pretix/plugins/stripe/payment.py:371 -#: pretix/plugins/stripe/payment.py:379 pretix/plugins/stripe/payment.py:414 -#: pretix/plugins/stripe/payment.py:422 pretix/plugins/stripe/payment.py:430 -#: pretix/plugins/stripe/payment.py:439 pretix/plugins/stripe/payment.py:450 -#: pretix/plugins/stripe/payment.py:458 pretix/plugins/stripe/payment.py:466 -#: pretix/plugins/stripe/payment.py:474 pretix/plugins/stripe/payment.py:482 -#: pretix/plugins/stripe/payment.py:491 pretix/plugins/stripe/payment.py:504 -#: pretix/plugins/stripe/payment.py:528 +#: pretix/plugins/stripe/payment.py:379 pretix/plugins/stripe/payment.py:388 +#: pretix/plugins/stripe/payment.py:414 pretix/plugins/stripe/payment.py:422 +#: pretix/plugins/stripe/payment.py:430 pretix/plugins/stripe/payment.py:439 +#: pretix/plugins/stripe/payment.py:450 pretix/plugins/stripe/payment.py:458 +#: pretix/plugins/stripe/payment.py:466 pretix/plugins/stripe/payment.py:474 +#: pretix/plugins/stripe/payment.py:482 pretix/plugins/stripe/payment.py:491 +#: pretix/plugins/stripe/payment.py:504 pretix/plugins/stripe/payment.py:528 msgid "" "Some payment methods might need to be enabled in the settings of your Stripe " "account before they work properly." @@ -29624,12 +29996,6 @@ msgstr "" msgid "SEPA Direct Debit" msgstr "" -#: pretix/plugins/stripe/payment.py:388 -msgid "" -"Some payment methods might need to be enabled in the settings of your Stripe " -"account before work properly." -msgstr "" - #: pretix/plugins/stripe/payment.py:391 msgid "" "SEPA Direct Debit payments via Stripe are not processed " @@ -30481,149 +30847,149 @@ msgstr "" msgid "Web Check-in" msgstr "" -#: pretix/presale/checkoutflow.py:117 +#: pretix/presale/checkoutflow.py:120 msgctxt "checkoutflow" msgid "Step" msgstr "" -#: pretix/presale/checkoutflow.py:249 +#: pretix/presale/checkoutflow.py:252 msgctxt "checkoutflow" msgid "Customer account" msgstr "" -#: pretix/presale/checkoutflow.py:336 +#: pretix/presale/checkoutflow.py:339 msgid "We failed to process your authentication request, please try again." msgstr "" -#: pretix/presale/checkoutflow.py:399 +#: pretix/presale/checkoutflow.py:402 msgctxt "checkoutflow" msgid "Membership" msgstr "" -#: pretix/presale/checkoutflow.py:447 pretix/presale/checkoutflow.py:468 +#: pretix/presale/checkoutflow.py:450 pretix/presale/checkoutflow.py:471 msgid "" "Your cart includes a product that requires an active membership to be " "selected." msgstr "" -#: pretix/presale/checkoutflow.py:487 +#: pretix/presale/checkoutflow.py:490 msgctxt "checkoutflow" msgid "Add-on products" msgstr "" -#: pretix/presale/checkoutflow.py:676 pretix/presale/checkoutflow.py:684 +#: pretix/presale/checkoutflow.py:697 pretix/presale/checkoutflow.py:705 #: pretix/presale/views/cart.py:195 pretix/presale/views/cart.py:200 #: pretix/presale/views/cart.py:218 pretix/presale/views/cart.py:231 -#: pretix/presale/views/order.py:1585 pretix/presale/views/order.py:1593 +#: pretix/presale/views/order.py:1582 pretix/presale/views/order.py:1590 msgid "Please enter numbers only." msgstr "" -#: pretix/presale/checkoutflow.py:758 +#: pretix/presale/checkoutflow.py:779 msgctxt "checkoutflow" msgid "Your information" msgstr "" -#: pretix/presale/checkoutflow.py:992 +#: pretix/presale/checkoutflow.py:1013 msgid "" "Unfortunately, based on the invoice address you entered, we're not able to " "sell you the selected products for tax-related legal reasons." msgstr "" -#: pretix/presale/checkoutflow.py:998 +#: pretix/presale/checkoutflow.py:1019 msgid "" "Due to the invoice address you entered, we need to apply a different tax " "rate to your purchase and the price of the products in your cart has changed " "accordingly." msgstr "" -#: pretix/presale/checkoutflow.py:1022 pretix/presale/checkoutflow.py:1028 +#: pretix/presale/checkoutflow.py:1043 pretix/presale/checkoutflow.py:1049 msgid "Please enter a valid email address." msgstr "" -#: pretix/presale/checkoutflow.py:1035 +#: pretix/presale/checkoutflow.py:1056 msgid "Please enter your invoicing address." msgstr "" -#: pretix/presale/checkoutflow.py:1039 +#: pretix/presale/checkoutflow.py:1060 msgid "Please enter your name." msgstr "" -#: pretix/presale/checkoutflow.py:1074 pretix/presale/checkoutflow.py:1079 -#: pretix/presale/checkoutflow.py:1084 pretix/presale/checkoutflow.py:1089 -#: pretix/presale/checkoutflow.py:1094 +#: pretix/presale/checkoutflow.py:1095 pretix/presale/checkoutflow.py:1100 +#: pretix/presale/checkoutflow.py:1105 pretix/presale/checkoutflow.py:1110 +#: pretix/presale/checkoutflow.py:1115 msgid "Please fill in answers to all required questions." msgstr "" -#: pretix/presale/checkoutflow.py:1257 +#: pretix/presale/checkoutflow.py:1278 msgctxt "checkoutflow" msgid "Payment" msgstr "" -#: pretix/presale/checkoutflow.py:1368 +#: pretix/presale/checkoutflow.py:1389 #, python-brace-format msgid "" "Your payment method has been applied, but {} still need to be paid. Please " "select a payment method for the remainder." msgstr "" -#: pretix/presale/checkoutflow.py:1393 pretix/presale/views/order.py:733 +#: pretix/presale/checkoutflow.py:1414 pretix/presale/views/order.py:733 msgid "Please select a payment method." msgstr "" -#: pretix/presale/checkoutflow.py:1425 pretix/presale/checkoutflow.py:1445 -#: pretix/presale/checkoutflow.py:1456 +#: pretix/presale/checkoutflow.py:1446 pretix/presale/checkoutflow.py:1466 +#: pretix/presale/checkoutflow.py:1477 msgid "Please select a payment method to proceed." msgstr "" -#: pretix/presale/checkoutflow.py:1461 pretix/presale/views/order.py:489 +#: pretix/presale/checkoutflow.py:1482 pretix/presale/views/order.py:489 #: pretix/presale/views/order.py:559 msgid "The payment information you entered was incomplete." msgstr "" -#: pretix/presale/checkoutflow.py:1506 +#: pretix/presale/checkoutflow.py:1527 msgctxt "checkoutflow" msgid "Review order" msgstr "" -#: pretix/presale/checkoutflow.py:1604 +#: pretix/presale/checkoutflow.py:1625 msgid "You need to check all checkboxes on the bottom of the page." msgstr "" -#: pretix/presale/forms/checkout.py:70 +#: pretix/presale/forms/checkout.py:67 msgid "Email address (repeated)" msgstr "" -#: pretix/presale/forms/checkout.py:71 +#: pretix/presale/forms/checkout.py:68 msgid "" "Please enter the same email address again to make sure you typed it " "correctly." msgstr "" -#: pretix/presale/forms/checkout.py:110 +#: pretix/presale/forms/checkout.py:107 msgid "Please enter the same email address twice." msgstr "" -#: pretix/presale/forms/checkout.py:125 +#: pretix/presale/forms/checkout.py:122 msgid "Save to address" msgstr "" -#: pretix/presale/forms/checkout.py:126 +#: pretix/presale/forms/checkout.py:123 msgid "Create new address" msgstr "" -#: pretix/presale/forms/checkout.py:129 +#: pretix/presale/forms/checkout.py:126 msgid "Save address in my customer account for future purchases" msgstr "" -#: pretix/presale/forms/checkout.py:159 +#: pretix/presale/forms/checkout.py:156 msgid "Save answers to my customer profiles for future purchases" msgstr "" -#: pretix/presale/forms/checkout.py:166 +#: pretix/presale/forms/checkout.py:163 msgid "Save to profile" msgstr "" -#: pretix/presale/forms/checkout.py:167 +#: pretix/presale/forms/checkout.py:164 msgid "Create new profile" msgstr "" @@ -30687,19 +31053,19 @@ msgstr "" msgid "Please enter the correct result." msgstr "" -#: pretix/presale/forms/customer.py:346 +#: pretix/presale/forms/customer.py:347 msgid "For security reasons, please wait 10 minutes before you try again." msgstr "" -#: pretix/presale/forms/customer.py:347 +#: pretix/presale/forms/customer.py:348 msgid "A user with this email address is not known in our system." msgstr "" -#: pretix/presale/forms/customer.py:476 +#: pretix/presale/forms/customer.py:477 msgid "Only required if you change your email address" msgstr "" -#: pretix/presale/forms/customer.py:514 +#: pretix/presale/forms/customer.py:515 #, python-brace-format msgid "" "To change your email address, change it in your {provider} account and then " @@ -31265,15 +31631,17 @@ msgid "from %(from_price)s to %(to_price)s" msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:98 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:109 -msgid "Hide variants" -msgstr "" - #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:102 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:113 msgid "Show variants" msgstr "" +#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:98 +#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:102 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:109 +msgid "Hide variants" +msgstr "" + #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:129 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:271 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:151 @@ -31416,7 +31784,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:105 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:31 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:69 -#: pretix/presale/views/widget.py:456 +#: pretix/presale/views/widget.py:488 msgid "Reserved" msgstr "" @@ -31968,7 +32336,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_subevent_list.html:34 #: pretix/presale/templates/pretixpresale/organizers/index.html:93 -#: pretix/presale/views/widget.py:467 +#: pretix/presale/views/widget.py:499 msgid "More info" msgstr "" @@ -31999,12 +32367,12 @@ msgid "Choose date to book a ticket" msgstr "" #: pretix/presale/templates/pretixpresale/event/index.html:155 -#: pretix/presale/views/waiting.py:141 pretix/presale/views/widget.py:806 +#: pretix/presale/views/waiting.py:146 pretix/presale/views/widget.py:839 msgid "The booking period for this event is over." msgstr "" #: pretix/presale/templates/pretixpresale/event/index.html:163 -#: pretix/presale/views/widget.py:808 +#: pretix/presale/views/widget.py:841 #, python-format msgid "The booking period for this event will start on %(date)s at %(time)s." msgstr "" @@ -32122,7 +32490,7 @@ msgid "" msgstr "" #: pretix/presale/templates/pretixpresale/event/order.html:75 -#: pretix/presale/templates/pretixpresale/event/position.html:18 +#: pretix/presale/templates/pretixpresale/event/position.html:19 msgid "View in backend" msgstr "" @@ -32180,13 +32548,13 @@ msgid "" msgstr "" #: pretix/presale/templates/pretixpresale/event/order.html:199 -#: pretix/presale/templates/pretixpresale/event/position.html:33 +#: pretix/presale/templates/pretixpresale/event/position.html:34 msgid "Change ordered items" msgstr "" #: pretix/presale/templates/pretixpresale/event/order.html:200 #: pretix/presale/templates/pretixpresale/event/order.html:291 -#: pretix/presale/templates/pretixpresale/event/position.html:34 +#: pretix/presale/templates/pretixpresale/event/position.html:35 msgid "Change details" msgstr "" @@ -32453,41 +32821,41 @@ msgstr "" msgid "Scan the QR code with your banking app" msgstr "" -#: pretix/presale/templates/pretixpresale/event/position.html:7 +#: pretix/presale/templates/pretixpresale/event/position.html:8 msgid "Registration details" msgstr "" -#: pretix/presale/templates/pretixpresale/event/position.html:10 +#: pretix/presale/templates/pretixpresale/event/position.html:11 msgid "Your registration" msgstr "" -#: pretix/presale/templates/pretixpresale/event/position.html:31 +#: pretix/presale/templates/pretixpresale/event/position.html:32 msgid "Your items" msgstr "" -#: pretix/presale/templates/pretixpresale/event/position.html:46 +#: pretix/presale/templates/pretixpresale/event/position.html:47 msgid "Additional information" msgstr "" -#: pretix/presale/templates/pretixpresale/event/position.html:51 +#: pretix/presale/templates/pretixpresale/event/position.html:52 #, python-format msgid "" "This order is managed for you by %(email)s. Please contact them for any " "questions regarding payment, cancellation or changes to this order." msgstr "" -#: pretix/presale/templates/pretixpresale/event/position.html:63 +#: pretix/presale/templates/pretixpresale/event/position.html:64 msgctxt "action" msgid "Change your ticket" msgstr "" -#: pretix/presale/templates/pretixpresale/event/position.html:68 +#: pretix/presale/templates/pretixpresale/event/position.html:69 msgid "" "If you want to make changes to the components of your ticket, you can click " "on the following button." msgstr "" -#: pretix/presale/templates/pretixpresale/event/position.html:73 +#: pretix/presale/templates/pretixpresale/event/position.html:74 #, python-format msgid "" "You can only make some changes to this ticket yourself. For additional " @@ -32495,7 +32863,7 @@ msgid "" "(%(email)s)." msgstr "" -#: pretix/presale/templates/pretixpresale/event/position.html:82 +#: pretix/presale/templates/pretixpresale/event/position.html:83 #: pretix/presale/templates/pretixpresale/event/position_change.html:5 #: pretix/presale/templates/pretixpresale/event/position_change.html:10 #: pretix/presale/templates/pretixpresale/event/position_change_confirm.html:6 @@ -32664,7 +33032,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:94 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:14 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:58 -#: pretix/presale/views/widget.py:441 +#: pretix/presale/views/widget.py:473 msgid "Few tickets left" msgstr "" @@ -32672,7 +33040,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:97 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:19 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:61 -#: pretix/presale/views/widget.py:446 +#: pretix/presale/views/widget.py:478 msgctxt "available_event_in_list" msgid "Buy now" msgstr "" @@ -32685,7 +33053,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:44 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:63 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:78 -#: pretix/presale/views/widget.py:448 pretix/presale/views/widget.py:471 +#: pretix/presale/views/widget.py:480 pretix/presale/views/widget.py:503 msgid "Book now" msgstr "" @@ -32693,7 +33061,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:111 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:38 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:74 -#: pretix/presale/views/widget.py:463 +#: pretix/presale/views/widget.py:495 msgid "Fully booked" msgstr "" @@ -32910,7 +33278,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/organizers/customer_addresses.html:5 #: pretix/presale/templates/pretixpresale/organizers/customer_addresses.html:11 -#: pretix/presale/views/customer.py:380 +#: pretix/presale/views/customer.py:382 msgid "Addresses" msgstr "" @@ -33038,7 +33406,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:5 #: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:11 -#: pretix/presale/views/customer.py:386 +#: pretix/presale/views/customer.py:388 msgid "Attendee profiles" msgstr "" @@ -33121,7 +33489,7 @@ msgstr "" msgid "The selected organizer was not found." msgstr "" -#: pretix/presale/views/__init__.py:298 +#: pretix/presale/views/__init__.py:316 #, python-brace-format msgid "" "Your selected payment method can only be used for a payment of at least " @@ -33132,49 +33500,49 @@ msgstr "" msgid "Please enter positive numbers only." msgstr "" -#: pretix/presale/views/cart.py:441 +#: pretix/presale/views/cart.py:443 msgid "We applied the voucher to as many products in your cart as we could." msgstr "" -#: pretix/presale/views/cart.py:476 pretix/presale/views/cart.py:484 +#: pretix/presale/views/cart.py:478 pretix/presale/views/cart.py:486 msgid "" "The gift card has been saved to your cart. Please continue your checkout." msgstr "" -#: pretix/presale/views/cart.py:520 +#: pretix/presale/views/cart.py:522 msgid "Your cart has been updated." msgstr "" -#: pretix/presale/views/cart.py:523 pretix/presale/views/cart.py:549 +#: pretix/presale/views/cart.py:525 pretix/presale/views/cart.py:551 msgid "Your cart is now empty." msgstr "" -#: pretix/presale/views/cart.py:570 +#: pretix/presale/views/cart.py:584 msgid "" "Your cart timeout was extended. Please note that some of the prices in your " "cart changed." msgstr "" -#: pretix/presale/views/cart.py:573 +#: pretix/presale/views/cart.py:587 msgid "Your cart timeout was extended." msgstr "" -#: pretix/presale/views/cart.py:588 +#: pretix/presale/views/cart.py:602 msgid "The products have been successfully added to your cart." msgstr "" -#: pretix/presale/views/cart.py:612 pretix/presale/views/event.py:543 -#: pretix/presale/views/widget.py:399 +#: pretix/presale/views/cart.py:626 pretix/presale/views/event.py:543 +#: pretix/presale/views/widget.py:431 msgid "Tickets for this event cannot be purchased on this sales channel." msgstr "" -#: pretix/presale/views/cart.py:767 +#: pretix/presale/views/cart.py:781 msgid "" "The gift card has been saved to your cart. Please now select the products " "you want to purchase." msgstr "" -#: pretix/presale/views/cart.py:795 +#: pretix/presale/views/cart.py:809 msgctxt "subevent" msgid "We were unable to find the specified date." msgstr "" @@ -33194,7 +33562,7 @@ msgid "" msgstr "" #: pretix/presale/views/customer.py:268 pretix/presale/views/customer.py:271 -#: pretix/presale/views/customer.py:625 pretix/presale/views/customer.py:631 +#: pretix/presale/views/customer.py:627 pretix/presale/views/customer.py:633 msgid "You clicked an invalid link." msgstr "" @@ -33202,67 +33570,67 @@ msgstr "" msgid "Your new password has been set! You can now use it to log in." msgstr "" -#: pretix/presale/views/customer.py:333 +#: pretix/presale/views/customer.py:335 msgid "" "We've sent you an email with further instructions on resetting your password." msgstr "" -#: pretix/presale/views/customer.py:593 +#: pretix/presale/views/customer.py:595 msgid "" "Your changes have been saved. We've sent you an email with a link to update " "your email address. The email address of your account will be changed as " "soon as you click that link." msgstr "" -#: pretix/presale/views/customer.py:646 +#: pretix/presale/views/customer.py:648 msgid "" "Your email address has not been updated since the address is already in use " "for another customer account." msgstr "" -#: pretix/presale/views/customer.py:649 +#: pretix/presale/views/customer.py:651 msgid "Your email address has been updated." msgstr "" -#: pretix/presale/views/customer.py:866 pretix/presale/views/customer.py:877 +#: pretix/presale/views/customer.py:868 pretix/presale/views/customer.py:879 #, python-brace-format msgid "" "We were unable to use your login since the email address {email} is already " "used for a different account in this system." msgstr "" -#: pretix/presale/views/event.py:921 +#: pretix/presale/views/event.py:919 msgid "Unknown event code or not authorized to access this event." msgstr "" -#: pretix/presale/views/event.py:928 +#: pretix/presale/views/event.py:926 msgctxt "subevent" msgid "No date selected." msgstr "" -#: pretix/presale/views/event.py:931 +#: pretix/presale/views/event.py:929 msgctxt "subevent" msgid "Unknown date selected." msgstr "" -#: pretix/presale/views/event.py:956 pretix/presale/views/event.py:964 -#: pretix/presale/views/event.py:967 +#: pretix/presale/views/event.py:954 pretix/presale/views/event.py:962 +#: pretix/presale/views/event.py:965 msgid "Please go back and try again." msgstr "" -#: pretix/presale/views/event.py:980 +#: pretix/presale/views/event.py:978 msgid "Fake date time" msgstr "" -#: pretix/presale/views/event.py:992 +#: pretix/presale/views/event.py:990 msgid "You are not allowed to access time machine mode." msgstr "" -#: pretix/presale/views/event.py:994 +#: pretix/presale/views/event.py:992 msgid "This feature is only available in test mode." msgstr "" -#: pretix/presale/views/event.py:1011 +#: pretix/presale/views/event.py:1009 msgid "Time machine disabled!" msgstr "" @@ -33317,47 +33685,47 @@ msgstr "" msgid "Please click the link we sent you via email to download your tickets." msgstr "" -#: pretix/presale/views/order.py:1692 +#: pretix/presale/views/order.py:1689 #, python-brace-format msgid "" "The order has been changed. You can now proceed by paying the open amount of " "{amount}." msgstr "" -#: pretix/presale/views/order.py:1704 +#: pretix/presale/views/order.py:1701 msgid "You did not make any changes." msgstr "" -#: pretix/presale/views/order.py:1729 +#: pretix/presale/views/order.py:1726 msgid "You may not change your order in a way that reduces the total price." msgstr "" -#: pretix/presale/views/order.py:1731 +#: pretix/presale/views/order.py:1728 msgid "You may only change your order in a way that increases the total price." msgstr "" -#: pretix/presale/views/order.py:1733 +#: pretix/presale/views/order.py:1730 msgid "You may not change your order in a way that changes the total price." msgstr "" -#: pretix/presale/views/order.py:1735 +#: pretix/presale/views/order.py:1732 msgid "You may not change your order in a way that would require a refund." msgstr "" -#: pretix/presale/views/order.py:1743 +#: pretix/presale/views/order.py:1740 msgid "" "You may not change your order in a way that increases the total price since " "payments are no longer being accepted for this event." msgstr "" -#: pretix/presale/views/order.py:1749 +#: pretix/presale/views/order.py:1746 msgid "" "You may not change your order in a way that requires additional payment " "while we are processing your current payment. Please check back after your " "current payment has been accepted." msgstr "" -#: pretix/presale/views/order.py:1768 pretix/presale/views/order.py:1799 +#: pretix/presale/views/order.py:1765 pretix/presale/views/order.py:1796 msgid "You cannot change this order." msgstr "" @@ -33380,78 +33748,78 @@ msgid "" "order codes." msgstr "" -#: pretix/presale/views/waiting.py:127 +#: pretix/presale/views/waiting.py:132 msgid "" "No ticket types are available for the waiting list, have a look at the " "ticket shop instead." msgstr "" -#: pretix/presale/views/waiting.py:137 pretix/presale/views/waiting.py:161 +#: pretix/presale/views/waiting.py:142 pretix/presale/views/waiting.py:166 msgid "Waiting lists are disabled for this event." msgstr "" -#: pretix/presale/views/waiting.py:173 +#: pretix/presale/views/waiting.py:178 msgid "" "You cannot add yourself to the waiting list as this product is currently " "available." msgstr "" -#: pretix/presale/views/waiting.py:180 +#: pretix/presale/views/waiting.py:185 #, python-brace-format msgid "" "We've added you to the waiting list. We will send an email to {email} as " "soon as this product gets available again." msgstr "" -#: pretix/presale/views/waiting.py:208 +#: pretix/presale/views/waiting.py:213 msgid "We could not find you on our waiting list." msgstr "" -#: pretix/presale/views/waiting.py:212 +#: pretix/presale/views/waiting.py:217 msgid "" "Your waiting list spot is no longer valid or already used. There's nothing " "more to do here." msgstr "" -#: pretix/presale/views/waiting.py:222 +#: pretix/presale/views/waiting.py:227 msgid "" "Thank you very much! We will assign your spot on the waiting list to someone " "else." msgstr "" -#: pretix/presale/views/widget.py:394 +#: pretix/presale/views/widget.py:426 msgid "This ticket shop is currently disabled." msgstr "" -#: pretix/presale/views/widget.py:408 +#: pretix/presale/views/widget.py:440 msgid "The selected date does not exist in this event series." msgstr "" -#: pretix/presale/views/widget.py:415 +#: pretix/presale/views/widget.py:447 msgid "The selected date is not available." msgstr "" -#: pretix/presale/views/widget.py:423 +#: pretix/presale/views/widget.py:455 msgid "This is not an event series." msgstr "" -#: pretix/presale/views/widget.py:479 +#: pretix/presale/views/widget.py:511 #, python-format msgid "from %(start_date)s" msgstr "" -#: pretix/settings.py:844 +#: pretix/settings.py:863 msgid "User profile only" msgstr "" -#: pretix/settings.py:845 +#: pretix/settings.py:864 msgid "Read access" msgstr "" -#: pretix/settings.py:846 +#: pretix/settings.py:865 msgid "Write access" msgstr "" -#: pretix/settings.py:857 +#: pretix/settings.py:876 msgid "Kosovo" msgstr "" diff --git a/src/pretix/locale/ang/LC_MESSAGES/djangojs.po b/src/pretix/locale/ang/LC_MESSAGES/djangojs.po index 039024278a..9937b1d28a 100644 --- a/src/pretix/locale/ang/LC_MESSAGES/djangojs.po +++ b/src/pretix/locale/ang/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-17 14:06+0000\n" +"POT-Creation-Date: 2026-06-28 15:49+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -130,7 +130,7 @@ msgid "Mercado Pago" msgstr "" #: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167 -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:50 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:54 #: pretix/static/pretixpresale/js/ui/cart.js:89 msgid "Continue" msgstr "" @@ -184,167 +184,167 @@ msgstr "" msgid "Contacting your bank …" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:30 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:34 msgid "Select a check-in list" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:31 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:35 msgid "No active check-in lists found." msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:32 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:36 msgid "Switch check-in list" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:33 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:37 msgid "Search results" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:34 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:38 msgid "No tickets found" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:35 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:39 msgid "Result" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:36 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:40 msgid "This ticket requires special attention" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:37 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:41 msgid "Switch direction" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:38 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:42 msgid "Entry" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:39 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:43 msgid "Exit" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:40 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:44 msgid "Scan a ticket or search and press return…" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:41 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:45 msgid "Load more" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:42 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:46 msgid "Valid" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:43 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:47 msgid "Unpaid" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:44 -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:45 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:48 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:49 msgid "Canceled" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:46 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:50 msgid "Confirmed" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:47 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:51 msgid "Approval pending" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:48 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:52 msgid "Redeemed" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:49 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:53 msgid "Cancel" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:51 -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:60 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:55 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:64 msgid "Ticket not paid" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:52 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:56 msgid "This ticket is not yet paid. Do you want to continue anyways?" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:53 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:57 msgid "Additional information required" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:54 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:58 msgid "Valid ticket" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:55 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:59 msgid "Exit recorded" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:56 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:60 msgid "Ticket already used" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:57 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:61 msgid "Information required" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:58 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:62 msgid "Unknown ticket" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:59 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:63 msgid "Ticket type not allowed here" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:61 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:65 msgid "Entry not allowed" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:62 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:66 msgid "Ticket code revoked/changed" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:63 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:67 msgid "Ticket blocked" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:64 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:68 msgid "Ticket not valid at this time" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:65 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:69 msgid "Order canceled" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:66 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:70 msgid "Ticket code is ambiguous on list" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:67 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:71 msgid "Order not approved" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:68 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:72 msgid "Checked-in Tickets" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:69 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:73 msgid "Valid Tickets" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:70 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:74 msgid "Currently inside" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:71 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:75 #: pretix/static/pretixcontrol/js/ui/question.js:136 #: pretix/static/pretixpresale/js/ui/questions.js:271 msgid "Yes" msgstr "" -#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:72 +#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:76 #: pretix/static/pretixcontrol/js/ui/question.js:137 #: pretix/static/pretixpresale/js/ui/questions.js:271 msgid "No" @@ -376,46 +376,46 @@ msgid "" "browser and try again." msgstr "" -#: pretix/static/pretixbase/js/asynctask.js:125 -#: pretix/static/pretixbase/js/asynctask.js:182 -#: pretix/static/pretixbase/js/asynctask.js:186 +#: pretix/static/pretixbase/js/asynctask.js:135 +#: pretix/static/pretixbase/js/asynctask.js:193 +#: pretix/static/pretixbase/js/asynctask.js:197 #: pretix/static/pretixcontrol/js/ui/mail.js:24 msgid "An error of type {code} occurred." msgstr "" -#: pretix/static/pretixbase/js/asynctask.js:128 +#: pretix/static/pretixbase/js/asynctask.js:138 msgid "" "We currently cannot reach the server, but we keep trying. Last error code: " "{code}" msgstr "" -#: pretix/static/pretixbase/js/asynctask.js:162 +#: pretix/static/pretixbase/js/asynctask.js:172 #: pretix/static/pretixcontrol/js/ui/mail.js:21 msgid "The request took too long. Please try again." msgstr "" -#: pretix/static/pretixbase/js/asynctask.js:188 +#: pretix/static/pretixbase/js/asynctask.js:199 #: pretix/static/pretixcontrol/js/ui/mail.js:26 msgid "" "We currently cannot reach the server. Please try again. Error code: {code}" msgstr "" -#: pretix/static/pretixbase/js/asynctask.js:216 +#: pretix/static/pretixbase/js/asynctask.js:227 msgid "We are processing your request …" msgstr "" -#: pretix/static/pretixbase/js/asynctask.js:219 +#: pretix/static/pretixbase/js/asynctask.js:230 msgid "" "We are currently sending your request to the server. If this takes longer " "than one minute, please check your internet connection and then reload this " "page and try again." msgstr "" -#: pretix/static/pretixbase/js/asynctask.js:276 +#: pretix/static/pretixbase/js/asynctask.js:287 msgid "If this takes longer than a few minutes, please contact us." msgstr "" -#: pretix/static/pretixbase/js/asynctask.js:331 +#: pretix/static/pretixbase/js/asynctask.js:342 msgid "Close message" msgstr "" @@ -427,143 +427,162 @@ msgstr "" msgid "Press Ctrl-C to copy!" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:12 -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:18 -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:24 -msgid "is one of" +#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:80 +msgid "Edit" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:30 -msgid "is before" +#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:86 +msgid "Visualize" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:34 -msgid "is after" +#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:96 +msgid "" +"Your rule always filters by product or variation, but the following products " +"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.js:40 -msgid "=" +#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:99 +msgid "Please double-check if this was intentional." msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:99 -msgid "Product" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:103 -msgid "Product variation" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:107 -msgid "Gate" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:111 -msgid "Current date and time" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:115 -msgid "Current day of the week (1 = Monday, 7 = Sunday)" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:119 -msgid "Current entry status" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:123 -msgid "Number of previous entries" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:127 -msgid "Number of previous entries since midnight" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:131 -msgid "Number of previous entries since" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:135 -msgid "Number of previous entries before" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:139 -msgid "Number of days with a previous entry" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:143 -msgid "Number of days with a previous entry since" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:147 -msgid "Number of days with a previous entry before" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:151 -msgid "Minutes since last entry (-1 on first entry)" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:155 -msgid "Minutes since first entry (-1 on first entry)" -msgstr "" - -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:182 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:4 msgid "All of the conditions below (AND)" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:183 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:5 msgid "At least one of the conditions below (OR)" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:184 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:6 msgid "Event start" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:185 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:7 msgid "Event end" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:186 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:8 msgid "Event admission" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:187 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:9 msgid "custom date and time" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:188 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:10 msgid "custom time" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:189 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:11 msgid "Tolerance (minutes)" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:190 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:12 msgid "Add condition" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:191 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:13 msgid "minutes" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:192 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:14 msgid "Duplicate" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:193 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:15 msgctxt "entry_status" msgid "present" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:194 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:16 msgctxt "entry_status" msgid "absent" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:289 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:29 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:35 +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:41 +msgid "is one of" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:47 +msgid "is before" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:51 +msgid "is after" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:57 +msgid "=" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:117 +msgid "Product" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:121 +msgid "Product variation" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:125 +msgid "Gate" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:129 +msgid "Current date and time" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:133 +msgid "Current day of the week (1 = Monday, 7 = Sunday)" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:137 +msgid "Current entry status" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:141 +msgid "Number of previous entries" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:145 +msgid "Number of previous entries since midnight" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:149 +msgid "Number of previous entries since" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:153 +msgid "Number of previous entries before" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:157 +msgid "Number of days with a previous entry" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:161 +msgid "Number of days with a previous entry since" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:165 +msgid "Number of days with a previous entry before" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:169 +msgid "Minutes since last entry (-1 on first entry)" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:173 +msgid "Minutes since first entry (-1 on first entry)" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:47 msgid "Error: Product not found!" msgstr "" -#: pretix/static/pretixcontrol/js/ui/checkinrules.js:296 +#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:54 msgid "Error: Variation not found!" msgstr "" @@ -632,56 +651,56 @@ msgstr "" msgid "Unknown error." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:309 +#: pretix/static/pretixcontrol/js/ui/main.js:310 msgid "Your color has great contrast and will provide excellent accessibility." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:313 +#: pretix/static/pretixcontrol/js/ui/main.js:314 msgid "" "Your color has decent contrast and is sufficient for minimum accessibility " "requirements." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:317 +#: pretix/static/pretixcontrol/js/ui/main.js:318 msgid "" "Your color has insufficient contrast to white. Accessibility of your site " "will be impacted." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:445 -#: pretix/static/pretixcontrol/js/ui/main.js:465 +#: pretix/static/pretixcontrol/js/ui/main.js:446 +#: pretix/static/pretixcontrol/js/ui/main.js:466 msgid "Search query" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:463 +#: pretix/static/pretixcontrol/js/ui/main.js:464 msgid "All" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:464 +#: pretix/static/pretixcontrol/js/ui/main.js:465 msgid "None" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:468 +#: pretix/static/pretixcontrol/js/ui/main.js:469 msgid "Selected only" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:841 +#: pretix/static/pretixcontrol/js/ui/main.js:844 msgid "Enter page number between 1 and %(max)s." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:844 +#: pretix/static/pretixcontrol/js/ui/main.js:847 msgid "Invalid page number." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:1002 +#: pretix/static/pretixcontrol/js/ui/main.js:1005 msgid "Use a different name internally" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:1042 +#: pretix/static/pretixcontrol/js/ui/main.js:1045 msgid "Click to close" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:1123 +#: pretix/static/pretixcontrol/js/ui/main.js:1126 msgid "You have unsaved changes!" msgstr "" @@ -767,164 +786,196 @@ msgid "Google Pay" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:16 +#: pretix/static/pretixpresale/widget/src/i18n.ts:30 msgctxt "widget" msgid "Quantity" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:17 +#: pretix/static/pretixpresale/widget/src/i18n.ts:31 msgctxt "widget" msgid "Decrease quantity" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:18 +#: pretix/static/pretixpresale/widget/src/i18n.ts:32 msgctxt "widget" msgid "Increase quantity" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:19 +#: pretix/static/pretixpresale/widget/src/i18n.ts:33 msgctxt "widget" msgid "Filter events by" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:20 +#: pretix/static/pretixpresale/widget/src/i18n.ts:34 msgctxt "widget" msgid "Filter" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:21 +#: pretix/static/pretixpresale/widget/src/i18n.ts:35 msgctxt "widget" msgid "Price" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:22 +#: pretix/static/pretixpresale/widget/src/i18n.ts:36 #, javascript-format msgctxt "widget" msgid "Original price: %s" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:23 +#: pretix/static/pretixpresale/widget/src/i18n.ts:37 #, javascript-format msgctxt "widget" msgid "New price: %s" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:24 +#: pretix/static/pretixpresale/widget/src/i18n.ts:38 msgctxt "widget" msgid "Select" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:25 +#: pretix/static/pretixpresale/widget/src/i18n.ts:39 #, javascript-format msgctxt "widget" msgid "Select %s" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:26 +#: pretix/static/pretixpresale/widget/src/i18n.ts:40 #, javascript-format msgctxt "widget" msgid "Select variant %s" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:27 +#: pretix/static/pretixpresale/widget/src/i18n.ts:41 msgctxt "widget" msgid "Sold out" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:28 +#: pretix/static/pretixpresale/widget/src/i18n.ts:42 msgctxt "widget" msgid "Buy" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:29 +#: pretix/static/pretixpresale/widget/src/i18n.ts:43 msgctxt "widget" msgid "Register" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:30 +#: pretix/static/pretixpresale/widget/src/i18n.ts:44 msgctxt "widget" msgid "Reserved" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:31 +#: pretix/static/pretixpresale/widget/src/i18n.ts:45 msgctxt "widget" msgid "FREE" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:32 +#: pretix/static/pretixpresale/widget/src/i18n.ts:46 msgctxt "widget" msgid "from %(currency)s %(price)s" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:33 +#: pretix/static/pretixpresale/widget/src/i18n.ts:47 #, javascript-format msgctxt "widget" msgid "Image of %s" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:34 +#: pretix/static/pretixpresale/widget/src/i18n.ts:48 msgctxt "widget" msgid "incl. %(rate)s% %(taxname)s" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:35 +#: pretix/static/pretixpresale/widget/src/i18n.ts:49 msgctxt "widget" msgid "plus %(rate)s% %(taxname)s" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:36 +#: pretix/static/pretixpresale/widget/src/i18n.ts:50 msgctxt "widget" msgid "incl. taxes" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:37 +#: pretix/static/pretixpresale/widget/src/i18n.ts:51 msgctxt "widget" msgid "plus taxes" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:38 +#: pretix/static/pretixpresale/widget/src/i18n.ts:52 #, javascript-format msgctxt "widget" msgid "currently available: %s" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:39 +#: pretix/static/pretixpresale/widget/src/i18n.ts:53 msgctxt "widget" msgid "Only available with a voucher" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:40 #: pretix/static/pretixpresale/js/widget/widget.js:43 +#: pretix/static/pretixpresale/widget/src/i18n.ts:54 +#: pretix/static/pretixpresale/widget/src/i18n.ts:57 msgctxt "widget" msgid "Not yet available" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:41 +#: pretix/static/pretixpresale/widget/src/i18n.ts:55 msgctxt "widget" msgid "Not available anymore" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:42 +#: pretix/static/pretixpresale/widget/src/i18n.ts:56 msgctxt "widget" msgid "Currently not available" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:44 +#: pretix/static/pretixpresale/widget/src/i18n.ts:58 #, javascript-format msgctxt "widget" msgid "minimum amount to order: %s" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:45 +#: pretix/static/pretixpresale/widget/src/i18n.ts:59 msgctxt "widget" msgid "Close ticket shop" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:46 +#: pretix/static/pretixpresale/widget/src/i18n.ts:60 msgctxt "widget" msgid "The ticket shop could not be loaded." msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:47 +#: pretix/static/pretixpresale/widget/src/i18n.ts:61 msgctxt "widget" msgid "" "There are currently a lot of users in this ticket shop. Please open the shop " @@ -932,21 +983,25 @@ msgid "" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:49 +#: pretix/static/pretixpresale/widget/src/i18n.ts:62 msgctxt "widget" msgid "Open ticket shop" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:50 +#: pretix/static/pretixpresale/widget/src/i18n.ts:63 msgctxt "widget" msgid "Checkout" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:51 +#: pretix/static/pretixpresale/widget/src/i18n.ts:64 msgctxt "widget" msgid "The cart could not be created. Please try again later" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:52 +#: pretix/static/pretixpresale/widget/src/i18n.ts:65 msgctxt "widget" msgid "" "We could not create your cart, since there are currently too many users in " @@ -954,11 +1009,13 @@ msgid "" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:54 +#: pretix/static/pretixpresale/widget/src/i18n.ts:66 msgctxt "widget" msgid "Waiting list" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:55 +#: pretix/static/pretixpresale/widget/src/i18n.ts:67 msgctxt "widget" msgid "" "You currently have an active cart for this event. If you select more " @@ -966,96 +1023,115 @@ msgid "" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:57 +#: pretix/static/pretixpresale/widget/src/i18n.ts:68 msgctxt "widget" msgid "Resume checkout" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:58 +#: pretix/static/pretixpresale/widget/src/i18n.ts:69 msgctxt "widget" msgid "Redeem a voucher" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:59 +#: pretix/static/pretixpresale/widget/src/i18n.ts:70 msgctxt "widget" msgid "Redeem" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:60 +#: pretix/static/pretixpresale/widget/src/i18n.ts:71 msgctxt "widget" msgid "Voucher code" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:61 +#: pretix/static/pretixpresale/widget/src/i18n.ts:72 msgctxt "widget" msgid "Close" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:62 +#: pretix/static/pretixpresale/widget/src/i18n.ts:73 msgctxt "widget" msgid "Close checkout" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:63 +#: pretix/static/pretixpresale/widget/src/i18n.ts:74 msgctxt "widget" msgid "You cannot cancel this operation. Please wait for loading to finish." msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:64 +#: pretix/static/pretixpresale/widget/src/i18n.ts:75 msgctxt "widget" msgid "Continue" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:65 +#: pretix/static/pretixpresale/widget/src/i18n.ts:76 msgctxt "widget" msgid "Show variants" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:66 +#: pretix/static/pretixpresale/widget/src/i18n.ts:77 msgctxt "widget" msgid "Hide variants" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:67 +#: pretix/static/pretixpresale/widget/src/i18n.ts:78 msgctxt "widget" msgid "Choose a different event" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:68 +#: pretix/static/pretixpresale/widget/src/i18n.ts:79 msgctxt "widget" msgid "Choose a different date" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:69 +#: pretix/static/pretixpresale/widget/src/i18n.ts:80 msgctxt "widget" msgid "Back" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:70 +#: pretix/static/pretixpresale/widget/src/i18n.ts:81 msgctxt "widget" msgid "Next month" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:71 +#: pretix/static/pretixpresale/widget/src/i18n.ts:82 msgctxt "widget" msgid "Previous month" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:72 +#: pretix/static/pretixpresale/widget/src/i18n.ts:83 msgctxt "widget" msgid "Next week" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:73 +#: pretix/static/pretixpresale/widget/src/i18n.ts:84 msgctxt "widget" msgid "Previous week" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:74 +#: pretix/static/pretixpresale/widget/src/i18n.ts:85 msgctxt "widget" msgid "Open seat selection" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:75 +#: pretix/static/pretixpresale/widget/src/i18n.ts:86 msgctxt "widget" msgid "" "Some or all ticket categories are currently sold out. If you want, you can " @@ -1064,110 +1140,137 @@ msgid "" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:76 +#: pretix/static/pretixpresale/widget/src/i18n.ts:87 msgctxt "widget" msgid "Load more" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:78 +#: pretix/static/pretixpresale/widget/src/i18n.ts:89 msgid "Mo" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:79 +#: pretix/static/pretixpresale/widget/src/i18n.ts:90 msgid "Tu" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:80 +#: pretix/static/pretixpresale/widget/src/i18n.ts:91 msgid "We" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:81 +#: pretix/static/pretixpresale/widget/src/i18n.ts:92 msgid "Th" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:82 +#: pretix/static/pretixpresale/widget/src/i18n.ts:93 msgid "Fr" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:83 +#: pretix/static/pretixpresale/widget/src/i18n.ts:94 msgid "Sa" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:84 +#: pretix/static/pretixpresale/widget/src/i18n.ts:95 msgid "Su" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:85 +#: pretix/static/pretixpresale/widget/src/i18n.ts:96 msgid "Monday" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:86 +#: pretix/static/pretixpresale/widget/src/i18n.ts:97 msgid "Tuesday" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:87 +#: pretix/static/pretixpresale/widget/src/i18n.ts:98 msgid "Wednesday" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:88 +#: pretix/static/pretixpresale/widget/src/i18n.ts:99 msgid "Thursday" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:89 +#: pretix/static/pretixpresale/widget/src/i18n.ts:100 msgid "Friday" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:90 +#: pretix/static/pretixpresale/widget/src/i18n.ts:101 msgid "Saturday" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:91 +#: pretix/static/pretixpresale/widget/src/i18n.ts:102 msgid "Sunday" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:94 +#: pretix/static/pretixpresale/widget/src/i18n.ts:105 msgid "January" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:95 +#: pretix/static/pretixpresale/widget/src/i18n.ts:106 msgid "February" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:96 +#: pretix/static/pretixpresale/widget/src/i18n.ts:107 msgid "March" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:97 +#: pretix/static/pretixpresale/widget/src/i18n.ts:108 msgid "April" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:98 +#: pretix/static/pretixpresale/widget/src/i18n.ts:109 msgid "May" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:99 +#: pretix/static/pretixpresale/widget/src/i18n.ts:110 msgid "June" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:100 +#: pretix/static/pretixpresale/widget/src/i18n.ts:111 msgid "July" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:101 +#: pretix/static/pretixpresale/widget/src/i18n.ts:112 msgid "August" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:102 +#: pretix/static/pretixpresale/widget/src/i18n.ts:113 msgid "September" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:103 +#: pretix/static/pretixpresale/widget/src/i18n.ts:114 msgid "October" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:104 +#: pretix/static/pretixpresale/widget/src/i18n.ts:115 msgid "November" msgstr "" #: pretix/static/pretixpresale/js/widget/widget.js:105 +#: pretix/static/pretixpresale/widget/src/i18n.ts:116 msgid "December" msgstr "" diff --git a/src/pretix/locale/ar/LC_MESSAGES/django.po b/src/pretix/locale/ar/LC_MESSAGES/django.po index 01ae554a2d..315abad95f 100644 --- a/src/pretix/locale/ar/LC_MESSAGES/django.po +++ b/src/pretix/locale/ar/LC_MESSAGES/django.po @@ -7,10 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-30 11:22+0000\n" -"PO-Revision-Date: 2025-04-08 18:00+0000\n" -"Last-Translator: Menaouer Chaabi " -"<98581961+DerJimno@users.noreply.github.com>\n" +"POT-Creation-Date: 2026-06-28 14:42+0000\n" +"PO-Revision-Date: 2026-05-19 04:16+0000\n" +"Last-Translator: Khalid Shaheen \n" "Language-Team: Arabic \n" "Language: ar\n" @@ -19,141 +18,175 @@ 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 5.10.4\n" +"X-Generator: Weblate 2026.5\n" -#: pretix/_base_settings.py:87 +#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html:670 +#: pretix/control/templates/pretixcontrol/events/index.html:166 +#: pretix/control/templates/pretixcontrol/organizers/detail.html:135 +#: pretix/control/views/dashboards.py:543 +msgid "Shop disabled" +msgstr "البيع متوقف الآن" + +#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html:672 +#: pretix/control/forms/filter.py:1370 pretix/control/forms/filter.py:1964 +#: pretix/control/templates/pretixcontrol/events/index.html:168 +#: pretix/control/templates/pretixcontrol/organizers/detail.html:137 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:36 +#: pretix/control/templates/pretixcontrol/subevents/index.html:172 +msgid "Presale over" +msgstr "انتهى البيع الأولي" + +#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html:674 +#: pretix/control/forms/filter.py:1369 pretix/control/forms/filter.py:1963 +#: pretix/control/templates/pretixcontrol/events/index.html:170 +#: pretix/control/templates/pretixcontrol/organizers/detail.html:139 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:38 +#: pretix/control/templates/pretixcontrol/subevents/index.html:174 +msgid "Presale not started" +msgstr "لم يبدأ البيع الأولي بعد" + +#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html:676 +#: pretix/control/templates/pretixcontrol/events/index.html:172 +#: pretix/control/templates/pretixcontrol/organizers/detail.html:141 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:40 +#: pretix/control/templates/pretixcontrol/subevents/index.html:176 +#: pretix/control/views/dashboards.py:549 +msgid "On sale" +msgstr "للبيع" + +#: pretix/_base_settings.py:89 msgid "English" msgstr "الإنجليزية" -#: pretix/_base_settings.py:88 +#: pretix/_base_settings.py:90 msgid "German" msgstr "الألمانية" -#: pretix/_base_settings.py:89 +#: pretix/_base_settings.py:91 msgid "German (informal)" msgstr "الألمانية (غير رسمي)" -#: pretix/_base_settings.py:90 +#: pretix/_base_settings.py:92 msgid "Arabic" msgstr "العربية" -#: pretix/_base_settings.py:91 +#: pretix/_base_settings.py:93 msgid "Basque" -msgstr "" +msgstr "الباسكية" -#: pretix/_base_settings.py:92 +#: pretix/_base_settings.py:94 msgid "Catalan" msgstr "الكتالانية" -#: pretix/_base_settings.py:93 +#: pretix/_base_settings.py:95 msgid "Chinese (simplified)" msgstr "الصينية (المبسطة)" -#: pretix/_base_settings.py:94 +#: pretix/_base_settings.py:96 msgid "Chinese (traditional)" msgstr "الصينية (التقليدية)" -#: pretix/_base_settings.py:95 +#: pretix/_base_settings.py:97 msgid "Czech" msgstr "التشيكية" -#: pretix/_base_settings.py:96 +#: pretix/_base_settings.py:98 msgid "Croatian" -msgstr "" +msgstr "الكرواتية" -#: pretix/_base_settings.py:97 +#: pretix/_base_settings.py:99 msgid "Danish" msgstr "دانماركي" -#: pretix/_base_settings.py:98 +#: pretix/_base_settings.py:100 msgid "Dutch" msgstr "هولندي" -#: pretix/_base_settings.py:99 +#: pretix/_base_settings.py:101 msgid "Dutch (informal)" msgstr "الهولندية (غير رسمي)" -#: pretix/_base_settings.py:100 +#: pretix/_base_settings.py:102 msgid "French" msgstr "الفرنسية" -#: pretix/_base_settings.py:101 +#: pretix/_base_settings.py:103 msgid "Finnish" msgstr "الفنلندية" -#: pretix/_base_settings.py:102 +#: pretix/_base_settings.py:104 msgid "Galician" msgstr "الجاليكية" -#: pretix/_base_settings.py:103 +#: pretix/_base_settings.py:105 msgid "Greek" msgstr "اليونانية" -#: pretix/_base_settings.py:104 +#: pretix/_base_settings.py:106 msgid "Hebrew" -msgstr "" +msgstr "العبرية" -#: pretix/_base_settings.py:105 +#: pretix/_base_settings.py:107 msgid "Indonesian" msgstr "الأندونيسية" -#: pretix/_base_settings.py:106 +#: pretix/_base_settings.py:108 msgid "Italian" msgstr "الإيطالية" -#: pretix/_base_settings.py:107 +#: pretix/_base_settings.py:109 msgid "Japanese" -msgstr "" +msgstr "اليابانية" -#: pretix/_base_settings.py:108 +#: pretix/_base_settings.py:110 msgid "Latvian" msgstr "لاتفيفية" -#: pretix/_base_settings.py:109 +#: pretix/_base_settings.py:111 msgid "Norwegian Bokmål" msgstr "النرويجية" -#: pretix/_base_settings.py:110 +#: pretix/_base_settings.py:112 msgid "Polish" msgstr "البولندية" -#: pretix/_base_settings.py:111 +#: pretix/_base_settings.py:113 msgid "Portuguese (Portugal)" msgstr "البرتغالية (البرتغال)" -#: pretix/_base_settings.py:112 +#: pretix/_base_settings.py:114 msgid "Portuguese (Brazil)" msgstr "البرتغالية (البرازيل)" -#: pretix/_base_settings.py:113 +#: pretix/_base_settings.py:115 msgid "Romanian" msgstr "الرومانية" -#: pretix/_base_settings.py:114 +#: pretix/_base_settings.py:116 msgid "Russian" msgstr "الروسية" -#: pretix/_base_settings.py:115 +#: pretix/_base_settings.py:117 msgid "Slovak" msgstr "السلوفاكية" -#: pretix/_base_settings.py:116 +#: pretix/_base_settings.py:118 msgid "Swedish" msgstr "السويدية" -#: pretix/_base_settings.py:117 +#: pretix/_base_settings.py:119 msgid "Spanish" msgstr "الأسبانية" -#: pretix/_base_settings.py:118 +#: pretix/_base_settings.py:120 msgid "Spanish (Latin America)" -msgstr "" +msgstr "الإسبانية (أميركا اللاتينية)" -#: pretix/_base_settings.py:119 +#: pretix/_base_settings.py:121 msgid "Turkish" msgstr "التركية" -#: pretix/_base_settings.py:120 +#: pretix/_base_settings.py:122 msgid "Ukrainian" msgstr "الأوكرانية" @@ -169,11 +202,11 @@ msgstr "" msgid "pretixSCAN" msgstr "بريتكس pretixSCAN" -#: pretix/api/auth/devicesecurity.py:118 +#: pretix/api/auth/devicesecurity.py:120 msgid "pretixSCAN (kiosk mode, no order sync, no search)" msgstr "pretixSCAN (وضع kiosk، لا مزامنة للطلبات ولا بحث)" -#: pretix/api/auth/devicesecurity.py:153 +#: pretix/api/auth/devicesecurity.py:155 msgid "pretixSCAN (online only, no order sync)" msgstr "pretixSCAN (وضع kiosk، لا مزامنة للطلبات)" @@ -212,40 +245,40 @@ msgid "Target URL" msgstr "الرابط المستهدف" #: pretix/api/models.py:118 pretix/base/models/devices.py:125 -#: pretix/base/models/organizer.py:373 +#: pretix/base/models/organizer.py:379 msgid "All events (including newly created ones)" msgstr "كل الفعاليات (بما في ذلك تلك التي تم إنشاؤها حديثا)" #: pretix/api/models.py:119 pretix/base/models/devices.py:126 -#: pretix/base/models/organizer.py:374 +#: pretix/base/models/organizer.py:380 msgid "Limit to events" msgstr "حد على الفعاليات" #: pretix/api/models.py:120 pretix/base/exporters/orderlist.py:306 -#: pretix/base/exporters/orderlist.py:1137 +#: pretix/base/exporters/orderlist.py:1150 #: pretix/base/modelimport_vouchers.py:326 pretix/base/models/orders.py:271 #: pretix/base/models/vouchers.py:295 pretix/control/forms/filter.py:593 -#: pretix/control/templates/pretixcontrol/order/index.html:981 +#: pretix/control/templates/pretixcontrol/order/index.html:1016 #: pretix/control/templates/pretixcontrol/organizers/webhooks.html:38 #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:21 #: pretix/control/views/vouchers.py:122 #: pretix/plugins/banktransfer/refund_export.py:47 -#: pretix/plugins/checkinlists/exporters.py:525 +#: pretix/plugins/checkinlists/exporters.py:524 msgid "Comment" msgstr "تعليق" -#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1533 +#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1541 #, python-brace-format msgid "The product \"{}\" is not assigned to a quota." msgstr "لم يتم تعيين حصة للمنتج \"{}\"." -#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1750 -#: pretix/base/models/items.py:1917 pretix/base/models/items.py:2203 +#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1767 +#: pretix/base/models/items.py:1927 pretix/base/models/items.py:2213 msgid "One or more items do not belong to this event." msgstr "هناك عنصر أو أكثر لا ينتمي إلى هذه الفعالية." #: pretix/api/serializers/checkin.py:69 pretix/api/serializers/checkin.py:72 -#: pretix/base/models/items.py:2214 pretix/base/models/items.py:2217 +#: pretix/base/models/items.py:2224 pretix/base/models/items.py:2227 #: pretix/base/models/waitinglist.py:306 pretix/base/models/waitinglist.py:309 msgid "The subevent does not belong to this event." msgstr "الفعالية الفرعية لا تنتمي إلى هذه الفعالية." @@ -284,50 +317,37 @@ msgstr "إضافة مقيدة: '{name}'." msgid "Item meta data property '{name}' does not exist." msgstr "خاصية البيانات الوصفية للعنصر '{name}' غير موجودة." -#: pretix/api/serializers/item.py:214 pretix/control/forms/item.py:1277 +#: pretix/api/serializers/item.py:214 pretix/control/forms/item.py:1332 msgid "The bundled item must not be the same item as the bundling one." msgstr "يجب ألا يكون العنصر المجمّع هو نفس عنصر التجميع." -#: pretix/api/serializers/item.py:217 pretix/control/forms/item.py:1279 +#: pretix/api/serializers/item.py:217 pretix/control/forms/item.py:1334 msgid "The bundled item must not have bundles on its own." msgstr "يجب ألا يحتوي العنصر المجمع على حزم بمفرده." #: pretix/api/serializers/item.py:235 -#, fuzzy -#| msgid "The payment is too late to be accepted." msgid "The program start must not be empty." -msgstr "فات الأوان لقبول الدفع." +msgstr "يجب ألا يكون موعد بداية البرنامج فارغ." #: pretix/api/serializers/item.py:239 -#, fuzzy -#| msgid "The payment is too late to be accepted." msgid "The program end must not be empty." -msgstr "فات الأوان لقبول الدفع." +msgstr "يجب ألا يكون موعد نهاية البرنامج فارغ." -#: pretix/api/serializers/item.py:242 pretix/base/models/items.py:2322 -#, fuzzy -#| msgid "The maximum count needs to be greater than the minimum count." +#: pretix/api/serializers/item.py:242 pretix/base/models/items.py:2339 msgid "The program end must not be before the program start." -msgstr "يجب أن يكون الحد الأقصى للعدد أكبر من الحد الأدنى للعد." +msgstr "يجب ألا يكون موعد نهاية البرنامج سابق لموعد بدايته." -#: pretix/api/serializers/item.py:247 pretix/base/models/items.py:2316 -#, fuzzy -#| msgid "You can not select a subevent if your event is not an event series." +#: pretix/api/serializers/item.py:247 pretix/base/models/items.py:2333 msgid "You cannot use program times on an event series." -msgstr "" -"لا يمكنك تحديد فعالية فرعية إذا لم تكن الفعالية الخاصة بك سلسلة فعاليات." +msgstr "لا يمكنك استخدام أوقات البرنامج لسلسلة من الفعاليات." #: pretix/api/serializers/item.py:337 -#, fuzzy -#| msgid "" -#| "Updating add-ons, bundles, or variations via PATCH/PUT is not supported. " -#| "Please use the dedicated nested endpoint." msgid "" "Updating add-ons, bundles, program times or variations via PATCH/PUT is not " "supported. Please use the dedicated nested endpoint." msgstr "" -"تحديث الإضافات، أو الحزم، أو المتغيرات عن طريق PATCH/PUT غير مدعوم. الرجاء " -"استخدام نقطة نهاية المتداخلة المخصصة." +"لا يوجد دعم لتحديث الإضافات، أو الحزم، أو مواعيد البرامج، أو المتغيرات عبر " +"طريقتي PATCH/PUT. يُرجى استخدام نقطة النهاية المتداخلة المخصصة لذلك." #: pretix/api/serializers/item.py:345 msgid "Only admission products can currently be personalized." @@ -341,7 +361,7 @@ msgstr "" "يجب ألا ترتبط منتجات بطاقات الهدايا بمعدلات ضريبية غير صفرية حيث سيتم تطبيق " "ضريبة المبيعات عند استرداد بطاقة الهدايا." -#: pretix/api/serializers/item.py:361 pretix/control/forms/item.py:784 +#: pretix/api/serializers/item.py:361 pretix/control/forms/item.py:839 msgid "Gift card products should not be admission products at the same time." msgstr "لا يمكن أن تكون منتجات بطاقات الهدايا هي نفس منتجات القبول." @@ -353,23 +373,23 @@ msgstr "" "خيارات التحديث عبر PATCH/PUT غير مدعومة. الرجاء استخدام نقطة نهاية المتداخلة " "المخصصة." -#: pretix/api/serializers/item.py:587 pretix/control/forms/item.py:177 +#: pretix/api/serializers/item.py:587 pretix/control/forms/item.py:178 msgid "Question cannot depend on a question asked during check-in." msgstr "لا يمكن أن يعتمد السؤال على سؤال تم طرحه أثناء التسجيل." -#: pretix/api/serializers/item.py:592 pretix/control/forms/item.py:182 +#: pretix/api/serializers/item.py:592 pretix/control/forms/item.py:183 msgid "Circular dependency between questions detected." msgstr "الأسئلة تدور في حلقة لا متناهية." -#: pretix/api/serializers/item.py:597 pretix/control/forms/item.py:191 +#: pretix/api/serializers/item.py:597 pretix/control/forms/item.py:192 msgid "This type of question cannot be asked during check-in." msgstr "لا يمكن طرح هذا النوع من الأسئلة أثناء تسجيل الدخول." -#: pretix/api/serializers/item.py:600 pretix/control/forms/item.py:199 +#: pretix/api/serializers/item.py:600 pretix/control/forms/item.py:200 msgid "This type of question cannot be shown during check-in." msgstr "لا يمكن عرض هذا النوع من الأسئلة أثناء تسجيل الدخول." -#: pretix/api/serializers/media.py:116 +#: pretix/api/serializers/media.py:143 msgid "" "A medium with the same identifier and type already exists in your organizer " "account." @@ -380,49 +400,47 @@ msgstr "توجد وسيلة بنفس المعرف والنوع في حساب ا msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" ادخال غير صالحة، يرجى المحاولة مرة أخرى." -#: pretix/api/serializers/order.py:1494 pretix/api/views/cart.py:224 -#: pretix/base/services/orders.py:1593 +#: pretix/api/serializers/order.py:1502 pretix/api/views/cart.py:224 +#: pretix/base/services/orders.py:1594 #, python-brace-format msgid "The selected seat \"{seat}\" is not available." msgstr "المقعد المحدد \"{seat}\" غير متوفر." -#: pretix/api/serializers/order.py:1520 pretix/api/serializers/order.py:1527 +#: pretix/api/serializers/order.py:1528 pretix/api/serializers/order.py:1535 #, python-brace-format msgid "The product \"{}\" is not available on this date." msgstr "المنتج \"{}\" غير متوفر في هذا التاريخ." -#: pretix/api/serializers/order.py:1542 pretix/api/views/cart.py:200 +#: pretix/api/serializers/order.py:1550 pretix/api/views/cart.py:200 #, python-brace-format msgid "" "There is not enough quota available on quota \"{}\" to perform the operation." msgstr "لا توجد حصة كافية متاحة في الحصة \"{}\" لإجراء العملية." #: pretix/api/serializers/organizer.py:152 -#: pretix/control/forms/organizer.py:1060 pretix/presale/forms/customer.py:471 +#: pretix/control/forms/organizer.py:1070 pretix/presale/forms/customer.py:472 msgid "An account with this email address is already registered." msgstr "هناك حساب مرتبط بهذا البريد الإلكتروني مسبقا." #: pretix/api/serializers/organizer.py:285 -#: pretix/control/forms/organizer.py:896 +#: pretix/control/forms/organizer.py:906 msgid "" "A gift card with the same secret already exists in your or an affiliated " "organizer account." msgstr "توجد مسبقا بطاقة هدايا بنفس السر في حسابك أو حساب منظم تابع." -#: pretix/api/serializers/organizer.py:482 -#: pretix/control/views/organizer.py:1039 -#, fuzzy -#| msgid "Account information" +#: pretix/api/serializers/organizer.py:495 +#: pretix/control/views/organizer.py:1035 msgid "Account invitation" -msgstr "معلومات الحساب" +msgstr "دعوة إلى فتح حساب" -#: pretix/api/serializers/organizer.py:503 -#: pretix/control/views/organizer.py:1138 +#: pretix/api/serializers/organizer.py:516 +#: pretix/control/views/organizer.py:1134 msgid "This user already has been invited for this team." msgstr "تمت دعوة هذا المستخدم سابقا لهذا الفريق." -#: pretix/api/serializers/organizer.py:519 -#: pretix/control/views/organizer.py:1155 +#: pretix/api/serializers/organizer.py:532 +#: pretix/control/views/organizer.py:1151 msgid "This user already has permissions for this team." msgstr "هذا المستخدم لديه تصاريح سابقة لهذا الفريق." @@ -431,28 +449,34 @@ msgid "" "The specified voucher has already been used the maximum number of times." msgstr "تم استخدام رمز كود الخصم هذا سابقا لأقصى عدد مسموح به من المرات." -#: pretix/api/views/checkin.py:645 pretix/api/views/checkin.py:652 +#: pretix/api/views/checkin.py:653 pretix/api/views/checkin.py:660 msgid "Medium connected to other event" msgstr "الوسيط متصل بحدث آخر" -#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:774 +#: pretix/api/views/checkin.py:814 +#, fuzzy +#| msgid "You cannot change this order." +msgid "You cannot exchange a medium for a medium." +msgstr "لا يمكنك تغيير هذا الطلب." + +#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:777 #, python-brace-format msgid "" "The application \"{application_name}\" has been authorized to access your " "account." msgstr "تم تفويض التطبيق \"{application_name}\" للوصول إلى حسابك." -#: pretix/api/views/order.py:607 pretix/control/views/orders.py:1605 +#: pretix/api/views/order.py:610 pretix/control/views/orders.py:1609 #: pretix/presale/views/order.py:788 pretix/presale/views/order.py:868 msgid "You cannot generate an invoice for this order." msgstr "لا يمكن انشاء فاتورة لهذا الطلب." -#: pretix/api/views/order.py:612 pretix/control/views/orders.py:1607 +#: pretix/api/views/order.py:615 pretix/control/views/orders.py:1611 #: pretix/presale/views/order.py:790 pretix/presale/views/order.py:870 msgid "An invoice for this order already exists." msgstr "توجد فاتورة مصدرة لهذا الطلب مسبقاً." -#: pretix/api/views/order.py:715 pretix/base/services/cart.py:223 +#: pretix/api/views/order.py:718 pretix/base/services/cart.py:223 #: pretix/base/services/orders.py:189 pretix/presale/views/order.py:852 msgid "One of the selected products is not available in the selected country." msgstr "أحد المنتجات المختارة غير متوفر في البلد المحدد." @@ -469,10 +493,10 @@ msgstr "الطلب الجديد بحاجة إلى موافقة" msgid "Order marked as paid" msgstr "تم تمييز الطلب على أنه مدفوع" -#: pretix/api/webhooks.py:307 pretix/base/models/checkin.py:355 +#: pretix/api/webhooks.py:307 pretix/base/models/checkin.py:358 #: pretix/base/notifications.py:251 #: pretix/control/templates/pretixcontrol/event/mail.html:114 -#: pretix/control/views/orders.py:1566 +#: pretix/control/views/orders.py:1570 msgid "Order canceled" msgstr "تم إلغاء الطلب" @@ -499,47 +523,35 @@ msgstr "تم تغيير عنوان اتصال الطلب" #: pretix/api/webhooks.py:331 pretix/base/notifications.py:281 #: pretix/control/templates/pretixcontrol/event/mail.html:102 msgid "Order changed" -msgstr "تم تغيير الطلب." +msgstr "تم تغيير الطلب" #: pretix/api/webhooks.py:335 -#, fuzzy -#| msgid "Enable payment method" msgid "Refund of payment created" -msgstr "تمكين طريقة الدفع" +msgstr "تم إنشاء طلب استرداد الدفع" #: pretix/api/webhooks.py:339 pretix/base/notifications.py:293 msgid "External refund of payment" -msgstr "استرداد الدفع الخارجي" +msgstr "استرداد خارجي للمدفوعات" #: pretix/api/webhooks.py:343 -#, fuzzy -#| msgid "Text (requested by user)" msgid "Refund of payment requested by customer" -msgstr "النص (عن طريق المستخدم المطلوب)" +msgstr "استرداد المبلغ بناءً على طلب العميل" #: pretix/api/webhooks.py:347 -#, fuzzy -#| msgid "Payment completed." msgid "Refund of payment completed" -msgstr "تم السداد." +msgstr "تم إتمام استرداد الدفع" #: pretix/api/webhooks.py:351 -#, fuzzy -#| msgid "Refund {local_id} has been canceled." msgid "Refund of payment canceled" -msgstr "تم إلغاء استرداد {local_id}." +msgstr "إلغاء استرداد الدفع" #: pretix/api/webhooks.py:355 -#, fuzzy -#| msgid "Refund order" msgid "Refund of payment failed" -msgstr "أجل استرداد" +msgstr "فشل استرداد الدفع" #: pretix/api/webhooks.py:359 -#, fuzzy -#| msgid "Payment confirmation date" msgid "Payment confirmed" -msgstr "تاريخ الدفع تأكيدا" +msgstr "تم تأكيد الدفع" #: pretix/api/webhooks.py:363 msgid "Order approved" @@ -550,14 +562,12 @@ msgid "Order denied" msgstr "تم رفض الطلب" #: pretix/api/webhooks.py:371 -#, fuzzy -#| msgid "Order denied" msgid "Order deleted" -msgstr "تم رفض الطلب" +msgstr "تم حذف الطلب" #: pretix/api/webhooks.py:375 msgid "Ticket checked in" -msgstr "تم تسجيل التذكرة" +msgstr "تم تسجيل دخول التذكرة" #: pretix/api/webhooks.py:379 msgid "Ticket check-in reverted" @@ -572,10 +582,8 @@ msgid "Event details changed" msgstr "تم تغيير تفاصيل الفعالية" #: pretix/api/webhooks.py:391 -#, fuzzy -#| msgid "Event date" msgid "Event deleted" -msgstr "تاريخ الفعالية" +msgstr "تم حذف الفعالية" #: pretix/api/webhooks.py:395 msgctxt "subevent" @@ -593,133 +601,132 @@ msgid "Event series date deleted" msgstr "تم حذف تاريخ سلسلة الفعاليات" #: pretix/api/webhooks.py:407 -#, fuzzy -#| msgid "Product name" msgid "Product changed" -msgstr "اسم المنتج" +msgstr "تم تغيير المنتج" #: pretix/api/webhooks.py:408 msgid "" "This includes product added or deleted and changes to nested objects like " "variations or bundles." msgstr "" +"يشمل ذلك المنتجات التي تمت إضافتها أو حذفها، والتغييرات التي طرأت على " +"الكائنات المتداخلة، مثل المتغيرات أو الحزم." #: pretix/api/webhooks.py:413 #, fuzzy -#| msgid "Shop not live" +#| msgid "Quota handling" +msgid "Quota changed" +msgstr "التعامل مع الحصص" + +#: pretix/api/webhooks.py:414 +msgid "" +"This includes related events like creation, deletion, opening or closing of " +"quotas. No webhook is sent for changes to the resulting availability." +msgstr "" + +#: pretix/api/webhooks.py:419 msgid "Shop taken live" -msgstr "تسوق لا يعيش" +msgstr "تم إطلاق المتجر" -#: pretix/api/webhooks.py:417 -#, fuzzy -#| msgid "The shop has been taken offline." +#: pretix/api/webhooks.py:423 msgid "Shop taken offline" -msgstr "وقد اتخذت المحل حاليا." +msgstr "تم إيقاف المتجر مؤقتاً" -#: pretix/api/webhooks.py:421 -#, fuzzy -#| msgid "The order has been reactivated." +#: pretix/api/webhooks.py:427 msgid "Test-Mode of shop has been activated" -msgstr "تم إعادة تنشيط الطلب." +msgstr "تم تفعيل وضع الاختبار للمتجر" -#: pretix/api/webhooks.py:425 -#, fuzzy -#| msgid "The order has been reactivated." +#: pretix/api/webhooks.py:431 msgid "Test-Mode of shop has been deactivated" -msgstr "تم إعادة تنشيط الطلب." +msgstr "تم إلغاء تفعيل وضع الاختبار للمتجر" -#: pretix/api/webhooks.py:429 -#, fuzzy -#| msgid "Waiting list entry" +#: pretix/api/webhooks.py:435 msgid "Waiting list entry added" -msgstr "دخول قائمة الانتظار" +msgstr "تم إضافة قيد إلى قائمة الانتظار" -#: pretix/api/webhooks.py:433 -#, fuzzy -#| msgid "Waiting list entry" +#: pretix/api/webhooks.py:439 msgid "Waiting list entry changed" -msgstr "دخول قائمة الانتظار" +msgstr "تم تغيير قيد قائمة الانتظار" -#: pretix/api/webhooks.py:437 -#, fuzzy -#| msgid "Waiting list entry" +#: pretix/api/webhooks.py:443 msgid "Waiting list entry deleted" -msgstr "دخول قائمة الانتظار" +msgstr "تم حذف قيد قائمة الانتظار" -#: pretix/api/webhooks.py:441 +#: pretix/api/webhooks.py:447 #, fuzzy #| msgid "Waiting list entries" msgid "Waiting list entry received voucher" msgstr "مدخلات قائمة الانتظار" -#: pretix/api/webhooks.py:445 +#: pretix/api/webhooks.py:451 #, fuzzy #| msgid "Voucher code" msgid "Voucher added" msgstr "رمز كود الخصم" -#: pretix/api/webhooks.py:449 +#: pretix/api/webhooks.py:455 #, fuzzy #| msgid "Voucher assigned" msgid "Voucher changed" msgstr "تم تعيين كود الخصم" -#: pretix/api/webhooks.py:450 +#: pretix/api/webhooks.py:456 msgid "" "Only includes explicit changes to the voucher, not e.g. an increase of the " "number of redemptions." msgstr "" -#: pretix/api/webhooks.py:454 +#: pretix/api/webhooks.py:460 #, fuzzy #| msgid "Voucher redeemed" msgid "Voucher deleted" msgstr "تم استخدام كود الخصم" -#: pretix/api/webhooks.py:458 +#: pretix/api/webhooks.py:464 #, fuzzy #| msgid "Customer actions" msgid "Customer account created" msgstr "إجراءات العملاء" -#: pretix/api/webhooks.py:462 +#: pretix/api/webhooks.py:468 #, fuzzy #| msgid "Customer actions" msgid "Customer account changed" msgstr "إجراءات العملاء" -#: pretix/api/webhooks.py:466 +#: pretix/api/webhooks.py:472 #, fuzzy #| msgid "This user has been anonymized." msgid "Customer account anonymized" msgstr "تم طمس هويتها لهذا المستخدم." -#: pretix/api/webhooks.py:470 +#: pretix/api/webhooks.py:476 #, fuzzy #| msgid "Gift card code" msgid "Gift card added" msgstr "رمز بطاقة الهدية" -#: pretix/api/webhooks.py:474 +#: pretix/api/webhooks.py:480 #, fuzzy #| msgid "Gift card code" msgid "Gift card modified" msgstr "رمز بطاقة الهدية" -#: pretix/api/webhooks.py:478 +#: pretix/api/webhooks.py:484 #, fuzzy #| msgid "Gift card redemptions" msgid "Gift card used in transaction" msgstr "استرداد بطاقة هدية" #: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103 -#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:1054 -#: pretix/base/forms/questions.py:1085 pretix/base/forms/questions.py:1337 -#: pretix/base/forms/questions.py:1373 pretix/base/payment.py:97 +#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:1074 +#: pretix/base/forms/questions.py:1105 pretix/base/forms/questions.py:1357 +#: pretix/base/forms/questions.py:1393 pretix/base/payment.py:97 #: pretix/control/forms/event.py:856 pretix/control/forms/event.py:862 #: pretix/control/forms/event.py:981 pretix/control/forms/event.py:1630 +#: pretix/control/forms/item.py:392 pretix/control/forms/item.py:394 #: pretix/control/forms/mailsetup.py:87 pretix/control/forms/mailsetup.py:129 -#: pretix/control/forms/subevents.py:181 +#: pretix/control/forms/subevents.py:191 #: pretix/plugins/banktransfer/payment.py:477 #: pretix/plugins/banktransfer/payment.py:483 #: pretix/presale/forms/customer.py:152 @@ -741,10 +748,10 @@ msgstr "{system} اسم المستخدم" #: pretix/base/auth.py:155 pretix/base/exporters/customers.py:70 #: pretix/base/exporters/orderlist.py:283 -#: pretix/base/exporters/orderlist.py:483 -#: pretix/base/exporters/orderlist.py:622 +#: pretix/base/exporters/orderlist.py:484 +#: pretix/base/exporters/orderlist.py:623 #: pretix/base/exporters/waitinglist.py:110 pretix/base/forms/auth.py:269 -#: pretix/base/invoicing/email.py:42 pretix/base/models/auth.py:269 +#: pretix/base/invoicing/email.py:42 pretix/base/models/auth.py:278 #: pretix/base/models/customers.py:102 pretix/base/models/notifications.py:46 #: pretix/base/models/orders.py:245 pretix/base/pdf.py:336 #: pretix/control/navigation.py:86 pretix/control/navigation.py:540 @@ -754,21 +761,21 @@ msgstr "{system} اسم المستخدم" #: pretix/control/templates/pretixcontrol/organizers/customer.html:50 #: pretix/control/templates/pretixcontrol/organizers/customers.html:63 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:164 -#: pretix/plugins/checkinlists/exporters.py:509 -#: pretix/presale/checkoutflow.py:1553 pretix/presale/forms/checkout.py:57 +#: pretix/plugins/checkinlists/exporters.py:508 +#: pretix/presale/checkoutflow.py:1574 pretix/presale/forms/checkout.py:54 #: pretix/presale/forms/customer.py:57 pretix/presale/forms/customer.py:142 -#: pretix/presale/forms/customer.py:298 pretix/presale/forms/customer.py:350 -#: pretix/presale/forms/customer.py:394 pretix/presale/forms/user.py:40 +#: pretix/presale/forms/customer.py:298 pretix/presale/forms/customer.py:351 +#: pretix/presale/forms/customer.py:395 pretix/presale/forms/user.py:40 #: pretix/presale/templates/pretixpresale/event/checkout_customer.html:31 #: pretix/presale/templates/pretixpresale/event/order.html:300 msgid "Email" msgstr "البريد الإلكتروني" #: pretix/base/auth.py:157 pretix/base/forms/auth.py:164 -#: pretix/base/forms/auth.py:225 pretix/base/models/auth.py:781 +#: pretix/base/forms/auth.py:225 pretix/base/models/auth.py:802 #: pretix/base/models/customers.py:104 pretix/control/forms/mailsetup.py:57 #: pretix/control/templates/pretixcontrol/user/settings.html:64 -#: pretix/presale/forms/customer.py:61 pretix/presale/forms/customer.py:302 +#: pretix/presale/forms/customer.py:61 pretix/presale/forms/customer.py:303 msgid "Password" msgstr "كلمة المرور" @@ -850,9 +857,9 @@ msgstr "تسجيل الفعالية الخاصة بك:{code}" #: pretix/base/customersso/oidc.py:206 pretix/base/customersso/oidc.py:214 #: pretix/base/customersso/oidc.py:237 pretix/base/customersso/oidc.py:254 -#: pretix/base/customersso/oidc.py:261 pretix/presale/views/customer.py:765 -#: pretix/presale/views/customer.py:775 pretix/presale/views/customer.py:814 -#: pretix/presale/views/customer.py:888 +#: pretix/base/customersso/oidc.py:261 pretix/presale/views/customer.py:767 +#: pretix/presale/views/customer.py:777 pretix/presale/views/customer.py:816 +#: pretix/presale/views/customer.py:890 #, python-brace-format msgid "Login was not successful. Error message: \"{error}\"." msgstr "" @@ -897,7 +904,7 @@ msgid "Attendee details" msgstr "البريد الإلكتروني للحاضر" #: pretix/base/datasync/sourcefields.py:130 pretix/base/exporters/answers.py:66 -#: pretix/base/models/items.py:1767 pretix/control/navigation.py:185 +#: pretix/base/models/items.py:1777 pretix/control/navigation.py:185 #: pretix/control/templates/pretixcontrol/items/questions.html:3 #: pretix/control/templates/pretixcontrol/items/questions.html:5 msgid "Questions" @@ -911,7 +918,7 @@ msgstr "اسم المنتج" #: pretix/base/datasync/sourcefields.py:132 #: pretix/control/templates/pretixcontrol/event/settings.html:279 -#: pretix/control/templates/pretixcontrol/order/index.html:176 +#: pretix/control/templates/pretixcontrol/order/index.html:209 #: pretix/presale/templates/pretixpresale/event/order.html:23 msgid "Order details" msgstr "تفاصيل الطلب" @@ -945,16 +952,16 @@ msgid "Event or date information" msgstr "إرسال معلومات الاسترداد" #: pretix/base/datasync/sourcefields.py:175 -#: pretix/base/exporters/orderlist.py:640 -#: pretix/base/exporters/orderlist.py:645 pretix/base/forms/questions.py:687 +#: pretix/base/exporters/orderlist.py:641 +#: pretix/base/exporters/orderlist.py:646 pretix/base/forms/questions.py:707 #: pretix/base/modelimport_orders.py:347 pretix/base/models/customers.py:344 -#: pretix/base/models/orders.py:1512 pretix/base/pdf.py:183 -#: pretix/control/forms/filter.py:684 pretix/control/forms/organizer.py:1154 -#: pretix/control/templates/pretixcontrol/order/index.html:571 +#: pretix/base/models/orders.py:1534 pretix/base/pdf.py:183 +#: pretix/control/forms/filter.py:684 pretix/control/forms/organizer.py:1164 +#: pretix/control/templates/pretixcontrol/order/index.html:606 #: pretix/control/templates/pretixcontrol/organizers/customer.html:123 -#: pretix/control/views/item.py:444 pretix/plugins/badges/exporters.py:495 -#: pretix/plugins/checkinlists/exporters.py:121 -#: pretix/plugins/checkinlists/exporters.py:495 +#: pretix/control/views/item.py:449 pretix/plugins/badges/exporters.py:503 +#: pretix/plugins/checkinlists/exporters.py:122 +#: pretix/plugins/checkinlists/exporters.py:494 #: pretix/plugins/ticketoutputpdf/exporters.py:94 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:162 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:165 @@ -973,11 +980,11 @@ msgid "Attendee" msgstr "اسم الحاضر" #: pretix/base/datasync/sourcefields.py:207 -#: pretix/base/exporters/orderlist.py:647 pretix/base/forms/questions.py:693 -#: pretix/base/models/customers.py:351 pretix/base/models/orders.py:1520 +#: pretix/base/exporters/orderlist.py:648 pretix/base/forms/questions.py:713 +#: pretix/base/models/customers.py:351 pretix/base/models/orders.py:1542 #: pretix/base/pdf.py:225 -#: pretix/control/templates/pretixcontrol/order/index.html:576 -#: pretix/control/views/item.py:456 +#: pretix/control/templates/pretixcontrol/order/index.html:611 +#: pretix/control/views/item.py:461 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:172 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:175 msgid "Attendee email" @@ -990,9 +997,9 @@ msgid "Attendee or order email" msgstr "البريد الإلكتروني للحاضر" #: pretix/base/datasync/sourcefields.py:232 -#: pretix/base/exporters/orderlist.py:648 pretix/base/pdf.py:188 -#: pretix/control/templates/pretixcontrol/order/index.html:600 -#: pretix/plugins/badges/exporters.py:496 +#: pretix/base/exporters/orderlist.py:649 pretix/base/pdf.py:188 +#: pretix/control/templates/pretixcontrol/order/index.html:635 +#: pretix/plugins/badges/exporters.py:504 #: pretix/plugins/ticketoutputpdf/exporters.py:95 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:182 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:185 @@ -1024,35 +1031,35 @@ msgid "Attendee address country" msgstr "عنوان الحاضر" #: pretix/base/datasync/sourcefields.py:279 -#: pretix/base/exporters/orderlist.py:690 pretix/base/pdf.py:346 +#: pretix/base/exporters/orderlist.py:691 pretix/base/pdf.py:346 msgid "Invoice address company" msgstr "شركة عنوان الفاتورة" #: pretix/base/datasync/sourcefields.py:288 -#: pretix/base/exporters/orderlist.py:494 -#: pretix/base/exporters/orderlist.py:499 -#: pretix/base/exporters/orderlist.py:691 -#: pretix/base/exporters/orderlist.py:695 pretix/base/pdf.py:341 +#: pretix/base/exporters/orderlist.py:495 +#: pretix/base/exporters/orderlist.py:500 +#: pretix/base/exporters/orderlist.py:692 +#: pretix/base/exporters/orderlist.py:696 pretix/base/pdf.py:341 msgid "Invoice address name" msgstr "اسم عنوان الفاتورة" #: pretix/base/datasync/sourcefields.py:317 -#: pretix/base/exporters/orderlist.py:697 pretix/base/pdf.py:351 +#: pretix/base/exporters/orderlist.py:698 pretix/base/pdf.py:351 msgid "Invoice address street" msgstr "شارع عنوان الفاتورة" #: pretix/base/datasync/sourcefields.py:326 -#: pretix/base/exporters/orderlist.py:697 pretix/base/pdf.py:356 +#: pretix/base/exporters/orderlist.py:698 pretix/base/pdf.py:356 msgid "Invoice address ZIP code" msgstr "الرمز البريدي لعنوان الفاتورة" #: pretix/base/datasync/sourcefields.py:335 -#: pretix/base/exporters/orderlist.py:697 pretix/base/pdf.py:361 +#: pretix/base/exporters/orderlist.py:698 pretix/base/pdf.py:361 msgid "Invoice address city" msgstr "مدينة عنوان الفاتورة" #: pretix/base/datasync/sourcefields.py:344 -#: pretix/base/exporters/orderlist.py:698 pretix/base/pdf.py:371 +#: pretix/base/exporters/orderlist.py:699 pretix/base/pdf.py:371 msgid "Invoice address country" msgstr "بلد عنوان الفاتورة" @@ -1071,13 +1078,13 @@ msgstr "اسم المنظم" #: pretix/base/datasync/sourcefields.py:371 #: pretix/base/exporters/invoices.py:203 pretix/base/exporters/invoices.py:332 #: pretix/base/exporters/orderlist.py:283 -#: pretix/base/exporters/orderlist.py:481 -#: pretix/base/exporters/orderlist.py:619 -#: pretix/base/exporters/orderlist.py:938 pretix/base/models/orders.py:209 +#: pretix/base/exporters/orderlist.py:482 +#: pretix/base/exporters/orderlist.py:620 +#: pretix/base/exporters/orderlist.py:939 pretix/base/models/orders.py:209 #: pretix/base/notifications.py:199 pretix/base/pdf.py:105 #: pretix/base/templates/pretixbase/email/order_details.html:61 #: pretix/control/templates/pretixcontrol/checkin/index.html:95 -#: pretix/control/templates/pretixcontrol/order/index.html:181 +#: pretix/control/templates/pretixcontrol/order/index.html:214 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:116 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:22 #: pretix/control/templates/pretixcontrol/orders/index.html:47 @@ -1085,12 +1092,13 @@ msgstr "اسم المنظم" #: pretix/control/templates/pretixcontrol/organizers/customer.html:211 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:41 #: pretix/control/templates/pretixcontrol/search/orders.html:48 -#: pretix/plugins/badges/exporters.py:497 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:213 +#: pretix/plugins/badges/exporters.py:505 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:29 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:41 -#: pretix/plugins/checkinlists/exporters.py:122 -#: pretix/plugins/checkinlists/exporters.py:494 -#: pretix/plugins/checkinlists/exporters.py:760 +#: pretix/plugins/checkinlists/exporters.py:123 +#: pretix/plugins/checkinlists/exporters.py:493 +#: pretix/plugins/checkinlists/exporters.py:759 #: pretix/plugins/reports/exporters.py:576 #: pretix/plugins/reports/exporters.py:900 #: pretix/plugins/ticketoutputpdf/exporters.py:96 @@ -1119,8 +1127,8 @@ msgid "Product and variation name" msgstr "اسم المنتج ونوعه" #: pretix/base/datasync/sourcefields.py:410 pretix/base/exporters/items.py:57 -#: pretix/base/exporters/orderlist.py:633 -#: pretix/base/exporters/orderlist.py:949 +#: pretix/base/exporters/orderlist.py:634 +#: pretix/base/exporters/orderlist.py:950 #: pretix/base/exporters/waitinglist.py:113 #, fuzzy #| msgid "Product" @@ -1141,11 +1149,11 @@ msgstr "اسم الحدث" #: pretix/base/datasync/sourcefields.py:437 pretix/base/exporters/events.py:57 #: pretix/base/exporters/orderlist.py:283 -#: pretix/base/exporters/orderlist.py:480 -#: pretix/base/exporters/orderlist.py:618 +#: pretix/base/exporters/orderlist.py:481 +#: pretix/base/exporters/orderlist.py:619 #: pretix/base/exporters/waitinglist.py:117 pretix/base/models/event.py:595 -#: pretix/base/pdf.py:235 pretix/control/forms/filter.py:1407 -#: pretix/control/forms/filter.py:1852 +#: pretix/base/pdf.py:235 pretix/control/forms/filter.py:1413 +#: pretix/control/forms/filter.py:1985 #: pretix/control/templates/pretixcontrol/events/index.html:69 #: pretix/control/templates/pretixcontrol/organizers/detail.html:65 msgid "Event name" @@ -1167,7 +1175,7 @@ msgstr "تاريخ إنتهاء الفعالية" #: pretix/control/templates/pretixcontrol/vouchers/index.html:18 #: pretix/control/templates/pretixcontrol/vouchers/index.html:114 #: pretix/control/views/vouchers.py:120 pretix/control/views/waitinglist.py:326 -#: pretix/plugins/checkinlists/exporters.py:521 +#: pretix/plugins/checkinlists/exporters.py:520 #: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:74 #: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:76 #: pretix/presale/templates/pretixpresale/event/fragment_voucher_form.html:12 @@ -1213,9 +1221,9 @@ msgstr "تاريخ ووقت الطباعة" #: pretix/base/datasync/sourcefields.py:527 #: pretix/base/exporters/orderlist.py:292 -#: pretix/base/exporters/orderlist.py:704 pretix/base/modelimport_orders.py:508 -#: pretix/control/templates/pretixcontrol/order/index.html:193 -#: pretix/control/templates/pretixcontrol/pdf/index.html:249 +#: pretix/base/exporters/orderlist.py:705 pretix/base/modelimport_orders.py:508 +#: pretix/control/templates/pretixcontrol/order/index.html:226 +#: pretix/control/templates/pretixcontrol/pdf/index.html:247 msgid "Order locale" msgstr "مكان الطلب" @@ -1251,25 +1259,25 @@ msgid "Question: {name}" msgstr "سؤال: %(name)s" #: pretix/base/datasync/sourcefields.py:604 -#: pretix/base/datasync/sourcefields.py:614 pretix/base/settings.py:3775 -#: pretix/base/settings.py:3788 pretix/base/settings.py:3804 -#: pretix/base/settings.py:3854 pretix/base/settings.py:3867 -#: pretix/base/settings.py:3881 pretix/base/settings.py:3934 -#: pretix/base/settings.py:3955 pretix/base/settings.py:3977 +#: pretix/base/datasync/sourcefields.py:614 pretix/base/settings.py:3794 +#: pretix/base/settings.py:3807 pretix/base/settings.py:3823 +#: pretix/base/settings.py:3873 pretix/base/settings.py:3886 +#: pretix/base/settings.py:3900 pretix/base/settings.py:3953 +#: pretix/base/settings.py:3974 pretix/base/settings.py:3996 msgid "Given name" msgstr "الاسم الاول" #: pretix/base/datasync/sourcefields.py:628 -#: pretix/base/datasync/sourcefields.py:638 pretix/base/settings.py:3776 -#: pretix/base/settings.py:3789 pretix/base/settings.py:3805 -#: pretix/base/settings.py:3821 pretix/base/settings.py:3838 -#: pretix/base/settings.py:3853 pretix/base/settings.py:3868 -#: pretix/base/settings.py:3882 pretix/base/settings.py:3935 -#: pretix/base/settings.py:3956 pretix/base/settings.py:3978 +#: pretix/base/datasync/sourcefields.py:638 pretix/base/settings.py:3795 +#: pretix/base/settings.py:3808 pretix/base/settings.py:3824 +#: pretix/base/settings.py:3840 pretix/base/settings.py:3857 +#: pretix/base/settings.py:3872 pretix/base/settings.py:3887 +#: pretix/base/settings.py:3901 pretix/base/settings.py:3954 +#: pretix/base/settings.py:3975 pretix/base/settings.py:3997 msgid "Family name" msgstr "اسم العائلة" -#: pretix/base/email.py:220 pretix/base/exporters/items.py:157 +#: pretix/base/email.py:225 pretix/base/exporters/items.py:157 #: pretix/base/exporters/items.py:205 pretix/base/models/tax.py:382 #: pretix/control/templates/pretixcontrol/event/tax.html:37 #: pretix/control/templates/pretixcontrol/event/tax.html:60 @@ -1283,31 +1291,31 @@ msgstr "اسم العائلة" msgid "Default" msgstr "افتراضي" -#: pretix/base/email.py:227 +#: pretix/base/email.py:232 msgid "Simple with logo" msgstr "بسيط مع الشعار" -#: pretix/base/exporter.py:217 pretix/base/exporter.py:350 +#: pretix/base/exporter.py:227 pretix/base/exporter.py:360 msgid "Export format" msgstr "طريقة التصدير" -#: pretix/base/exporter.py:219 +#: pretix/base/exporter.py:229 msgid "Excel (.xlsx)" msgstr "إكسل (.xlsx)" -#: pretix/base/exporter.py:220 pretix/base/exporter.py:342 +#: pretix/base/exporter.py:230 pretix/base/exporter.py:352 msgid "CSV (with commas)" msgstr "CSV (مع فواصل)" -#: pretix/base/exporter.py:221 pretix/base/exporter.py:343 +#: pretix/base/exporter.py:231 pretix/base/exporter.py:353 msgid "CSV (Excel-style)" msgstr "CSV (نمط إكسل)" -#: pretix/base/exporter.py:222 pretix/base/exporter.py:344 +#: pretix/base/exporter.py:232 pretix/base/exporter.py:354 msgid "CSV (with semicolons)" msgstr "CSV (مع فواصل منقوطة)" -#: pretix/base/exporter.py:338 +#: pretix/base/exporter.py:348 msgid "Combined Excel (.xlsx)" msgstr "إكسل مجمع (.xlsx)" @@ -1319,9 +1327,9 @@ msgstr "إجابات السؤال" #: pretix/base/exporters/answers.py:55 pretix/base/exporters/json.py:52 #: pretix/base/exporters/mail.py:53 pretix/base/exporters/orderlist.py:88 -#: pretix/base/exporters/orderlist.py:881 -#: pretix/base/exporters/orderlist.py:1061 -#: pretix/base/exporters/orderlist.py:1305 +#: pretix/base/exporters/orderlist.py:882 +#: pretix/base/exporters/orderlist.py:1062 +#: pretix/base/exporters/orderlist.py:1320 #: pretix/plugins/reports/exporters.py:493 #: pretix/plugins/reports/exporters.py:666 #, fuzzy @@ -1336,29 +1344,29 @@ msgid "" "customers while creating an order." msgstr "" -#: pretix/base/exporters/answers.py:76 pretix/base/exporters/orderlist.py:628 -#: pretix/base/exporters/orderlist.py:957 -#: pretix/base/exporters/orderlist.py:1198 pretix/base/models/checkin.py:58 -#: pretix/base/models/items.py:2067 pretix/base/models/orders.py:1490 -#: pretix/base/models/orders.py:3046 pretix/base/models/vouchers.py:190 +#: pretix/base/exporters/answers.py:76 pretix/base/exporters/orderlist.py:629 +#: pretix/base/exporters/orderlist.py:958 +#: pretix/base/exporters/orderlist.py:1213 pretix/base/models/checkin.py:58 +#: pretix/base/models/items.py:2077 pretix/base/models/orders.py:1512 +#: pretix/base/models/orders.py:3068 pretix/base/models/vouchers.py:190 #: pretix/base/models/waitinglist.py:61 pretix/control/forms/event.py:1798 #: pretix/control/forms/filter.py:446 pretix/control/forms/filter.py:1254 -#: pretix/control/forms/filter.py:2056 pretix/control/forms/filter.py:2278 -#: pretix/control/forms/filter.py:2393 pretix/control/forms/filter.py:2475 -#: pretix/control/forms/filter.py:2692 pretix/control/forms/orders.py:360 -#: pretix/control/forms/orders.py:849 +#: pretix/control/forms/filter.py:1547 pretix/control/forms/filter.py:2189 +#: pretix/control/forms/filter.py:2411 pretix/control/forms/filter.py:2526 +#: pretix/control/forms/filter.py:2608 pretix/control/forms/filter.py:2825 +#: pretix/control/forms/orders.py:364 pretix/control/forms/orders.py:857 #: pretix/control/templates/pretixcontrol/checkin/lists.html:108 -#: pretix/control/templates/pretixcontrol/items/quotas.html:55 +#: pretix/control/templates/pretixcontrol/items/quotas.html:99 #: pretix/control/templates/pretixcontrol/order/change.html:108 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:43 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:8 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:7 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:12 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:7 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:12 #: pretix/control/templates/pretixcontrol/vouchers/index.html:140 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:170 #: pretix/control/views/waitinglist.py:330 -#: pretix/plugins/checkinlists/exporters.py:513 -#: pretix/plugins/checkinlists/exporters.py:703 +#: pretix/plugins/checkinlists/exporters.py:512 +#: pretix/plugins/checkinlists/exporters.py:702 #: pretix/plugins/sendmail/forms.py:137 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:32 #: pretix/presale/templates/pretixpresale/event/checkout_membership.html:48 @@ -1372,12 +1380,13 @@ msgstr "تاريخ" #: pretix/control/forms/checkin.py:83 pretix/control/forms/event.py:1799 #: pretix/control/forms/filter.py:449 pretix/control/forms/filter.py:476 #: pretix/control/forms/filter.py:1253 pretix/control/forms/filter.py:1287 -#: pretix/control/forms/filter.py:2059 pretix/control/forms/filter.py:2092 -#: pretix/control/forms/filter.py:2281 pretix/control/forms/filter.py:2301 -#: pretix/control/forms/filter.py:2396 pretix/control/forms/filter.py:2412 -#: pretix/control/forms/filter.py:2478 pretix/control/forms/filter.py:2513 -#: pretix/control/forms/filter.py:2695 pretix/control/forms/filter.py:2710 -#: pretix/control/forms/orders.py:851 pretix/control/forms/orders.py:1013 +#: pretix/control/forms/filter.py:1550 pretix/control/forms/filter.py:1610 +#: pretix/control/forms/filter.py:2192 pretix/control/forms/filter.py:2225 +#: pretix/control/forms/filter.py:2414 pretix/control/forms/filter.py:2434 +#: pretix/control/forms/filter.py:2529 pretix/control/forms/filter.py:2545 +#: pretix/control/forms/filter.py:2611 pretix/control/forms/filter.py:2646 +#: pretix/control/forms/filter.py:2828 pretix/control/forms/filter.py:2843 +#: pretix/control/forms/orders.py:859 pretix/control/forms/orders.py:1021 #: pretix/control/templates/pretixcontrol/event/fragment_subevent_choice_simple.html:5 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:69 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:132 @@ -1431,26 +1440,26 @@ msgid "External identifier" msgstr "معرف داخلي" #: pretix/base/exporters/customers.py:71 pretix/base/exporters/orderlist.py:284 -#: pretix/base/exporters/orderlist.py:484 -#: pretix/base/exporters/orderlist.py:623 +#: pretix/base/exporters/orderlist.py:485 +#: pretix/base/exporters/orderlist.py:624 #: pretix/base/exporters/waitinglist.py:111 #: pretix/base/modelimport_orders.py:87 pretix/base/models/customers.py:103 -#: pretix/base/models/customers.py:440 pretix/base/models/items.py:1659 +#: pretix/base/models/customers.py:440 pretix/base/models/items.py:1669 #: pretix/base/models/orders.py:249 pretix/base/models/waitinglist.py:80 #: pretix/base/pdf.py:331 -#: pretix/control/templates/pretixcontrol/order/index.html:257 +#: pretix/control/templates/pretixcontrol/order/index.html:290 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:166 #: pretix/control/views/waitinglist.py:326 -#: pretix/plugins/checkinlists/exporters.py:510 -#: pretix/presale/checkoutflow.py:1559 pretix/presale/forms/checkout.py:84 +#: pretix/plugins/checkinlists/exporters.py:509 +#: pretix/presale/checkoutflow.py:1580 pretix/presale/forms/checkout.py:81 #: pretix/presale/forms/waitinglist.py:80 #: pretix/presale/templates/pretixpresale/event/order.html:304 msgid "Phone number" msgstr "رقم الجوال" -#: pretix/base/exporters/customers.py:72 pretix/base/models/auth.py:272 -#: pretix/base/models/customers.py:105 pretix/base/models/orders.py:3349 -#: pretix/base/settings.py:3908 pretix/base/settings.py:3920 +#: pretix/base/exporters/customers.py:72 pretix/base/models/auth.py:281 +#: pretix/base/models/customers.py:105 pretix/base/models/orders.py:3371 +#: pretix/base/settings.py:3927 pretix/base/settings.py:3939 #: pretix/control/templates/pretixcontrol/users/index.html:47 msgid "Full name" msgstr "الاسم الكامل" @@ -1458,23 +1467,23 @@ msgstr "الاسم الكامل" #: pretix/base/exporters/customers.py:77 pretix/base/exporters/invoices.py:208 #: pretix/base/exporters/invoices.py:217 pretix/base/exporters/invoices.py:336 #: pretix/base/exporters/invoices.py:344 pretix/base/exporters/orderlist.py:284 -#: pretix/base/exporters/waitinglist.py:109 pretix/base/forms/questions.py:1252 +#: pretix/base/exporters/waitinglist.py:109 pretix/base/forms/questions.py:1272 #: pretix/base/models/devices.py:68 pretix/base/models/devices.py:130 -#: pretix/base/models/event.py:1556 pretix/base/models/event.py:1794 -#: pretix/base/models/items.py:2071 pretix/base/models/items.py:2244 +#: pretix/base/models/event.py:1573 pretix/base/models/event.py:1811 +#: pretix/base/models/items.py:2081 pretix/base/models/items.py:2254 #: pretix/base/models/memberships.py:41 pretix/base/models/organizer.py:82 -#: pretix/base/models/organizer.py:639 pretix/base/models/seating.py:86 -#: pretix/base/models/waitinglist.py:69 pretix/base/settings.py:3533 -#: pretix/base/settings.py:3543 pretix/base/settings.py:3897 -#: pretix/control/forms/filter.py:661 pretix/control/forms/item.py:447 -#: pretix/control/forms/organizer.py:1085 +#: pretix/base/models/organizer.py:646 pretix/base/models/seating.py:86 +#: pretix/base/models/waitinglist.py:69 pretix/base/settings.py:3548 +#: pretix/base/settings.py:3558 pretix/base/settings.py:3916 +#: pretix/control/forms/filter.py:661 pretix/control/forms/item.py:502 +#: pretix/control/forms/organizer.py:1095 #: pretix/control/forms/waitinglist.py:84 #: pretix/control/templates/pretixcontrol/checkin/index.html:109 #: pretix/control/templates/pretixcontrol/checkin/lists.html:99 #: pretix/control/templates/pretixcontrol/event/tax.html:36 #: pretix/control/templates/pretixcontrol/oauth/app_list.html:12 #: pretix/control/templates/pretixcontrol/oauth/authorized.html:17 -#: pretix/control/templates/pretixcontrol/order/index.html:1030 +#: pretix/control/templates/pretixcontrol/order/index.html:1065 #: pretix/control/templates/pretixcontrol/organizers/customer.html:59 #: pretix/control/templates/pretixcontrol/organizers/customers.html:66 #: pretix/control/templates/pretixcontrol/organizers/devices.html:81 @@ -1482,16 +1491,18 @@ msgstr "الاسم الكامل" #: pretix/control/templates/pretixcontrol/organizers/ssoclients.html:20 #: pretix/control/templates/pretixcontrol/organizers/ssoproviders.html:20 #: pretix/control/templates/pretixcontrol/organizers/team_members.html:100 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:27 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:136 #: pretix/control/templates/pretixcontrol/subevents/index.html:97 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:162 #: pretix/control/views/waitinglist.py:326 pretix/plugins/badges/models.py:53 #: pretix/plugins/badges/templates/pretixplugins/badges/index.html:34 -#: pretix/plugins/checkinlists/exporters.py:376 -#: pretix/plugins/checkinlists/exporters.py:764 +#: pretix/plugins/checkinlists/exporters.py:375 +#: pretix/plugins/checkinlists/exporters.py:763 #: pretix/plugins/reports/exporters.py:901 #: pretix/plugins/ticketoutputpdf/models.py:333 #: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/index.html:32 -#: pretix/presale/forms/customer.py:179 pretix/presale/forms/customer.py:496 +#: pretix/presale/forms/customer.py:179 pretix/presale/forms/customer.py:497 #: pretix/presale/forms/waitinglist.py:68 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:86 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:142 @@ -1504,7 +1515,7 @@ msgstr "اسم" msgid "Account active" msgstr "حساب نشط" -#: pretix/base/exporters/customers.py:81 pretix/base/models/auth.py:270 +#: pretix/base/exporters/customers.py:81 pretix/base/models/auth.py:279 #: pretix/base/models/customers.py:108 msgid "Verified email address" msgstr "تم التحقق من عنوان البريد الإلكتروني" @@ -1520,7 +1531,7 @@ msgid "Registration date" msgstr "تاريخ التسجيل" #: pretix/base/exporters/customers.py:84 pretix/base/exporters/invoices.py:207 -#: pretix/base/exporters/waitinglist.py:121 pretix/base/models/auth.py:284 +#: pretix/base/exporters/waitinglist.py:121 pretix/base/models/auth.py:293 #: pretix/base/models/customers.py:114 pretix/base/models/exports.py:54 #: pretix/control/forms/event.py:1804 pretix/control/forms/exports.py:49 #: pretix/control/forms/exports.py:88 pretix/control/views/waitinglist.py:327 @@ -1528,10 +1539,10 @@ msgid "Language" msgstr "اللغة" #: pretix/base/exporters/customers.py:85 -#: pretix/base/exporters/reusablemedia.py:58 -#: pretix/base/models/customers.py:117 pretix/base/models/media.py:110 +#: pretix/base/exporters/reusablemedia.py:61 +#: pretix/base/models/customers.py:117 pretix/base/models/media.py:122 #: pretix/control/templates/pretixcontrol/organizers/customer.html:73 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:75 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:87 msgid "Notes" msgstr "" @@ -1552,51 +1563,51 @@ msgstr "" #: pretix/base/exporters/items.py:213 pretix/base/exporters/items.py:214 #: pretix/base/exporters/items.py:215 pretix/base/exporters/items.py:218 #: pretix/base/exporters/items.py:221 pretix/base/exporters/items.py:222 -#: pretix/base/exporters/items.py:223 pretix/base/exporters/orderlist.py:417 -#: pretix/base/exporters/orderlist.py:422 -#: pretix/base/exporters/orderlist.py:792 -#: pretix/base/exporters/orderlist.py:815 -#: pretix/base/exporters/orderlist.py:847 -#: pretix/base/exporters/orderlist.py:1449 -#: pretix/base/exporters/reusablemedia.py:68 -#: pretix/base/invoicing/transmission.py:119 pretix/base/modelimport.py:208 -#: pretix/base/modelimport.py:215 pretix/base/models/orders.py:1391 +#: pretix/base/exporters/items.py:223 pretix/base/exporters/orderlist.py:419 +#: pretix/base/exporters/orderlist.py:424 +#: pretix/base/exporters/orderlist.py:793 +#: pretix/base/exporters/orderlist.py:816 +#: pretix/base/exporters/orderlist.py:848 +#: pretix/base/exporters/orderlist.py:1464 +#: pretix/base/exporters/reusablemedia.py:77 +#: pretix/base/invoicing/transmission.py:119 pretix/base/modelimport.py:212 +#: pretix/base/modelimport.py:219 pretix/base/models/orders.py:1413 #: pretix/control/forms/filter.py:182 pretix/control/forms/filter.py:556 -#: pretix/control/forms/filter.py:743 pretix/control/forms/item.py:618 -#: pretix/control/forms/subevents.py:119 pretix/control/views/item.py:715 +#: pretix/control/forms/filter.py:743 pretix/control/forms/item.py:673 +#: pretix/control/forms/subevents.py:129 pretix/control/views/item.py:720 #: pretix/control/views/vouchers.py:140 pretix/control/views/vouchers.py:141 -#: pretix/plugins/checkinlists/exporters.py:602 -#: pretix/plugins/checkinlists/exporters.py:605 -#: pretix/plugins/checkinlists/exporters.py:632 -#: pretix/plugins/checkinlists/exporters.py:648 -#: pretix/plugins/checkinlists/exporters.py:718 +#: pretix/plugins/checkinlists/exporters.py:601 +#: pretix/plugins/checkinlists/exporters.py:604 +#: pretix/plugins/checkinlists/exporters.py:631 +#: pretix/plugins/checkinlists/exporters.py:647 +#: pretix/plugins/checkinlists/exporters.py:717 +#: pretix/plugins/checkinlists/exporters.py:825 #: pretix/plugins/checkinlists/exporters.py:826 #: pretix/plugins/checkinlists/exporters.py:827 -#: pretix/plugins/checkinlists/exporters.py:828 msgid "Yes" msgstr "نعم" #: pretix/base/exporters/customers.py:103 #: pretix/base/exporters/customers.py:104 pretix/base/exporters/events.py:83 -#: pretix/base/exporters/invoices.py:309 pretix/base/exporters/orderlist.py:417 -#: pretix/base/exporters/orderlist.py:422 -#: pretix/base/exporters/orderlist.py:815 -#: pretix/base/exporters/orderlist.py:847 -#: pretix/base/exporters/orderlist.py:1449 -#: pretix/base/exporters/reusablemedia.py:68 -#: pretix/base/invoicing/transmission.py:121 pretix/base/modelimport.py:207 -#: pretix/base/modelimport.py:217 pretix/base/models/orders.py:1393 +#: pretix/base/exporters/invoices.py:309 pretix/base/exporters/orderlist.py:419 +#: pretix/base/exporters/orderlist.py:424 +#: pretix/base/exporters/orderlist.py:816 +#: pretix/base/exporters/orderlist.py:848 +#: pretix/base/exporters/orderlist.py:1464 +#: pretix/base/exporters/reusablemedia.py:77 +#: pretix/base/invoicing/transmission.py:121 pretix/base/modelimport.py:211 +#: pretix/base/modelimport.py:221 pretix/base/models/orders.py:1415 #: pretix/control/forms/filter.py:182 pretix/control/forms/filter.py:557 -#: pretix/control/forms/filter.py:744 pretix/control/forms/item.py:619 -#: pretix/control/forms/subevents.py:120 pretix/control/views/item.py:715 +#: pretix/control/forms/filter.py:744 pretix/control/forms/item.py:674 +#: pretix/control/forms/subevents.py:130 pretix/control/views/item.py:720 #: pretix/control/views/vouchers.py:140 pretix/control/views/vouchers.py:141 -#: pretix/plugins/checkinlists/exporters.py:602 -#: pretix/plugins/checkinlists/exporters.py:605 -#: pretix/plugins/checkinlists/exporters.py:632 -#: pretix/plugins/checkinlists/exporters.py:718 +#: pretix/plugins/checkinlists/exporters.py:601 +#: pretix/plugins/checkinlists/exporters.py:604 +#: pretix/plugins/checkinlists/exporters.py:631 +#: pretix/plugins/checkinlists/exporters.py:717 +#: pretix/plugins/checkinlists/exporters.py:825 #: pretix/plugins/checkinlists/exporters.py:826 #: pretix/plugins/checkinlists/exporters.py:827 -#: pretix/plugins/checkinlists/exporters.py:828 msgid "No" msgstr "لا" @@ -1620,10 +1631,10 @@ msgstr "تذكرة الفعالية {event}-{code}" #: pretix/base/exporters/dekodi.py:234 pretix/base/exporters/invoices.py:74 #: pretix/base/exporters/orderlist.py:130 -#: pretix/base/exporters/orderlist.py:896 -#: pretix/base/exporters/orderlist.py:1255 -#: pretix/plugins/checkinlists/exporters.py:89 -#: pretix/plugins/checkinlists/exporters.py:868 +#: pretix/base/exporters/orderlist.py:897 +#: pretix/base/exporters/orderlist.py:1270 +#: pretix/plugins/checkinlists/exporters.py:90 +#: pretix/plugins/checkinlists/exporters.py:867 #: pretix/plugins/reports/accountingreport.py:75 #: pretix/plugins/reports/exporters.py:472 #: pretix/plugins/reports/exporters.py:714 @@ -1678,71 +1689,79 @@ msgstr "المتجر نشط" msgid "Event currency" msgstr "عملة الفعالية" -#: pretix/base/exporters/events.py:61 pretix/base/models/auth.py:287 +#: pretix/base/exporters/events.py:61 pretix/base/models/auth.py:296 #: pretix/base/models/exports.py:133 pretix/control/forms/exports.py:93 msgid "Timezone" msgstr "المنطقة الزمنية" #: pretix/base/exporters/events.py:62 pretix/base/models/event.py:618 -#: pretix/base/models/event.py:1558 pretix/base/settings.py:3531 -#: pretix/base/settings.py:3541 pretix/control/forms/subevents.py:484 +#: pretix/base/models/event.py:1575 pretix/base/settings.py:3546 +#: pretix/base/settings.py:3556 pretix/control/forms/subevents.py:494 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:268 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:43 msgid "Event start time" msgstr "وقت بداية الفعالية" #: pretix/base/exporters/events.py:63 pretix/base/models/event.py:620 -#: pretix/base/models/event.py:1560 pretix/base/pdf.py:297 -#: pretix/control/forms/subevents.py:489 +#: pretix/base/models/event.py:1577 pretix/base/pdf.py:297 +#: pretix/control/forms/subevents.py:499 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:270 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:45 msgid "Event end time" msgstr "وقت نهاية الفعالية" #: pretix/base/exporters/events.py:64 pretix/base/models/event.py:622 -#: pretix/base/models/event.py:1562 pretix/control/forms/subevents.py:494 +#: pretix/base/models/event.py:1579 pretix/control/forms/subevents.py:504 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:274 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:48 msgid "Admission time" msgstr "وقت قبول التسجيل" #: pretix/base/exporters/events.py:65 pretix/base/models/event.py:634 -#: pretix/base/models/event.py:1571 pretix/control/forms/subevents.py:93 +#: pretix/base/models/event.py:1588 pretix/control/forms/subevents.py:93 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:52 msgid "Start of presale" msgstr "بداية عرض ما قبل البيع" #: pretix/base/exporters/events.py:66 pretix/base/models/event.py:628 -#: pretix/base/models/event.py:1565 pretix/control/forms/subevents.py:99 +#: pretix/base/models/event.py:1582 pretix/control/forms/subevents.py:99 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:56 msgid "End of presale" msgstr "نهاية عرض ما قبل البيع" #: pretix/base/exporters/events.py:67 pretix/base/exporters/invoices.py:355 -#: pretix/base/models/event.py:640 pretix/base/models/event.py:1577 +#: pretix/base/models/event.py:640 pretix/base/models/event.py:1594 +#: pretix/base/models/items.py:2328 #: pretix/base/templates/pretixbase/email/order_details.html:83 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:60 msgid "Location" msgstr "الموقع" #: pretix/base/exporters/events.py:68 pretix/base/models/event.py:648 -#: pretix/base/models/event.py:1580 +#: pretix/base/models/event.py:1597 #: pretix/control/templates/pretixcontrol/event/fragment_geodata.html:18 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:54 msgid "Latitude" msgstr "خط العرض" #: pretix/base/exporters/events.py:69 pretix/base/models/event.py:656 -#: pretix/base/models/event.py:1588 +#: pretix/base/models/event.py:1605 #: pretix/control/templates/pretixcontrol/event/fragment_geodata.html:28 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:64 msgid "Longitude" msgstr "خط الطول" #: pretix/base/exporters/events.py:70 pretix/base/models/event.py:668 -#: pretix/base/models/event.py:1603 +#: pretix/base/models/event.py:1620 #: pretix/control/templates/pretixcontrol/event/index.html:137 -#: pretix/control/templates/pretixcontrol/order/index.html:1080 +#: pretix/control/templates/pretixcontrol/order/index.html:1115 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:70 msgid "Internal comment" msgstr "ملاحظة داخلية" -#: pretix/base/exporters/invoices.py:82 pretix/base/models/orders.py:1761 -#: pretix/base/models/orders.py:2185 pretix/control/forms/filter.py:214 -#: pretix/control/forms/filter.py:1060 pretix/control/forms/filter.py:2433 +#: pretix/base/exporters/invoices.py:82 pretix/base/models/orders.py:1783 +#: pretix/base/models/orders.py:2207 pretix/control/forms/filter.py:214 +#: pretix/control/forms/filter.py:1060 pretix/control/forms/filter.py:2566 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:9 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:14 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:44 @@ -1757,7 +1776,7 @@ msgstr "مقدم خدمة السداد" #: pretix/base/exporters/invoices.py:84 pretix/base/exporters/invoices.py:86 #: pretix/control/forms/filter.py:216 pretix/control/forms/filter.py:1062 -#: pretix/control/forms/filter.py:2435 +#: pretix/control/forms/filter.py:2568 msgid "All payment providers" msgstr "جميع مزودي خدمات السداد" @@ -1791,9 +1810,9 @@ msgid "" msgstr "" #: pretix/base/exporters/invoices.py:193 pretix/base/shredder.py:583 -#: pretix/control/templates/pretixcontrol/order/index.html:268 -#: pretix/control/templates/pretixcontrol/order/index.html:386 -#: pretix/control/templates/pretixcontrol/organizers/edit.html:313 +#: pretix/control/templates/pretixcontrol/order/index.html:301 +#: pretix/control/templates/pretixcontrol/order/index.html:419 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:314 #: pretix/presale/templates/pretixpresale/event/order.html:236 #: pretix/presale/templates/pretixpresale/event/order.html:257 msgid "Invoices" @@ -1808,11 +1827,11 @@ msgid "Invoice number" msgstr "رقم الفاتورة" #: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:331 -#: pretix/base/exporters/orderlist.py:1278 -#: pretix/base/exporters/orderlist.py:1324 +#: pretix/base/exporters/orderlist.py:1293 +#: pretix/base/exporters/orderlist.py:1339 #: pretix/base/exporters/waitinglist.py:108 pretix/base/forms/widgets.py:222 -#: pretix/base/models/items.py:1655 pretix/base/models/orders.py:258 -#: pretix/base/models/orders.py:3021 pretix/base/models/orders.py:3160 +#: pretix/base/models/items.py:1665 pretix/base/models/orders.py:258 +#: pretix/base/models/orders.py:3043 pretix/base/models/orders.py:3182 #: pretix/base/templates/pretixbase/email/order_details.html:70 #: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:25 #: pretix/control/templates/pretixcontrol/order/transactions.html:19 @@ -1820,7 +1839,7 @@ msgstr "رقم الفاتورة" #: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html:65 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:17 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:11 -#: pretix/plugins/checkinlists/exporters.py:756 +#: pretix/plugins/checkinlists/exporters.py:755 #: pretix/presale/templates/pretixpresale/event/fragment_giftcard_history.html:6 #: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:58 msgid "Date" @@ -1856,14 +1875,14 @@ msgstr "مرسل الفاتورة:" #: pretix/base/exporters/invoices.py:209 pretix/base/exporters/invoices.py:337 #: pretix/base/exporters/orderlist.py:291 -#: pretix/base/exporters/orderlist.py:501 -#: pretix/base/exporters/orderlist.py:649 pretix/base/forms/questions.py:712 +#: pretix/base/exporters/orderlist.py:502 +#: pretix/base/exporters/orderlist.py:650 pretix/base/forms/questions.py:732 #: pretix/base/modelimport_orders.py:232 pretix/base/modelimport_orders.py:386 -#: pretix/base/models/customers.py:355 pretix/base/models/orders.py:1547 -#: pretix/base/models/orders.py:3351 pretix/control/forms/filter.py:665 +#: pretix/base/models/customers.py:355 pretix/base/models/orders.py:1569 +#: pretix/base/models/orders.py:3373 pretix/control/forms/filter.py:665 #: pretix/control/forms/filter.py:696 -#: pretix/control/templates/pretixcontrol/order/index.html:1032 -#: pretix/plugins/checkinlists/exporters.py:536 +#: pretix/control/templates/pretixcontrol/order/index.html:1067 +#: pretix/plugins/checkinlists/exporters.py:535 #: pretix/plugins/reports/exporters.py:856 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:88 #: pretix/presale/templates/pretixpresale/event/order.html:316 @@ -1873,14 +1892,14 @@ msgstr "العنوان" #: pretix/base/exporters/invoices.py:210 pretix/base/exporters/invoices.py:219 #: pretix/base/exporters/invoices.py:338 pretix/base/exporters/invoices.py:346 #: pretix/base/exporters/orderlist.py:291 -#: pretix/base/exporters/orderlist.py:501 -#: pretix/base/exporters/orderlist.py:650 pretix/base/forms/questions.py:723 +#: pretix/base/exporters/orderlist.py:502 +#: pretix/base/exporters/orderlist.py:651 pretix/base/forms/questions.py:743 #: pretix/base/modelimport_orders.py:244 pretix/base/modelimport_orders.py:397 -#: pretix/base/models/customers.py:356 pretix/base/models/orders.py:1548 -#: pretix/base/models/orders.py:3352 pretix/base/settings.py:1321 +#: pretix/base/models/customers.py:356 pretix/base/models/orders.py:1570 +#: pretix/base/models/orders.py:3374 pretix/base/settings.py:1336 #: pretix/control/forms/filter.py:669 pretix/control/forms/filter.py:700 -#: pretix/control/views/item.py:490 -#: pretix/plugins/checkinlists/exporters.py:537 +#: pretix/control/views/item.py:495 +#: pretix/plugins/checkinlists/exporters.py:536 #: pretix/plugins/reports/exporters.py:857 msgid "ZIP code" msgstr "الرمز البريدي" @@ -1888,28 +1907,29 @@ msgstr "الرمز البريدي" #: pretix/base/exporters/invoices.py:211 pretix/base/exporters/invoices.py:220 #: pretix/base/exporters/invoices.py:339 pretix/base/exporters/invoices.py:347 #: pretix/base/exporters/orderlist.py:291 -#: pretix/base/exporters/orderlist.py:501 -#: pretix/base/exporters/orderlist.py:651 pretix/base/forms/questions.py:731 +#: pretix/base/exporters/orderlist.py:502 +#: pretix/base/exporters/orderlist.py:652 pretix/base/forms/questions.py:751 #: pretix/base/modelimport_orders.py:256 pretix/base/modelimport_orders.py:408 -#: pretix/base/models/customers.py:357 pretix/base/models/orders.py:1549 -#: pretix/base/models/orders.py:3353 pretix/base/settings.py:1335 +#: pretix/base/models/customers.py:357 pretix/base/models/orders.py:1571 +#: pretix/base/models/orders.py:3375 pretix/base/settings.py:1350 #: pretix/control/forms/filter.py:674 pretix/control/forms/filter.py:705 -#: pretix/control/views/item.py:500 -#: pretix/plugins/checkinlists/exporters.py:538 +#: pretix/control/views/item.py:505 +#: pretix/plugins/checkinlists/exporters.py:537 #: pretix/plugins/reports/exporters.py:858 msgid "City" msgstr "المدينة" #: pretix/base/exporters/invoices.py:212 pretix/base/exporters/invoices.py:222 #: pretix/base/exporters/invoices.py:349 pretix/base/exporters/orderlist.py:291 -#: pretix/base/exporters/orderlist.py:501 -#: pretix/base/exporters/orderlist.py:653 pretix/base/forms/questions.py:768 -#: pretix/base/forms/questions.py:1202 pretix/base/modelimport_orders.py:295 -#: pretix/base/models/customers.py:359 pretix/base/models/orders.py:1551 -#: pretix/base/models/orders.py:3357 pretix/base/settings.py:1349 -#: pretix/base/views/js_helpers.py:72 pretix/control/forms/event.py:1098 -#: pretix/control/templates/pretixcontrol/order/index.html:1039 -#: pretix/plugins/checkinlists/exporters.py:540 +#: pretix/base/exporters/orderlist.py:502 +#: pretix/base/exporters/orderlist.py:654 pretix/base/forms/questions.py:788 +#: pretix/base/forms/questions.py:1222 pretix/base/modelimport_orders.py:295 +#: pretix/base/modelimport_orders.py:445 pretix/base/models/customers.py:359 +#: pretix/base/models/orders.py:1573 pretix/base/models/orders.py:3379 +#: pretix/base/settings.py:1364 pretix/base/views/js_helpers.py:72 +#: pretix/control/forms/event.py:1098 +#: pretix/control/templates/pretixcontrol/order/index.html:1074 +#: pretix/plugins/checkinlists/exporters.py:539 #: pretix/plugins/reports/exporters.py:859 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:95 #: pretix/presale/templates/pretixpresale/event/order.html:323 @@ -1920,16 +1940,16 @@ msgstr "المنطقة" #: pretix/base/exporters/invoices.py:213 pretix/base/exporters/invoices.py:221 #: pretix/base/exporters/invoices.py:340 pretix/base/exporters/invoices.py:348 #: pretix/base/exporters/orderlist.py:291 -#: pretix/base/exporters/orderlist.py:501 -#: pretix/base/exporters/orderlist.py:652 pretix/base/forms/questions.py:743 +#: pretix/base/exporters/orderlist.py:502 +#: pretix/base/exporters/orderlist.py:653 pretix/base/forms/questions.py:763 #: pretix/base/modelimport_orders.py:274 pretix/base/modelimport_orders.py:425 -#: pretix/base/models/customers.py:358 pretix/base/models/orders.py:1550 -#: pretix/base/models/orders.py:3354 pretix/base/models/orders.py:3355 -#: pretix/base/settings.py:1361 pretix/control/forms/filter.py:679 +#: pretix/base/models/customers.py:358 pretix/base/models/orders.py:1572 +#: pretix/base/models/orders.py:3376 pretix/base/models/orders.py:3377 +#: pretix/base/settings.py:1376 pretix/control/forms/filter.py:679 #: pretix/control/forms/filter.py:710 -#: pretix/control/templates/pretixcontrol/order/index.html:1036 -#: pretix/control/views/item.py:510 -#: pretix/plugins/checkinlists/exporters.py:539 +#: pretix/control/templates/pretixcontrol/order/index.html:1071 +#: pretix/control/views/item.py:515 +#: pretix/plugins/checkinlists/exporters.py:538 #: pretix/plugins/reports/exporters.py:808 #: pretix/plugins/reports/exporters.py:853 #: pretix/plugins/reports/exporters.py:902 @@ -1945,10 +1965,10 @@ msgstr "الرقم الضريبي" #: pretix/base/exporters/invoices.py:215 pretix/base/exporters/invoices.py:223 #: pretix/base/exporters/invoices.py:342 pretix/base/exporters/invoices.py:350 #: pretix/base/exporters/orderlist.py:292 -#: pretix/base/exporters/orderlist.py:501 -#: pretix/base/exporters/orderlist.py:700 pretix/base/modelimport_orders.py:321 -#: pretix/base/models/orders.py:3358 pretix/base/views/js_helpers.py:77 -#: pretix/control/templates/pretixcontrol/order/index.html:1043 +#: pretix/base/exporters/orderlist.py:502 +#: pretix/base/exporters/orderlist.py:701 pretix/base/modelimport_orders.py:321 +#: pretix/base/models/orders.py:3380 pretix/base/views/js_helpers.py:77 +#: pretix/control/templates/pretixcontrol/order/index.html:1078 #: pretix/plugins/reports/exporters.py:860 #: pretix/plugins/reports/exporters.py:902 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:99 @@ -1971,12 +1991,12 @@ msgstr "مستلم الفاتورة:" #: pretix/base/exporters/invoices.py:216 pretix/base/exporters/invoices.py:343 #: pretix/base/exporters/orderlist.py:284 -#: pretix/base/exporters/orderlist.py:493 pretix/base/forms/questions.py:704 +#: pretix/base/exporters/orderlist.py:494 pretix/base/forms/questions.py:724 #: pretix/base/modelimport_orders.py:199 pretix/base/modelimport_orders.py:375 #: pretix/control/forms/filter.py:657 pretix/control/forms/filter.py:692 -#: pretix/control/templates/pretixcontrol/order/index.html:1028 -#: pretix/control/views/item.py:468 -#: pretix/plugins/checkinlists/exporters.py:520 +#: pretix/control/templates/pretixcontrol/order/index.html:1063 +#: pretix/control/views/item.py:473 +#: pretix/plugins/checkinlists/exporters.py:519 #: pretix/plugins/reports/exporters.py:855 #: pretix/plugins/reports/exporters.py:901 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:83 @@ -1989,14 +2009,14 @@ msgid "Street address" msgstr "عنوان الشارع" #: pretix/base/exporters/invoices.py:224 pretix/base/exporters/invoices.py:351 -#: pretix/base/models/orders.py:3367 pretix/base/models/orders.py:3423 +#: pretix/base/models/orders.py:3389 pretix/base/models/orders.py:3445 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:103 msgid "Beneficiary" msgstr "المستفيد" #: pretix/base/exporters/invoices.py:225 pretix/base/exporters/invoices.py:352 -#: pretix/base/modelimport_orders.py:333 pretix/base/models/orders.py:3362 -#: pretix/control/templates/pretixcontrol/order/index.html:1064 +#: pretix/base/modelimport_orders.py:333 pretix/base/models/orders.py:3384 +#: pretix/control/templates/pretixcontrol/order/index.html:1099 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:111 msgid "Internal reference" msgstr "المرجع الداخلي" @@ -2028,8 +2048,8 @@ msgstr "معرفات مطابقة الدفع" #: pretix/base/exporters/invoices.py:232 pretix/base/exporters/invoices.py:353 #: pretix/base/exporters/orderlist.py:311 -#: pretix/base/exporters/orderlist.py:505 -#: pretix/base/exporters/orderlist.py:708 pretix/base/plugins.py:139 +#: pretix/base/exporters/orderlist.py:506 +#: pretix/base/exporters/orderlist.py:709 pretix/base/plugins.py:144 #: pretix/control/templates/pretixcontrol/event/payment.html:11 msgid "Payment providers" msgstr "مزودي خدمات الدفع" @@ -2040,7 +2060,7 @@ msgstr "إلغاء" #: pretix/base/exporters/invoices.py:288 pretix/base/exporters/invoices.py:392 #: pretix/control/templates/pretixcontrol/event/mail.html:120 -#: pretix/control/templates/pretixcontrol/order/index.html:272 +#: pretix/control/templates/pretixcontrol/order/index.html:305 #: pretix/control/templates/pretixcontrol/order/mail_history.html:72 #: pretix/presale/templates/pretixpresale/event/order.html:244 msgid "Invoice" @@ -2050,13 +2070,13 @@ msgstr "فاتورة" msgid "Line number" msgstr "رقم السطر" -#: pretix/base/exporters/invoices.py:324 pretix/base/exporters/orderlist.py:488 -#: pretix/base/models/items.py:492 pretix/base/models/items.py:1155 +#: pretix/base/exporters/invoices.py:324 pretix/base/exporters/orderlist.py:489 +#: pretix/base/models/items.py:497 pretix/base/models/items.py:1165 #: pretix/control/templates/pretixcontrol/pdf/placeholders.html:32 msgid "Description" msgstr "الوصف" -#: pretix/base/exporters/invoices.py:325 pretix/control/forms/orders.py:355 +#: pretix/base/exporters/invoices.py:325 pretix/control/forms/orders.py:359 msgid "Gross price" msgstr "السعر الإجمالي" @@ -2064,18 +2084,18 @@ msgstr "السعر الإجمالي" msgid "Net price" msgstr "السعر الصافي" -#: pretix/base/exporters/invoices.py:327 pretix/base/exporters/orderlist.py:492 -#: pretix/base/exporters/orderlist.py:639 -#: pretix/base/exporters/orderlist.py:963 pretix/base/models/orders.py:2352 -#: pretix/base/models/orders.py:2551 pretix/base/models/orders.py:3070 +#: pretix/base/exporters/invoices.py:327 pretix/base/exporters/orderlist.py:493 +#: pretix/base/exporters/orderlist.py:640 +#: pretix/base/exporters/orderlist.py:964 pretix/base/models/orders.py:2374 +#: pretix/base/models/orders.py:2573 pretix/base/models/orders.py:3092 msgid "Tax value" msgstr "قيمة الضريبة" -#: pretix/base/exporters/invoices.py:328 pretix/base/exporters/orderlist.py:490 -#: pretix/base/exporters/orderlist.py:637 -#: pretix/base/exporters/orderlist.py:960 pretix/base/models/orders.py:2339 -#: pretix/base/models/orders.py:2538 pretix/base/models/orders.py:3057 -#: pretix/base/models/orders.py:3173 pretix/base/models/tax.py:349 +#: pretix/base/exporters/invoices.py:328 pretix/base/exporters/orderlist.py:491 +#: pretix/base/exporters/orderlist.py:638 +#: pretix/base/exporters/orderlist.py:961 pretix/base/models/orders.py:2361 +#: pretix/base/models/orders.py:2560 pretix/base/models/orders.py:3079 +#: pretix/base/models/orders.py:3195 pretix/base/models/tax.py:349 #: pretix/control/templates/pretixcontrol/order/transactions.html:21 #: pretix/plugins/reports/accountingreport.py:316 #: pretix/plugins/reports/exporters.py:809 @@ -2093,7 +2113,7 @@ msgstr "الاسم الضريبي" msgid "Product data" msgstr "اسم المنتج" -#: pretix/base/exporters/items.py:50 pretix/base/exporters/orderlist.py:1188 +#: pretix/base/exporters/items.py:50 pretix/base/exporters/orderlist.py:1203 #, fuzzy #| msgid "Product name" msgctxt "export_category" @@ -2104,8 +2124,8 @@ msgstr "اسم المنتج" msgid "Download a spreadsheet with details about all products and variations." msgstr "" -#: pretix/base/exporters/items.py:58 pretix/base/exporters/orderlist.py:635 -#: pretix/base/exporters/orderlist.py:951 +#: pretix/base/exporters/items.py:58 pretix/base/exporters/orderlist.py:636 +#: pretix/base/exporters/orderlist.py:952 #: pretix/base/exporters/waitinglist.py:115 #, fuzzy #| msgid "Variation" @@ -2120,31 +2140,31 @@ msgid "Product category" msgstr "فئة المنتج" #: pretix/base/exporters/items.py:60 pretix/base/models/discount.py:64 -#: pretix/base/models/items.py:96 pretix/base/models/items.py:483 -#: pretix/base/models/tax.py:321 pretix/control/forms/organizer.py:267 +#: pretix/base/models/items.py:96 pretix/base/models/items.py:488 +#: pretix/base/models/tax.py:321 pretix/control/forms/organizer.py:276 #: pretix/control/templates/pretixcontrol/items/discounts.html:61 msgid "Internal name" msgstr "الاسم الداخلي" -#: pretix/base/exporters/items.py:64 pretix/base/models/items.py:480 +#: pretix/base/exporters/items.py:64 pretix/base/models/items.py:485 msgid "Item name" msgstr "اسم العنصر" -#: pretix/base/exporters/items.py:68 pretix/base/exporters/orderlist.py:634 -#: pretix/base/exporters/orderlist.py:952 -#: pretix/base/exporters/waitinglist.py:114 pretix/base/models/items.py:1148 -#: pretix/base/models/orders.py:1500 pretix/base/models/orders.py:3039 -#: pretix/plugins/checkinlists/exporters.py:698 +#: pretix/base/exporters/items.py:68 pretix/base/exporters/orderlist.py:635 +#: pretix/base/exporters/orderlist.py:953 +#: pretix/base/exporters/waitinglist.py:114 pretix/base/models/items.py:1158 +#: pretix/base/models/orders.py:1522 pretix/base/models/orders.py:3061 +#: pretix/plugins/checkinlists/exporters.py:697 msgid "Variation" msgstr "النوع" -#: pretix/base/exporters/items.py:71 pretix/base/exporters/reusablemedia.py:53 +#: pretix/base/exporters/items.py:71 pretix/base/exporters/reusablemedia.py:56 #: pretix/base/models/customers.py:65 pretix/base/models/customers.py:447 -#: pretix/base/models/discount.py:60 pretix/base/models/event.py:1547 -#: pretix/base/models/items.py:489 pretix/base/models/items.py:1152 -#: pretix/base/models/media.py:77 pretix/base/settings.py:226 -#: pretix/base/settings.py:261 pretix/base/settings.py:292 -#: pretix/control/forms/filter.py:1360 pretix/control/forms/filter.py:2165 +#: pretix/base/models/discount.py:60 pretix/base/models/event.py:1564 +#: pretix/base/models/items.py:494 pretix/base/models/items.py:1162 +#: pretix/base/models/media.py:87 pretix/base/settings.py:239 +#: pretix/base/settings.py:274 pretix/base/settings.py:305 +#: pretix/control/forms/filter.py:1366 pretix/control/forms/filter.py:2298 #: pretix/control/templates/pretixcontrol/event/plugins.html:25 #: pretix/control/templates/pretixcontrol/event/plugins.html:75 #: pretix/control/templates/pretixcontrol/organizers/plugins.html:25 @@ -2163,22 +2183,22 @@ msgstr "نشط" msgid "Sales channels" msgstr "قنوات البيع" -#: pretix/base/exporters/items.py:73 pretix/base/models/items.py:497 -#: pretix/base/models/items.py:1166 +#: pretix/base/exporters/items.py:73 pretix/base/models/items.py:502 +#: pretix/base/models/items.py:1176 #: pretix/control/templates/pretixcontrol/items/index.html:48 msgid "Default price" msgstr "السعر الافتراضي" -#: pretix/base/exporters/items.py:74 pretix/base/models/items.py:505 +#: pretix/base/exporters/items.py:74 pretix/base/models/items.py:510 #: pretix/control/templates/pretixcontrol/items/index.html:150 msgid "Free price input" msgstr "إدخال سعر مجاني" -#: pretix/base/exporters/items.py:75 pretix/base/models/items.py:519 +#: pretix/base/exporters/items.py:75 pretix/base/models/items.py:524 msgid "Sales tax" msgstr "ضريبة المبيعات" -#: pretix/base/exporters/items.py:76 pretix/base/models/items.py:524 +#: pretix/base/exporters/items.py:76 pretix/base/models/items.py:529 msgid "Is an admission ticket" msgstr "تذكرة دخول" @@ -2190,11 +2210,11 @@ msgstr "تذكرة دخول" msgid "Personalized ticket" msgstr "إنشاء التذاكر" -#: pretix/base/exporters/items.py:78 pretix/base/models/items.py:538 +#: pretix/base/exporters/items.py:78 pretix/base/models/items.py:543 msgid "Generate tickets" msgstr "إنشاء التذاكر" -#: pretix/base/exporters/items.py:79 pretix/base/exporters/orderlist.py:1195 +#: pretix/base/exporters/items.py:79 pretix/base/exporters/orderlist.py:1210 #: pretix/base/exporters/waitinglist.py:41 pretix/base/shredder.py:371 #: pretix/control/forms/event.py:1874 pretix/control/navigation.py:249 #: pretix/control/templates/pretixcontrol/event/settings.html:362 @@ -2213,95 +2233,95 @@ msgstr "إنشاء التذاكر" #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:103 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:27 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:67 -#: pretix/presale/views/widget.py:452 +#: pretix/presale/views/widget.py:484 msgid "Waiting list" msgstr "قائمة الانتظار" #: pretix/base/exporters/items.py:80 pretix/base/models/discount.py:82 #: pretix/base/models/items.py:224 pretix/base/models/items.py:280 -#: pretix/base/models/items.py:561 pretix/base/models/items.py:1205 -#: pretix/base/payment.py:394 pretix/control/forms/subevents.py:323 -#: pretix/control/forms/subevents.py:345 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:507 +#: pretix/base/models/items.py:566 pretix/base/models/items.py:1215 +#: pretix/base/payment.py:394 pretix/control/forms/subevents.py:333 +#: pretix/control/forms/subevents.py:355 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:509 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:172 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:150 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:150 msgid "Available from" msgstr "متاح من" #: pretix/base/exporters/items.py:81 pretix/base/models/discount.py:87 #: pretix/base/models/items.py:229 pretix/base/models/items.py:285 -#: pretix/base/models/items.py:571 pretix/base/models/items.py:1215 -#: pretix/base/payment.py:400 pretix/control/forms/subevents.py:328 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:512 +#: pretix/base/models/items.py:576 pretix/base/models/items.py:1225 +#: pretix/base/payment.py:400 pretix/control/forms/subevents.py:338 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:514 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:177 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:155 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:155 msgid "Available until" msgstr "متاح حتى" -#: pretix/base/exporters/items.py:82 pretix/base/models/items.py:609 +#: pretix/base/exporters/items.py:82 pretix/base/models/items.py:614 msgid "This product can only be bought using a voucher." msgstr "لا يمكن شراء هذا المنتج إلا باستخدام كود خصم." -#: pretix/base/exporters/items.py:83 pretix/base/models/items.py:622 +#: pretix/base/exporters/items.py:83 pretix/base/models/items.py:627 msgid "" "This product will only be shown if a voucher matching the product is " "redeemed." msgstr "سيظهر هذا المنتج فقط في حالة استرداد كود خصم مطابقة للمنتج." -#: pretix/base/exporters/items.py:84 pretix/base/models/items.py:615 +#: pretix/base/exporters/items.py:84 pretix/base/models/items.py:620 msgid "Buying this product requires approval" msgstr "شراء هذا المنتج يتطلب موافقة" -#: pretix/base/exporters/items.py:85 pretix/base/models/items.py:628 +#: pretix/base/exporters/items.py:85 pretix/base/models/items.py:633 msgid "Only sell this product as part of a bundle" msgstr "قم ببيع هذا المنتج فقط كجزء من حزمة" -#: pretix/base/exporters/items.py:86 pretix/base/models/items.py:635 +#: pretix/base/exporters/items.py:86 pretix/base/models/items.py:640 msgid "Allow product to be canceled or changed" msgstr "السماح بإلغاء المنتج أو تغييره" -#: pretix/base/exporters/items.py:87 pretix/base/models/items.py:641 +#: pretix/base/exporters/items.py:87 pretix/base/models/items.py:646 msgid "Minimum amount per order" msgstr "الحد الأدنى للمبلغ حسب كل طلب" -#: pretix/base/exporters/items.py:88 pretix/base/models/items.py:648 +#: pretix/base/exporters/items.py:88 pretix/base/models/items.py:653 msgid "Maximum amount per order" msgstr "الحد الأقصى حسب كل طلب" #: pretix/base/exporters/items.py:89 pretix/base/exporters/orderlist.py:304 -#: pretix/base/modelimport_orders.py:652 pretix/base/models/items.py:656 -#: pretix/base/models/items.py:1242 pretix/base/models/orders.py:281 -#: pretix/plugins/checkinlists/exporters.py:524 +#: pretix/base/modelimport_orders.py:652 pretix/base/models/items.py:661 +#: pretix/base/models/items.py:1252 pretix/base/models/orders.py:281 +#: pretix/plugins/checkinlists/exporters.py:523 msgid "Requires special attention" msgstr "يتطلب اهتماما خاصا" #: pretix/base/exporters/items.py:90 pretix/base/exporters/orderlist.py:305 -#: pretix/base/modelimport_orders.py:661 pretix/base/models/items.py:663 -#: pretix/base/models/items.py:1249 pretix/base/models/orders.py:288 -#: pretix/plugins/checkinlists/exporters.py:526 +#: pretix/base/modelimport_orders.py:661 pretix/base/models/items.py:668 +#: pretix/base/models/items.py:1259 pretix/base/models/orders.py:288 +#: pretix/plugins/checkinlists/exporters.py:525 #, fuzzy #| msgid "Check-in list" msgid "Check-in text" msgstr "تحقق في قائمة" -#: pretix/base/exporters/items.py:91 pretix/base/models/items.py:668 -#: pretix/base/models/items.py:1169 +#: pretix/base/exporters/items.py:91 pretix/base/models/items.py:673 +#: pretix/base/models/items.py:1179 msgid "Original price" msgstr "السعر الأصلي" -#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:685 +#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:690 msgid "This product is a gift card" msgstr "هذا المنتج هو بطاقة هدية" -#: pretix/base/exporters/items.py:93 pretix/base/models/items.py:691 -#: pretix/base/models/items.py:1190 +#: pretix/base/exporters/items.py:93 pretix/base/models/items.py:696 +#: pretix/base/models/items.py:1200 #: pretix/control/templates/pretixcontrol/item/include_variations.html:41 #: pretix/control/templates/pretixcontrol/item/include_variations.html:167 msgid "Require a valid membership" msgstr "يتتطلب عضوية سارية المفعول" -#: pretix/base/exporters/items.py:94 pretix/base/models/items.py:700 -#: pretix/base/models/items.py:1199 +#: pretix/base/exporters/items.py:94 pretix/base/models/items.py:705 +#: pretix/base/models/items.py:1209 #, fuzzy #| msgid "Require a valid membership" msgid "Hide without a valid membership" @@ -2345,15 +2365,16 @@ msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:8 #: pretix/control/templates/pretixcontrol/orders/index.html:10 #: pretix/control/templates/pretixcontrol/organizers/customer.html:205 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:203 #: pretix/plugins/reports/accountingreport.py:673 #: pretix/plugins/reports/accountingreport.py:873 #: pretix/plugins/reports/exporters.py:673 pretix/plugins/statistics/apps.py:39 #: pretix/presale/templates/pretixpresale/organizers/customer_orders.html:13 -#: pretix/presale/views/customer.py:362 +#: pretix/presale/views/customer.py:364 msgid "Orders" msgstr "طلبات" -#: pretix/base/exporters/orderlist.py:103 pretix/base/models/orders.py:2603 +#: pretix/base/exporters/orderlist.py:103 pretix/base/models/orders.py:2625 #: pretix/base/notifications.py:205 msgid "Order positions" msgstr "حالات الطلب" @@ -2382,9 +2403,9 @@ msgid "Only include orders created within this date range." msgstr "قم بتضمين الطلبات التي تم إنشاؤها في هذا التاريخ أو بعده فقط." #: pretix/base/exporters/orderlist.py:137 pretix/base/notifications.py:194 -#: pretix/base/pdf.py:245 pretix/base/settings.py:1223 -#: pretix/base/settings.py:1235 pretix/control/forms/filter.py:1259 -#: pretix/plugins/badges/exporters.py:499 +#: pretix/base/pdf.py:245 pretix/base/settings.py:1238 +#: pretix/base/settings.py:1250 pretix/control/forms/filter.py:1259 +#: pretix/plugins/badges/exporters.py:507 #: pretix/plugins/reports/exporters.py:315 #: pretix/plugins/reports/exporters.py:465 #: pretix/plugins/ticketoutputpdf/exporters.py:97 @@ -2403,10 +2424,10 @@ msgstr "" "قم بتضمين الطلبات التي تشمل تذكرة واحدة على الأقل في هذا التاريخ أو بعده. " "سيشمل أيضا تواريخ أخرى في حالة الطلبات المختلطة!" -#: pretix/base/exporters/orderlist.py:149 pretix/base/models/items.py:795 -#: pretix/base/models/items.py:1702 pretix/control/forms/filter.py:442 -#: pretix/control/forms/filter.py:1248 pretix/control/forms/filter.py:2050 -#: pretix/control/forms/item.py:277 pretix/control/navigation.py:151 +#: pretix/base/exporters/orderlist.py:149 pretix/base/models/items.py:800 +#: pretix/base/models/items.py:1712 pretix/control/forms/filter.py:442 +#: pretix/control/forms/filter.py:1248 pretix/control/forms/filter.py:2183 +#: pretix/control/forms/item.py:278 pretix/control/navigation.py:151 #: pretix/control/navigation.py:160 #: pretix/control/templates/pretixcontrol/checkin/lists.html:113 #: pretix/control/templates/pretixcontrol/items/base.html:3 @@ -2414,7 +2435,9 @@ msgstr "" #: pretix/control/templates/pretixcontrol/items/index.html:5 #: pretix/control/templates/pretixcontrol/items/index.html:8 #: pretix/control/templates/pretixcontrol/items/questions.html:28 -#: pretix/control/templates/pretixcontrol/items/quotas.html:53 +#: pretix/control/templates/pretixcontrol/items/quotas.html:97 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:82 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:140 #: pretix/plugins/autocheckin/forms.py:56 #: pretix/plugins/autocheckin/models.py:72 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:31 @@ -2431,34 +2454,34 @@ msgid "" msgstr "" #: pretix/base/exporters/orderlist.py:283 -#: pretix/base/exporters/orderlist.py:479 -#: pretix/base/exporters/orderlist.py:617 -#: pretix/base/exporters/orderlist.py:935 -#: pretix/base/exporters/orderlist.py:1136 -#: pretix/base/exporters/orderlist.py:1324 +#: pretix/base/exporters/orderlist.py:480 +#: pretix/base/exporters/orderlist.py:618 +#: pretix/base/exporters/orderlist.py:936 +#: pretix/base/exporters/orderlist.py:1149 +#: pretix/base/exporters/orderlist.py:1339 #: pretix/base/exporters/waitinglist.py:116 pretix/control/forms/event.py:1850 #: pretix/control/forms/organizer.py:119 msgid "Event slug" msgstr "رابط الفعالية" #: pretix/base/exporters/orderlist.py:283 -#: pretix/base/exporters/orderlist.py:482 -#: pretix/base/exporters/orderlist.py:621 -#: pretix/base/exporters/orderlist.py:1136 -#: pretix/base/exporters/orderlist.py:1380 +#: pretix/base/exporters/orderlist.py:483 +#: pretix/base/exporters/orderlist.py:622 +#: pretix/base/exporters/orderlist.py:1149 +#: pretix/base/exporters/orderlist.py:1395 #: pretix/base/exporters/waitinglist.py:123 #: pretix/base/exporters/waitinglist.py:173 pretix/base/models/orders.py:215 -#: pretix/control/forms/filter.py:1055 pretix/control/forms/filter.py:1357 -#: pretix/control/forms/filter.py:1583 pretix/control/forms/filter.py:1652 -#: pretix/control/forms/filter.py:1724 pretix/control/forms/filter.py:1824 -#: pretix/control/forms/filter.py:2162 pretix/control/forms/filter.py:2242 -#: pretix/control/forms/filter.py:2523 pretix/control/forms/filter.py:2840 +#: pretix/control/forms/filter.py:1055 pretix/control/forms/filter.py:1363 +#: pretix/control/forms/filter.py:1716 pretix/control/forms/filter.py:1785 +#: pretix/control/forms/filter.py:1857 pretix/control/forms/filter.py:1957 +#: pretix/control/forms/filter.py:2295 pretix/control/forms/filter.py:2375 +#: pretix/control/forms/filter.py:2656 pretix/control/forms/filter.py:2973 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:52 #: pretix/control/templates/pretixcontrol/checkin/index.html:112 #: pretix/control/templates/pretixcontrol/event/invoicing.html:99 #: pretix/control/templates/pretixcontrol/events/index.html:92 -#: pretix/control/templates/pretixcontrol/order/index.html:826 -#: pretix/control/templates/pretixcontrol/order/index.html:922 +#: pretix/control/templates/pretixcontrol/order/index.html:861 +#: pretix/control/templates/pretixcontrol/order/index.html:957 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:26 #: pretix/control/templates/pretixcontrol/orders/index.html:151 #: pretix/control/templates/pretixcontrol/orders/refunds.html:65 @@ -2470,9 +2493,10 @@ msgstr "رابط الفعالية" #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:113 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mail.html:35 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html:64 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:30 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:42 #: pretix/control/templates/pretixcontrol/search/orders.html:63 #: pretix/control/templates/pretixcontrol/search/payments.html:103 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:31 #: pretix/control/templates/pretixcontrol/subevents/index.html:108 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:173 #: pretix/control/views/waitinglist.py:326 @@ -2485,20 +2509,20 @@ msgid "Status" msgstr "حالة" #: pretix/base/exporters/orderlist.py:284 -#: pretix/base/exporters/orderlist.py:485 -#: pretix/base/exporters/orderlist.py:624 -#: pretix/base/exporters/orderlist.py:939 pretix/base/notifications.py:203 -#: pretix/base/settings.py:1224 pretix/base/settings.py:1236 -#: pretix/control/forms/filter.py:2484 -#: pretix/control/templates/pretixcontrol/order/index.html:183 +#: pretix/base/exporters/orderlist.py:486 +#: pretix/base/exporters/orderlist.py:625 +#: pretix/base/exporters/orderlist.py:940 pretix/base/notifications.py:203 +#: pretix/base/settings.py:1239 pretix/base/settings.py:1251 +#: pretix/control/forms/filter.py:2617 +#: pretix/control/templates/pretixcontrol/order/index.html:216 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:24 #: pretix/control/templates/pretixcontrol/orders/index.html:140 #: pretix/control/templates/pretixcontrol/organizers/customer.html:213 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:45 #: pretix/control/templates/pretixcontrol/search/orders.html:57 -#: pretix/plugins/badges/exporters.py:498 -#: pretix/plugins/checkinlists/exporters.py:123 -#: pretix/plugins/checkinlists/exporters.py:522 +#: pretix/plugins/badges/exporters.py:506 +#: pretix/plugins/checkinlists/exporters.py:124 +#: pretix/plugins/checkinlists/exporters.py:521 #: pretix/plugins/reports/exporters.py:513 #: pretix/plugins/reports/exporters.py:576 #: pretix/plugins/reports/exporters.py:696 @@ -2508,10 +2532,10 @@ msgid "Order date" msgstr "تاريخ الطلب" #: pretix/base/exporters/orderlist.py:284 -#: pretix/base/exporters/orderlist.py:486 -#: pretix/base/exporters/orderlist.py:625 -#: pretix/base/exporters/orderlist.py:940 -#: pretix/plugins/checkinlists/exporters.py:523 +#: pretix/base/exporters/orderlist.py:487 +#: pretix/base/exporters/orderlist.py:626 +#: pretix/base/exporters/orderlist.py:941 +#: pretix/plugins/checkinlists/exporters.py:522 msgid "Order time" msgstr "توقيت الطلب" @@ -2543,18 +2567,19 @@ msgid "Tax value at {rate} % tax" msgstr "قيمة الضريبة {rate} % ضريبة" #: pretix/base/exporters/orderlist.py:302 +#: pretix/base/exporters/orderlist.py:1151 msgid "Invoice numbers" msgstr "أرقام الفواتير" #: pretix/base/exporters/orderlist.py:303 -#: pretix/base/exporters/orderlist.py:703 pretix/base/modelimport_orders.py:578 +#: pretix/base/exporters/orderlist.py:704 pretix/base/modelimport_orders.py:578 #: pretix/control/forms/filter.py:621 -#: pretix/control/templates/pretixcontrol/order/index.html:190 +#: pretix/control/templates/pretixcontrol/order/index.html:223 msgid "Sales channel" msgstr "قناة المبيعات" #: pretix/base/exporters/orderlist.py:307 -#: pretix/base/exporters/orderlist.py:668 pretix/base/models/orders.py:276 +#: pretix/base/exporters/orderlist.py:669 pretix/base/models/orders.py:276 #: pretix/control/forms/filter.py:251 #, fuzzy #| msgctxt "subevent" @@ -2569,14 +2594,14 @@ msgid "Positions" msgstr "الحالات" #: pretix/base/exporters/orderlist.py:309 -#: pretix/base/exporters/orderlist.py:705 pretix/base/models/orders.py:320 +#: pretix/base/exporters/orderlist.py:706 pretix/base/models/orders.py:320 #: pretix/control/forms/filter.py:603 msgid "Email address verified" msgstr "تم التحقق من عنوان البريد الإلكتروني" #: pretix/base/exporters/orderlist.py:310 -#: pretix/base/exporters/orderlist.py:504 -#: pretix/base/exporters/orderlist.py:706 +#: pretix/base/exporters/orderlist.py:505 +#: pretix/base/exporters/orderlist.py:707 #, fuzzy #| msgctxt "invoice" #| msgid "Customer VAT ID" @@ -2588,87 +2613,87 @@ msgstr "معرف ضريبة القيمة المضافة للعميل" msgid "Paid by {method}" msgstr "تم السداد بواسطة {method}" -#: pretix/base/exporters/orderlist.py:487 -#: pretix/base/exporters/orderlist.py:953 +#: pretix/base/exporters/orderlist.py:488 +#: pretix/base/exporters/orderlist.py:954 msgid "Fee type" msgstr "نوع الرسوم" -#: pretix/base/exporters/orderlist.py:489 -#: pretix/base/exporters/orderlist.py:636 -#: pretix/base/exporters/orderlist.py:959 pretix/base/modelimport_orders.py:467 -#: pretix/base/models/orders.py:1505 pretix/base/models/orders.py:3050 -#: pretix/base/pdf.py:160 pretix/control/forms/orders.py:638 +#: pretix/base/exporters/orderlist.py:490 +#: pretix/base/exporters/orderlist.py:637 +#: pretix/base/exporters/orderlist.py:960 pretix/base/modelimport_orders.py:467 +#: pretix/base/models/orders.py:1527 pretix/base/models/orders.py:3072 +#: pretix/base/pdf.py:160 pretix/control/forms/orders.py:646 #: pretix/control/templates/pretixcontrol/item/index.html:146 #: pretix/control/templates/pretixcontrol/order/change.html:194 -#: pretix/control/templates/pretixcontrol/order/change.html:418 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:497 +#: pretix/control/templates/pretixcontrol/order/change.html:420 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:499 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:162 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:140 -#: pretix/plugins/checkinlists/exporters.py:377 -#: pretix/plugins/checkinlists/exporters.py:501 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:140 +#: pretix/plugins/checkinlists/exporters.py:376 +#: pretix/plugins/checkinlists/exporters.py:500 #: pretix/plugins/reports/accountingreport.py:315 msgid "Price" msgstr "السعر" -#: pretix/base/exporters/orderlist.py:491 -#: pretix/base/exporters/orderlist.py:638 -#: pretix/base/exporters/orderlist.py:962 +#: pretix/base/exporters/orderlist.py:492 +#: pretix/base/exporters/orderlist.py:639 +#: pretix/base/exporters/orderlist.py:963 #: pretix/control/templates/pretixcontrol/event/tax_edit.html:9 #: pretix/control/templates/pretixcontrol/event/tax_edit.html:16 #: pretix/control/templates/pretixcontrol/order/change.html:165 msgid "Tax rule" msgstr "قاعدة الضريبة" -#: pretix/base/exporters/orderlist.py:520 -#: pretix/base/exporters/orderlist.py:731 pretix/base/models/orders.py:204 +#: pretix/base/exporters/orderlist.py:521 +#: pretix/base/exporters/orderlist.py:732 pretix/base/models/orders.py:204 msgid "canceled" msgstr "ملغى" -#: pretix/base/exporters/orderlist.py:620 -#: pretix/base/exporters/orderlist.py:946 -#: pretix/plugins/checkinlists/exporters.py:761 +#: pretix/base/exporters/orderlist.py:621 +#: pretix/base/exporters/orderlist.py:947 +#: pretix/plugins/checkinlists/exporters.py:760 msgid "Position ID" msgstr "معرف الحالة" -#: pretix/base/exporters/orderlist.py:629 -#: pretix/base/exporters/orderlist.py:1199 -#: pretix/base/exporters/waitinglist.py:119 pretix/base/forms/questions.py:658 -#: pretix/base/forms/questions.py:667 pretix/base/models/memberships.py:145 +#: pretix/base/exporters/orderlist.py:630 +#: pretix/base/exporters/orderlist.py:1214 +#: pretix/base/exporters/waitinglist.py:119 pretix/base/forms/questions.py:678 +#: pretix/base/forms/questions.py:687 pretix/base/models/memberships.py:145 #: pretix/control/forms/rrule.py:49 #: pretix/control/templates/pretixcontrol/events/index.html:80 -#: pretix/control/templates/pretixcontrol/order/index.html:823 -#: pretix/control/templates/pretixcontrol/order/index.html:917 +#: pretix/control/templates/pretixcontrol/order/index.html:858 +#: pretix/control/templates/pretixcontrol/order/index.html:952 #: pretix/control/templates/pretixcontrol/orders/refunds.html:55 #: pretix/control/templates/pretixcontrol/organizers/detail.html:68 #: pretix/control/templates/pretixcontrol/search/payments.html:83 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:19 #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:18 -#: pretix/plugins/checkinlists/exporters.py:514 -#: pretix/plugins/checkinlists/exporters.py:704 +#: pretix/plugins/checkinlists/exporters.py:513 +#: pretix/plugins/checkinlists/exporters.py:703 msgid "Start date" msgstr "تاريخ البداية" -#: pretix/base/exporters/orderlist.py:630 -#: pretix/base/exporters/orderlist.py:1200 +#: pretix/base/exporters/orderlist.py:631 +#: pretix/base/exporters/orderlist.py:1215 #: pretix/base/exporters/waitinglist.py:120 #: pretix/base/models/memberships.py:148 #: pretix/control/templates/pretixcontrol/events/index.html:84 #: pretix/control/templates/pretixcontrol/organizers/detail.html:70 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:21 #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:20 -#: pretix/plugins/checkinlists/exporters.py:515 -#: pretix/plugins/checkinlists/exporters.py:705 +#: pretix/plugins/checkinlists/exporters.py:514 +#: pretix/plugins/checkinlists/exporters.py:704 msgid "End date" msgstr "تاريخ الإنتهاء" -#: pretix/base/exporters/orderlist.py:632 -#: pretix/base/exporters/orderlist.py:950 +#: pretix/base/exporters/orderlist.py:633 +#: pretix/base/exporters/orderlist.py:951 #: pretix/base/exporters/waitinglist.py:112 #: pretix/base/modelimport_orders.py:129 -#: pretix/base/modelimport_vouchers.py:174 pretix/base/models/items.py:794 +#: pretix/base/modelimport_vouchers.py:174 pretix/base/models/items.py:799 #: pretix/base/models/vouchers.py:253 pretix/base/models/waitinglist.py:91 -#: pretix/control/forms/filter.py:2284 pretix/control/forms/filter.py:2539 -#: pretix/control/forms/orders.py:335 pretix/control/forms/vouchers.py:67 +#: pretix/control/forms/filter.py:2417 pretix/control/forms/filter.py:2672 +#: pretix/control/forms/orders.py:339 pretix/control/forms/vouchers.py:67 #: pretix/control/forms/waitinglist.py:106 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:66 #: pretix/control/templates/pretixcontrol/item/base.html:3 @@ -2679,10 +2704,10 @@ msgstr "تاريخ الإنتهاء" #: pretix/control/templates/pretixcontrol/vouchers/index.html:134 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:168 #: pretix/control/views/vouchers.py:120 pretix/control/views/waitinglist.py:326 -#: pretix/plugins/checkinlists/exporters.py:377 -#: pretix/plugins/checkinlists/exporters.py:501 -#: pretix/plugins/checkinlists/exporters.py:697 -#: pretix/plugins/checkinlists/exporters.py:763 +#: pretix/plugins/checkinlists/exporters.py:376 +#: pretix/plugins/checkinlists/exporters.py:500 +#: pretix/plugins/checkinlists/exporters.py:696 +#: pretix/plugins/checkinlists/exporters.py:762 #: pretix/plugins/reports/accountingreport.py:271 #: pretix/plugins/reports/exporters.py:386 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:159 @@ -2692,7 +2717,7 @@ msgstr "تاريخ الإنتهاء" msgid "Product" msgstr "منتج" -#: pretix/base/exporters/orderlist.py:654 pretix/base/models/vouchers.py:315 +#: pretix/base/exporters/orderlist.py:655 pretix/base/models/vouchers.py:315 #: pretix/control/templates/pretixcontrol/vouchers/bulk.html:5 #: pretix/control/templates/pretixcontrol/vouchers/detail.html:6 #: pretix/control/templates/pretixcontrol/vouchers/detail.html:8 @@ -2700,145 +2725,146 @@ msgstr "منتج" msgid "Voucher" msgstr "كود الخصم" -#: pretix/base/exporters/orderlist.py:655 +#: pretix/base/exporters/orderlist.py:656 #, fuzzy #| msgid "Voucher code used:" msgid "Voucher budget usage" msgstr "كود القسيمة المستخدمة:" -#: pretix/base/exporters/orderlist.py:656 +#: pretix/base/exporters/orderlist.py:657 #, fuzzy #| msgid "Voucher tags" msgid "Voucher tag" msgstr "علامات قسيمة" -#: pretix/base/exporters/orderlist.py:657 +#: pretix/base/exporters/orderlist.py:658 msgid "Pseudonymization ID" msgstr "معرف الاسم المستعار" -#: pretix/base/exporters/orderlist.py:658 pretix/control/forms/filter.py:714 +#: pretix/base/exporters/orderlist.py:659 pretix/control/forms/filter.py:714 #: pretix/control/templates/pretixcontrol/order/change.html:280 #, fuzzy #| msgid "Client secret" msgid "Ticket secret" msgstr "كلمة سر التذكرة" -#: pretix/base/exporters/orderlist.py:659 pretix/base/modelimport_orders.py:610 +#: pretix/base/exporters/orderlist.py:660 pretix/base/modelimport_orders.py:610 #: pretix/base/modelimport_vouchers.py:272 -#: pretix/plugins/checkinlists/exporters.py:527 +#: pretix/plugins/checkinlists/exporters.py:526 msgid "Seat ID" msgstr "رقم المقعد" -#: pretix/base/exporters/orderlist.py:660 -#: pretix/plugins/checkinlists/exporters.py:528 +#: pretix/base/exporters/orderlist.py:661 +#: pretix/plugins/checkinlists/exporters.py:527 msgid "Seat name" msgstr "اسم المقعد" -#: pretix/base/exporters/orderlist.py:661 -#: pretix/plugins/checkinlists/exporters.py:529 +#: pretix/base/exporters/orderlist.py:662 +#: pretix/plugins/checkinlists/exporters.py:528 msgid "Seat zone" msgstr "منطقة المقعد" -#: pretix/base/exporters/orderlist.py:662 -#: pretix/plugins/checkinlists/exporters.py:530 +#: pretix/base/exporters/orderlist.py:663 +#: pretix/plugins/checkinlists/exporters.py:529 msgid "Seat row" msgstr "صف المقعد" -#: pretix/base/exporters/orderlist.py:663 -#: pretix/plugins/checkinlists/exporters.py:531 +#: pretix/base/exporters/orderlist.py:664 +#: pretix/plugins/checkinlists/exporters.py:530 msgid "Seat number" msgstr "رقم المقعد" -#: pretix/base/exporters/orderlist.py:664 +#: pretix/base/exporters/orderlist.py:665 #: pretix/control/templates/pretixcontrol/order/change.html:224 -#: pretix/plugins/checkinlists/exporters.py:429 -#: pretix/plugins/checkinlists/exporters.py:532 +#: pretix/plugins/checkinlists/exporters.py:428 +#: pretix/plugins/checkinlists/exporters.py:531 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:167 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:169 msgid "Blocked" msgstr "محجوب" -#: pretix/base/exporters/orderlist.py:665 pretix/base/modelimport_orders.py:537 -#: pretix/base/models/orders.py:2570 +#: pretix/base/exporters/orderlist.py:666 pretix/base/modelimport_orders.py:537 +#: pretix/base/models/orders.py:2592 #: pretix/control/templates/pretixcontrol/organizers/customer.html:120 -#: pretix/plugins/checkinlists/exporters.py:533 -#: pretix/plugins/checkinlists/exporters.py:707 +#: pretix/plugins/checkinlists/exporters.py:532 +#: pretix/plugins/checkinlists/exporters.py:706 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:46 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:54 msgid "Valid from" msgstr "من تاريخ" -#: pretix/base/exporters/orderlist.py:666 pretix/base/modelimport_orders.py:545 -#: pretix/base/modelimport_vouchers.py:111 pretix/base/models/orders.py:2575 +#: pretix/base/exporters/orderlist.py:667 pretix/base/modelimport_orders.py:545 +#: pretix/base/modelimport_vouchers.py:111 pretix/base/models/orders.py:2597 #: pretix/base/models/vouchers.py:224 #: pretix/control/templates/pretixcontrol/organizers/customer.html:121 #: pretix/control/views/vouchers.py:120 -#: pretix/plugins/checkinlists/exporters.py:534 -#: pretix/plugins/checkinlists/exporters.py:708 +#: pretix/plugins/checkinlists/exporters.py:533 +#: pretix/plugins/checkinlists/exporters.py:707 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:48 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:60 msgid "Valid until" msgstr "حتى تاريخ" -#: pretix/base/exporters/orderlist.py:667 pretix/base/modelimport_orders.py:643 +#: pretix/base/exporters/orderlist.py:668 pretix/base/modelimport_orders.py:643 msgid "Order comment" msgstr "ملاحظات الطلب" -#: pretix/base/exporters/orderlist.py:669 +#: pretix/base/exporters/orderlist.py:670 #, fuzzy #| msgid "Add-On to position #%(posid)s" msgid "Add-on to position ID" msgstr "إضافة على #%(posid)s" -#: pretix/base/exporters/orderlist.py:699 +#: pretix/base/exporters/orderlist.py:700 #, fuzzy #| msgid "Invoice address state" msgctxt "address" msgid "Invoice address state" msgstr "منطقة عنوان الفاتورة" -#: pretix/base/exporters/orderlist.py:707 pretix/control/navigation.py:327 +#: pretix/base/exporters/orderlist.py:708 pretix/control/navigation.py:327 #: pretix/control/templates/pretixcontrol/checkin/lists.html:6 #: pretix/control/templates/pretixcontrol/checkin/lists.html:8 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:521 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:523 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:274 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:164 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:131 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:164 #: pretix/plugins/checkinlists/apps.py:44 msgid "Check-in lists" msgstr "تحقق في القوائم" -#: pretix/base/exporters/orderlist.py:709 +#: pretix/base/exporters/orderlist.py:710 #, fuzzy #| msgid "Resend order link" msgid "Position order link" msgstr "إعادة إرسال روابط الطلب" -#: pretix/base/exporters/orderlist.py:880 +#: pretix/base/exporters/orderlist.py:881 #, fuzzy #| msgid "Transaction Code" msgid "Order transaction data" msgstr "رمز معاملة الخادم" -#: pretix/base/exporters/orderlist.py:882 +#: pretix/base/exporters/orderlist.py:883 msgid "" "Download a spreadsheet of all substantial changes to orders, i.e. all " "changes to products, prices or tax rates. The information is only accurate " "for changes made with pretix versions released after October 2021." msgstr "" -#: pretix/base/exporters/orderlist.py:899 +#: pretix/base/exporters/orderlist.py:900 #, fuzzy #| msgid "Only include orders created on or after this date." msgid "Only include transactions created within this date range." msgstr "قم بتضمين الطلبات التي تم إنشاؤها في هذا التاريخ أو بعده فقط." -#: pretix/base/exporters/orderlist.py:934 pretix/base/models/event.py:695 -#: pretix/base/models/items.py:468 pretix/base/models/items.py:2060 -#: pretix/base/models/orders.py:232 pretix/base/models/orders.py:3152 +#: pretix/base/exporters/orderlist.py:935 pretix/base/models/event.py:695 +#: pretix/base/models/items.py:473 pretix/base/models/items.py:2070 +#: pretix/base/models/orders.py:232 pretix/base/models/orders.py:3174 #: pretix/base/models/vouchers.py:184 pretix/base/models/waitinglist.py:55 #: pretix/base/notifications.py:187 #: pretix/base/templates/pretixbase/email/cancel_confirm.txt:4 -#: pretix/control/forms/filter.py:1030 pretix/control/forms/filter.py:2835 +#: pretix/control/forms/filter.py:1030 pretix/control/forms/filter.py:2968 #: pretix/control/templates/pretixcontrol/organizers/customer.html:212 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:42 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mail.html:66 @@ -2851,9 +2877,9 @@ msgstr "قم بتضمين الطلبات التي تم إنشاؤها في هذ msgid "Event" msgstr "فعالية" -#: pretix/base/exporters/orderlist.py:936 -#: pretix/base/exporters/orderlist.py:1280 -#: pretix/base/exporters/orderlist.py:1428 +#: pretix/base/exporters/orderlist.py:937 +#: pretix/base/exporters/orderlist.py:1295 +#: pretix/base/exporters/orderlist.py:1443 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:50 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:36 #: pretix/plugins/banktransfer/refund_export.py:47 @@ -2865,25 +2891,25 @@ msgstr "فعالية" msgid "Currency" msgstr "العملة" -#: pretix/base/exporters/orderlist.py:942 +#: pretix/base/exporters/orderlist.py:943 #, fuzzy #| msgid "Transaction Code" msgid "Transaction date" msgstr "كود المعاملة" -#: pretix/base/exporters/orderlist.py:943 +#: pretix/base/exporters/orderlist.py:944 #, fuzzy #| msgid "Transaction Code" msgid "Transaction time" msgstr "كود المعاملة" -#: pretix/base/exporters/orderlist.py:944 +#: pretix/base/exporters/orderlist.py:945 #, fuzzy #| msgid "Order data" msgid "Old data" msgstr "بيانات الطلب" -#: pretix/base/exporters/orderlist.py:947 pretix/base/models/items.py:1555 +#: pretix/base/exporters/orderlist.py:948 pretix/base/models/items.py:1565 #: pretix/control/templates/pretixcontrol/order/transactions.html:23 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:207 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:353 @@ -2897,26 +2923,26 @@ msgstr "بيانات الطلب" msgid "Quantity" msgstr "كمية" -#: pretix/base/exporters/orderlist.py:954 +#: pretix/base/exporters/orderlist.py:955 #, fuzzy #| msgid "Internal reference" msgid "Internal fee type" msgstr "المرجع الداخلي" -#: pretix/base/exporters/orderlist.py:956 +#: pretix/base/exporters/orderlist.py:957 #, fuzzy #| msgid "Date" msgctxt "subevent" msgid "Date ID" msgstr "التاريخ" -#: pretix/base/exporters/orderlist.py:961 +#: pretix/base/exporters/orderlist.py:962 #, fuzzy #| msgid "Tax rule" msgid "Tax rule ID" msgstr "قاعدة الضريبة" -#: pretix/base/exporters/orderlist.py:964 +#: pretix/base/exporters/orderlist.py:965 #: pretix/plugins/reports/accountingreport.py:320 #, fuzzy #| msgctxt "invoice" @@ -2924,106 +2950,106 @@ msgstr "قاعدة الضريبة" msgid "Gross total" msgstr "القيمة الإجمالية" -#: pretix/base/exporters/orderlist.py:965 +#: pretix/base/exporters/orderlist.py:966 #: pretix/plugins/reports/accountingreport.py:319 #, fuzzy #| msgid "Total" msgid "Tax total" msgstr "المجموع" -#: pretix/base/exporters/orderlist.py:975 +#: pretix/base/exporters/orderlist.py:976 msgid "" "This value is supplied for informational purposes, it is not part of the " "original transaction data and might have changed since the transaction." msgstr "" -#: pretix/base/exporters/orderlist.py:998 +#: pretix/base/exporters/orderlist.py:999 msgid "Converted from legacy version" msgstr "" -#: pretix/base/exporters/orderlist.py:1060 +#: pretix/base/exporters/orderlist.py:1061 #, fuzzy #| msgid "Order payments and refunds" msgid "Payments and refunds" msgstr "مدفوعات الطلب والمبالغ المستردة" -#: pretix/base/exporters/orderlist.py:1062 +#: pretix/base/exporters/orderlist.py:1063 msgid "Download a spreadsheet of all payments or refunds of every order." msgstr "" -#: pretix/base/exporters/orderlist.py:1072 +#: pretix/base/exporters/orderlist.py:1073 #, fuzzy #| msgid "Extend payment term" msgid "Date range (payment date)" msgstr "تمديد فترة السداد" -#: pretix/base/exporters/orderlist.py:1075 +#: pretix/base/exporters/orderlist.py:1076 msgid "" "Note that using this will exclude any non-confirmed payments or non-" "completed refunds." msgstr "" -#: pretix/base/exporters/orderlist.py:1079 +#: pretix/base/exporters/orderlist.py:1080 msgid "Date range (start of transaction)" msgstr "" -#: pretix/base/exporters/orderlist.py:1085 +#: pretix/base/exporters/orderlist.py:1086 msgid "Payment states" msgstr "‪حالات الدفع" -#: pretix/base/exporters/orderlist.py:1093 +#: pretix/base/exporters/orderlist.py:1094 msgid "Refund states" msgstr "حالات استعادة المبلغ" -#: pretix/base/exporters/orderlist.py:1136 -#: pretix/base/exporters/orderlist.py:1281 -#: pretix/base/exporters/orderlist.py:1324 pretix/base/models/orders.py:335 -#: pretix/base/models/orders.py:1748 pretix/base/models/orders.py:2166 -#: pretix/base/models/orders.py:2328 pretix/base/models/orders.py:2527 -#: pretix/base/models/orders.py:3012 +#: pretix/base/exporters/orderlist.py:1149 +#: pretix/base/exporters/orderlist.py:1296 +#: pretix/base/exporters/orderlist.py:1339 pretix/base/models/orders.py:335 +#: pretix/base/models/orders.py:1770 pretix/base/models/orders.py:2188 +#: pretix/base/models/orders.py:2350 pretix/base/models/orders.py:2549 +#: pretix/base/models/orders.py:3034 #: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:23 #: pretix/control/templates/pretixcontrol/organizers/customer.html:122 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mail.html:74 #: pretix/control/templates/pretixcontrol/search/payments.html:78 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:15 -#: pretix/plugins/checkinlists/exporters.py:375 +#: pretix/plugins/checkinlists/exporters.py:374 #: pretix/presale/templates/pretixpresale/event/order.html:68 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:70 msgid "Order" msgstr "الطلب" -#: pretix/base/exporters/orderlist.py:1136 -#: pretix/base/exporters/orderlist.py:1324 +#: pretix/base/exporters/orderlist.py:1149 +#: pretix/base/exporters/orderlist.py:1339 #: pretix/control/templates/pretixcontrol/search/payments.html:75 #: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html:5 #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html:5 msgid "Payment ID" msgstr "معرف الدفع" -#: pretix/base/exporters/orderlist.py:1136 -#: pretix/base/exporters/orderlist.py:1425 +#: pretix/base/exporters/orderlist.py:1149 +#: pretix/base/exporters/orderlist.py:1440 #: pretix/control/templates/pretixcontrol/organizers/customer.html:298 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:32 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:62 msgid "Creation date" msgstr "تاريخ الإنشاء" -#: pretix/base/exporters/orderlist.py:1136 -#: pretix/control/templates/pretixcontrol/order/index.html:918 +#: pretix/base/exporters/orderlist.py:1149 +#: pretix/control/templates/pretixcontrol/order/index.html:953 msgid "Completion date" msgstr "تاريخ الاكتمال" -#: pretix/base/exporters/orderlist.py:1137 +#: pretix/base/exporters/orderlist.py:1150 msgid "Status code" msgstr "رمز الحالة" -#: pretix/base/exporters/orderlist.py:1137 -#: pretix/base/exporters/orderlist.py:1279 -#: pretix/base/exporters/orderlist.py:1324 pretix/base/models/orders.py:1744 -#: pretix/base/models/orders.py:2162 pretix/control/forms/filter.py:1087 +#: pretix/base/exporters/orderlist.py:1150 +#: pretix/base/exporters/orderlist.py:1294 +#: pretix/base/exporters/orderlist.py:1339 pretix/base/models/orders.py:1766 +#: pretix/base/models/orders.py:2184 pretix/control/forms/filter.py:1087 #: pretix/control/forms/filter.py:1090 -#: pretix/control/templates/pretixcontrol/order/index.html:827 -#: pretix/control/templates/pretixcontrol/order/index.html:923 +#: pretix/control/templates/pretixcontrol/order/index.html:862 +#: pretix/control/templates/pretixcontrol/order/index.html:958 #: pretix/control/templates/pretixcontrol/orders/refunds.html:70 #: pretix/control/templates/pretixcontrol/search/payments.html:98 #: pretix/plugins/banktransfer/payment.py:300 @@ -3034,106 +3060,107 @@ msgstr "رمز الحالة" msgid "Amount" msgstr "المبلغ" -#: pretix/base/exporters/orderlist.py:1137 +#: pretix/base/exporters/orderlist.py:1150 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:102 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:115 -#: pretix/control/templates/pretixcontrol/order/index.html:825 -#: pretix/control/templates/pretixcontrol/order/index.html:920 +#: pretix/control/templates/pretixcontrol/order/index.html:860 +#: pretix/control/templates/pretixcontrol/order/index.html:955 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:85 #: pretix/plugins/reports/accountingreport.py:496 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:29 msgid "Payment method" msgstr "طريقة السداد" -#: pretix/base/exporters/orderlist.py:1137 +#: pretix/base/exporters/orderlist.py:1150 #, fuzzy #| msgid "Payment matching IDs" msgid "Matching ID" msgstr "معرفات مطابقة الدفع" -#: pretix/base/exporters/orderlist.py:1137 +#: pretix/base/exporters/orderlist.py:1150 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:38 #, fuzzy #| msgid "Payment settings" msgid "Payment details" msgstr "إعدادات الدفع" -#: pretix/base/exporters/orderlist.py:1187 +#: pretix/base/exporters/orderlist.py:1202 msgid "Quota availabilities" msgstr "توافر الحصة" -#: pretix/base/exporters/orderlist.py:1189 +#: pretix/base/exporters/orderlist.py:1204 msgid "" "Download a spreadsheet of all quotas including their current availability." msgstr "" -#: pretix/base/exporters/orderlist.py:1194 -#: pretix/control/templates/pretixcontrol/items/quotas.html:49 +#: pretix/base/exporters/orderlist.py:1209 pretix/control/forms/filter.py:1591 +#: pretix/control/templates/pretixcontrol/items/quotas.html:93 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:81 msgid "Quota name" msgstr "اسم الحصة" -#: pretix/base/exporters/orderlist.py:1194 +#: pretix/base/exporters/orderlist.py:1209 #: pretix/control/templates/pretixcontrol/items/quota.html:56 msgid "Total quota" msgstr "الحصة الإجمالية" -#: pretix/base/exporters/orderlist.py:1194 +#: pretix/base/exporters/orderlist.py:1209 #: pretix/control/templates/pretixcontrol/event/cancel.html:20 -#: pretix/control/views/item.py:954 +#: pretix/control/views/item.py:1125 msgid "Paid orders" msgstr "الطلبات المدفوعة" -#: pretix/base/exporters/orderlist.py:1194 pretix/control/views/item.py:959 +#: pretix/base/exporters/orderlist.py:1209 pretix/control/views/item.py:1130 msgid "Pending orders" msgstr "الطلبات المعلقة" -#: pretix/base/exporters/orderlist.py:1194 +#: pretix/base/exporters/orderlist.py:1209 msgid "Blocking vouchers" msgstr "حظر كود الخصم" -#: pretix/base/exporters/orderlist.py:1195 pretix/control/views/item.py:978 +#: pretix/base/exporters/orderlist.py:1210 pretix/control/views/item.py:1149 msgid "Current user's carts" msgstr "عربات المستخدم الحالية" -#: pretix/base/exporters/orderlist.py:1195 +#: pretix/base/exporters/orderlist.py:1210 msgid "Exited orders" msgstr "طلبات خارجة" -#: pretix/base/exporters/orderlist.py:1195 +#: pretix/base/exporters/orderlist.py:1210 msgid "Current availability" msgstr "المتوفر حاليا" -#: pretix/base/exporters/orderlist.py:1212 -#: pretix/base/exporters/orderlist.py:1219 +#: pretix/base/exporters/orderlist.py:1227 +#: pretix/base/exporters/orderlist.py:1234 #: pretix/control/templates/pretixcontrol/items/quota.html:58 -#: pretix/control/views/item.py:985 +#: pretix/control/views/item.py:1156 msgid "Infinite" msgstr "غير محدود" -#: pretix/base/exporters/orderlist.py:1241 +#: pretix/base/exporters/orderlist.py:1256 #, fuzzy #| msgid "Gift card redemptions" msgid "Gift card transactions" msgstr "استرداد بطاقة هدية" -#: pretix/base/exporters/orderlist.py:1242 -#: pretix/base/exporters/orderlist.py:1352 +#: pretix/base/exporters/orderlist.py:1257 +#: pretix/base/exporters/orderlist.py:1367 #, fuzzy #| msgid "Gift cards" msgctxt "export_category" msgid "Gift cards" msgstr "بطاقات الهدايا" -#: pretix/base/exporters/orderlist.py:1243 +#: pretix/base/exporters/orderlist.py:1258 msgid "Download a spreadsheet of all gift card transactions." msgstr "" -#: pretix/base/exporters/orderlist.py:1276 -#: pretix/base/exporters/orderlist.py:1324 -#: pretix/base/exporters/orderlist.py:1423 pretix/base/models/giftcards.py:96 +#: pretix/base/exporters/orderlist.py:1291 +#: pretix/base/exporters/orderlist.py:1339 +#: pretix/base/exporters/orderlist.py:1438 pretix/base/models/giftcards.py:96 #: pretix/base/payment.py:1490 #: pretix/control/templates/pretixcontrol/giftcards/payment.html:4 -#: pretix/control/templates/pretixcontrol/order/index.html:563 +#: pretix/control/templates/pretixcontrol/order/index.html:598 #: pretix/control/templates/pretixcontrol/organizers/customer.html:297 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:30 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:59 @@ -3141,18 +3168,18 @@ msgstr "" msgid "Gift card code" msgstr "رمز بطاقة الهدية" -#: pretix/base/exporters/orderlist.py:1277 -#: pretix/base/exporters/orderlist.py:1370 -#: pretix/base/exporters/orderlist.py:1373 +#: pretix/base/exporters/orderlist.py:1292 +#: pretix/base/exporters/orderlist.py:1385 +#: pretix/base/exporters/orderlist.py:1388 #: pretix/base/models/memberships.py:120 pretix/control/forms/filter.py:255 -#: pretix/control/forms/filter.py:1574 pretix/control/forms/filter.py:1577 +#: pretix/control/forms/filter.py:1707 pretix/control/forms/filter.py:1710 #: pretix/control/templates/pretixcontrol/event/live.html:75 msgid "Test mode" msgstr "وضع الاختبار" -#: pretix/base/exporters/orderlist.py:1282 pretix/base/models/organizer.py:107 +#: pretix/base/exporters/orderlist.py:1297 pretix/base/models/organizer.py:107 #: pretix/control/forms/event.py:112 pretix/control/forms/filter.py:924 -#: pretix/control/forms/filter.py:1042 pretix/control/forms/filter.py:1839 +#: pretix/control/forms/filter.py:1042 pretix/control/forms/filter.py:1972 #: pretix/control/templates/pretixcontrol/email_setup.html:6 #: pretix/control/templates/pretixcontrol/email_setup_simple.html:6 #: pretix/control/templates/pretixcontrol/email_setup_smtp.html:6 @@ -3165,8 +3192,8 @@ msgstr "وضع الاختبار" msgid "Organizer" msgstr "منظم" -#: pretix/base/exporters/orderlist.py:1289 pretix/base/invoicing/pdf.py:591 -#: pretix/control/templates/pretixcontrol/base.html:283 +#: pretix/base/exporters/orderlist.py:1304 pretix/base/invoicing/pdf.py:582 +#: pretix/control/templates/pretixcontrol/base.html:286 #: pretix/control/templates/pretixcontrol/checkin/index.html:145 #: pretix/control/templates/pretixcontrol/order/index.html:25 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:38 @@ -3183,10 +3210,11 @@ msgstr "منظم" #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:84 #: pretix/control/templates/pretixcontrol/search/orders.html:77 #: pretix/control/templates/pretixcontrol/search/payments.html:119 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:228 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:67 -#: pretix/presale/forms/checkout.py:259 +#: pretix/presale/forms/checkout.py:216 #: pretix/presale/templates/pretixpresale/event/order.html:70 -#: pretix/presale/templates/pretixpresale/event/position.html:14 +#: pretix/presale/templates/pretixpresale/event/position.html:15 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:59 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:20 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:84 @@ -3195,52 +3223,52 @@ msgstr "منظم" msgid "TEST MODE" msgstr "وضع الاختبار" -#: pretix/base/exporters/orderlist.py:1304 +#: pretix/base/exporters/orderlist.py:1319 msgid "Gift card redemptions" msgstr "استرداد بطاقة هدية" -#: pretix/base/exporters/orderlist.py:1306 +#: pretix/base/exporters/orderlist.py:1321 msgid "" "Download a spreadsheet of all payments or refunds that involve gift cards." msgstr "" -#: pretix/base/exporters/orderlist.py:1324 +#: pretix/base/exporters/orderlist.py:1339 #: pretix/control/templates/pretixcontrol/giftcards/payment.html:21 msgid "Issuer" msgstr "جهة الاصدار" -#: pretix/base/exporters/orderlist.py:1351 pretix/base/permissions.py:292 +#: pretix/base/exporters/orderlist.py:1366 pretix/base/permissions.py:292 #: pretix/control/navigation.py:577 pretix/control/navigation.py:595 #: pretix/control/templates/pretixcontrol/organizers/customer.html:291 #: pretix/control/templates/pretixcontrol/organizers/edit.html:157 #: pretix/plugins/reports/accountingreport.py:915 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:7 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:13 -#: pretix/presale/views/customer.py:374 +#: pretix/presale/views/customer.py:376 msgid "Gift cards" msgstr "بطاقات الهدايا" -#: pretix/base/exporters/orderlist.py:1353 +#: pretix/base/exporters/orderlist.py:1368 msgid "Download a spreadsheet of all gift cards including their current value." msgstr "" -#: pretix/base/exporters/orderlist.py:1364 +#: pretix/base/exporters/orderlist.py:1379 msgid "Show value at" msgstr "إظهار القيمة عند" -#: pretix/base/exporters/orderlist.py:1367 +#: pretix/base/exporters/orderlist.py:1382 msgid "Defaults to the time of report." msgstr "" -#: pretix/base/exporters/orderlist.py:1372 -#: pretix/base/exporters/orderlist.py:1382 pretix/control/forms/filter.py:555 -#: pretix/control/forms/filter.py:1359 pretix/control/forms/filter.py:1576 -#: pretix/control/forms/filter.py:1585 pretix/control/forms/filter.py:1655 -#: pretix/control/forms/filter.py:1665 pretix/control/forms/filter.py:1727 -#: pretix/control/forms/filter.py:2164 pretix/control/forms/filter.py:2173 -#: pretix/control/forms/filter.py:2244 pretix/control/forms/filter.py:2257 -#: pretix/control/forms/filter.py:2763 pretix/control/forms/filter.py:2782 -#: pretix/control/forms/filter.py:2842 +#: pretix/base/exporters/orderlist.py:1387 +#: pretix/base/exporters/orderlist.py:1397 pretix/control/forms/filter.py:555 +#: pretix/control/forms/filter.py:1365 pretix/control/forms/filter.py:1709 +#: pretix/control/forms/filter.py:1718 pretix/control/forms/filter.py:1788 +#: pretix/control/forms/filter.py:1798 pretix/control/forms/filter.py:1860 +#: pretix/control/forms/filter.py:2297 pretix/control/forms/filter.py:2306 +#: pretix/control/forms/filter.py:2377 pretix/control/forms/filter.py:2390 +#: pretix/control/forms/filter.py:2896 pretix/control/forms/filter.py:2915 +#: pretix/control/forms/filter.py:2975 #: pretix/control/templates/pretixcontrol/checkin/lists.html:145 #: pretix/control/templates/pretixcontrol/checkin/lists.html:151 #: pretix/control/templates/pretixcontrol/event/plugins.html:24 @@ -3249,6 +3277,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/plugins.html:24 #: pretix/control/templates/pretixcontrol/organizers/teams.html:61 #: pretix/control/templates/pretixcontrol/organizers/webhooks.html:52 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:167 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:43 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:62 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:76 @@ -3257,26 +3286,26 @@ msgstr "" msgid "All" msgstr "الكل" -#: pretix/base/exporters/orderlist.py:1374 pretix/control/forms/filter.py:1578 +#: pretix/base/exporters/orderlist.py:1389 pretix/control/forms/filter.py:1711 msgid "Live" msgstr "مباشر" -#: pretix/base/exporters/orderlist.py:1383 pretix/control/forms/filter.py:1586 -#: pretix/control/templates/pretixcontrol/pdf/index.html:330 +#: pretix/base/exporters/orderlist.py:1398 pretix/control/forms/filter.py:1719 +#: pretix/control/templates/pretixcontrol/pdf/index.html:328 msgid "Empty" msgstr "فارغ" -#: pretix/base/exporters/orderlist.py:1384 pretix/control/forms/filter.py:1587 +#: pretix/base/exporters/orderlist.py:1399 pretix/control/forms/filter.py:1720 msgid "Valid and with value" msgstr "صالحة وذات قيمة" -#: pretix/base/exporters/orderlist.py:1385 pretix/control/forms/filter.py:1588 +#: pretix/base/exporters/orderlist.py:1400 pretix/control/forms/filter.py:1721 msgid "Expired and with value" msgstr "منتهية الصلاحية وذات قيمة" -#: pretix/base/exporters/orderlist.py:1386 pretix/control/forms/filter.py:238 -#: pretix/control/forms/filter.py:1235 pretix/control/forms/filter.py:1589 -#: pretix/control/forms/filter.py:2249 +#: pretix/base/exporters/orderlist.py:1401 pretix/control/forms/filter.py:238 +#: pretix/control/forms/filter.py:1235 pretix/control/forms/filter.py:1722 +#: pretix/control/forms/filter.py:2382 #: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html:37 #: pretix/control/templates/pretixcontrol/orders/overview.html:78 #: pretix/control/templates/pretixcontrol/organizers/customer.html:319 @@ -3287,44 +3316,44 @@ msgstr "منتهية الصلاحية وذات قيمة" msgid "Expired" msgstr "منتهية الصلاحية" -#: pretix/base/exporters/orderlist.py:1424 pretix/base/models/giftcards.py:105 +#: pretix/base/exporters/orderlist.py:1439 pretix/base/models/giftcards.py:105 msgid "Test mode card" msgstr "بطاقة وضع الاختبار" -#: pretix/base/exporters/orderlist.py:1426 +#: pretix/base/exporters/orderlist.py:1441 #: pretix/base/modelimport_orders.py:553 pretix/base/models/giftcards.py:109 -#: pretix/control/templates/pretixcontrol/order/index.html:203 +#: pretix/control/templates/pretixcontrol/order/index.html:236 #: pretix/control/templates/pretixcontrol/organizers/customer.html:299 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:65 msgid "Expiry date" msgstr "تاريخ الانتهاء" -#: pretix/base/exporters/orderlist.py:1427 pretix/control/forms/orders.py:902 +#: pretix/base/exporters/orderlist.py:1442 pretix/control/forms/orders.py:910 msgid "Special terms and conditions" msgstr "شروط وأحكام خاصة" -#: pretix/base/exporters/orderlist.py:1429 +#: pretix/base/exporters/orderlist.py:1444 #: pretix/control/templates/pretixcontrol/order/change.html:98 -#: pretix/control/templates/pretixcontrol/order/change.html:410 +#: pretix/control/templates/pretixcontrol/order/change.html:412 #: pretix/control/templates/pretixcontrol/organizers/customer.html:301 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:34 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:71 msgid "Current value" msgstr "القيمة الحالية" -#: pretix/base/exporters/orderlist.py:1430 +#: pretix/base/exporters/orderlist.py:1445 msgid "Created in order" msgstr "تم الإنشاء بالترتيب" -#: pretix/base/exporters/orderlist.py:1431 +#: pretix/base/exporters/orderlist.py:1446 msgid "Last invoice number of order" msgstr "رقم الفاتورة الأخير للطلب" -#: pretix/base/exporters/orderlist.py:1432 +#: pretix/base/exporters/orderlist.py:1447 msgid "Last invoice date of order" msgstr "تاريخ آخر فاتورة للطلب" -#: pretix/base/exporters/reusablemedia.py:34 pretix/base/permissions.py:304 +#: pretix/base/exporters/reusablemedia.py:35 pretix/base/permissions.py:304 #: pretix/control/navigation.py:656 #: pretix/control/templates/pretixcontrol/organizers/edit.html:223 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:35 @@ -3334,41 +3363,41 @@ msgstr "تاريخ آخر فاتورة للطلب" msgid "Reusable media" msgstr "" -#: pretix/base/exporters/reusablemedia.py:35 +#: pretix/base/exporters/reusablemedia.py:36 #, fuzzy #| msgid "Disable selected" msgctxt "export_category" msgid "Reusable media" msgstr "تعطيل المختارة" -#: pretix/base/exporters/reusablemedia.py:36 +#: pretix/base/exporters/reusablemedia.py:37 msgid "" "Download a spread sheet with the data of all reusable medias on your account." msgstr "" -#: pretix/base/exporters/reusablemedia.py:51 pretix/base/models/media.py:67 +#: pretix/base/exporters/reusablemedia.py:54 pretix/base/models/media.py:67 #, fuzzy #| msgid "Fee type" msgctxt "reusable_medium" msgid "Media type" msgstr "نوع الرسوم" -#: pretix/base/exporters/reusablemedia.py:52 pretix/base/models/media.py:73 +#: pretix/base/exporters/reusablemedia.py:55 pretix/base/models/media.py:73 #, fuzzy #| msgid "Internal identifier" msgctxt "reusable_medium" msgid "Identifier" msgstr "معرف داخلي" -#: pretix/base/exporters/reusablemedia.py:54 pretix/base/models/media.py:81 -#: pretix/base/models/orders.py:264 pretix/base/models/orders.py:3164 +#: pretix/base/exporters/reusablemedia.py:57 pretix/base/models/media.py:91 +#: pretix/base/models/orders.py:264 pretix/base/models/orders.py:3186 #: pretix/control/forms/orders.py:78 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:138 msgid "Expiration date" msgstr "تاريخ إنتهاء الصلاحية" -#: pretix/base/exporters/reusablemedia.py:55 pretix/base/models/media.py:90 -#: pretix/control/templates/pretixcontrol/order/index.html:216 +#: pretix/base/exporters/reusablemedia.py:58 pretix/base/models/media.py:100 +#: pretix/control/templates/pretixcontrol/order/index.html:249 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:60 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:136 #: pretix/presale/templates/pretixpresale/event/checkout_customer.html:8 @@ -3377,13 +3406,13 @@ msgstr "تاريخ إنتهاء الصلاحية" msgid "Customer account" msgstr "إجراءات العملاء" -#: pretix/base/exporters/reusablemedia.py:56 pretix/base/models/media.py:97 +#: pretix/base/exporters/reusablemedia.py:59 #, fuzzy #| msgid "Info text" msgid "Linked ticket" msgstr "معلومات النص" -#: pretix/base/exporters/reusablemedia.py:57 pretix/base/models/media.py:104 +#: pretix/base/exporters/reusablemedia.py:60 pretix/base/models/media.py:116 #, fuzzy #| msgid "Issued gift cards" msgid "Linked gift card" @@ -3469,7 +3498,7 @@ msgid "This combination of credentials is not known to our system." msgstr "مجموعة بيانات الاعتماد هذه غير معروفة لدى نظامنا." #: pretix/base/forms/auth.py:66 pretix/base/forms/user.py:94 -#: pretix/presale/forms/customer.py:391 pretix/presale/forms/customer.py:470 +#: pretix/presale/forms/customer.py:392 pretix/presale/forms/customer.py:471 msgid "For security reasons, please wait 5 minutes before you try again." msgstr "لأسباب أمنية ، يرجى الانتظار 5 دقائق قبل المحاولة مرة أخرى." @@ -3486,12 +3515,12 @@ msgstr "" #: pretix/base/forms/auth.py:157 pretix/base/forms/auth.py:214 #: pretix/base/forms/user.py:93 pretix/control/forms/users.py:45 -#: pretix/presale/forms/customer.py:295 pretix/presale/forms/customer.py:390 +#: pretix/presale/forms/customer.py:295 pretix/presale/forms/customer.py:391 msgid "Please enter the same password twice" msgstr "الرجاء إدخال نفس كلمة المرور مرتين" #: pretix/base/forms/auth.py:172 pretix/base/forms/auth.py:233 -#: pretix/presale/forms/customer.py:307 pretix/presale/forms/customer.py:409 +#: pretix/presale/forms/customer.py:308 pretix/presale/forms/customer.py:410 msgid "Repeat password" msgstr "أعد كلمة السر" @@ -3501,50 +3530,56 @@ msgstr "أعد كلمة السر" msgid "Your email address" msgstr "عنوان البريد الإلكتروني" -#: pretix/base/forms/auth.py:326 pretix/control/forms/orders.py:1041 +#: pretix/base/forms/auth.py:326 pretix/control/forms/orders.py:1049 #: pretix/control/templates/pretixcontrol/shredder/download.html:53 msgid "Confirmation code" msgstr "رمز التأكيد" -#: pretix/base/forms/questions.py:139 pretix/base/forms/questions.py:266 +#: pretix/base/forms/questions.py:138 pretix/base/forms/questions.py:255 #, fuzzy #| msgid "No country specified." msgctxt "name_salutation" msgid "not specified" msgstr "تحديد أي بلد." -#: pretix/base/forms/questions.py:229 -#, fuzzy -#| msgid "Please enter a shorter name." -msgid "Please do not use special characters in names." -msgstr "الرجاء إدخال اسم أقصر." - -#: pretix/base/forms/questions.py:291 +#: pretix/base/forms/questions.py:280 msgid "Please enter a shorter name." msgstr "الرجاء إدخال اسم أقصر." -#: pretix/base/forms/questions.py:318 +#: pretix/base/forms/questions.py:291 +#, python-format +msgid "" +"The field \"%(label)s\" may not contain special characters such as " +"\"%(chars)s\"." +msgstr "" + +#: pretix/base/forms/questions.py:305 +#, python-format +msgid "The field \"%(label)s\" may not contain an URL (%(url)s)." +msgstr "" + +#: pretix/base/forms/questions.py:338 msgctxt "phonenumber" msgid "International area code" msgstr "مفتاح الاتصال الدولي" -#: pretix/base/forms/questions.py:344 +#: pretix/base/forms/questions.py:364 msgctxt "phonenumber" msgid "Phone number (without international area code)" msgstr "رقم الهاتف (بدون مفتاح الاتصال الدولي)" -#: pretix/base/forms/questions.py:507 +#: pretix/base/forms/questions.py:527 msgid "" "You uploaded an image in landscape orientation. Please upload an image in " "portrait orientation." msgstr "" "قمت بتحميل صورة في الاتجاه الأفقي. الرجاء تحميل صورة في الاتجاه العمودي." -#: pretix/base/forms/questions.py:510 +#: pretix/base/forms/questions.py:530 msgid "Please upload an image where the width is 3/4 of the height." msgstr "يرجى تحميل صورة بحيث يكون العرض 3/4 الارتفاع." -#: pretix/base/forms/questions.py:513 +#: pretix/base/forms/questions.py:533 msgid "" "The file you uploaded has a very large number of pixels, please upload an " "image no larger than 10000 x 10000 pixels." @@ -3552,95 +3587,95 @@ msgstr "" "يحتوي الملف الذي قمت بتحميله على عدد كبير جدا من وحدات البكسل ، يرجى تحميل " "صورة لا يزيد حجمها عن 10000 × 10000 بكسل." -#: pretix/base/forms/questions.py:516 pretix/helpers/images.py:75 +#: pretix/base/forms/questions.py:536 pretix/helpers/images.py:75 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" "قم بتحميل صورة صالحة. الملف الذي قمت بتحميله ليس صورة أو هو صورة تالفة." -#: pretix/base/forms/questions.py:659 pretix/base/forms/questions.py:668 +#: pretix/base/forms/questions.py:679 pretix/base/forms/questions.py:688 msgid "" "If you keep this empty, the ticket will be valid starting at the time of " "purchase." msgstr "" -#: pretix/base/forms/questions.py:715 pretix/base/forms/questions.py:1108 +#: pretix/base/forms/questions.py:735 pretix/base/forms/questions.py:1128 msgid "Street and Number" msgstr "الشارع والرقم" -#: pretix/base/forms/questions.py:893 +#: pretix/base/forms/questions.py:913 #, fuzzy, python-brace-format #| msgid "Please enter a shorter name." msgid "Please enter a date between {min} and {max}." msgstr "الرجاء إدخال اسم أقصر." -#: pretix/base/forms/questions.py:899 +#: pretix/base/forms/questions.py:919 #, fuzzy, python-brace-format #| msgid "Please enter a valid sales channel." msgid "Please enter a date no earlier than {min}." msgstr "الرجاء إدخال قناة بيع صالحة." -#: pretix/base/forms/questions.py:904 +#: pretix/base/forms/questions.py:924 #, fuzzy, python-brace-format #| msgid "Please enter a shorter name." msgid "Please enter a date no later than {max}." msgstr "الرجاء إدخال اسم أقصر." -#: pretix/base/forms/questions.py:942 +#: pretix/base/forms/questions.py:962 #, python-brace-format msgid "Please enter a date and time between {min} and {max}." msgstr "" -#: pretix/base/forms/questions.py:948 +#: pretix/base/forms/questions.py:968 #, fuzzy, python-brace-format #| msgid "Please enter a valid sales channel." msgid "Please enter a date and time no earlier than {min}." msgstr "الرجاء إدخال قناة بيع صالحة." -#: pretix/base/forms/questions.py:953 +#: pretix/base/forms/questions.py:973 #, fuzzy, python-brace-format #| msgid "Please enter a shorter name." msgid "Please enter a date and time no later than {max}." msgstr "الرجاء إدخال اسم أقصر." -#: pretix/base/forms/questions.py:1172 +#: pretix/base/forms/questions.py:1192 msgid "" "Optional, but depending on the country you reside in we might need to charge " "you additional taxes if you do not enter it." msgstr "" -#: pretix/base/forms/questions.py:1177 +#: pretix/base/forms/questions.py:1197 msgid "" "Optional, but it might be required for you to claim tax benefits on your " "invoice depending on your and the seller’s country of residence." msgstr "" -#: pretix/base/forms/questions.py:1185 +#: pretix/base/forms/questions.py:1205 #, fuzzy #| msgid "Cancellation requested" msgid "No invoice requested" msgstr "طلبات الإلغاء" -#: pretix/base/forms/questions.py:1187 +#: pretix/base/forms/questions.py:1207 msgid "Invoice transmission method" msgstr "" -#: pretix/base/forms/questions.py:1333 +#: pretix/base/forms/questions.py:1353 msgid "You need to provide a company name." msgstr "تحتاج إلى تقديم اسم شركة." -#: pretix/base/forms/questions.py:1335 +#: pretix/base/forms/questions.py:1355 msgid "You need to provide your name." msgstr "تحتاج إلى تقديم اسمك." -#: pretix/base/forms/questions.py:1361 +#: pretix/base/forms/questions.py:1381 msgid "" "If you enter an invoice address, you also need to select an invoice " "transmission method." msgstr "" -#: pretix/base/forms/questions.py:1403 +#: pretix/base/forms/questions.py:1423 #, fuzzy #| msgid "The selected product is not active or has no price set." msgid "" @@ -3648,17 +3683,17 @@ msgid "" "type of address." msgstr "المنتج المحدد غير نشط أو ليس له سعر محدد." -#: pretix/base/forms/questions.py:1412 +#: pretix/base/forms/questions.py:1432 msgid "" "The selected type of invoice transmission requires a field that is currently " "not available, please reach out to the organizer." msgstr "" -#: pretix/base/forms/questions.py:1416 +#: pretix/base/forms/questions.py:1436 msgid "This field is required for the selected type of invoice transmission." msgstr "" -#: pretix/base/forms/user.py:54 pretix/control/forms/organizer.py:576 +#: pretix/base/forms/user.py:54 pretix/control/forms/organizer.py:585 #: pretix/control/forms/users.py:58 msgid "Default timezone" msgstr "المنطقة الزمنية الافتراضية" @@ -3694,8 +3729,8 @@ msgstr "هاتف ذكي مع تطبيق المصادقة" msgid "WebAuthn-compatible hardware token (e.g. Yubikey)" msgstr "رمز جهاز متوافق مع WebAuthn (مثل Yubikey)" -#: pretix/base/forms/user.py:92 pretix/presale/forms/customer.py:389 -#: pretix/presale/forms/customer.py:469 +#: pretix/base/forms/user.py:92 pretix/presale/forms/customer.py:390 +#: pretix/presale/forms/customer.py:470 msgid "The current password you entered was not correct." msgstr "كلمة المرور الحالية التي أدخلتها غير صحيحة." @@ -3703,13 +3738,13 @@ msgstr "كلمة المرور الحالية التي أدخلتها غير صح msgid "Please choose a password different to your current one." msgstr "" -#: pretix/base/forms/user.py:105 pretix/presale/forms/customer.py:398 -#: pretix/presale/forms/customer.py:474 +#: pretix/base/forms/user.py:105 pretix/presale/forms/customer.py:399 +#: pretix/presale/forms/customer.py:475 msgid "Your current password" msgstr "كلمة السر الحالية الخاصة بك" #: pretix/base/forms/user.py:111 pretix/control/forms/users.py:50 -#: pretix/presale/forms/customer.py:403 +#: pretix/presale/forms/customer.py:404 msgid "New password" msgstr "كلمة المرور الجديدة" @@ -3745,7 +3780,7 @@ msgid "" "\"{{\" and \"}}\"." msgstr "" -#: pretix/base/forms/validators.py:72 pretix/control/views/event.py:900 +#: pretix/base/forms/validators.py:72 pretix/control/views/event.py:904 #, fuzzy, python-format #| msgid "Invalid placeholder(s): %(value)s" msgid "Invalid placeholder: {%(value)s}" @@ -3762,8 +3797,8 @@ msgstr "مدينة مثال" msgid "Available placeholders: {list}" msgstr "النائبة المتاحة: {list}" -#: pretix/base/forms/widgets.py:223 pretix/base/models/items.py:1656 -#: pretix/plugins/checkinlists/exporters.py:757 +#: pretix/base/forms/widgets.py:223 pretix/base/models/items.py:1666 +#: pretix/plugins/checkinlists/exporters.py:756 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:40 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:54 msgid "Time" @@ -3839,68 +3874,68 @@ msgid "" "April 30, 2018, issued by the Director of the Revenue Agency." msgstr "" -#: pretix/base/invoicing/pdf.py:142 +#: pretix/base/invoicing/pdf.py:140 #, python-format msgctxt "invoice" msgid "Page %d of %d" msgstr "صفحة %d من %d" -#: pretix/base/invoicing/pdf.py:387 +#: pretix/base/invoicing/pdf.py:380 msgctxt "invoice" msgid "Classic renderer (pretix 1.0)" msgstr "المقدم الكلاسيكي (pretix 1.0)" -#: pretix/base/invoicing/pdf.py:431 +#: pretix/base/invoicing/pdf.py:423 msgctxt "invoice" msgid "Invoice from" msgstr "فاتورة من طرف" -#: pretix/base/invoicing/pdf.py:437 +#: pretix/base/invoicing/pdf.py:429 msgctxt "invoice" msgid "Invoice to" msgstr "فاتورة إلى" -#: pretix/base/invoicing/pdf.py:474 pretix/base/invoicing/pdf.py:1225 +#: pretix/base/invoicing/pdf.py:466 pretix/base/invoicing/pdf.py:1211 msgctxt "invoice" msgid "Order code" msgstr "رمز الطلب" -#: pretix/base/invoicing/pdf.py:483 pretix/base/invoicing/pdf.py:1238 +#: pretix/base/invoicing/pdf.py:475 pretix/base/invoicing/pdf.py:1224 msgctxt "invoice" msgid "Cancellation number" msgstr "رقم الإلغاء" -#: pretix/base/invoicing/pdf.py:489 pretix/base/invoicing/pdf.py:1240 +#: pretix/base/invoicing/pdf.py:481 pretix/base/invoicing/pdf.py:1226 msgctxt "invoice" msgid "Original invoice" msgstr "فاتورة أصلية" -#: pretix/base/invoicing/pdf.py:494 pretix/base/invoicing/pdf.py:1245 +#: pretix/base/invoicing/pdf.py:486 pretix/base/invoicing/pdf.py:1231 msgctxt "invoice" msgid "Invoice number" msgstr "رقم الفاتورة" -#: pretix/base/invoicing/pdf.py:502 pretix/base/invoicing/pdf.py:1260 +#: pretix/base/invoicing/pdf.py:494 pretix/base/invoicing/pdf.py:1246 msgctxt "invoice" msgid "Cancellation date" msgstr "تاريخ الإلغاء" -#: pretix/base/invoicing/pdf.py:508 +#: pretix/base/invoicing/pdf.py:500 msgctxt "invoice" msgid "Original invoice date" msgstr "تاريخ الفاتورة الأصلي" -#: pretix/base/invoicing/pdf.py:515 pretix/base/invoicing/pdf.py:1262 +#: pretix/base/invoicing/pdf.py:507 pretix/base/invoicing/pdf.py:1248 msgctxt "invoice" msgid "Invoice date" msgstr "تاريخ الفاتورة" -#: pretix/base/invoicing/pdf.py:531 +#: pretix/base/invoicing/pdf.py:523 msgctxt "invoice" msgid "Event" msgstr "الفعالية" -#: pretix/base/invoicing/pdf.py:565 +#: pretix/base/invoicing/pdf.py:556 #, python-brace-format msgctxt "invoice" msgid "" @@ -3910,146 +3945,146 @@ msgstr "" "من {from_date}\n" "حتى {to_date}" -#: pretix/base/invoicing/pdf.py:612 pretix/base/services/mail.py:536 +#: pretix/base/invoicing/pdf.py:603 pretix/base/services/mail.py:536 #, python-brace-format msgctxt "invoice" msgid "Invoice {num}" msgstr "فاتورة {num}" -#: pretix/base/invoicing/pdf.py:664 +#: pretix/base/invoicing/pdf.py:655 #, python-brace-format msgctxt "invoice" msgid "Customer reference: {reference}" msgstr "رقم مرجع العميل: {reference}" -#: pretix/base/invoicing/pdf.py:672 +#: pretix/base/invoicing/pdf.py:663 msgctxt "invoice" msgid "Customer VAT ID" msgstr "معرف ضريبة القيمة المضافة للعميل" -#: pretix/base/invoicing/pdf.py:679 +#: pretix/base/invoicing/pdf.py:669 msgctxt "invoice" msgid "Beneficiary" msgstr "المستفيد" -#: pretix/base/invoicing/pdf.py:712 +#: pretix/base/invoicing/pdf.py:701 msgctxt "invoice" msgid "Tax Invoice" msgstr "فاتورة الضريبة" -#: pretix/base/invoicing/pdf.py:713 +#: pretix/base/invoicing/pdf.py:702 msgctxt "invoice" msgid "Invoice" msgstr "فاتورة" -#: pretix/base/invoicing/pdf.py:714 -#: pretix/control/templates/pretixcontrol/order/index.html:272 +#: pretix/base/invoicing/pdf.py:703 +#: pretix/control/templates/pretixcontrol/order/index.html:305 #: pretix/control/templates/pretixcontrol/order/mail_history.html:72 #: pretix/presale/templates/pretixpresale/event/order.html:244 msgctxt "invoice" msgid "Cancellation" msgstr "إلغاء" -#: pretix/base/invoicing/pdf.py:736 pretix/base/invoicing/pdf.py:744 +#: pretix/base/invoicing/pdf.py:725 pretix/base/invoicing/pdf.py:733 msgctxt "invoice" msgid "Description" msgstr "وصف" -#: pretix/base/invoicing/pdf.py:737 pretix/base/invoicing/pdf.py:745 +#: pretix/base/invoicing/pdf.py:726 pretix/base/invoicing/pdf.py:734 msgctxt "invoice" msgid "Qty" msgstr "الكمية" -#: pretix/base/invoicing/pdf.py:738 pretix/base/invoicing/pdf.py:1042 +#: pretix/base/invoicing/pdf.py:727 pretix/base/invoicing/pdf.py:1031 msgctxt "invoice" msgid "Tax rate" msgstr "معدل الضريبة" -#: pretix/base/invoicing/pdf.py:739 +#: pretix/base/invoicing/pdf.py:728 msgctxt "invoice" msgid "Net" msgstr "الصافي" -#: pretix/base/invoicing/pdf.py:740 +#: pretix/base/invoicing/pdf.py:729 msgctxt "invoice" msgid "Gross" msgstr "الإجمالي" -#: pretix/base/invoicing/pdf.py:746 +#: pretix/base/invoicing/pdf.py:735 msgctxt "invoice" msgid "Amount" msgstr "المبلغ" -#: pretix/base/invoicing/pdf.py:873 +#: pretix/base/invoicing/pdf.py:862 #, python-brace-format msgctxt "invoice" msgid "Single price: {net_price} net / {gross_price} gross" msgstr "" -#: pretix/base/invoicing/pdf.py:904 +#: pretix/base/invoicing/pdf.py:893 #, fuzzy, python-brace-format #| msgid "Original price" msgctxt "invoice" msgid "Single price: {price}" msgstr "السعر الأصلي" -#: pretix/base/invoicing/pdf.py:947 pretix/base/invoicing/pdf.py:952 +#: pretix/base/invoicing/pdf.py:936 pretix/base/invoicing/pdf.py:941 msgctxt "invoice" msgid "Invoice total" msgstr "إجمالي الفاتورة" -#: pretix/base/invoicing/pdf.py:961 +#: pretix/base/invoicing/pdf.py:950 msgctxt "invoice" msgid "Received payments" msgstr "المدفوعات المستلمة" -#: pretix/base/invoicing/pdf.py:966 +#: pretix/base/invoicing/pdf.py:955 msgctxt "invoice" msgid "Outstanding payments" msgstr "المدفوعات المتأخرة" -#: pretix/base/invoicing/pdf.py:983 +#: pretix/base/invoicing/pdf.py:972 #, fuzzy #| msgid "Issued gift cards" msgctxt "invoice" msgid "Paid by gift card" msgstr "بطاقات هدية صدر" -#: pretix/base/invoicing/pdf.py:988 +#: pretix/base/invoicing/pdf.py:977 #, fuzzy #| msgid "Pending amount" msgctxt "invoice" msgid "Remaining amount" msgstr "مبالغ متأخرة" -#: pretix/base/invoicing/pdf.py:1012 +#: pretix/base/invoicing/pdf.py:1001 #, fuzzy, python-brace-format #| msgid "Event date range" msgctxt "invoice" msgid "Invoice period: {daterange}" msgstr "نطاق تاريخ الفعالية" -#: pretix/base/invoicing/pdf.py:1043 +#: pretix/base/invoicing/pdf.py:1032 msgctxt "invoice" msgid "Net value" msgstr "صافي القيمة" -#: pretix/base/invoicing/pdf.py:1044 +#: pretix/base/invoicing/pdf.py:1033 msgctxt "invoice" msgid "Gross value" msgstr "القيمة الإجمالية" -#: pretix/base/invoicing/pdf.py:1045 +#: pretix/base/invoicing/pdf.py:1034 msgctxt "invoice" msgid "Tax" msgstr "الضريبة" -#: pretix/base/invoicing/pdf.py:1075 +#: pretix/base/invoicing/pdf.py:1064 msgctxt "invoice" msgid "Included taxes" msgstr "الضرائب المدرجة" -#: pretix/base/invoicing/pdf.py:1103 +#: pretix/base/invoicing/pdf.py:1092 #, fuzzy, python-brace-format #| msgctxt "invoice" #| msgid "" @@ -4063,7 +4098,7 @@ msgstr "" "باستخدام معدل التحويل 1: {rate} كما نشره البنك المركزي الأوروبي بتاريخ " "{date} ، وهذا يعادل:" -#: pretix/base/invoicing/pdf.py:1118 +#: pretix/base/invoicing/pdf.py:1107 #, fuzzy, python-brace-format #| msgctxt "invoice" #| msgid "" @@ -4077,22 +4112,22 @@ msgstr "" "باستخدام معدل التحويل 1: {rate} كما نشره البنك المركزي الأوروبي بتاريخ " "{date} ، إجمالي الفاتورة يعادل {total}." -#: pretix/base/invoicing/pdf.py:1132 +#: pretix/base/invoicing/pdf.py:1121 msgid "Default invoice renderer (European-style letter)" msgstr "" -#: pretix/base/invoicing/pdf.py:1221 +#: pretix/base/invoicing/pdf.py:1207 #, fuzzy #| msgid "Please enter a valid state." msgctxt "invoice" msgid "(Please quote at all times.)" msgstr "الرجاء اختيار ولاية صحيحة." -#: pretix/base/invoicing/pdf.py:1268 +#: pretix/base/invoicing/pdf.py:1254 msgid "Simplified invoice renderer" msgstr "" -#: pretix/base/invoicing/pdf.py:1287 +#: pretix/base/invoicing/pdf.py:1273 #, fuzzy, python-brace-format #| msgid "Event date range" msgctxt "invoice" @@ -4210,12 +4245,12 @@ msgstr "سؤال{val}" msgid "Tax rule {val}" msgstr "قاعدة الضريبة {val}" -#: pretix/base/media.py:71 +#: pretix/base/media.py:72 msgid "Barcode / QR-Code" msgstr "" -#: pretix/base/media.py:88 -#: pretix/control/templates/pretixcontrol/organizers/edit.html:256 +#: pretix/base/media.py:89 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:257 msgid "NFC UID-based" msgstr "" @@ -4224,37 +4259,37 @@ msgstr "" msgid "Default list" msgstr "القائمة الافتراضية" -#: pretix/base/modelimport.py:126 +#: pretix/base/modelimport.py:130 msgid "Keep empty" msgstr "أبقه فارغا" -#: pretix/base/modelimport.py:160 +#: pretix/base/modelimport.py:164 #, python-brace-format msgid "Invalid setting for column \"{header}\"." msgstr "إعداد غير صالح للعمود \"{header}\"." -#: pretix/base/modelimport.py:220 +#: pretix/base/modelimport.py:224 #, python-brace-format msgid "Could not parse {value} as a yes/no value." msgstr "" -#: pretix/base/modelimport.py:243 +#: pretix/base/modelimport.py:247 #, python-brace-format msgid "Could not parse {value} as a date and time." msgstr "" -#: pretix/base/modelimport.py:253 pretix/control/views/orders.py:1175 -#: pretix/control/views/orders.py:1204 pretix/control/views/orders.py:1253 -#: pretix/control/views/orders.py:1288 pretix/control/views/orders.py:1311 +#: pretix/base/modelimport.py:257 pretix/control/views/orders.py:1179 +#: pretix/control/views/orders.py:1208 pretix/control/views/orders.py:1257 +#: pretix/control/views/orders.py:1292 pretix/control/views/orders.py:1315 msgid "You entered an invalid number." msgstr "لقد أدخلت رقما غير صالح." -#: pretix/base/modelimport.py:300 pretix/base/modelimport.py:312 +#: pretix/base/modelimport.py:304 pretix/base/modelimport.py:316 msgctxt "subevent" msgid "No matching date was found." msgstr "لم يتم العثور على تاريخ مطابق." -#: pretix/base/modelimport.py:302 pretix/base/modelimport.py:314 +#: pretix/base/modelimport.py:306 pretix/base/modelimport.py:318 msgctxt "subevent" msgid "Multiple matching dates were found." msgstr "تم العثور على تواريخ مطابقة متعددة." @@ -4283,7 +4318,7 @@ msgid "" "internal ID, provided only one date in the system matches the input." msgstr "" -#: pretix/base/modelimport_orders.py:120 pretix/presale/views/waiting.py:157 +#: pretix/base/modelimport_orders.py:120 pretix/presale/views/waiting.py:162 msgctxt "subevent" msgid "You need to select a date." msgstr "تحتاج إلى تحديد تاريخ." @@ -4304,7 +4339,7 @@ msgid "Multiple matching products were found." msgstr "تم العثور على منتجات مطابقة متعددة." #: pretix/base/modelimport_orders.py:160 -#: pretix/base/modelimport_vouchers.py:205 pretix/base/models/items.py:1257 +#: pretix/base/modelimport_vouchers.py:205 pretix/base/models/items.py:1267 #: pretix/base/models/vouchers.py:266 pretix/base/models/waitinglist.py:99 msgid "Product variation" msgstr "نوع المنتج" @@ -4361,23 +4396,19 @@ msgstr "عنوان البريد الإلكتروني للحاضر" #: pretix/control/forms/filter.py:692 pretix/control/forms/filter.py:696 #: pretix/control/forms/filter.py:700 pretix/control/forms/filter.py:705 #: pretix/control/forms/filter.py:710 -#: pretix/control/templates/pretixcontrol/order/index.html:608 +#: pretix/control/templates/pretixcontrol/order/index.html:643 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:193 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:196 msgid "Attendee address" msgstr "عنوان الحاضر" -#: pretix/base/modelimport_orders.py:445 -msgid "State" -msgstr "ولاية" - #: pretix/base/modelimport_orders.py:468 msgid "Calculate from product" msgstr "احسب من المنتج" #: pretix/base/modelimport_orders.py:486 #: pretix/control/templates/pretixcontrol/checkin/index.html:111 -#: pretix/control/templates/pretixcontrol/order/index.html:536 +#: pretix/control/templates/pretixcontrol/order/index.html:571 msgid "Ticket code" msgstr "رمز التذكرة" @@ -4434,8 +4465,8 @@ msgstr "المقعد الذي اخترته قد تم شغله مسبقا. الر msgid "You need to select a specific seat." msgstr "يجب أن تختار مقعدا محددا." -#: pretix/base/modelimport_orders.py:691 pretix/base/models/items.py:1671 -#: pretix/base/models/items.py:1766 pretix/control/forms/item.py:148 +#: pretix/base/modelimport_orders.py:691 pretix/base/models/items.py:1681 +#: pretix/base/models/items.py:1776 pretix/control/forms/item.py:149 #: pretix/control/templates/pretixcontrol/items/question_edit.html:10 #: pretix/control/templates/pretixcontrol/items/question_edit.html:17 #: pretix/control/templates/pretixcontrol/items/questions.html:23 @@ -4443,7 +4474,7 @@ msgid "Question" msgstr "سؤال" #: pretix/base/modelimport_orders.py:701 pretix/base/modelimport_orders.py:709 -#: pretix/base/models/items.py:1830 pretix/base/models/items.py:1848 +#: pretix/base/models/items.py:1840 pretix/base/models/items.py:1858 msgid "Invalid option selected." msgstr "تم تحديد خيار غير صحيح." @@ -4489,7 +4520,7 @@ msgid "Maximum discount budget" msgstr "الحد الأقصى للخصم" #: pretix/base/modelimport_vouchers.py:119 pretix/base/models/vouchers.py:228 -#: pretix/control/forms/filter.py:2258 +#: pretix/control/forms/filter.py:2391 msgid "Reserve ticket from quota" msgstr "حجز تذكرة من الحصة" @@ -4517,7 +4548,7 @@ msgstr "قيمة كود الخصم" msgid "It is pointless to set a value without a price effect." msgstr "" -#: pretix/base/modelimport_vouchers.py:237 pretix/base/models/items.py:2121 +#: pretix/base/modelimport_vouchers.py:237 pretix/base/models/items.py:2131 #: pretix/base/models/vouchers.py:275 #: pretix/control/templates/pretixcontrol/items/quota_edit.html:8 #: pretix/control/templates/pretixcontrol/items/quota_edit.html:15 @@ -4568,37 +4599,37 @@ msgid "" "voucher" msgstr "" -#: pretix/base/models/auth.py:274 +#: pretix/base/models/auth.py:283 msgid "Is active" msgstr "نشط" -#: pretix/base/models/auth.py:276 +#: pretix/base/models/auth.py:285 msgid "Is site admin" msgstr "مشرف الموقع" -#: pretix/base/models/auth.py:278 +#: pretix/base/models/auth.py:287 msgid "Date joined" msgstr "تاريخ الانضمام" -#: pretix/base/models/auth.py:280 +#: pretix/base/models/auth.py:289 #, fuzzy #| msgid "Request a new password" msgid "Force user to select a new password" msgstr "اطلب كلمة مرور جديدة" -#: pretix/base/models/auth.py:290 +#: pretix/base/models/auth.py:299 msgid "Two-factor authentication is required to log in" msgstr "المصادقة الثنائية مطلوبة لتسجيل الدخول" -#: pretix/base/models/auth.py:294 +#: pretix/base/models/auth.py:303 msgid "Receive notifications according to my settings below" msgstr "تلقي الإخطارات وفقا لإعداداتي التالية" -#: pretix/base/models/auth.py:295 +#: pretix/base/models/auth.py:304 msgid "If turned off, you will not get any notifications." msgstr "إذا قمت بإيقاف التشغيل، فلن تتلقى أي إشعارات." -#: pretix/base/models/auth.py:309 +#: pretix/base/models/auth.py:318 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:23 #: pretix/control/templates/pretixcontrol/orders/index.html:135 #: pretix/control/templates/pretixcontrol/search/orders.html:54 @@ -4606,41 +4637,41 @@ msgstr "إذا قمت بإيقاف التشغيل، فلن تتلقى أي إش #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:15 #: pretix/control/templates/pretixcontrol/users/form.html:4 #: pretix/control/templates/pretixcontrol/users/form.html:6 -#: pretix/control/views/organizer.py:174 tests/base/test_mail.py:202 +#: pretix/control/views/organizer.py:174 tests/base/test_mail.py:205 msgid "User" msgstr "المستخدم" -#: pretix/base/models/auth.py:310 pretix/control/navigation.py:438 +#: pretix/base/models/auth.py:319 pretix/control/navigation.py:438 #: pretix/control/templates/pretixcontrol/users/index.html:5 #: pretix/control/templates/pretixcontrol/users/index.html:7 msgid "Users" msgstr "المستخدمون" -#: pretix/base/models/auth.py:367 +#: pretix/base/models/auth.py:376 msgid "Account information changed" msgstr "تغييرت معلومات الحساب" -#: pretix/base/models/auth.py:394 +#: pretix/base/models/auth.py:403 #, python-brace-format msgid "" "to confirm changing your email address from {old_email}\n" "to {new_email}, use the following code:" msgstr "" -#: pretix/base/models/auth.py:398 +#: pretix/base/models/auth.py:407 #, python-brace-format msgid "" "to confirm that your email address {email} belongs to your pretix account, " "use the following code:" msgstr "" -#: pretix/base/models/auth.py:412 +#: pretix/base/models/auth.py:421 #, fuzzy #| msgid "Confirmation code" msgid "pretix confirmation code" msgstr "رمز التأكيد" -#: pretix/base/models/auth.py:456 +#: pretix/base/models/auth.py:465 #: pretix/control/templates/pretixcontrol/auth/forgot.html:7 msgid "Password recovery" msgstr "استعادة كلمة السر" @@ -4649,8 +4680,8 @@ msgstr "استعادة كلمة السر" msgid "All products (including newly created ones)" msgstr "جميع المنتجات (بما في ذلك تلك التي تم إنشاؤها حديثا)" -#: pretix/base/models/checkin.py:56 pretix/plugins/badges/exporters.py:436 -#: pretix/plugins/checkinlists/exporters.py:854 +#: pretix/base/models/checkin.py:56 pretix/plugins/badges/exporters.py:444 +#: pretix/plugins/checkinlists/exporters.py:853 msgid "Limit to products" msgstr "مقتصر على المنتجات" @@ -4741,80 +4772,98 @@ msgstr "دخول" msgid "Exit" msgstr "خروج" -#: pretix/base/models/checkin.py:356 +#: pretix/base/models/checkin.py:359 #, fuzzy #| msgid "Unknown invoice." msgid "Unknown ticket" msgstr "فاتورة غير معروفة." -#: pretix/base/models/checkin.py:357 +#: pretix/base/models/checkin.py:360 #, fuzzy #| msgid "Ticket download" msgid "Ticket not paid" msgstr "حمل تذكرة" -#: pretix/base/models/checkin.py:358 +#: pretix/base/models/checkin.py:361 msgid "Forbidden by custom rule" msgstr "" -#: pretix/base/models/checkin.py:359 +#: pretix/base/models/checkin.py:362 #, fuzzy #| msgid "Ticket layout changed." msgid "Ticket code revoked/changed" msgstr "تم تغيير نسق التذكرة." -#: pretix/base/models/checkin.py:360 +#: pretix/base/models/checkin.py:363 #, fuzzy #| msgid "Action required" msgid "Information required" msgstr "الإجراء مطلوب" -#: pretix/base/models/checkin.py:361 +#: pretix/base/models/checkin.py:364 #, fuzzy #| msgid "Ticket layouts" msgid "Ticket already used" msgstr "أنماط التذاكر" -#: pretix/base/models/checkin.py:362 +#: pretix/base/models/checkin.py:365 #, fuzzy #| msgid "Ticket type not allowed" msgid "Ticket type not allowed here" msgstr "نوع التذكرة غير مسموح به" -#: pretix/base/models/checkin.py:363 +#: pretix/base/models/checkin.py:366 msgid "Ticket code is ambiguous on list" msgstr "" -#: pretix/base/models/checkin.py:364 +#: pretix/base/models/checkin.py:367 #, fuzzy #| msgid "Internal Server Error" msgid "Server error" msgstr "خطأ في الخادم الداخلي" -#: pretix/base/models/checkin.py:365 +#: pretix/base/models/checkin.py:368 #, fuzzy #| msgid "Ticket code" msgid "Ticket blocked" msgstr "رمز التذكرة" -#: pretix/base/models/checkin.py:366 +#: pretix/base/models/checkin.py:369 #, fuzzy #| msgid "Order approved" msgid "Order not approved" msgstr "تمت الموافقة على الطلب" -#: pretix/base/models/checkin.py:367 +#: pretix/base/models/checkin.py:370 #, fuzzy #| msgid "This voucher is not valid for this seat." msgid "Ticket not valid at this time" msgstr "كود الخصم هذا غير صالح لهذا المقعد." -#: pretix/base/models/checkin.py:368 +#: pretix/base/models/checkin.py:371 #, fuzzy #| msgid "Check-in status" msgid "Check-in annulled" msgstr "تحقق ذات المركز" +#: pretix/base/models/checkin.py:372 +#, fuzzy +#| msgid "Ticket layouts" +msgid "Ticket already exchanged" +msgstr "أنماط التذاكر" + +#: pretix/base/models/checkin.py:373 +#, fuzzy +#| msgid "Disable selected" +msgid "Reusable medium invalid" +msgstr "تعطيل المختارة" + +#: pretix/base/models/checkin.py:374 +#, fuzzy +#| msgid "Disable selected" +msgid "Reusable medium already exists" +msgstr "تعطيل المختارة" + #: pretix/base/models/customers.py:63 #, fuzzy #| msgid "Product name" @@ -4832,7 +4881,7 @@ msgid "Single-sign-on method" msgstr "طريقة الاسترداد" #: pretix/base/models/customers.py:93 pretix/base/models/devices.py:74 -#: pretix/base/models/items.py:1676 pretix/base/models/items.py:1952 +#: pretix/base/models/items.py:1686 pretix/base/models/items.py:1962 msgid "" "You can enter any value here to make it easier to match the data with other " "sources. If you do not input one, we will generate one automatically." @@ -4846,24 +4895,24 @@ msgid "" "underscores. It must start and end with a letter or number." msgstr "" -#: pretix/base/models/customers.py:225 pretix/control/forms/filter.py:1657 -#: pretix/control/forms/filter.py:1729 +#: pretix/base/models/customers.py:225 pretix/control/forms/filter.py:1790 +#: pretix/control/forms/filter.py:1862 #: pretix/control/templates/pretixcontrol/organizers/customer.html:43 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:56 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:135 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:33 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:45 #, fuzzy #| msgid "Disabled" msgid "disabled" msgstr "معاق" -#: pretix/base/models/customers.py:354 pretix/base/models/orders.py:1546 -#: pretix/base/models/orders.py:3348 pretix/base/settings.py:1308 +#: pretix/base/models/customers.py:354 pretix/base/models/orders.py:1568 +#: pretix/base/models/orders.py:3370 pretix/base/settings.py:1323 msgid "Company name" msgstr "اسم الشركة" -#: pretix/base/models/customers.py:358 pretix/base/models/orders.py:1550 -#: pretix/base/models/orders.py:3355 pretix/base/settings.py:92 +#: pretix/base/models/customers.py:358 pretix/base/models/orders.py:1572 +#: pretix/base/models/orders.py:3377 pretix/base/settings.py:92 #: pretix/plugins/stripe/payment.py:291 msgid "Select country" msgstr "اختر الدولة" @@ -4951,20 +5000,20 @@ msgstr "" msgid "System error, needs manual intervention" msgstr "" -#: pretix/base/models/devices.py:73 pretix/base/models/items.py:1675 +#: pretix/base/models/devices.py:73 pretix/base/models/items.py:1685 msgid "Internal identifier" msgstr "معرف داخلي" -#: pretix/base/models/devices.py:93 pretix/base/models/items.py:1788 +#: pretix/base/models/devices.py:93 pretix/base/models/items.py:1798 msgid "This identifier is already used for a different question." msgstr "هذا المعرف مستخدم مسبقا لسؤال مختلف." #: pretix/base/models/devices.py:116 pretix/control/forms/checkin.py:196 -#: pretix/control/forms/checkin.py:217 pretix/control/forms/filter.py:2549 -#: pretix/control/forms/filter.py:2596 pretix/control/forms/filter.py:2756 +#: pretix/control/forms/checkin.py:217 pretix/control/forms/filter.py:2682 +#: pretix/control/forms/filter.py:2729 pretix/control/forms/filter.py:2889 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:67 #: pretix/control/templates/pretixcontrol/organizers/gates.html:18 -#: pretix/plugins/checkinlists/exporters.py:769 +#: pretix/plugins/checkinlists/exporters.py:768 msgid "Gate" msgstr "بوابة" @@ -4996,9 +5045,9 @@ msgctxt "subevent" msgid "Each matching product must be for a different date" msgstr "أضف تذاكر لتاريخ مختلف" -#: pretix/base/models/discount.py:69 pretix/base/models/items.py:1161 -#: pretix/base/models/items.py:1481 pretix/base/models/items.py:1708 -#: pretix/base/models/organizer.py:657 +#: pretix/base/models/discount.py:69 pretix/base/models/items.py:1171 +#: pretix/base/models/items.py:1491 pretix/base/models/items.py:1718 +#: pretix/base/models/organizer.py:664 msgid "Position" msgstr "حالة" @@ -5180,7 +5229,8 @@ msgstr "" msgid "The slug may only contain letters, numbers, dots and dashes." msgstr "يجب أن يحتوي الرابط فقط على أحرف وأرقام ونقاط وشرطات." -#: pretix/base/models/event.py:624 pretix/base/models/event.py:1551 +#: pretix/base/models/event.py:624 pretix/base/models/event.py:1568 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:63 msgid "Show in lists" msgstr "أظهرهذا في قوائم" @@ -5192,7 +5242,7 @@ msgstr "" "إذا تم تحديدها، فستظهر هذه الفعالية بشكل عام في قائمة الفعاليات لحساب المنظم " "الخاص بك." -#: pretix/base/models/event.py:629 pretix/base/models/event.py:1566 +#: pretix/base/models/event.py:629 pretix/base/models/event.py:1583 #: pretix/control/forms/subevents.py:100 msgid "" "Optional. No products will be sold after this date. If you do not set this " @@ -5201,7 +5251,7 @@ msgstr "" "اختياري. لن يتم بيع أي منتجات بعد هذا التاريخ. إذا لم تقم بتعيين هذه " "القيمة ، فسينتهي عرض ما قبل البيع بعد تاريخ انتهاء الفعالية الخاصة بك." -#: pretix/base/models/event.py:635 pretix/base/models/event.py:1572 +#: pretix/base/models/event.py:635 pretix/base/models/event.py:1589 #: pretix/control/forms/subevents.py:94 msgid "Optional. No products will be sold before this date." msgstr "اختياري. لن يتم بيع أي منتجات قبل هذا التاريخ." @@ -5222,31 +5272,31 @@ msgid "Plugins" msgstr "الإضافات" #: pretix/base/models/event.py:672 pretix/base/pdf.py:240 -#: pretix/control/forms/event.py:300 pretix/control/forms/filter.py:1834 +#: pretix/control/forms/event.py:300 pretix/control/forms/filter.py:1967 #: pretix/control/templates/pretixcontrol/event/index.html:13 #: pretix/control/templates/pretixcontrol/events/index.html:131 #: pretix/control/templates/pretixcontrol/organizers/detail.html:112 #: pretix/control/views/dashboards.py:554 #: pretix/presale/templates/pretixpresale/event/index.html:33 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:8 -#: pretix/presale/views/widget.py:732 +#: pretix/presale/views/widget.py:765 msgid "Event series" msgstr "فعالية بأوقات مختلفة" -#: pretix/base/models/event.py:676 pretix/base/models/event.py:1600 +#: pretix/base/models/event.py:676 pretix/base/models/event.py:1617 #, fuzzy #| msgid "Settings" msgid "Seating plan" msgstr "الإعدادات" -#: pretix/base/models/event.py:683 pretix/base/models/items.py:675 +#: pretix/base/models/event.py:683 pretix/base/models/items.py:680 #, fuzzy #| msgid "Sales channels" msgid "Sell on all sales channels" msgstr "قنوات البيع" -#: pretix/base/models/event.py:688 pretix/base/models/items.py:680 -#: pretix/base/models/items.py:1230 pretix/base/payment.py:476 +#: pretix/base/models/event.py:688 pretix/base/models/items.py:685 +#: pretix/base/models/items.py:1240 pretix/base/payment.py:476 msgid "Restrict to specific sales channels" msgstr "يقتصر على قنوات بيع محددة" @@ -5257,20 +5307,20 @@ msgstr "يقتصر على قنوات بيع محددة" #: pretix/control/templates/pretixcontrol/organizers/devices.html:92 #: pretix/control/templates/pretixcontrol/organizers/teams.html:39 #: pretix/control/templates/pretixcontrol/organizers/webhooks.html:37 -#: pretix/control/views/organizer.py:2020 +#: pretix/control/views/organizer.py:2016 #: pretix/plugins/reports/accountingreport.py:105 #: pretix/plugins/reports/accountingreport.py:108 msgid "Events" msgstr "فعاليات" -#: pretix/base/models/event.py:1372 +#: pretix/base/models/event.py:1389 msgid "" "You have configured at least one paid product but have not enabled any " "payment methods." msgstr "" "لقد قمت بإعداد منتج مدفوع واحد على الأقل، ولكن لم تقم بتفعيل أي وسيلة سداد." -#: pretix/base/models/event.py:1375 +#: pretix/base/models/event.py:1392 #, fuzzy #| msgid "" #| "You have configured at least one paid product but have not enabled any " @@ -5281,37 +5331,37 @@ msgid "" msgstr "" "لقد قمت بإعداد منتج مدفوع واحد على الأقل، ولكن لم تقم بتفعيل أي وسيلة سداد." -#: pretix/base/models/event.py:1378 +#: pretix/base/models/event.py:1395 msgid "You need to configure at least one quota to sell anything." msgstr "تحتاج إلى إعداد حصة واحدة على الأقل لبيع أي شيء." -#: pretix/base/models/event.py:1383 +#: pretix/base/models/event.py:1400 #, python-brace-format msgid "You need to fill the meta parameter \"{property}\"." msgstr "تحتاج إلى ملء المعلومة الوصفية \"{property}\"." -#: pretix/base/models/event.py:1497 +#: pretix/base/models/event.py:1514 msgid "" "Once created an event cannot change between an series and a single event." msgstr "بمجرد إنشاء فعالية لا يمكن التغيير بين سلسلة فعاليات وفعالية واحدة." -#: pretix/base/models/event.py:1503 +#: pretix/base/models/event.py:1520 msgid "The event slug cannot be changed." msgstr "لا يمكن تغيير رابط الفعالية." -#: pretix/base/models/event.py:1506 +#: pretix/base/models/event.py:1523 msgid "This slug has already been used for a different event." msgstr "لقد تم استخدام هذا الرابط مسبقا لفعالية مختلفة." -#: pretix/base/models/event.py:1512 +#: pretix/base/models/event.py:1529 msgid "The event cannot end before it starts." msgstr "لا يمكن أن تنتهي الفعالية قبل أن تبدأ." -#: pretix/base/models/event.py:1518 +#: pretix/base/models/event.py:1535 msgid "The event's presale cannot end before it starts." msgstr "لا يمكن أن ينتهي العرض المسبق للفعالية قبل أن يبدأ." -#: pretix/base/models/event.py:1548 +#: pretix/base/models/event.py:1565 msgid "" "Only with this checkbox enabled, this date is visible in the frontend to " "users." @@ -5319,7 +5369,7 @@ msgstr "" "يكون هذا التاريخ مرئيا في الواجهة الأمامية للمستخدمين فقط في حال تم تمكين " "مربع الاختيار هذا." -#: pretix/base/models/event.py:1552 +#: pretix/base/models/event.py:1569 msgid "" "If selected, this event will show up publicly on the list of dates for your " "event." @@ -5327,44 +5377,44 @@ msgstr "" "إذا تم الحديد، فستظهر هذه الفعالية بشكل عام في قائمة تواريخ الفعالية الخاصة " "بك." -#: pretix/base/models/event.py:1597 pretix/base/settings.py:3332 +#: pretix/base/models/event.py:1614 pretix/base/settings.py:3347 msgid "Frontpage text" msgstr "نص الصفحة الأولى" -#: pretix/base/models/event.py:1614 +#: pretix/base/models/event.py:1631 msgid "Date in event series" msgstr "التاريخ في سلسلة الفعالية" -#: pretix/base/models/event.py:1615 +#: pretix/base/models/event.py:1632 msgid "Dates in event series" msgstr "التواريخ في سلسلة الفعالية" -#: pretix/base/models/event.py:1756 +#: pretix/base/models/event.py:1773 msgid "One or more variations do not belong to this event." msgstr "عنصر أو أكثر لا ينتمي إلى هذه الفعالية." -#: pretix/base/models/event.py:1786 pretix/base/models/items.py:2236 +#: pretix/base/models/event.py:1803 pretix/base/models/items.py:2246 msgid "Can not contain spaces or special characters except underscores" msgstr "لا يمكن أن يحتوي على مسافات أو أحرف خاصة باستثناء الشرطات السفلية" -#: pretix/base/models/event.py:1791 pretix/base/models/items.py:2241 +#: pretix/base/models/event.py:1808 pretix/base/models/items.py:2251 msgid "The property name may only contain letters, numbers and underscores." msgstr "لا يسمح أن يحتوي اسم الملكية إلا على أحرف وأرقام وشرطات سفلية فقط." -#: pretix/base/models/event.py:1796 +#: pretix/base/models/event.py:1813 msgid "Default value" msgstr "القيمة الافتراضية" -#: pretix/base/models/event.py:1798 +#: pretix/base/models/event.py:1815 #: pretix/control/templates/pretixcontrol/organizers/properties.html:50 msgid "Can only be changed by organizer-level administrators" msgstr "لا يمكن تغييرها إلا من قبل المسؤولين برتبة منظم" -#: pretix/base/models/event.py:1800 +#: pretix/base/models/event.py:1817 msgid "Required for events" msgstr "مطلوب للفعاليات" -#: pretix/base/models/event.py:1801 +#: pretix/base/models/event.py:1818 msgid "" "If checked, an event can only be taken live if the property is set. In event " "series, its always optional to set a value for individual dates" @@ -5372,53 +5422,59 @@ msgstr "" "إذا تم تحديده ، فلا يمكن أن تكون الفعالية مباشرة إلا إذا تم تعيين الخاصية. " "في سلسلة الفعالية، يكون دائما تعيين قيمة للتواريخ الفردية أمرا اختياريا" -#: pretix/base/models/event.py:1807 pretix/base/models/items.py:2253 +#: pretix/base/models/event.py:1824 pretix/base/models/items.py:2263 msgid "Valid values" msgstr "قيم صالحة" -#: pretix/base/models/event.py:1810 +#: pretix/base/models/event.py:1827 #: pretix/control/templates/pretixcontrol/organizers/properties.html:45 #, fuzzy #| msgid "Show number of tickets left" msgid "Show filter option to customers" msgstr "إظهار عدد التذاكر المتبقية" -#: pretix/base/models/event.py:1811 +#: pretix/base/models/event.py:1828 msgid "" "This field will be shown to filter events in the public event list and " "calendar." msgstr "" -#: pretix/base/models/event.py:1814 pretix/control/forms/organizer.py:272 -#: pretix/control/forms/organizer.py:276 +#: pretix/base/models/event.py:1831 pretix/control/forms/organizer.py:281 +#: pretix/control/forms/organizer.py:285 #, fuzzy #| msgid "Public profile" msgid "Public name" msgstr "حساب عام" -#: pretix/base/models/event.py:1818 +#: pretix/base/models/event.py:1835 #: pretix/control/templates/pretixcontrol/organizers/properties.html:40 msgid "Can be used for filtering" msgstr "" -#: pretix/base/models/event.py:1819 +#: pretix/base/models/event.py:1836 msgid "" "This field will be shown to filter events or reports in the backend, and it " "can also be used for hidden filter parameters in the frontend (e.g. using " "the widget)." msgstr "" -#: pretix/base/models/event.py:1829 +#: pretix/base/models/event.py:1846 msgid "A property can either be required or have a default value, not both." msgstr "يمكن أن تكون الخاصية إما مطلوبة أو لها قيمة افتراضية ، وليس كليهما." -#: pretix/base/models/event.py:1909 pretix/base/models/organizer.py:620 +#: pretix/base/models/event.py:1884 +#, fuzzy +#| msgid "The bundled item must belong to the same event as the item." +msgid "Property and event must belong to the same organizer." +msgstr "يجب أن ينتمي العنصر المجمع إلى نفس فعالية العنصر." + +#: pretix/base/models/event.py:1928 pretix/base/models/organizer.py:627 #, fuzzy #| msgid "Info text" msgid "Link text" msgstr "معلومات النص" -#: pretix/base/models/event.py:1912 pretix/base/models/organizer.py:623 +#: pretix/base/models/event.py:1931 pretix/base/models/organizer.py:630 #, fuzzy #| msgid "Imprint URL" msgid "Link URL" @@ -5437,7 +5493,7 @@ msgstr "إعدادات إضافية" #: pretix/base/models/exports.py:61 pretix/base/models/exports.py:66 #: pretix/base/models/exports.py:71 pretix/control/forms/event.py:1153 -#: pretix/control/forms/organizer.py:705 +#: pretix/control/forms/organizer.py:715 msgid "You can specify multiple recipients separated by commas." msgstr "" @@ -5456,10 +5512,10 @@ msgstr "إعدادات إضافية" #: pretix/base/models/exports.py:74 pretix/control/forms/event.py:1259 #: pretix/control/forms/event.py:1333 pretix/control/forms/event.py:1343 #: pretix/control/forms/event.py:1353 pretix/control/forms/event.py:1368 -#: pretix/control/forms/orders.py:730 pretix/control/forms/orders.py:952 -#: pretix/control/forms/orders.py:979 pretix/control/forms/organizer.py:727 -#: pretix/control/forms/organizer.py:737 pretix/control/forms/organizer.py:747 -#: pretix/control/forms/organizer.py:757 pretix/control/forms/vouchers.py:282 +#: pretix/control/forms/orders.py:738 pretix/control/forms/orders.py:960 +#: pretix/control/forms/orders.py:987 pretix/control/forms/organizer.py:737 +#: pretix/control/forms/organizer.py:747 pretix/control/forms/organizer.py:757 +#: pretix/control/forms/organizer.py:767 pretix/control/forms/vouchers.py:282 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mail.html:33 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html:61 #: pretix/plugins/sendmail/forms.py:57 pretix/plugins/sendmail/forms.py:73 @@ -5467,9 +5523,9 @@ msgstr "إعدادات إضافية" msgid "Subject" msgstr "موضوع" -#: pretix/base/models/exports.py:78 pretix/control/forms/orders.py:769 -#: pretix/control/forms/orders.py:792 pretix/control/forms/orders.py:960 -#: pretix/control/forms/orders.py:987 pretix/control/forms/vouchers.py:288 +#: pretix/base/models/exports.py:78 pretix/control/forms/orders.py:777 +#: pretix/control/forms/orders.py:800 pretix/control/forms/orders.py:968 +#: pretix/control/forms/orders.py:995 pretix/control/forms/vouchers.py:288 #: pretix/plugins/sendmail/forms.py:58 pretix/plugins/sendmail/forms.py:78 #: pretix/plugins/sendmail/models.py:242 msgid "Message" @@ -5562,7 +5618,7 @@ msgctxt "invoice" msgid "Tax ID: %s" msgstr "رقم تعريف الضريبة: %s" -#: pretix/base/models/invoices.py:240 pretix/base/services/invoices.py:156 +#: pretix/base/models/invoices.py:240 pretix/base/services/invoices.py:157 #, python-format msgctxt "invoice" msgid "VAT-ID: %s" @@ -5572,7 +5628,7 @@ msgstr "رقم تعريف الضريبة على القيمة المضافة: %s" msgid "Category name" msgstr "اسم التصنيف" -#: pretix/base/models/items.py:97 pretix/base/models/items.py:484 +#: pretix/base/models/items.py:97 pretix/base/models/items.py:489 msgid "" "If you set this, this will be used instead of the public name in the backend." msgstr "" @@ -5597,17 +5653,17 @@ msgstr "" "مصادر قوائم الإضافات." #: pretix/base/models/items.py:114 pretix/base/models/items.py:159 -#: pretix/control/forms/item.py:98 +#: pretix/control/forms/item.py:99 #, fuzzy #| msgid "No category" msgid "Normal category" msgstr "ليس هناك فئة" -#: pretix/base/models/items.py:115 pretix/control/forms/item.py:111 +#: pretix/base/models/items.py:115 pretix/control/forms/item.py:112 msgid "Normal + cross-selling category" msgstr "" -#: pretix/base/models/items.py:116 pretix/control/forms/item.py:106 +#: pretix/base/models/items.py:116 pretix/control/forms/item.py:107 #, fuzzy #| msgid "No category" msgid "Cross-selling category" @@ -5660,12 +5716,12 @@ msgid "Disable product for this date" msgstr "تعطيل المنتج لهذا التاريخ" #: pretix/base/models/items.py:226 pretix/base/models/items.py:282 -#: pretix/base/models/items.py:563 +#: pretix/base/models/items.py:568 msgid "This product will not be sold before the given date." msgstr "لن يتم بيع هذا المنتج قبل التاريخ المعين." #: pretix/base/models/items.py:231 pretix/base/models/items.py:287 -#: pretix/base/models/items.py:573 +#: pretix/base/models/items.py:578 msgid "This product will not be sold after the given date." msgstr "لن يتم بيع هذا المنتج بعد التاريخ المحدد." @@ -5687,41 +5743,53 @@ msgstr "عميل" msgid "Dynamic validity" msgstr "صلاحية بطاقة هدية" -#: pretix/base/models/items.py:444 pretix/control/forms/item.py:671 +#: pretix/base/models/items.py:444 pretix/control/forms/item.py:726 #: pretix/control/templates/pretixcontrol/subevents/fragment_unavail_mode_indicator.html:3 #, fuzzy #| msgid "Waiting, product unavailable" msgid "Hide product if unavailable" msgstr "الانتظار، المنتج غير متوفر" -#: pretix/base/models/items.py:445 pretix/control/forms/item.py:672 +#: pretix/base/models/items.py:445 pretix/control/forms/item.py:727 #: pretix/control/templates/pretixcontrol/subevents/fragment_unavail_mode_indicator.html:5 #, fuzzy #| msgid "The ordered product \"{item}\" is no longer available." msgid "Show product with info on why it’s unavailable" msgstr "المنتج المطلوب \"{item}\" لم يعد متاحا." -#: pretix/base/models/items.py:456 pretix/base/models/items.py:781 -msgid "Don't use re-usable media, use regular one-off tickets" -msgstr "" - -#: pretix/base/models/items.py:457 -msgid "Require an existing medium to be re-used" -msgstr "" - -#: pretix/base/models/items.py:458 -msgid "Require a previously unknown medium to be newly added" +#: pretix/base/models/items.py:458 pretix/base/models/items.py:786 +msgid "Don't use reusable media, use regular one-off tickets" msgstr "" #: pretix/base/models/items.py:459 -msgid "Require either an existing or a new medium to be used" +msgid "Require a previously unknown medium to be newly added" msgstr "" -#: pretix/base/models/items.py:475 pretix/base/models/items.py:1458 +#: pretix/base/models/items.py:460 +msgid "Require an existing medium to be reused, replacing any previous tickets" +msgstr "" + +#: pretix/base/models/items.py:461 +msgid "" +"Require either an existing or a new medium to be used, replacing any " +"previous tickets" +msgstr "" + +#: pretix/base/models/items.py:462 +msgid "Require an existing medium to be reused, adding to any previous tickets" +msgstr "" + +#: pretix/base/models/items.py:464 +msgid "" +"Require either an existing or a new medium to be used, adding to any " +"previous tickets" +msgstr "" + +#: pretix/base/models/items.py:480 pretix/base/models/items.py:1468 msgid "Category" msgstr "الفئة" -#: pretix/base/models/items.py:476 +#: pretix/base/models/items.py:481 msgid "" "If you have many products, you can optionally sort them into categories to " "keep things organized." @@ -5729,11 +5797,11 @@ msgstr "" "إذا كان لديك العديد من المنتجات ، فيمكنك تصنيفها اختياريا إلى فئات ليبقى كل " "شيء منظم." -#: pretix/base/models/items.py:493 +#: pretix/base/models/items.py:498 msgid "This is shown below the product name in lists." msgstr "سيظهر هذا في القوائم أسفل اسم المنتج." -#: pretix/base/models/items.py:498 +#: pretix/base/models/items.py:503 msgid "" "If this product has multiple variations, you can set different prices for " "each of the variations. If a variation does not have a special price or if " @@ -5743,7 +5811,7 @@ msgstr "" "المتغيرات. إذا لم يكن المتغير لديه سعر خاص أو إذا لم يكن لديك متغيرات، فسيتم " "استخدام هذا السعر." -#: pretix/base/models/items.py:506 +#: pretix/base/models/items.py:511 #, fuzzy #| msgid "" #| "If this option is active, your users can choose the price themselves. The " @@ -5763,13 +5831,13 @@ msgstr "" "لهذه الفعالية الخاصة بك. هذا غير مدعوم حاليا للمنتجات التي تم شراؤها كإضافة " "لمنتجات أخرى." -#: pretix/base/models/items.py:511 pretix/base/models/items.py:1176 +#: pretix/base/models/items.py:516 pretix/base/models/items.py:1186 #, fuzzy #| msgid "Net price" msgid "Suggested price" msgstr "السعر الصافي" -#: pretix/base/models/items.py:512 pretix/base/models/items.py:1177 +#: pretix/base/models/items.py:517 pretix/base/models/items.py:1187 msgid "" "This price will be used as the default value of the input field. The user " "can choose a lower value, but not lower than the price this product would " @@ -5777,52 +5845,52 @@ msgid "" "used that lowers the price." msgstr "" -#: pretix/base/models/items.py:526 +#: pretix/base/models/items.py:531 msgid "Whether or not buying this product allows a person to enter your event" msgstr "سواء تم شراء هذا المنتج أم لا، سيسمح للشخص بدخول الفعالية الخاصة بك" -#: pretix/base/models/items.py:531 +#: pretix/base/models/items.py:536 #, fuzzy #| msgid "Is an admission ticket" msgid "Is a personalized ticket" msgstr "تذكرة دخول" -#: pretix/base/models/items.py:533 +#: pretix/base/models/items.py:538 #, fuzzy #| msgid "" #| "Whether or not buying this product allows a person to enter your event" msgid "Whether or not buying this product allows to enter attendee information" msgstr "سواء تم شراء هذا المنتج أم لا، سيسمح للشخص بدخول الفعالية الخاصة بك" -#: pretix/base/models/items.py:542 +#: pretix/base/models/items.py:547 msgid "Show a waiting list for this ticket" msgstr "عرض قائمة الانتظار لهذه التذكرة" -#: pretix/base/models/items.py:543 +#: pretix/base/models/items.py:548 msgid "This will only work if waiting lists are enabled for this event." msgstr "لن يعمل هذا إلا إذا تم تمكين قوائم الانتظار لهذه الفعالية." -#: pretix/base/models/items.py:547 pretix/base/settings.py:1591 +#: pretix/base/models/items.py:552 pretix/base/settings.py:1606 #: pretix/control/forms/event.py:1869 msgid "Show number of tickets left" msgstr "إظهار عدد التذاكر المتبقية" -#: pretix/base/models/items.py:548 +#: pretix/base/models/items.py:553 msgid "Publicly show how many tickets are still available." msgstr "أظهر للجمهور عدد التذاكر التي لا تزال متاحة." -#: pretix/base/models/items.py:555 pretix/control/forms/item.py:636 +#: pretix/base/models/items.py:560 pretix/control/forms/item.py:691 msgid "Product picture" msgstr "صورة المنتج" -#: pretix/base/models/items.py:584 +#: pretix/base/models/items.py:589 #, fuzzy #| msgid "Only show after sellout of" msgctxt "hidden_if_available_legacy" msgid "Only show after sellout of" msgstr "تظهر فقط بعد بيع" -#: pretix/base/models/items.py:585 +#: pretix/base/models/items.py:590 msgid "" "If you select a quota here, this product will only be shown when that quota " "is unavailable. If combined with the option to hide sold-out products, this " @@ -5836,11 +5904,11 @@ msgstr "" "فيها كلا المنتجين مرئيين بينما يتم حجز جميع التذاكر في الحصة المرجعية ، ولكن " "لم يتم بيعها بعد." -#: pretix/base/models/items.py:595 +#: pretix/base/models/items.py:600 msgid "Only show after sellout of" msgstr "تظهر فقط بعد بيع" -#: pretix/base/models/items.py:596 +#: pretix/base/models/items.py:601 #, fuzzy #| msgid "" #| "If you select a quota here, this product will only be shown when that " @@ -5865,7 +5933,7 @@ msgstr "" "فيها كلا المنتجين مرئيين بينما يتم حجز جميع التذاكر في الحصة المرجعية ، ولكن " "لم يتم بيعها بعد." -#: pretix/base/models/items.py:611 +#: pretix/base/models/items.py:616 msgid "" "To buy this product, the user needs a voucher that applies to this product " "either directly or via a quota." @@ -5873,7 +5941,7 @@ msgstr "" "لشراء هذا المنتج ، يحتاج المستخدم إلى كود خصم ينطبق على هذا المنتج إما " "مباشرة أو بواسطة حصة." -#: pretix/base/models/items.py:617 +#: pretix/base/models/items.py:622 msgid "" "If this product is part of an order, the order will be put into an " "\"approval\" state and will need to be confirmed by you before it can be " @@ -5884,7 +5952,7 @@ msgstr "" "عليك تأكيده قبل دفعه وإكماله. يمكنك استخدام هذا على سبيل المثال للتذاكر " "المخصومة المتوفرة فقط لمجموعات محددة." -#: pretix/base/models/items.py:624 +#: pretix/base/models/items.py:629 msgid "" "This product will be hidden from the event page until the user enters a " "voucher that unlocks this product." @@ -5892,7 +5960,7 @@ msgstr "" "سيتم إخفاء هذا المنتج من صفحة الفعالية حتى يقوم المستخدم بإدخال كود خصم يسمح " "بظهور هذا المنتج." -#: pretix/base/models/items.py:630 +#: pretix/base/models/items.py:635 msgid "" "If this option is set, the product will only be sold as part of bundle " "products. Do not check this option if you want to use this " @@ -5902,7 +5970,7 @@ msgstr "" "وليس حدد هذا الخيار إذا كنت تريد استخدام هذا المنتج كمنتج " "إضافي ، ينطبق ذلك على الحزم الثابتة فقط!" -#: pretix/base/models/items.py:637 +#: pretix/base/models/items.py:642 msgid "" "If this is checked, the usual cancellation and order change settings of this " "event apply. If this is unchecked, orders containing this product can not be " @@ -5912,7 +5980,7 @@ msgstr "" "لهذه الفعالية. وإذا لم يتم تحديده ، فلن يمكن إلغاء الطلبات التي تحتوي على " "هذا المنتج من قبل المستخدمين وإنما من قبلك أنت فقط." -#: pretix/base/models/items.py:644 +#: pretix/base/models/items.py:649 msgid "" "This product can only be bought if it is added to the cart at least this " "many times. If you keep the field empty or set it to 0, there is no special " @@ -5922,7 +5990,7 @@ msgstr "" "مرات. إذا احتفظت بالحقل فارغا أو قمت بتحديد قيمة 0 ، فلن يوجد حد خاص لهذا " "المنتج." -#: pretix/base/models/items.py:651 +#: pretix/base/models/items.py:656 msgid "" "This product can only be bought at most this many times within one order. If " "you keep the field empty or set it to 0, there is no special limit for this " @@ -5933,7 +6001,7 @@ msgstr "" "بالحقل فارغا أو قمت بتحديد قيمة 0 ، فلا يوجد حد خاص لهذا المنتج. وعلى كل حال " "يتم تطبيق الحد الأقصى لعدد العناصر في الطلب بالكامل." -#: pretix/base/models/items.py:658 pretix/base/models/items.py:1244 +#: pretix/base/models/items.py:663 pretix/base/models/items.py:1254 msgid "" "If you set this, the check-in app will show a visible warning that this " "ticket requires special attention. You can use this for example for student " @@ -5944,13 +6012,13 @@ msgstr "" "اهتماما خاصا. يمكنك استخدام هذا على سبيل المثال لتذاكر الطلاب لتنبيه موظف " "التسجيل أنه لابد من التحقق من بطاقة هوية الطالب قبل الدخول." -#: pretix/base/models/items.py:665 pretix/base/models/items.py:1251 +#: pretix/base/models/items.py:670 pretix/base/models/items.py:1261 msgid "" "This text will be shown by the check-in app if a ticket of this type is " "scanned." msgstr "" -#: pretix/base/models/items.py:671 pretix/base/models/items.py:1172 +#: pretix/base/models/items.py:676 pretix/base/models/items.py:1182 msgid "" "If set, this will be displayed next to the current price to show that the " "current price is a discounted one. This is just a cosmetic setting and will " @@ -5959,54 +6027,54 @@ msgstr "" "إذا تم تعيينه ، فسيتم عرضه بجوار السعر الحالي لإظهار أن السعر الحالي هو سعر " "مخفض. هذا مجرد إعداد شكلي ولن يؤثر فعليا على الأسعار." -#: pretix/base/models/items.py:681 +#: pretix/base/models/items.py:686 #, fuzzy #| msgid "Only sell tickets for this event on the following sales channels." msgid "Only sell tickets for this product on the selected sales channels." msgstr "قم ببيع التذاكر لهذه الفعالية فقط على قنوات البيع التالية." -#: pretix/base/models/items.py:686 +#: pretix/base/models/items.py:691 msgid "" "When a customer buys this product, they will get a gift card with a value " "corresponding to the product price." msgstr "" "عندما يشتري العميل هذا المنتج ، سيحصل على بطاقة هداية بقيمة تقابل سعر المنتج." -#: pretix/base/models/items.py:696 +#: pretix/base/models/items.py:701 msgid "Allowed membership types" msgstr "أنواع العضوية المسموح بها" -#: pretix/base/models/items.py:701 pretix/base/models/items.py:1200 +#: pretix/base/models/items.py:706 pretix/base/models/items.py:1210 msgid "" "Do not show this unless the customer is logged in and has a valid " "membership. Be aware that this means it will never be visible in the widget." msgstr "" -#: pretix/base/models/items.py:710 +#: pretix/base/models/items.py:715 msgid "This product creates a membership of type" msgstr "هذا المنتج يخلق عضوية من نوع" -#: pretix/base/models/items.py:713 +#: pretix/base/models/items.py:718 msgid "" "The duration of the membership is the same as the duration of the event or " "event series date" msgstr "مدة العضوية هي نفسها مدة الفعالية أو تاريخ سلسلة الفعالية" -#: pretix/base/models/items.py:717 +#: pretix/base/models/items.py:722 msgid "Membership duration in days" msgstr "مدة العضوية بالأيام" -#: pretix/base/models/items.py:721 +#: pretix/base/models/items.py:726 msgid "Membership duration in months" msgstr "مدة العضوية بالأشهر" -#: pretix/base/models/items.py:728 +#: pretix/base/models/items.py:733 #, fuzzy #| msgid "Valid until" msgid "Validity" msgstr "حتى تاريخ" -#: pretix/base/models/items.py:730 +#: pretix/base/models/items.py:735 msgid "" "When setting up a regular event, or an event series with time slots, you " "typically do NOT need to change this value. The default setting means that " @@ -6018,67 +6086,67 @@ msgid "" "change but keep their current validity." msgstr "" -#: pretix/base/models/items.py:738 pretix/control/forms/item.py:739 +#: pretix/base/models/items.py:743 pretix/control/forms/item.py:794 #, fuzzy #| msgid "Gift card validity" msgid "Start of validity" msgstr "صلاحية بطاقة هدية" -#: pretix/base/models/items.py:739 +#: pretix/base/models/items.py:744 #, fuzzy #| msgid "End of presale" msgid "End of validity" msgstr "نهاية عرض ما قبل البيع" -#: pretix/base/models/items.py:742 +#: pretix/base/models/items.py:747 #, fuzzy #| msgid "minutes" msgid "Minutes" msgstr "الدقائق" -#: pretix/base/models/items.py:746 +#: pretix/base/models/items.py:751 msgid "Hours" msgstr "" -#: pretix/base/models/items.py:750 +#: pretix/base/models/items.py:755 msgid "Days" msgstr "" -#: pretix/base/models/items.py:754 +#: pretix/base/models/items.py:759 #, fuzzy #| msgid "Month" msgid "Months" msgstr "شهر" -#: pretix/base/models/items.py:757 +#: pretix/base/models/items.py:762 #, fuzzy #| msgid "Customers can cancel their paid orders" msgid "Customers can select the validity start date" msgstr "يمكن للعملاء إلغاء طلباتهم المدفوعة" -#: pretix/base/models/items.py:758 +#: pretix/base/models/items.py:763 msgid "If not selected, the validity always starts at the time of purchase." msgstr "" -#: pretix/base/models/items.py:763 +#: pretix/base/models/items.py:768 #, fuzzy #| msgid "Maximum order total" msgid "Maximum future start" msgstr "الحد الأقصى لإجمالي الطلب" -#: pretix/base/models/items.py:764 +#: pretix/base/models/items.py:769 #, fuzzy #| msgid "The selected date does not exist in this event series." msgid "The selected start date may only be this many days in the future." msgstr "التاريخ المحدد غير موجود في سلسلة الفعاليات هذه." -#: pretix/base/models/items.py:770 +#: pretix/base/models/items.py:775 msgid "Reusable media policy" msgstr "" -#: pretix/base/models/items.py:772 +#: pretix/base/models/items.py:777 msgid "" -"If this product should be stored on a re-usable physical medium, you can " +"If this product should be stored on a reusable physical medium, you can " "attach a physical media policy. This is not required for regular tickets, " "which just use a one-time barcode, but only for products like renewable " "season tickets or re-chargeable gift card wristbands. This is an advanced " @@ -6086,80 +6154,87 @@ msgid "" "settings." msgstr "" -#: pretix/base/models/items.py:782 +#: pretix/base/models/items.py:787 msgid "Reusable media type" msgstr "" -#: pretix/base/models/items.py:784 +#: pretix/base/models/items.py:789 msgid "" "Select the type of physical medium that should be used for this product. " "Note that not all media types support all types of products, and not all " "media types are supported across all sales channels or check-in processes." msgstr "" -#: pretix/base/models/items.py:989 +#: pretix/base/models/items.py:994 msgid "" "If you select a reusable media policy, you also need to select a reusable " "media type." msgstr "" -#: pretix/base/models/items.py:993 +#: pretix/base/models/items.py:998 #, fuzzy #| msgid "The selected product is not active or has no price set." msgid "The selected media type is not enabled in your organizer settings." msgstr "المنتج المحدد غير نشط أو ليس له سعر محدد." -#: pretix/base/models/items.py:995 +#: pretix/base/models/items.py:1000 #, fuzzy #| msgid "The selected item does not belong to this event." msgid "The selected media type does not support usage for tickets currently." msgstr "العنصر المحدد لا ينتمي إلى هذه الفعالية." -#: pretix/base/models/items.py:997 +#: pretix/base/models/items.py:1002 #, fuzzy #| msgid "The selected item does not belong to this event." msgid "" "The selected media type does not support usage for gift cards currently." msgstr "العنصر المحدد لا ينتمي إلى هذه الفعالية." -#: pretix/base/models/items.py:999 +#: pretix/base/models/items.py:1005 +msgid "" +"The selected media type requires all media to be registered in the system " +"prior to their usage. Therefore, the selected media policy does not make " +"sense for this media type." +msgstr "" + +#: pretix/base/models/items.py:1009 msgid "" "You currently cannot create gift cards with a reusable media policy. " "Instead, gift cards for some reusable media types can be created or re-" "charged directly at the POS." msgstr "" -#: pretix/base/models/items.py:1007 +#: pretix/base/models/items.py:1017 msgid "" "The maximum number per order can not be lower than the minimum number per " "order." msgstr "لا يمكن أن يكون العدد الأقصى لكل طلب أقل من العدد الأدنى للطلب." -#: pretix/base/models/items.py:1013 +#: pretix/base/models/items.py:1023 msgid "The item's category must belong to the same event as the item." msgstr "يجب أن تنتمي فئة العنصر إلى نفس فعالية العنصر." -#: pretix/base/models/items.py:1018 +#: pretix/base/models/items.py:1028 msgid "The item's tax rule must belong to the same event as the item." msgstr "" "يجب أن تنتمي القاعدة الضريبية للعنصر إلى نفس الفعالية التي ينتمي إليها " "العنصر." -#: pretix/base/models/items.py:1024 +#: pretix/base/models/items.py:1034 msgid "The item's availability cannot end before it starts." msgstr "لا يمكن أن ينتهي توفر العنصر قبل أن يبدأ." -#: pretix/base/models/items.py:1156 +#: pretix/base/models/items.py:1166 msgid "This is shown below the variation name in lists." msgstr "يظهر هذا في القوائم أسفل اسم العنصر." -#: pretix/base/models/items.py:1183 +#: pretix/base/models/items.py:1193 #, fuzzy #| msgid "New order requires approval" msgid "Require approval" msgstr "طلب جديد يتطلب الموافقة." -#: pretix/base/models/items.py:1185 +#: pretix/base/models/items.py:1195 #, fuzzy #| msgid "" #| "If this product is part of an order, the order will be put into an " @@ -6176,36 +6251,36 @@ msgstr "" "عليك تأكيده قبل دفعه وإكماله. يمكنك استخدام هذا على سبيل المثال للتذاكر " "المخصومة المتوفرة فقط لمجموعات محددة." -#: pretix/base/models/items.py:1195 pretix/control/navigation.py:618 +#: pretix/base/models/items.py:1205 pretix/control/navigation.py:618 #: pretix/control/templates/pretixcontrol/organizers/membershiptypes.html:4 #: pretix/control/templates/pretixcontrol/organizers/membershiptypes.html:6 msgid "Membership types" msgstr "أنواع العضوية" -#: pretix/base/models/items.py:1207 +#: pretix/base/models/items.py:1217 #, fuzzy #| msgid "This product will not be sold before the given date." msgid "This variation will not be sold before the given date." msgstr "لن يتم بيع هذا المنتج قبل التاريخ المعين." -#: pretix/base/models/items.py:1217 +#: pretix/base/models/items.py:1227 #, fuzzy #| msgid "This product will not be sold after the given date." msgid "This variation will not be sold after the given date." msgstr "لن يتم بيع هذا المنتج بعد التاريخ المحدد." -#: pretix/base/models/items.py:1225 +#: pretix/base/models/items.py:1235 msgid "Sell on all sales channels the product is sold on" msgstr "" -#: pretix/base/models/items.py:1231 +#: pretix/base/models/items.py:1241 msgid "" "The sales channel selection for the product as a whole takes precedence, so " "if a sales channel is selected here but not on product level, the variation " "will not be available." msgstr "" -#: pretix/base/models/items.py:1236 +#: pretix/base/models/items.py:1246 #, fuzzy #| msgid "" #| "This product will only be shown if a voucher matching the product is " @@ -6213,7 +6288,7 @@ msgstr "" msgid "Show only if a matching voucher is redeemed." msgstr "سيظهر هذا المنتج فقط في حالة استرداد كود خصم مطابقة للمنتج." -#: pretix/base/models/items.py:1238 +#: pretix/base/models/items.py:1248 #, fuzzy #| msgid "" #| "This product will be hidden from the event page until the user enters a " @@ -6225,24 +6300,24 @@ msgstr "" "سيتم إخفاء هذا المنتج من صفحة الفعالية حتى يقوم المستخدم بإدخال كود خصم يسمح " "بظهور هذا المنتج." -#: pretix/base/models/items.py:1258 +#: pretix/base/models/items.py:1268 #: pretix/control/templates/pretixcontrol/item/create.html:111 msgid "Product variations" msgstr "أنواع المنتج" -#: pretix/base/models/items.py:1463 +#: pretix/base/models/items.py:1473 msgid "Minimum number" msgstr "العدد الأدنى" -#: pretix/base/models/items.py:1467 +#: pretix/base/models/items.py:1477 msgid "Maximum number" msgstr "العدد الأقصى" -#: pretix/base/models/items.py:1471 +#: pretix/base/models/items.py:1481 msgid "Add-Ons are included in the price" msgstr "تم تضمين قائمة الإضافات في السعر" -#: pretix/base/models/items.py:1472 +#: pretix/base/models/items.py:1482 msgid "" "If selected, adding add-ons to this ticket is free, even if the add-ons " "would normally cost money individually." @@ -6250,44 +6325,44 @@ msgstr "" "إذا تم تحديده ، فإن إضافة القوائم الإضافية إلى هذه التذكرة سيكون مجانيا، حتى " "لو كانت الإضافات تكلف مبالغا إن كانت بشكل فردي." -#: pretix/base/models/items.py:1477 +#: pretix/base/models/items.py:1487 msgid "Allow the same product to be selected multiple times" msgstr "اسمح لنفس المنتج أن يتم اختياره عدة مرات" -#: pretix/base/models/items.py:1496 +#: pretix/base/models/items.py:1506 msgid "The add-on's category must belong to the same event as the item." msgstr "" "يجب أن تنتمي فئة قائمة الإضافة إلى نفس الفعالية كما هو الحال مع العنصر." -#: pretix/base/models/items.py:1501 +#: pretix/base/models/items.py:1511 msgid "The item already has an add-on of this category." msgstr "العنصر يحتوي مسبقا على قائمة إضافة من هذه الفئة." -#: pretix/base/models/items.py:1506 +#: pretix/base/models/items.py:1516 msgid "The minimum count needs to be equal to or greater than zero." msgstr "يجب أن يكون الحد الأدنى للعدد مساويا أو أكبر من الصفر." -#: pretix/base/models/items.py:1511 +#: pretix/base/models/items.py:1521 msgid "The maximum count needs to be equal to or greater than zero." msgstr "يجب أن يكون الحد الأقصى للعدد مساويا للصفر أو أكبر منه." -#: pretix/base/models/items.py:1516 +#: pretix/base/models/items.py:1526 msgid "The maximum count needs to be greater than the minimum count." msgstr "يجب أن يكون الحد الأقصى للعدد أكبر من الحد الأدنى للعد." -#: pretix/base/models/items.py:1543 +#: pretix/base/models/items.py:1553 msgid "Bundled item" msgstr "عنصر تم تجميعه" -#: pretix/base/models/items.py:1549 +#: pretix/base/models/items.py:1559 msgid "Bundled variation" msgstr "صيغة تم تجميعها" -#: pretix/base/models/items.py:1560 +#: pretix/base/models/items.py:1570 msgid "Designated price part" msgstr "جزء السعر المحدد" -#: pretix/base/models/items.py:1561 +#: pretix/base/models/items.py:1571 msgid "" "If set, it will be shown that this bundled item is responsible for the given " "value of the total gross price. This might be important in cases of mixed " @@ -6298,61 +6373,61 @@ msgstr "" "الإجمالي الكلي. قد يكون هذا مهما في حالات الضرائب المختلطة، ولكن يمكن أن تظل " "فارغة. لن يتم إضافة هذه القيمة إلى سعر العنصر الأساسي." -#: pretix/base/models/items.py:1584 +#: pretix/base/models/items.py:1594 msgid "The bundled item must belong to the same event as the item." msgstr "يجب أن ينتمي العنصر المجمع إلى نفس فعالية العنصر." -#: pretix/base/models/items.py:1586 +#: pretix/base/models/items.py:1596 msgid "A variation needs to be set for this item." msgstr "يجب تعيين نوع لهذا العنصر." -#: pretix/base/models/items.py:1588 +#: pretix/base/models/items.py:1598 msgid "The chosen variation does not belong to this item." msgstr "النوع الذي تم اختياره لا ينتمي إلى هذا العنصر." -#: pretix/base/models/items.py:1593 +#: pretix/base/models/items.py:1603 msgid "The count needs to be equal to or greater than zero." msgstr "يجب أن يكون العدد مساويا للصفر أو أكبر منه." -#: pretix/base/models/items.py:1648 +#: pretix/base/models/items.py:1658 msgid "Number" msgstr "رقم" -#: pretix/base/models/items.py:1649 +#: pretix/base/models/items.py:1659 msgid "Text (one line)" msgstr "نص (سطر واحد)" -#: pretix/base/models/items.py:1650 +#: pretix/base/models/items.py:1660 msgid "Multiline text" msgstr "نص متعدد الأسطر" -#: pretix/base/models/items.py:1651 +#: pretix/base/models/items.py:1661 msgid "Yes/No" msgstr "نعم / لا" -#: pretix/base/models/items.py:1652 +#: pretix/base/models/items.py:1662 msgid "Choose one from a list" msgstr "قم باختيار واحد من قائمة" -#: pretix/base/models/items.py:1653 +#: pretix/base/models/items.py:1663 msgid "Choose multiple from a list" msgstr "قم بعدة اختيارات من قائمة" -#: pretix/base/models/items.py:1654 +#: pretix/base/models/items.py:1664 msgid "File upload" msgstr "تحميل الملف" -#: pretix/base/models/items.py:1657 +#: pretix/base/models/items.py:1667 #: pretix/control/templates/pretixcontrol/event/settings.html:240 msgid "Date and time" msgstr "التاريخ و الوقت" -#: pretix/base/models/items.py:1658 +#: pretix/base/models/items.py:1668 msgid "Country code (ISO 3166-1 alpha-2)" msgstr "رمز البلد (ISO 3166-1 alpha-2)" -#: pretix/base/models/items.py:1681 pretix/base/models/items.py:1957 -#: pretix/base/models/organizer.py:647 +#: pretix/base/models/items.py:1691 pretix/base/models/items.py:1967 +#: pretix/base/models/organizer.py:654 #, fuzzy #| msgid "The property name may only contain letters, numbers and underscores." msgid "" @@ -6360,82 +6435,82 @@ msgid "" "underscores." msgstr "لا يسمح أن يحتوي اسم الملكية إلا على أحرف وأرقام وشرطات سفلية فقط." -#: pretix/base/models/items.py:1686 +#: pretix/base/models/items.py:1696 msgid "Help text" msgstr "نص للمساعدة" -#: pretix/base/models/items.py:1687 +#: pretix/base/models/items.py:1697 msgid "If the question needs to be explained or clarified, do it here!" msgstr "إذا كان السؤال بحاجة إلى شرح أو توضيح ، فقم ذلك هنا!" -#: pretix/base/models/items.py:1693 +#: pretix/base/models/items.py:1703 msgid "Question type" msgstr "نوع السؤال" -#: pretix/base/models/items.py:1697 +#: pretix/base/models/items.py:1707 #: pretix/control/templates/pretixcontrol/items/questions.html:59 msgid "Required question" msgstr "سؤال مطلوب" -#: pretix/base/models/items.py:1704 +#: pretix/base/models/items.py:1714 msgid "This question will be asked to buyers of the selected products" msgstr "سيتم طرح هذا السؤال على مشتري المنتجات المختارة" -#: pretix/base/models/items.py:1711 +#: pretix/base/models/items.py:1721 msgid "Ask during check-in instead of in the ticket buying process" msgstr "اسأل أثناء التسجيل بدلا من السؤال أثناء عملية شراء التذكرة" -#: pretix/base/models/items.py:1712 pretix/base/models/items.py:1717 +#: pretix/base/models/items.py:1722 pretix/base/models/items.py:1727 msgid "Not supported by all check-in apps for all question types." msgstr "غير مدعوم من قبل جميع تطبيقات التسجيل لجميع أنواع الأسئلة." -#: pretix/base/models/items.py:1716 +#: pretix/base/models/items.py:1726 #, fuzzy #| msgid "Ask during check-in" msgid "Show answer during check-in" msgstr "طرح خلال التسجيل في مكتب الاستقبال" -#: pretix/base/models/items.py:1721 +#: pretix/base/models/items.py:1731 #: pretix/control/templates/pretixcontrol/items/questions.html:70 msgid "Hidden question" msgstr "سؤال مخفي" -#: pretix/base/models/items.py:1722 +#: pretix/base/models/items.py:1732 msgid "This question will only show up in the backend." msgstr "سيظهر هذا السؤال في لوحة التحكم فقط." -#: pretix/base/models/items.py:1726 +#: pretix/base/models/items.py:1736 msgid "Print answer on invoices" msgstr "طباعة الجواب على الفواتير" -#: pretix/base/models/items.py:1734 pretix/base/models/items.py:1740 -#: pretix/base/models/items.py:1746 +#: pretix/base/models/items.py:1744 pretix/base/models/items.py:1750 +#: pretix/base/models/items.py:1756 msgid "Minimum value" msgstr "الحد الأدنى للقيمة" -#: pretix/base/models/items.py:1735 pretix/base/models/items.py:1738 -#: pretix/base/models/items.py:1741 pretix/base/models/items.py:1744 -#: pretix/base/models/items.py:1747 pretix/base/models/items.py:1750 -#: pretix/base/models/items.py:1754 +#: pretix/base/models/items.py:1745 pretix/base/models/items.py:1748 +#: pretix/base/models/items.py:1751 pretix/base/models/items.py:1754 +#: pretix/base/models/items.py:1757 pretix/base/models/items.py:1760 +#: pretix/base/models/items.py:1764 msgid "Currently not supported in our apps and during check-in" msgstr "غير مدعوم حاليا في تطبيقاتنا وأثناء التسجيل" -#: pretix/base/models/items.py:1737 pretix/base/models/items.py:1743 -#: pretix/base/models/items.py:1749 +#: pretix/base/models/items.py:1747 pretix/base/models/items.py:1753 +#: pretix/base/models/items.py:1759 msgid "Maximum value" msgstr "القيمة القصوى" -#: pretix/base/models/items.py:1752 +#: pretix/base/models/items.py:1762 #, fuzzy #| msgid "Maximum value" msgid "Maximum length" msgstr "القيمة القصوى" -#: pretix/base/models/items.py:1758 +#: pretix/base/models/items.py:1768 msgid "Validate file to be a portrait" msgstr "تحقق من صحة الملف ليكون صورة" -#: pretix/base/models/items.py:1759 +#: pretix/base/models/items.py:1769 msgid "" "If checked, files must be images with an aspect ratio of 3:4. This is " "commonly used for photos printed on badges." @@ -6443,59 +6518,59 @@ msgstr "" "إذا تم تحديده ، يجب أن تكون الملفات صورا بنسبة عرض إلى ارتفاع 3:4. يستخدم " "هذا بشكل شائع للصور المطبوعة على الشارات." -#: pretix/base/models/items.py:1814 +#: pretix/base/models/items.py:1824 msgid "An answer to this question is required to proceed." msgstr "مطلوب إجابة على هذا السؤال للمتابعة." -#: pretix/base/models/items.py:1824 +#: pretix/base/models/items.py:1834 #, fuzzy #| msgid "Invalid input data." msgid "Invalid input type." msgstr "بيانات الإدخال غير صالحة." -#: pretix/base/models/items.py:1858 +#: pretix/base/models/items.py:1868 msgid "The number is to low." msgstr "الرقم أقبل من المطلوب." -#: pretix/base/models/items.py:1860 +#: pretix/base/models/items.py:1870 msgid "The number is to high." msgstr "الرقم أعلى من المطلوب." -#: pretix/base/models/items.py:1863 +#: pretix/base/models/items.py:1873 msgid "Invalid number input." msgstr "إدخال رقم غير صحيح." -#: pretix/base/models/items.py:1870 pretix/base/models/items.py:1894 +#: pretix/base/models/items.py:1880 pretix/base/models/items.py:1904 msgid "Please choose a later date." msgstr "الرجاء اختيار تاريخ لاحق." -#: pretix/base/models/items.py:1872 pretix/base/models/items.py:1896 +#: pretix/base/models/items.py:1882 pretix/base/models/items.py:1906 msgid "Please choose an earlier date." msgstr "الرجاء اختيار تاريخ سابق." -#: pretix/base/models/items.py:1875 +#: pretix/base/models/items.py:1885 msgid "Invalid date input." msgstr "إدخال تاريخ غير صحيح." -#: pretix/base/models/items.py:1882 +#: pretix/base/models/items.py:1892 msgid "Invalid time input." msgstr "إدخال وقت غير صحيح." -#: pretix/base/models/items.py:1891 +#: pretix/base/models/items.py:1901 msgid "Invalid datetime input." msgstr "إدخال تاريخ ووقت غير صالح." -#: pretix/base/models/items.py:1903 +#: pretix/base/models/items.py:1913 msgid "Unknown country code." msgstr "رمز الدولة غير معروف." -#: pretix/base/models/items.py:1921 pretix/base/models/items.py:1923 +#: pretix/base/models/items.py:1931 pretix/base/models/items.py:1933 #, fuzzy #| msgid "The maximum count needs to be greater than the minimum count." msgid "The maximum date must not be before the minimum value." msgstr "يجب أن يكون الحد الأقصى للعدد أكبر من الحد الأدنى للعد." -#: pretix/base/models/items.py:1925 +#: pretix/base/models/items.py:1935 #, fuzzy #| msgid "" #| "The maximum number per order can not be lower than the minimum number per " @@ -6503,57 +6578,59 @@ msgstr "يجب أن يكون الحد الأقصى للعدد أكبر من ال msgid "The maximum value must not be lower than the minimum value." msgstr "لا يمكن أن يكون العدد الأقصى لكل طلب أقل من العدد الأدنى للطلب." -#: pretix/base/models/items.py:1943 +#: pretix/base/models/items.py:1953 msgid "" "The system already contains answers to this question that are not compatible " "with changing the type of question without data loss. Consider hiding this " "question and creating a new one instead." msgstr "" -#: pretix/base/models/items.py:1961 +#: pretix/base/models/items.py:1971 #: pretix/control/templates/pretixcontrol/items/question.html:87 msgid "Answer" msgstr "إجابة" -#: pretix/base/models/items.py:1985 +#: pretix/base/models/items.py:1995 #, python-brace-format msgid "The identifier \"{}\" is already used for a different option." msgstr "المعرف \"{}\" مستخدم سابقا لخيار مختلف." -#: pretix/base/models/items.py:1988 +#: pretix/base/models/items.py:1998 msgid "Question option" msgstr "خيار السؤال" -#: pretix/base/models/items.py:1989 +#: pretix/base/models/items.py:1999 msgid "Question options" msgstr "خيارات السؤال" -#: pretix/base/models/items.py:2074 pretix/control/forms/event.py:1903 -#: pretix/control/templates/pretixcontrol/items/quotas.html:60 +#: pretix/base/models/items.py:2084 pretix/control/forms/event.py:1903 +#: pretix/control/templates/pretixcontrol/items/quotas.html:104 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:83 msgid "Total capacity" msgstr "السعة الإجمالية" -#: pretix/base/models/items.py:2076 pretix/control/forms/item.py:457 +#: pretix/base/models/items.py:2086 pretix/control/forms/item.py:512 msgid "Leave empty for an unlimited number of tickets." msgstr "اتركه فارغا لعدد غير محدود من التذاكر." -#: pretix/base/models/items.py:2080 pretix/base/models/orders.py:1494 -#: pretix/base/models/orders.py:3033 +#: pretix/base/models/items.py:2090 pretix/base/models/orders.py:1516 +#: pretix/base/models/orders.py:3055 #: pretix/control/templates/pretixcontrol/checkin/index.html:97 msgid "Item" msgstr "بند" -#: pretix/base/models/items.py:2088 pretix/control/forms/item.py:918 +#: pretix/base/models/items.py:2098 pretix/control/forms/item.py:973 #: pretix/plugins/autocheckin/models.py:74 msgid "Variations" msgstr "متغيرات" -#: pretix/base/models/items.py:2092 -#: pretix/control/templates/pretixcontrol/items/quotas.html:74 +#: pretix/base/models/items.py:2102 +#: pretix/control/templates/pretixcontrol/items/quotas.html:135 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:96 msgid "Ignore this quota when determining event availability" msgstr "تجاهل هذه الحصة إذا أردت تحديد مدى توفر الفعالية" -#: pretix/base/models/items.py:2093 +#: pretix/base/models/items.py:2103 msgid "" "If you enable this, this quota will be ignored when determining event " "availability in your event calendar. This is useful e.g. for merchandise " @@ -6564,11 +6641,11 @@ msgstr "" "تقويم الفعالية الخاص بك. قد يفيد هذا في حالات مثل المشتريات المضافة إلى كل " "فعالية ولكنه يجب ألا يمنع ظهور حالة الفعالية إذا كانت غير متوفرة." -#: pretix/base/models/items.py:2100 +#: pretix/base/models/items.py:2110 msgid "Close this quota permanently once it is sold out" msgstr "أغلق هذه الحصة بشكل دائم بمجرد بيعها" -#: pretix/base/models/items.py:2101 +#: pretix/base/models/items.py:2111 msgid "" "If you enable this, when the quota is sold out once, no more tickets will be " "sold, even if tickets become available again through cancellations or " @@ -6578,11 +6655,11 @@ msgstr "" "التذاكر ، حتى إذا أصبحت التذاكر متاحة مرة أخرى من خلال الإلغاء أو الطلبات " "المنتهية الصلاحية. بالطبع ، يمكنك دائما إعادة الفتح يدويا." -#: pretix/base/models/items.py:2109 +#: pretix/base/models/items.py:2119 msgid "Allow to sell more tickets once people have checked out" msgstr "السماح ببيع المزيد من التذاكر بمجرد قيام الأشخاص بتسجيل الخروج" -#: pretix/base/models/items.py:2110 +#: pretix/base/models/items.py:2120 msgid "" "With this option, quota will be released as soon as people are scanned at an " "exit of your event. This will only happen if they have been scanned both at " @@ -6597,20 +6674,21 @@ msgstr "" "يتم تجاهل قوائم التسجيل إذا تم ضبطها على \"السماح بإعادة الدخول بعد فحص " "الخروج\" لمنع الحجز الزائد غير المقصود." -#: pretix/base/models/items.py:2122 pretix/control/navigation.py:169 -#: pretix/control/templates/pretixcontrol/items/quotas.html:4 -#: pretix/control/templates/pretixcontrol/items/quotas.html:6 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:416 +#: pretix/base/models/items.py:2132 pretix/control/navigation.py:169 +#: pretix/control/templates/pretixcontrol/items/quotas.html:5 +#: pretix/control/templates/pretixcontrol/items/quotas.html:7 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:418 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:185 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:59 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:76 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:59 msgid "Quotas" msgstr "الحصص" -#: pretix/base/models/items.py:2195 +#: pretix/base/models/items.py:2205 msgid "All variations must belong to an item contained in the items list." msgstr "يجب أن تنتمي جميع الأنواع إلى عنصر موجود في قائمة العناصر." -#: pretix/base/models/items.py:2206 +#: pretix/base/models/items.py:2216 msgid "" "One or more items has variations but none of these are in the variations " "list." @@ -6618,23 +6696,23 @@ msgstr "" "يحتوي عنصر واحد أو أكثر على أشكال مختلفة ولكن لا يوجد أي منها في قائمة " "المتغيرات." -#: pretix/base/models/items.py:2212 pretix/base/models/waitinglist.py:304 +#: pretix/base/models/items.py:2222 pretix/base/models/waitinglist.py:304 msgid "Subevent cannot be null for event series." msgstr "لا يمكن أن تكون الفعالية الفرعية في سلسلة الفعاليات غير معرفة." -#: pretix/base/models/items.py:2248 +#: pretix/base/models/items.py:2258 #, fuzzy #| msgid "Required for events" msgid "Required for products" msgstr "مطلوب للفعاليات" -#: pretix/base/models/items.py:2249 +#: pretix/base/models/items.py:2259 msgid "" "If checked, this property must be set in each product. Does not apply if a " "default value is set." msgstr "" -#: pretix/base/models/items.py:2254 +#: pretix/base/models/items.py:2264 msgid "" "If you keep this empty, any value is allowed. Otherwise, enter one possible " "value per line." @@ -6642,13 +6720,13 @@ msgstr "" "إذا أبقيت هذا فارغا ، فسيتم السماح بأي قيمة. وإلا ، أدخل قيمة واحدة محتملة " "في كل سطر." -#: pretix/base/models/items.py:2311 +#: pretix/base/models/items.py:2323 #, fuzzy #| msgid "Start date" msgid "Start" msgstr "تاريخ البداية" -#: pretix/base/models/items.py:2312 +#: pretix/base/models/items.py:2324 #: pretix/plugins/reports/accountingreport.py:129 #, fuzzy #| msgid "Enabled" @@ -6700,6 +6778,29 @@ msgstr "حاضر" msgid "bounced" msgstr "" +#: pretix/base/models/media.py:77 +msgctxt "reusable_medium" +msgid "Claim token" +msgstr "" + +#: pretix/base/models/media.py:82 +msgctxt "reusable_medium" +msgid "Label" +msgstr "" + +#: pretix/base/models/media.py:105 +#, fuzzy +#| msgid "Info text" +msgid "Linked tickets" +msgstr "معلومات النص" + +#: pretix/base/models/media.py:107 +msgid "" +"If you link to more than one ticket, make sure there is no overlap in " +"validity. If multiple tickets are valid at once, this will lead to failed " +"check-ins." +msgstr "" + #: pretix/base/models/memberships.py:44 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:28 msgid "Membership is transferable" @@ -6760,12 +6861,12 @@ msgid "pending" msgstr "معلق" #: pretix/base/models/orders.py:202 pretix/base/payment.py:570 -#: pretix/base/services/invoices.py:593 +#: pretix/base/services/invoices.py:607 msgid "paid" msgstr "مدفوع" -#: pretix/base/models/orders.py:203 pretix/control/forms/filter.py:1730 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:35 +#: pretix/base/models/orders.py:203 pretix/control/forms/filter.py:1863 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:47 msgid "expired" msgstr "منتهي الصلاحية" @@ -6811,7 +6912,7 @@ msgid "" "scanned." msgstr "سيظهر هذا النص في أعلى نموذج عنوان الفاتورة أثناء تسجيل الخروج." -#: pretix/base/models/orders.py:300 pretix/base/models/orders.py:1534 +#: pretix/base/models/orders.py:300 pretix/base/models/orders.py:1556 msgid "Meta information" msgstr "المعلومات الوصفية" @@ -6821,25 +6922,25 @@ msgstr "المعلومات الوصفية" msgid "API meta information" msgstr "المعلومات الوصفية" -#: pretix/base/models/orders.py:418 pretix/plugins/sendmail/forms.py:236 +#: pretix/base/models/orders.py:440 pretix/plugins/sendmail/forms.py:236 #: pretix/plugins/sendmail/forms.py:389 pretix/plugins/sendmail/views.py:269 msgid "approval pending" msgstr "في انتظار الموافقة" -#: pretix/base/models/orders.py:420 +#: pretix/base/models/orders.py:442 #, fuzzy #| msgid "Pending (overdue)" msgctxt "order state" msgid "pending (confirmed)" msgstr "في انتظار (تأخر)" -#: pretix/base/models/orders.py:422 +#: pretix/base/models/orders.py:444 #, fuzzy #| msgid "Canceled (paid fee)" msgid "canceled (paid fee)" msgstr "إلغاء (الرسوم المدفوعة)" -#: pretix/base/models/orders.py:1035 +#: pretix/base/models/orders.py:1057 msgid "" "The payment can not be accepted as the last date of payments configured in " "the payment settings is over." @@ -6847,7 +6948,7 @@ msgstr "" "لا يمكن قبول الدفع نظرا لانتهاء آخر تاريخ للدفعات التي تم إعداده في إعدادات " "السداد." -#: pretix/base/models/orders.py:1037 +#: pretix/base/models/orders.py:1059 msgid "" "The payment can not be accepted as the order is expired and you configured " "that no late payments should be accepted in the payment settings." @@ -6855,124 +6956,124 @@ msgstr "" "لا يمكن قبول الدفع نظرا لانتهاء صلاحية الطلب ولاختيارك عدم قبول المدفوعات " "المتأخرة في إعدادات السداد." -#: pretix/base/models/orders.py:1039 +#: pretix/base/models/orders.py:1061 msgid "This order is not yet approved by the event organizer." msgstr "لم تتم الموافقة على هذا الطلب بعد من قبل منظم الفعالية." -#: pretix/base/models/orders.py:1064 +#: pretix/base/models/orders.py:1086 #, python-brace-format msgid "The ordered product \"{item}\" is no longer available." msgstr "المنتج المطلوب \"{item}\" لم يعد متاحا." -#: pretix/base/models/orders.py:1065 +#: pretix/base/models/orders.py:1087 #, python-brace-format msgid "The seat \"{seat}\" is no longer available." msgstr "المقعد \"{seat}\" لم يعد متاحا." -#: pretix/base/models/orders.py:1066 +#: pretix/base/models/orders.py:1088 #, python-brace-format msgid "The voucher \"{voucher}\" no longer has sufficient budget." msgstr "كود خصم \"{voucher}\" لم يعد به ميزانية كافية." -#: pretix/base/models/orders.py:1067 +#: pretix/base/models/orders.py:1089 #, python-brace-format msgid "The voucher \"{voucher}\" has been used in the meantime." msgstr "يتم استخدام كود الخصم \"{voucher}\"في هذه الأثناء." -#: pretix/base/models/orders.py:1395 +#: pretix/base/models/orders.py:1417 msgid "" msgstr "" -#: pretix/base/models/orders.py:1514 pretix/base/models/orders.py:1522 +#: pretix/base/models/orders.py:1536 pretix/base/models/orders.py:1544 msgid "Empty, if this product is not an admission ticket" msgstr "فارغ ، إذا لم يكن هذا المنتج تذكرة دخول" -#: pretix/base/models/orders.py:1731 +#: pretix/base/models/orders.py:1753 msgctxt "payment_state" msgid "created" msgstr "تم إنشاؤه" -#: pretix/base/models/orders.py:1732 +#: pretix/base/models/orders.py:1754 msgctxt "payment_state" msgid "pending" msgstr "قيد الانتظار" -#: pretix/base/models/orders.py:1733 +#: pretix/base/models/orders.py:1755 msgctxt "payment_state" msgid "confirmed" msgstr "تم التأكيد" -#: pretix/base/models/orders.py:1734 +#: pretix/base/models/orders.py:1756 msgctxt "payment_state" msgid "canceled" msgstr "ملغي" -#: pretix/base/models/orders.py:1735 +#: pretix/base/models/orders.py:1757 msgctxt "payment_state" msgid "failed" msgstr "فشل" -#: pretix/base/models/orders.py:1736 +#: pretix/base/models/orders.py:1758 msgctxt "payment_state" msgid "refunded" msgstr "تم الاسترداد" -#: pretix/base/models/orders.py:1764 pretix/base/models/orders.py:2193 +#: pretix/base/models/orders.py:1786 pretix/base/models/orders.py:2215 #: pretix/base/shredder.py:637 msgid "Payment information" msgstr "معلومات الدفع" -#: pretix/base/models/orders.py:2134 +#: pretix/base/models/orders.py:2156 msgctxt "refund_state" msgid "started externally" msgstr "بدأ من الخارج" -#: pretix/base/models/orders.py:2135 +#: pretix/base/models/orders.py:2157 msgctxt "refund_state" msgid "created" msgstr "تم الإنشاء" -#: pretix/base/models/orders.py:2136 +#: pretix/base/models/orders.py:2158 msgctxt "refund_state" msgid "in transit" msgstr "قيد الإرسال" -#: pretix/base/models/orders.py:2137 +#: pretix/base/models/orders.py:2159 msgctxt "refund_state" msgid "done" msgstr "منجز" -#: pretix/base/models/orders.py:2138 +#: pretix/base/models/orders.py:2160 msgctxt "refund_state" msgid "failed" msgstr "فشل" -#: pretix/base/models/orders.py:2140 +#: pretix/base/models/orders.py:2162 msgctxt "refund_state" msgid "canceled" msgstr "ألغيت" -#: pretix/base/models/orders.py:2148 +#: pretix/base/models/orders.py:2170 msgctxt "refund_source" msgid "Organizer" msgstr "منظم" -#: pretix/base/models/orders.py:2149 +#: pretix/base/models/orders.py:2171 msgctxt "refund_source" msgid "Customer" msgstr "عميل" -#: pretix/base/models/orders.py:2150 +#: pretix/base/models/orders.py:2172 msgctxt "refund_source" msgid "External" msgstr "خارجي" -#: pretix/base/models/orders.py:2188 +#: pretix/base/models/orders.py:2210 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:198 msgid "Refund reason" msgstr "سبب استرداد الأموال" -#: pretix/base/models/orders.py:2189 +#: pretix/base/models/orders.py:2211 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:199 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:201 msgid "" @@ -6981,48 +7082,48 @@ msgstr "" "قد يتم عرضها للمستخدم النهائي أو استخدامها على سبيل المثال كجزء من مرجع " "السداد." -#: pretix/base/models/orders.py:2309 +#: pretix/base/models/orders.py:2331 msgid "Service fee" msgstr "رسوم الخدمة" -#: pretix/base/models/orders.py:2310 +#: pretix/base/models/orders.py:2332 msgid "Payment fee" msgstr "رسوم السداد" -#: pretix/base/models/orders.py:2311 +#: pretix/base/models/orders.py:2333 msgid "Shipping fee" msgstr "رسوم الشحن" -#: pretix/base/models/orders.py:2312 -#: pretix/control/templates/pretixcontrol/order/index.html:157 +#: pretix/base/models/orders.py:2334 +#: pretix/control/templates/pretixcontrol/order/index.html:190 msgid "Cancellation fee" msgstr "رسوم الإلغاء" -#: pretix/base/models/orders.py:2313 +#: pretix/base/models/orders.py:2335 msgid "Insurance fee" msgstr "" -#: pretix/base/models/orders.py:2314 +#: pretix/base/models/orders.py:2336 #, fuzzy #| msgid "Other fees" msgid "Late fee" msgstr "رسوم أخرى" -#: pretix/base/models/orders.py:2315 +#: pretix/base/models/orders.py:2337 msgid "Other fees" msgstr "رسوم أخرى" -#: pretix/base/models/orders.py:2316 pretix/base/payment.py:1379 -#: pretix/base/payment.py:1455 pretix/base/settings.py:1099 +#: pretix/base/models/orders.py:2338 pretix/base/payment.py:1379 +#: pretix/base/payment.py:1455 pretix/base/settings.py:1114 #: pretix/control/templates/pretixcontrol/items/index.html:117 -#: pretix/control/templates/pretixcontrol/order/index.html:152 +#: pretix/control/templates/pretixcontrol/order/index.html:185 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:383 #: pretix/presale/templates/pretixpresale/event/order_giftcard.html:7 #: pretix/presale/templates/pretixpresale/event/position_giftcard.html:7 msgid "Gift card" msgstr "بطاقة هدايا" -#: pretix/base/models/orders.py:2321 +#: pretix/base/models/orders.py:2343 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:84 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:126 #: pretix/control/views/vouchers.py:121 @@ -7030,62 +7131,62 @@ msgstr "بطاقة هدايا" msgid "Value" msgstr "قيمة" -#: pretix/base/models/orders.py:2602 +#: pretix/base/models/orders.py:2624 msgid "Order position" msgstr "حالة الطلب" -#: pretix/base/models/orders.py:3157 +#: pretix/base/models/orders.py:3179 msgid "Cart ID (e.g. session key)" msgstr "معرف عربة التسوق (مثل مفتاح الجلسة)" -#: pretix/base/models/orders.py:3168 +#: pretix/base/models/orders.py:3190 #, fuzzy #| msgid "Expiration date" msgid "Limit for extending expiration date" msgstr "تاريخ إنتهاء الصلاحية" -#: pretix/base/models/orders.py:3204 +#: pretix/base/models/orders.py:3226 msgid "Cart position" msgstr "حالة سلة التسوق" -#: pretix/base/models/orders.py:3205 +#: pretix/base/models/orders.py:3227 msgid "Cart positions" msgstr "حالات سلة التسوق" -#: pretix/base/models/orders.py:3347 +#: pretix/base/models/orders.py:3369 msgid "Business customer" msgstr "عميل قطاع الأعمال" -#: pretix/base/models/orders.py:3363 +#: pretix/base/models/orders.py:3385 msgid "This reference will be printed on your invoice for your convenience." msgstr "ستتم طباعة هذا المرجع على فاتورتك وفقا لما يناسبك." -#: pretix/base/models/orders.py:3489 +#: pretix/base/models/orders.py:3511 #, fuzzy #| msgid "Transaction Code" msgid "Transmission type" msgstr "كود المعاملة" -#: pretix/base/models/orders.py:3580 +#: pretix/base/models/orders.py:3602 #: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html:9 msgid "Badge" msgstr "شارة" -#: pretix/base/models/orders.py:3581 pretix/base/pdf.py:1140 +#: pretix/base/models/orders.py:3603 pretix/base/pdf.py:1162 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:66 #: pretix/plugins/ticketoutputpdf/ticketoutput.py:114 msgid "Ticket" msgstr "تذكرة" -#: pretix/base/models/orders.py:3582 +#: pretix/base/models/orders.py:3604 #, fuzzy #| msgid "Verification failed" msgid "Certificate" msgstr "فشل التحقق" -#: pretix/base/models/orders.py:3583 pretix/control/views/event.py:393 -#: pretix/control/views/event.py:398 pretix/control/views/organizer.py:652 -#: pretix/control/views/organizer.py:657 +#: pretix/base/models/orders.py:3605 pretix/control/views/event.py:402 +#: pretix/control/views/event.py:407 pretix/control/views/organizer.py:653 +#: pretix/control/views/organizer.py:658 #, fuzzy #| msgid "Other…" msgid "Other" @@ -7108,87 +7209,87 @@ msgstr "" msgid "Organizers" msgstr "المنظمون" -#: pretix/base/models/organizer.py:363 +#: pretix/base/models/organizer.py:369 #: pretix/control/templates/pretixcontrol/organizers/teams.html:35 msgid "Team name" msgstr "اسم الفريق" -#: pretix/base/models/organizer.py:364 +#: pretix/base/models/organizer.py:370 #: pretix/control/templates/pretixcontrol/organizers/team_members.html:13 msgid "Team members" msgstr "أعضاء الفريق" -#: pretix/base/models/organizer.py:366 +#: pretix/base/models/organizer.py:372 #, fuzzy #| msgid "Do you really want to disable two-factor authentication?" msgid "Require all members of this team to use two-factor authentication" msgstr "هل تريد حقا أن اثنين عامل التوثيق تعطيلها؟" -#: pretix/base/models/organizer.py:367 +#: pretix/base/models/organizer.py:373 msgid "" "If you turn this on, all members of the team will be required to either set " "up two-factor authentication or leave the team. The setting may take a few " "minutes to become effective for all users." msgstr "" -#: pretix/base/models/organizer.py:378 +#: pretix/base/models/organizer.py:384 #, fuzzy #| msgid "Event permissions" msgid "All event permissions" msgstr "أذونات الحدث" -#: pretix/base/models/organizer.py:379 -#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:34 +#: pretix/base/models/organizer.py:385 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:47 msgid "Event permissions" msgstr "أذونات الحدث" -#: pretix/base/models/organizer.py:380 +#: pretix/base/models/organizer.py:386 #, fuzzy #| msgid "Organizer permissions" msgid "All organizer permissions" msgstr "أذونات منظم" -#: pretix/base/models/organizer.py:381 -#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:25 +#: pretix/base/models/organizer.py:387 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:26 msgid "Organizer permissions" msgstr "أذونات منظم" -#: pretix/base/models/organizer.py:401 +#: pretix/base/models/organizer.py:407 #, python-format msgid "%(name)s on %(object)s" msgstr "%(name)s على %(object)s" -#: pretix/base/models/organizer.py:487 +#: pretix/base/models/organizer.py:493 #: pretix/control/templates/pretixcontrol/events/create_basics.html:67 msgid "Team" msgstr "فريق" -#: pretix/base/models/organizer.py:488 pretix/base/permissions.py:282 +#: pretix/base/models/organizer.py:494 pretix/base/permissions.py:282 #: pretix/control/navigation.py:566 #: pretix/control/templates/pretixcontrol/organizers/teams.html:6 msgid "Teams" msgstr "فرق" -#: pretix/base/models/organizer.py:508 +#: pretix/base/models/organizer.py:514 #, python-brace-format msgid "Invite to team '{team}' for '{email}'" msgstr "دعوة إلى فريق '{team}' ل '{email}'" -#: pretix/base/models/organizer.py:642 +#: pretix/base/models/organizer.py:649 #: pretix/control/templates/pretixcontrol/organizers/channels.html:23 #, fuzzy #| msgid "Internal identifier" msgid "Identifier" msgstr "معرف داخلي" -#: pretix/base/models/organizer.py:652 +#: pretix/base/models/organizer.py:659 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:54 #: pretix/control/templates/pretixcontrol/items/questions.html:24 msgid "Type" msgstr "نوع" #: pretix/base/models/seating.py:46 pretix/base/models/tax.py:306 -#: pretix/base/pdf.py:1319 +#: pretix/base/pdf.py:1341 msgid "Your layout file is not a valid JSON file." msgstr "ملف التخطيط الخاص بك ليس ملف \"ترميز باستعمال جافا سكريبت\" صالح." @@ -7207,12 +7308,12 @@ msgstr "" msgid "Multiple seats have the same ID: {id}" msgstr "" -#: pretix/base/models/seating.py:200 +#: pretix/base/models/seating.py:203 #, python-brace-format msgid "Row {number}" msgstr "صف {number}" -#: pretix/base/models/seating.py:205 +#: pretix/base/models/seating.py:208 #, python-brace-format msgid "Seat {number}" msgstr "مقعد {number}" @@ -7745,7 +7846,7 @@ msgid "Dates" msgstr "تواريخ" #: pretix/base/notifications.py:200 -#: pretix/control/templates/pretixcontrol/order/index.html:755 +#: pretix/control/templates/pretixcontrol/order/index.html:790 #: pretix/plugins/reports/accountingreport.py:318 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:446 msgid "Net total" @@ -8145,7 +8246,7 @@ msgstr "" msgid "Offsetting" msgstr "تعويض" -#: pretix/base/payment.py:1339 pretix/control/views/orders.py:1262 +#: pretix/base/payment.py:1339 pretix/control/views/orders.py:1266 msgid "You entered an order that could not be found." msgstr "لقد أدخلت طلبا لا يمكن العثور عليه." @@ -8186,7 +8287,7 @@ msgid "Product name" msgstr "اسم المنتج" #: pretix/base/pdf.py:124 pretix/base/services/tickets.py:98 -#: pretix/control/views/event.py:938 pretix/control/views/pdf.py:96 +#: pretix/control/views/event.py:942 pretix/control/views/pdf.py:96 msgid "Sample product" msgstr "نموذج منتج" @@ -8203,7 +8304,7 @@ msgid "Product description" msgstr "وصف المنتج" #: pretix/base/pdf.py:134 pretix/base/services/tickets.py:99 -#: pretix/control/views/event.py:939 pretix/control/views/pdf.py:97 +#: pretix/control/views/event.py:943 pretix/control/views/pdf.py:97 msgid "Sample product description" msgstr "نموذج وصف منتج" @@ -8244,11 +8345,11 @@ msgid "Price including add-ons and bundled products" msgstr "السعر شاملا الإضافات" #: pretix/base/pdf.py:184 pretix/base/pdf.py:342 -#: pretix/base/services/invoices.py:594 +#: pretix/base/services/invoices.py:608 #: pretix/base/services/placeholders.py:604 #: pretix/base/services/placeholders.py:689 #: pretix/base/services/placeholders.py:705 -#: pretix/base/services/placeholders.py:714 pretix/control/views/event.py:940 +#: pretix/base/services/placeholders.py:714 pretix/control/views/event.py:944 msgid "John Doe" msgstr "جون دو" @@ -8331,9 +8432,9 @@ msgstr "20:00 2017-05-31" msgid "Event begin date" msgstr "تاريخ بداية الفعالية" -#: pretix/base/pdf.py:264 pretix/base/pdf.py:290 pretix/base/pdf.py:399 -#: pretix/base/pdf.py:423 pretix/base/pdf.py:447 pretix/base/pdf.py:471 -#: pretix/base/pdf.py:534 pretix/base/pdf.py:539 +#: pretix/base/pdf.py:264 pretix/base/pdf.py:290 pretix/base/pdf.py:411 +#: pretix/base/pdf.py:435 pretix/base/pdf.py:459 pretix/base/pdf.py:483 +#: pretix/base/pdf.py:546 pretix/base/pdf.py:551 msgid "2017-05-31" msgstr "2017-05-31" @@ -8352,7 +8453,8 @@ msgid "Event begin weekday" msgstr "تاريخ بداية الفعالية" #: pretix/base/pdf.py:277 pretix/base/pdf.py:306 -#: pretix/base/services/checkin.py:362 pretix/control/forms/filter.py:1399 +#: pretix/base/services/checkin.py:362 pretix/control/forms/filter.py:1405 +#: pretix/control/forms/filter.py:1583 msgid "Friday" msgstr "يوم الجمعة" @@ -8378,8 +8480,8 @@ msgstr "تاريخ إنتهاء الفعالية" msgid "Event admission date and time" msgstr "تاريخ ووقت قبول الفعالية" -#: pretix/base/pdf.py:311 pretix/base/pdf.py:407 pretix/base/pdf.py:431 -#: pretix/base/pdf.py:455 pretix/base/pdf.py:479 pretix/base/pdf.py:528 +#: pretix/base/pdf.py:311 pretix/base/pdf.py:419 pretix/base/pdf.py:443 +#: pretix/base/pdf.py:467 pretix/base/pdf.py:491 pretix/base/pdf.py:540 msgid "2017-05-31 19:00" msgstr "19:00 2017-05-31" @@ -8387,8 +8489,8 @@ msgstr "19:00 2017-05-31" msgid "Event admission time" msgstr "وقت تسجيل الفعالية" -#: pretix/base/pdf.py:319 pretix/base/pdf.py:415 pretix/base/pdf.py:439 -#: pretix/base/pdf.py:463 pretix/base/pdf.py:487 +#: pretix/base/pdf.py:319 pretix/base/pdf.py:427 pretix/base/pdf.py:451 +#: pretix/base/pdf.py:475 pretix/base/pdf.py:499 msgid "19:00" msgstr "19:00" @@ -8396,7 +8498,7 @@ msgstr "19:00" msgid "Event location" msgstr "موقع الفعالية" -#: pretix/base/pdf.py:327 pretix/base/settings.py:1333 +#: pretix/base/pdf.py:327 pretix/base/settings.py:1348 msgid "Random City" msgstr "مدينة عشوائية" @@ -8408,7 +8510,7 @@ msgstr "شارع سيسيم 42" msgid "12345" msgstr "12345" -#: pretix/base/pdf.py:362 pretix/base/services/invoices.py:597 +#: pretix/base/pdf.py:362 pretix/base/services/invoices.py:611 msgid "Sample city" msgstr "مدينة مثال" @@ -8425,10 +8527,21 @@ msgid "Atlantis" msgstr "اتلانتس" #: pretix/base/pdf.py:376 +#, fuzzy +msgid "Invoice custom recipient field" +msgstr "مستلم الفاتورة:" + +#: pretix/base/pdf.py:377 +#, fuzzy +#| msgid "Custom address field" +msgid "Custom recipient field" +msgstr "حقل العنوان المخصص" + +#: pretix/base/pdf.py:381 msgid "List of Add-Ons" msgstr "قائمة الإضافات" -#: pretix/base/pdf.py:377 +#: pretix/base/pdf.py:382 pretix/base/pdf.py:389 #, fuzzy #| msgid "" #| "Add-on 1\n" @@ -8440,201 +8553,207 @@ msgstr "" "الإضافة 1\n" "الإضافة 2" -#: pretix/base/pdf.py:383 pretix/control/forms/filter.py:1537 -#: pretix/control/forms/filter.py:1539 +#: pretix/base/pdf.py:388 +#, fuzzy +#| msgid "List of Add-Ons" +msgid "List of Checked-In Add-Ons" +msgstr "قائمة الإضافات" + +#: pretix/base/pdf.py:395 pretix/control/forms/filter.py:1670 +#: pretix/control/forms/filter.py:1672 #: pretix/control/templates/pretixcontrol/organizers/index.html:42 msgid "Organizer name" msgstr "اسم المنظم" -#: pretix/base/pdf.py:384 +#: pretix/base/pdf.py:396 msgid "Event organizer company" msgstr "شركة منظم الفعالية" -#: pretix/base/pdf.py:388 +#: pretix/base/pdf.py:400 msgid "Organizer info text" msgstr "نص معلومات المنظم" -#: pretix/base/pdf.py:389 +#: pretix/base/pdf.py:401 msgid "Event organizer info text" msgstr "نص معلومات منظم الفعالية" -#: pretix/base/pdf.py:393 pretix/base/pdf.py:394 +#: pretix/base/pdf.py:405 pretix/base/pdf.py:406 msgid "Event info text" msgstr "نص معلومات الفعالية" -#: pretix/base/pdf.py:398 +#: pretix/base/pdf.py:410 msgid "Printing date" msgstr "تاريخ الطباعة" -#: pretix/base/pdf.py:406 +#: pretix/base/pdf.py:418 msgid "Printing date and time" msgstr "تاريخ ووقت الطباعة" -#: pretix/base/pdf.py:414 +#: pretix/base/pdf.py:426 msgid "Printing time" msgstr "وقت الطباعة" -#: pretix/base/pdf.py:422 pretix/control/forms/item.py:741 +#: pretix/base/pdf.py:434 pretix/control/forms/item.py:796 #, fuzzy #| msgid "Purchased" msgid "Purchase date" msgstr "اشترى" -#: pretix/base/pdf.py:430 +#: pretix/base/pdf.py:442 #, fuzzy #| msgid "Purchased" msgid "Purchase date and time" msgstr "اشترى" -#: pretix/base/pdf.py:438 +#: pretix/base/pdf.py:450 #, fuzzy #| msgid "Purchased" msgid "Purchase time" msgstr "اشترى" -#: pretix/base/pdf.py:446 +#: pretix/base/pdf.py:458 #, fuzzy #| msgid "Valid until" msgid "Validity start date" msgstr "حتى تاريخ" -#: pretix/base/pdf.py:454 +#: pretix/base/pdf.py:466 #, fuzzy #| msgid "Printing date and time" msgid "Validity start date and time" msgstr "تاريخ ووقت الطباعة" -#: pretix/base/pdf.py:462 +#: pretix/base/pdf.py:474 #, fuzzy #| msgid "Valid until" msgid "Validity start time" msgstr "حتى تاريخ" -#: pretix/base/pdf.py:470 +#: pretix/base/pdf.py:482 #, fuzzy #| msgid "Valid until" msgid "Validity end date" msgstr "حتى تاريخ" -#: pretix/base/pdf.py:478 +#: pretix/base/pdf.py:490 #, fuzzy #| msgid "Event end date and time" msgid "Validity end date and time" msgstr "تاريخ ووقت إنتهاء الفعالية" -#: pretix/base/pdf.py:486 +#: pretix/base/pdf.py:498 #, fuzzy #| msgid "Valid until" msgid "Validity end time" msgstr "حتى تاريخ" -#: pretix/base/pdf.py:494 +#: pretix/base/pdf.py:506 pretix/control/forms/item.py:1386 #, fuzzy -#| msgid "Printing date and time" -msgid "Program times: date and time" -msgstr "تاريخ ووقت الطباعة" +#| msgid "Printing time" +msgid "Program times" +msgstr "وقت الطباعة" -#: pretix/base/pdf.py:496 +#: pretix/base/pdf.py:508 msgid "" -"2017-05-31 10:00 – 12:00\n" -"2017-05-31 14:00 – 16:00\n" -"2017-05-31 14:00 – 2017-06-01 14:00" +"2017-05-31 10:00 – 12:00, Room 1\n" +"2017-05-31 14:00 – 16:00, Room 2\n" +"2017-05-31 14:00 – 2017-06-01 14:00, Building A" msgstr "" -#: pretix/base/pdf.py:500 +#: pretix/base/pdf.py:512 msgid "Reusable Medium ID" msgstr "" -#: pretix/base/pdf.py:505 +#: pretix/base/pdf.py:517 msgid "Seat: Full name" msgstr "مقعد: الاسم الكامل" -#: pretix/base/pdf.py:506 +#: pretix/base/pdf.py:518 msgid "Ground floor, Row 3, Seat 4" msgstr "الطابق الأرضي، الصف 3، مقعد 4" -#: pretix/base/pdf.py:508 pretix/base/pdf.py:514 -#: pretix/control/forms/orders.py:344 +#: pretix/base/pdf.py:520 pretix/base/pdf.py:526 +#: pretix/control/forms/orders.py:348 msgid "General admission" msgstr "التسجيل العام" -#: pretix/base/pdf.py:511 +#: pretix/base/pdf.py:523 msgid "Seat: zone" msgstr "مقعد: المنطقة" -#: pretix/base/pdf.py:512 +#: pretix/base/pdf.py:524 msgid "Ground floor" msgstr "الطابق الأرضي" -#: pretix/base/pdf.py:517 +#: pretix/base/pdf.py:529 msgid "Seat: row" msgstr "مقعد: صف" -#: pretix/base/pdf.py:522 +#: pretix/base/pdf.py:534 msgid "Seat: seat number" msgstr "مقعد: عدد المقاعد" -#: pretix/base/pdf.py:527 +#: pretix/base/pdf.py:539 msgid "Date and time of first scan" msgstr "تاريخ ووقت أول مسح" -#: pretix/base/pdf.py:533 +#: pretix/base/pdf.py:545 #, fuzzy #| msgid "Gift card code" msgid "Gift card: Issuance date" msgstr "رمز بطاقة الهدية" -#: pretix/base/pdf.py:538 +#: pretix/base/pdf.py:550 #, fuzzy #| msgid "Expiration date" msgid "Gift card: Expiration date" msgstr "تاريخ إنتهاء الصلاحية" -#: pretix/base/pdf.py:579 pretix/base/pdf.py:617 pretix/base/pdf.py:623 -#: pretix/plugins/badges/exporters.py:504 +#: pretix/base/pdf.py:591 pretix/base/pdf.py:629 pretix/base/pdf.py:635 +#: pretix/plugins/badges/exporters.py:512 #: pretix/plugins/ticketoutputpdf/exporters.py:102 #, python-brace-format msgid "Question: {question}" msgstr "سؤال: {question}" -#: pretix/base/pdf.py:618 pretix/base/pdf.py:624 +#: pretix/base/pdf.py:630 pretix/base/pdf.py:636 #, python-brace-format msgid "" msgstr "<جواب: {question}>" -#: pretix/base/pdf.py:665 +#: pretix/base/pdf.py:677 #, fuzzy #| msgid "Attendee names" msgid "Attendee name for salutation" msgstr "أسماء الحضور" -#: pretix/base/pdf.py:666 pretix/base/pdf.py:689 +#: pretix/base/pdf.py:678 pretix/base/pdf.py:701 #: pretix/base/services/placeholders.py:732 -#: pretix/control/forms/organizer.py:799 +#: pretix/control/forms/organizer.py:809 msgid "Mr Doe" msgstr "السيد دو" -#: pretix/base/pdf.py:672 pretix/base/pdf.py:679 -#: pretix/plugins/badges/exporters.py:501 -#: pretix/plugins/checkinlists/exporters.py:125 -#: pretix/plugins/checkinlists/exporters.py:499 +#: pretix/base/pdf.py:684 pretix/base/pdf.py:691 +#: pretix/plugins/badges/exporters.py:509 +#: pretix/plugins/checkinlists/exporters.py:126 +#: pretix/plugins/checkinlists/exporters.py:498 #: pretix/plugins/ticketoutputpdf/exporters.py:99 #, python-brace-format msgid "Attendee name: {part}" msgstr "اسم الحاضر: {part}" -#: pretix/base/pdf.py:688 +#: pretix/base/pdf.py:700 #, fuzzy #| msgid "Invoice address explanation" msgid "Invoice address name for salutation" msgstr "شرح عنوان الفاتورة" -#: pretix/base/pdf.py:695 +#: pretix/base/pdf.py:707 #, python-brace-format msgid "Invoice address name: {part}" msgstr "اسم عنوان الفاتورة: {part}" -#: pretix/base/pdf.py:1328 +#: pretix/base/pdf.py:1350 #, fuzzy, python-brace-format #| msgid "Your layout file is not a valid seating plan. Error message: {}" msgid "Your layout file is not a valid layout. Error message: {}" @@ -8852,30 +8971,30 @@ msgstr "الإعدادات" msgid "Outgoing emails" msgstr "إرسال رسائل البريد الإلكتروني" -#: pretix/base/plugins.py:138 +#: pretix/base/plugins.py:143 #: pretix/control/templates/pretixcontrol/event/quick_setup.html:132 msgid "Features" msgstr "المميزات" -#: pretix/base/plugins.py:140 +#: pretix/base/plugins.py:145 #, fuzzy #| msgid "Invoice generation" msgid "Integrations" msgstr "جيل فاتورة" -#: pretix/base/plugins.py:141 +#: pretix/base/plugins.py:146 #, fuzzy #| msgid "Customer actions" msgid "Customizations" msgstr "إجراءات العملاء" -#: pretix/base/plugins.py:142 +#: pretix/base/plugins.py:147 #, fuzzy #| msgid "Export format" msgid "Output and export formats" msgstr "تنسيق التصدير" -#: pretix/base/plugins.py:143 +#: pretix/base/plugins.py:148 #, fuzzy #| msgid "Features" msgid "API features" @@ -9040,7 +9159,7 @@ msgstr[3] "لا يمكنك تحديد أكثر من %s عناصر لكل طلب. msgstr[4] "لا يمكنك تحديد أكثر من %s عناصر لكل طلب." msgstr[5] "لا يمكنك تحديد أكثر من %s عناصر لكل طلب." -#: pretix/base/services/cart.py:138 pretix/base/services/orders.py:1602 +#: pretix/base/services/cart.py:138 pretix/base/services/orders.py:1603 #, fuzzy, python-format #| msgid "" #| "You cannot select more than %(max)s items of the product %(product)s." @@ -9054,7 +9173,7 @@ msgstr[3] "لا يمكنك تحديد أكثر من %(max)s عناصر من ال msgstr[4] "لا يمكنك تحديد أكثر من %(max)s عناصر من المنتج %(product)s." msgstr[5] "لا يمكنك تحديد أكثر من %(max)s عناصر من المنتج %(product)s." -#: pretix/base/services/cart.py:143 pretix/base/services/orders.py:1607 +#: pretix/base/services/cart.py:143 pretix/base/services/orders.py:1608 #, fuzzy, python-format #| msgid "" #| "You need to select at least %(min)s items of the product %(product)s." @@ -9100,7 +9219,7 @@ msgstr[5] "" #: pretix/base/services/cart.py:152 pretix/base/services/orders.py:164 #: pretix/presale/templates/pretixpresale/event/index.html:170 -#: pretix/presale/views/waiting.py:145 pretix/presale/views/widget.py:813 +#: pretix/presale/views/waiting.py:150 pretix/presale/views/widget.py:846 #, fuzzy #| msgid "The presale period for this event has not yet started." msgid "The booking period for this event has not yet started." @@ -9158,26 +9277,28 @@ msgstr "السعر الذي تم إدخاله مرتفع جدا." msgid "This voucher code is not known in our database." msgstr "رمز كود الخصم هذا غير معروف في قاعدة البيانات الخاصة بنا." -#: pretix/base/services/cart.py:165 pretix/base/services/orders.py:167 -#, python-format +#: pretix/base/services/cart.py:165 +#, fuzzy, python-format +#| msgid "" +#| "You need to select at least %(min)s items of the product %(product)s." msgid "" "The voucher code \"%(voucher)s\" can only be used if you select at least " -"%(number)s matching products." +"%(number)s matching product." msgid_plural "" "The voucher code \"%(voucher)s\" can only be used if you select at least " "%(number)s matching products." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" +msgstr[0] "تحتاج إلى تحديد ما لا يقل عن %(min)s عناصر من المنتج %(product)s." +msgstr[1] "تحتاج إلى تحديد ما لا يقل عن %(min)s عناصر من المنتج %(product)s." +msgstr[2] "تحتاج إلى تحديد ما لا يقل عن %(min)s عناصر من المنتج %(product)s." +msgstr[3] "تحتاج إلى تحديد ما لا يقل عن %(min)s عناصر من المنتج %(product)s." +msgstr[4] "تحتاج إلى تحديد ما لا يقل عن %(min)s عناصر من المنتج %(product)s." +msgstr[5] "تحتاج إلى تحديد ما لا يقل عن %(min)s عناصر من المنتج %(product)s." #: pretix/base/services/cart.py:170 #, python-format msgid "" "The voucher code \"%(voucher)s\" can only be used if you select at least " -"%(number)s matching products. We have therefore removed some positions from " +"%(number)s matching product. We have therefore removed some positions from " "your cart that can no longer be purchased like this." msgid_plural "" "The voucher code \"%(voucher)s\" can only be used if you select at least " @@ -9466,27 +9587,33 @@ msgstr "عدد الإدخالات اليوم" msgid "week day" msgstr "يوم عطلة نهاية الأسبوع" -#: pretix/base/services/checkin.py:358 pretix/control/forms/filter.py:1395 +#: pretix/base/services/checkin.py:358 pretix/control/forms/filter.py:1401 +#: pretix/control/forms/filter.py:1579 msgid "Monday" msgstr "يوم الاثنين" -#: pretix/base/services/checkin.py:359 pretix/control/forms/filter.py:1396 +#: pretix/base/services/checkin.py:359 pretix/control/forms/filter.py:1402 +#: pretix/control/forms/filter.py:1580 msgid "Tuesday" msgstr "الثلاثاء" -#: pretix/base/services/checkin.py:360 pretix/control/forms/filter.py:1397 +#: pretix/base/services/checkin.py:360 pretix/control/forms/filter.py:1403 +#: pretix/control/forms/filter.py:1581 msgid "Wednesday" msgstr "الأربعاء" -#: pretix/base/services/checkin.py:361 pretix/control/forms/filter.py:1398 +#: pretix/base/services/checkin.py:361 pretix/control/forms/filter.py:1404 +#: pretix/control/forms/filter.py:1582 msgid "Thursday" msgstr "الخميس" -#: pretix/base/services/checkin.py:363 pretix/control/forms/filter.py:1400 +#: pretix/base/services/checkin.py:363 pretix/control/forms/filter.py:1406 +#: pretix/control/forms/filter.py:1584 msgid "Saturday" msgstr "يوم السبت" -#: pretix/base/services/checkin.py:364 pretix/control/forms/filter.py:1401 +#: pretix/base/services/checkin.py:364 pretix/control/forms/filter.py:1407 +#: pretix/control/forms/filter.py:1585 msgid "Sunday" msgstr "الأحد" @@ -9510,60 +9637,70 @@ msgstr "تم تجاوز الحد الأدنى {variable}" msgid "{variable} is {value}" msgstr "{variable} هو {value}" -#: pretix/base/services/checkin.py:972 +#: pretix/base/services/checkin.py:982 msgid "This order position has been canceled." msgstr "تم إلغاء وضع الطلب هذا." -#: pretix/base/services/checkin.py:981 +#: pretix/base/services/checkin.py:991 #, fuzzy #| msgid "This ticket has already been redeemed." msgid "This ticket has been blocked." msgstr "تم استخدام هذه التذكرة مسبقا." -#: pretix/base/services/checkin.py:990 +#: pretix/base/services/checkin.py:1000 #, fuzzy #| msgid "This order is not pending approval." msgid "This order is not yet approved." msgstr "هذا الطلب ليس في انتظار الموافقة." -#: pretix/base/services/checkin.py:999 pretix/base/services/checkin.py:1003 +#: pretix/base/services/checkin.py:1009 pretix/base/services/checkin.py:1013 #, fuzzy, python-brace-format #| msgid "Only allowed after {datetime}" msgid "This ticket is only valid after {datetime}." msgstr "مسموح فقط بعد {datetime}" -#: pretix/base/services/checkin.py:1013 pretix/base/services/checkin.py:1017 +#: pretix/base/services/checkin.py:1023 pretix/base/services/checkin.py:1027 #, fuzzy, python-brace-format #| msgid "This ticket has already been redeemed." msgid "This ticket was only valid before {datetime}." msgstr "تم استخدام هذه التذكرة مسبقا." -#: pretix/base/services/checkin.py:1048 +#: pretix/base/services/checkin.py:1058 msgid "This order position has an invalid product for this check-in list." msgstr "يحتوي هذا الطلب على منتج غير صالح لقائمة التسجيل هذه." -#: pretix/base/services/checkin.py:1057 +#: pretix/base/services/checkin.py:1067 msgid "This order position has an invalid date for this check-in list." msgstr "يحتوي هذا الطلب على تاريخ غير صالح لقائمة التسجيل هذه." -#: pretix/base/services/checkin.py:1068 +#: pretix/base/services/checkin.py:1078 msgid "This order is not marked as paid." msgstr "لم يتم تمييز هذا الطلب على أنه مدفوع." -#: pretix/base/services/checkin.py:1080 +#: pretix/base/services/checkin.py:1090 msgid "Evaluation of custom rules has failed." msgstr "" -#: pretix/base/services/checkin.py:1090 +#: pretix/base/services/checkin.py:1100 #, python-brace-format msgid "Entry not permitted: {explanation}." msgstr "غير مسموح بالدخول: {explanation}." -#: pretix/base/services/checkin.py:1099 +#: pretix/base/services/checkin.py:1109 msgid "You need to answer questions to complete this check-in." msgstr "تحتاج إلى الإجابة على الأسئلة لإكمال هذا التسجيل." -#: pretix/base/services/checkin.py:1152 +#: pretix/base/services/checkin.py:1121 +msgid "Ticket needs to be exchanged to a suitable medium." +msgstr "" + +#: pretix/base/services/checkin.py:1128 +msgid "" +"This ticket has already been exchanged for a reusable medium that now needs " +"to be used instead." +msgstr "" + +#: pretix/base/services/checkin.py:1180 msgid "This ticket has already been redeemed." msgstr "تم استخدام هذه التذكرة مسبقا." @@ -9577,7 +9714,11 @@ msgstr "الإتحاد الأوربي" msgid "Czech National Bank" msgstr "" -#: pretix/base/services/export.py:94 pretix/base/services/export.py:154 +#: pretix/base/services/currencies.py:41 +msgid "National Bank of Poland" +msgstr "" + +#: pretix/base/services/export.py:95 pretix/base/services/export.py:155 #, fuzzy #| msgid "You do not have permission to perform this action." msgid "" @@ -9585,34 +9726,34 @@ msgid "" "export." msgstr "ليس لديك إذن لتنفيذ هذا الإجراء." -#: pretix/base/services/export.py:107 pretix/base/services/export.py:179 -#: pretix/base/services/export.py:357 +#: pretix/base/services/export.py:108 pretix/base/services/export.py:180 +#: pretix/base/services/export.py:373 msgid "Your export did not contain any data." msgstr "تصديرك لا يحتوي على أي بيانات." -#: pretix/base/services/export.py:327 +#: pretix/base/services/export.py:343 #, fuzzy #| msgid "Exported files" msgid "Export failed" msgstr "الملفات المصدرة" -#: pretix/base/services/export.py:344 +#: pretix/base/services/export.py:360 #, fuzzy #| msgid "Permission denied" msgid "Permission denied." msgstr "تم رفض طلب الإذن" -#: pretix/base/services/export.py:363 +#: pretix/base/services/export.py:379 msgid "Your exported data exceeded the size limit for scheduled exports." msgstr "" -#: pretix/base/services/invoices.py:117 +#: pretix/base/services/invoices.py:118 #, python-brace-format msgctxt "invoice" msgid "Please complete your payment before {expire_date}." msgstr "يرجى إتمام عملية الدفع قبل {expire_date}." -#: pretix/base/services/invoices.py:129 +#: pretix/base/services/invoices.py:130 #, python-brace-format msgctxt "invoice" msgid "" @@ -9628,52 +9769,52 @@ msgstr "" "{i.zipcode} {i.city} {state}\n" "{country}" -#: pretix/base/services/invoices.py:239 pretix/base/services/invoices.py:282 +#: pretix/base/services/invoices.py:253 pretix/base/services/invoices.py:296 #, fuzzy, python-brace-format #| msgid "Event location" msgctxt "invoice" msgid "Event location: {location}" msgstr "موقع الفعالية" -#: pretix/base/services/invoices.py:255 +#: pretix/base/services/invoices.py:269 #, python-brace-format msgctxt "invoice" msgid "Attendee: {name}" msgstr "الحاضر: {name}" -#: pretix/base/services/invoices.py:279 pretix/plugins/reports/exporters.py:308 +#: pretix/base/services/invoices.py:293 pretix/plugins/reports/exporters.py:308 #, python-brace-format msgctxt "subevent" msgid "Date: {}" msgstr "تاريخ: {}" -#: pretix/base/services/invoices.py:587 +#: pretix/base/services/invoices.py:601 msgid "A payment provider specific text might appear here." msgstr "قد يظهر نص محدد لمزود خدمة الدفع هنا." -#: pretix/base/services/invoices.py:595 +#: pretix/base/services/invoices.py:609 msgid "214th Example Street" msgstr "مثال شارع رقم 214" -#: pretix/base/services/invoices.py:596 +#: pretix/base/services/invoices.py:610 msgid "012345" msgstr "012345" -#: pretix/base/services/invoices.py:613 +#: pretix/base/services/invoices.py:627 #, python-brace-format msgid "Sample product {}" msgstr "نموذج منتج {}" -#: pretix/base/services/invoices.py:623 +#: pretix/base/services/invoices.py:637 msgid "Sample product A" msgstr "نموذج منتج أ" -#: pretix/base/services/invoices.py:683 +#: pretix/base/services/invoices.py:697 #, python-brace-format msgid "New invoice: {number}" msgstr "فاتورة جديدة: {number}" -#: pretix/base/services/invoices.py:685 +#: pretix/base/services/invoices.py:699 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -9731,6 +9872,64 @@ msgstr "" msgid "You are receiving this email because you placed an order for {event}." msgstr "أنت تتلقى هذا البريد الإلكتروني لأنك قدمت طلبا ل {event}." +#: pretix/base/services/media.py:93 pretix/base/services/media.py:95 +#, fuzzy +#| msgid "Invalid input data." +msgid "Invalid medium type." +msgstr "بيانات الإدخال غير صالحة." + +#: pretix/base/services/media.py:100 pretix/base/services/media.py:102 +#, fuzzy +#| msgid "The selected product is not active or has no price set." +msgid "Medium type is not enabled for organizer." +msgstr "المنتج المحدد غير نشط أو ليس له سعر محدد." + +#: pretix/base/services/media.py:107 pretix/base/services/media.py:109 +msgid "Incorrect medium type for product." +msgstr "" + +#: pretix/base/services/media.py:114 pretix/base/services/media.py:116 +#, fuzzy +#| msgid "This ticket has already been redeemed." +msgid "Ticket is already exchanged for reusable medium." +msgstr "تم استخدام هذه التذكرة مسبقا." + +#: pretix/base/services/media.py:133 pretix/base/services/media.py:135 +#, fuzzy +#| msgid "Disable selected" +msgid "Reusable medium not found." +msgstr "تعطيل المختارة" + +#: pretix/base/services/media.py:140 pretix/base/services/media.py:142 +#: pretix/base/services/media.py:168 pretix/base/services/media.py:170 +#, fuzzy +#| msgid "The team has been created." +msgid "Reusable medium is inactive or expired." +msgstr "تم إنشاء فريق." + +#: pretix/base/services/media.py:155 pretix/base/services/media.py:162 +#: pretix/base/services/media.py:176 +#, fuzzy +#| msgid "The team has been created." +msgid "Reusable medium not found and could not be created." +msgstr "تم إنشاء فريق." + +#: pretix/base/services/media.py:183 +#, fuzzy +#| msgid "Disable selected" +msgid "Reusable medium already exists." +msgstr "تعطيل المختارة" + +#: pretix/base/services/media.py:189 +#, fuzzy +#| msgid "The team has been created." +msgid "Reusable medium could not be created." +msgstr "تم إنشاء فريق." + +#: pretix/base/services/media.py:195 pretix/base/services/media.py:197 +msgid "Product does not support medium exchange." +msgstr "" + #: pretix/base/services/memberships.py:108 #, python-brace-format msgid "" @@ -9863,7 +10062,7 @@ msgstr "" "\": {message}" #: pretix/base/services/modelimport.py:92 -#: pretix/base/services/modelimport.py:140 pretix/base/services/orders.py:1611 +#: pretix/base/services/modelimport.py:140 pretix/base/services/orders.py:1612 #, python-format msgid "Orders cannot have more than %(max)s positions." msgstr "" @@ -9967,6 +10166,21 @@ msgstr[5] "" msgid "The booking period has ended." msgstr "انتهت فترة عرض ما قبل البيع." +#: pretix/base/services/orders.py:167 +#, python-format +msgid "" +"The voucher code \"%(voucher)s\" can only be used if you select at least " +"%(number)s matching products." +msgid_plural "" +"The voucher code \"%(voucher)s\" can only be used if you select at least " +"%(number)s matching products." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + #: pretix/base/services/orders.py:171 msgid "" "The voucher code used for one of the items in your cart is not known in our " @@ -10084,13 +10298,13 @@ msgid "" "The cancellation fee cannot be higher than the total amount of this order." msgstr "لا يمكن أن تكون رسوم الإلغاء أعلى من رصيد الدفع لهذا الطلب." -#: pretix/base/services/orders.py:1017 +#: pretix/base/services/orders.py:1018 #, fuzzy #| msgid "This payment method does not support automatic refunds." msgid "The selected payment methods do not cover the total balance." msgstr "طريقة الدفع هذه لا يدعم استرداد التلقائي." -#: pretix/base/services/orders.py:1083 +#: pretix/base/services/orders.py:1084 msgid "" "While trying to place your order, we noticed that the order total has " "changed. Either one of the prices changed just now, or a gift card you used " @@ -10100,31 +10314,31 @@ msgstr "" "الأسعار الآن ، أو أن بطاقة الهدايا التي استخدمتها جاري استعمالها في الوقت " "الحالي. يرجى التحقق من الأسعار أدناه والمحاولة مرة أخرى." -#: pretix/base/services/orders.py:1581 +#: pretix/base/services/orders.py:1582 msgid "You need to select a variation of the product." msgstr "تحتاج إلى تحديد نوع من المنتج." -#: pretix/base/services/orders.py:1582 +#: pretix/base/services/orders.py:1583 #, python-brace-format msgid "" "The quota {name} does not have enough capacity left to perform the operation." msgstr "الحصة {name} لم يتبق لديها سعة كافية لإجراء العملية." -#: pretix/base/services/orders.py:1583 +#: pretix/base/services/orders.py:1584 msgid "There is no quota defined that allows this operation." msgstr "لا توجد حصة محددة تسمح بهذه العملية." -#: pretix/base/services/orders.py:1584 +#: pretix/base/services/orders.py:1585 msgid "The selected product is not active or has no price set." msgstr "المنتج المحدد غير نشط أو ليس له سعر محدد." -#: pretix/base/services/orders.py:1585 +#: pretix/base/services/orders.py:1586 msgid "" "This operation would leave the order empty. Please cancel the order itself " "instead." msgstr "سيترك هذا الإجراء الطلب فارغا. يرجى إلغاء الطلب نفسه بدلا من ذلك." -#: pretix/base/services/orders.py:1587 +#: pretix/base/services/orders.py:1588 msgid "" "This operation would make the order free and therefore immediately paid, " "however no quota is available." @@ -10132,23 +10346,23 @@ msgstr "" "ستجعل هذه العملية الطلب مجانيا وبالتالي يتم دفعه على الفور ، إلا أنه لا " "تتوفر حصة." -#: pretix/base/services/orders.py:1590 +#: pretix/base/services/orders.py:1591 msgid "" "This is an add-on product, please select the base position it should be " "added to." msgstr "هذا منتج إضافي ، يرجى تحديد العنصر الأساسي الذي تجب الإضافة إليه." -#: pretix/base/services/orders.py:1591 +#: pretix/base/services/orders.py:1592 msgid "" "The selected base position does not allow you to add this product as an add-" "on." msgstr "لا يسمح لك العنصر المختار بإضافة هذا المنتج كقائمة مضافة." -#: pretix/base/services/orders.py:1592 +#: pretix/base/services/orders.py:1593 msgid "You need to choose a subevent for the new position." msgstr "تحتاج إلى اختيار فعالية فرعية للعنصر الجديد." -#: pretix/base/services/orders.py:1595 +#: pretix/base/services/orders.py:1596 #, python-brace-format msgid "" "You selected seat \"{seat}\" for a date that does not match the selected " @@ -10157,25 +10371,25 @@ msgstr "" "لقد حددت المقعد \"{seat}\" لتاريخ لا يتطابق مع تاريخ التذكرة المحدد. الرجاء " "اختيار مقعد مرة أخرى." -#: pretix/base/services/orders.py:1597 +#: pretix/base/services/orders.py:1598 msgid "The selected product requires you to select a seat." msgstr "المنتج المحدد يتطلب منك اختيار مقعد." -#: pretix/base/services/orders.py:1598 +#: pretix/base/services/orders.py:1599 msgid "The selected product does not allow to select a seat." msgstr "المنتج المحدد لا يسمح باختيار مقعد." -#: pretix/base/services/orders.py:1599 +#: pretix/base/services/orders.py:1600 msgid "The selected country is blocked by your tax rule." msgstr "تم حظر البلد المحدد من خلال القاعدة الضريبية الخاصة بك." -#: pretix/base/services/orders.py:1600 +#: pretix/base/services/orders.py:1601 msgid "" "You cannot change the price of a position that has been used to issue a gift " "card." msgstr "لا يمكنك تغيير سعر العنصر الذي تم استخدامه لإصدار بطاقة هدايا." -#: pretix/base/services/orders.py:2450 pretix/base/services/orders.py:2477 +#: pretix/base/services/orders.py:2463 pretix/base/services/orders.py:2490 #, python-brace-format msgid "" "A position can not be canceled since the gift card {card} purchased in this " @@ -10184,7 +10398,7 @@ msgstr "" "لا يمكن إلغاء العنصر نظرا لأنه تم بالفعل استرداد قيمة بطاقة الهدايا {card} " "المشتراة في هذا الطلب." -#: pretix/base/services/orders.py:3253 +#: pretix/base/services/orders.py:3273 msgid "" "There was an error while trying to send the money back to you. Please " "contact the event organizer for further information." @@ -10445,50 +10659,61 @@ msgstr "" #: pretix/base/settings.py:214 #, fuzzy #| msgid "Disable selected" -msgid "Activate re-usable media" +msgid "Activate reusable media" msgstr "تعطيل المختارة" #: pretix/base/settings.py:215 msgid "" -"The re-usable media feature allows you to connect tickets and gift cards " -"with physical media such as wristbands or chip cards that may be re-used for " +"The reusable media feature allows you to connect tickets and gift cards with " +"physical media such as wristbands or chip cards that may be reused for " "different tickets or gift cards later." msgstr "" -#: pretix/base/settings.py:241 +#: pretix/base/settings.py:226 +msgid "Enforce the usage of issued reusable media for check-in" +msgstr "" + +#: pretix/base/settings.py:227 +msgid "" +"If enabled, a ticket barcode will not be accepted anymore, if a reusable " +"medium has been created and linked to a ticket. Keeping this option turned " +"off will treat the reusable medium and ticket as equals." +msgstr "" + +#: pretix/base/settings.py:254 #, fuzzy #| msgid "Length of gift card codes" msgid "Length of barcodes" msgstr "طول رموز بطاقات الهدايا" -#: pretix/base/settings.py:270 +#: pretix/base/settings.py:283 msgid "" "Automatically create a new gift card if a previously unknown chip is seen" msgstr "" -#: pretix/base/settings.py:283 pretix/base/settings.py:314 +#: pretix/base/settings.py:296 pretix/base/settings.py:327 #, fuzzy #| msgid "Gift card code" msgid "Gift card currency" msgstr "رمز بطاقة الهدية" -#: pretix/base/settings.py:301 +#: pretix/base/settings.py:314 msgid "Automatically create a new gift card if a new chip is encoded" msgstr "" -#: pretix/base/settings.py:323 +#: pretix/base/settings.py:336 msgid "Use UID protection feature of NFC chip" msgstr "" -#: pretix/base/settings.py:339 +#: pretix/base/settings.py:352 msgid "Maximum number of items per order" msgstr "الحد الأقصى لعدد العناصر لكل طلب" -#: pretix/base/settings.py:340 +#: pretix/base/settings.py:353 msgid "Add-on products will not be counted." msgstr "لن يتم احتساب المنتجات الإضافية." -#: pretix/base/settings.py:350 +#: pretix/base/settings.py:363 #, fuzzy #| msgid "" #| "Show net prices instead of gross prices in the product list (not " @@ -10497,7 +10722,7 @@ msgid "Show net prices instead of gross prices in the product list" msgstr "" "عرض صافي الأسعار بدلا من الأسعار الإجمالية في قائمة المنتجات (غير مستحسن!)" -#: pretix/base/settings.py:351 +#: pretix/base/settings.py:364 msgid "" "Independent of your choice, the cart will show gross prices as this is the " "price that needs to be paid." @@ -10505,11 +10730,11 @@ msgstr "" "بغض النظر عن اختيارك ، ستعرض عربة التسوق الأسعار الإجمالية لأن هذا هو السعر " "الذي يجب دفعه." -#: pretix/base/settings.py:362 +#: pretix/base/settings.py:375 msgid "Hide prices on attendee ticket page" msgstr "" -#: pretix/base/settings.py:363 +#: pretix/base/settings.py:376 msgid "" "If a person buys multiple tickets and you send emails to all of the " "attendees, with this option the ticket price will not be shown on the ticket " @@ -10517,29 +10742,29 @@ msgid "" "price." msgstr "" -#: pretix/base/settings.py:381 +#: pretix/base/settings.py:394 msgid "Ask for attendee names" msgstr "اسأل عن أسماء الحضور" -#: pretix/base/settings.py:382 +#: pretix/base/settings.py:395 #, fuzzy #| msgid "Ask for a name for all tickets which include admission to the event." msgid "Ask for a name for all personalized tickets." msgstr "اطلب اسما لجميع التذاكر التي تشمل الدخول إلى الفعالية." -#: pretix/base/settings.py:391 +#: pretix/base/settings.py:404 msgid "Require attendee names" msgstr "اطلب أسماء الحضور" -#: pretix/base/settings.py:392 +#: pretix/base/settings.py:405 msgid "Require customers to fill in the names of all attendees." msgstr "مطالبة العملاء بملء أسماء جميع الحضور." -#: pretix/base/settings.py:402 +#: pretix/base/settings.py:415 msgid "Ask for email addresses per ticket" msgstr "اسأل عن عناوين البريد الإلكتروني للتذكرة الواحدة" -#: pretix/base/settings.py:403 +#: pretix/base/settings.py:416 #, fuzzy #| msgid "" #| "Normally, pretix asks for one email address per order and the order " @@ -10568,11 +10793,11 @@ msgstr "" "البريد الإلكتروني الأساسي الوحيد ، ليس لعناوين كل حاضر. ومع ذلك ، يمكنك " "تمكين هذا في إعدادات البريد الإلكتروني." -#: pretix/base/settings.py:417 +#: pretix/base/settings.py:430 msgid "Require email addresses per ticket" msgstr "يتطلب عناوين البريد الإلكتروني لكل تذكرة" -#: pretix/base/settings.py:418 +#: pretix/base/settings.py:431 #, fuzzy #| msgid "" #| "Require customers to fill in individual email addresses for all admission " @@ -10587,130 +10812,136 @@ msgstr "" "انظر الخيار أعلاه لمزيد من التفاصيل. سيطلب عنوان بريد إلكتروني واحد لتأكيد " "الطلب دائما بغض النظر عن هذا الإعداد." -#: pretix/base/settings.py:430 +#: pretix/base/settings.py:443 msgid "Ask for company per ticket" msgstr "اسأل عن شركة لكل تذكرة" -#: pretix/base/settings.py:439 +#: pretix/base/settings.py:452 msgid "Require company per ticket" msgstr "مطلوب شركة لكل تذكرة" -#: pretix/base/settings.py:449 +#: pretix/base/settings.py:462 msgid "Ask for postal addresses per ticket" msgstr "اسأل عن العناوين البريدية لكل تذكرة" -#: pretix/base/settings.py:458 +#: pretix/base/settings.py:471 msgid "Require postal addresses per ticket" msgstr "يتطلب العناوين البريدية لكل تذكرة" -#: pretix/base/settings.py:468 +#: pretix/base/settings.py:481 msgid "Ask for the order email address twice" msgstr "اطلب عنوان البريد الإلكتروني مرتين للطلب" -#: pretix/base/settings.py:469 +#: pretix/base/settings.py:482 msgid "" "Require customers to fill in the primary email address twice to avoid errors." msgstr "" "اطلب من العملاء ملء عنوان البريد الإلكتروني الأساسي مرتين لتجنب الأخطاء." -#: pretix/base/settings.py:478 +#: pretix/base/settings.py:491 msgid "Ask for a phone number per order" msgstr "اطلب رقم هاتف لكل طلب" -#: pretix/base/settings.py:487 +#: pretix/base/settings.py:500 msgid "Require a phone number per order" msgstr "يتطلب رقم هاتف لكل طلب" -#: pretix/base/settings.py:498 +#: pretix/base/settings.py:511 #, fuzzy #| msgid "including all taxes" msgid "Rounding of taxes" msgstr "بما في ذلك جميع الضرائب" -#: pretix/base/settings.py:502 +#: pretix/base/settings.py:515 msgid "" "Note that if you transfer your sales data from pretix to an external system " "for tax reporting, you need to make sure to account for possible rounding " "differences if your external system rounds differently than pretix." msgstr "" -#: pretix/base/settings.py:518 +#: pretix/base/settings.py:531 msgid "Ask for invoice address" msgstr "اطلب عنوان الفاتورة" -#: pretix/base/settings.py:528 +#: pretix/base/settings.py:541 msgid "Do not ask for invoice address if an order is free" msgstr "لا تسأل عن عنوان الفاتورة إذا كان الطلب مجانيا" -#: pretix/base/settings.py:538 +#: pretix/base/settings.py:551 msgid "Require customer name" msgstr "مطلوب اسم العميل" -#: pretix/base/settings.py:548 +#: pretix/base/settings.py:561 msgid "Show attendee names on invoices" msgstr "إظهار أسماء الحضور في الفواتير" -#: pretix/base/settings.py:558 +#: pretix/base/settings.py:571 #, fuzzy #| msgid "Show free products on invoices" msgid "Show event location on invoices" msgstr "عرض المنتجات المجانية على الفواتير" -#: pretix/base/settings.py:559 +#: pretix/base/settings.py:572 msgid "" "The event location will be shown below the list of products if it is the " "same for all lines. It will be shown on every line if there are different " "locations." msgstr "" -#: pretix/base/settings.py:570 +#: pretix/base/settings.py:583 #, fuzzy #| msgid "Show event end date" msgid "Show exchange rates" msgstr "إظهار تاريخ انتهاء الفعالية" -#: pretix/base/settings.py:573 pretix/base/settings.py:581 -#: pretix/control/forms/item.py:629 +#: pretix/base/settings.py:586 pretix/base/settings.py:595 +#: pretix/control/forms/item.py:684 msgid "Never" msgstr "أبدا" -#: pretix/base/settings.py:574 pretix/base/settings.py:582 +#: pretix/base/settings.py:587 pretix/base/settings.py:596 msgid "" "Based on European Central Bank daily rates, whenever the invoice recipient " "is in an EU country that uses a different currency." msgstr "" -#: pretix/base/settings.py:576 pretix/base/settings.py:584 +#: pretix/base/settings.py:589 pretix/base/settings.py:598 msgid "" "Based on Czech National Bank daily rates, whenever the invoice amount is not " "in CZK." msgstr "" -#: pretix/base/settings.py:595 +#: pretix/base/settings.py:590 pretix/base/settings.py:599 +msgid "" +"Based on National Bank of Poland daily rates, whenever the invoice amount is " +"not in PLN." +msgstr "" + +#: pretix/base/settings.py:610 msgid "Require invoice address" msgstr "مطلوب عنوان الفاتورة" -#: pretix/base/settings.py:606 +#: pretix/base/settings.py:621 #, fuzzy #| msgid "Require a business addresses" msgid "Require a business address" msgstr "مطلوب عناوين العمل" -#: pretix/base/settings.py:607 +#: pretix/base/settings.py:622 msgid "This will require users to enter a company name." msgstr "سيتطلب هذا من المستخدمين إدخال اسم الشركة." -#: pretix/base/settings.py:618 +#: pretix/base/settings.py:633 msgid "Ask for beneficiary" msgstr "اسأل عن المستفيد" -#: pretix/base/settings.py:629 +#: pretix/base/settings.py:644 #, fuzzy #| msgid "Custom address field" msgid "Custom recipient field label" msgstr "حقل العنوان المخصص" -#: pretix/base/settings.py:631 +#: pretix/base/settings.py:646 #, fuzzy #| msgid "" #| "If you want to add a custom text field, e.g. for a country-specific " @@ -10730,24 +10961,24 @@ msgstr "" "التصنيف لمطالبة المستخدم بإدخال التفاصيل الخاصة به وكذلك لعرض القيمة على " "الفاتورة. لن يكون الحقل مطلوبا." -#: pretix/base/settings.py:645 +#: pretix/base/settings.py:660 #, fuzzy #| msgid "Custom address field" msgid "Custom recipient field help text" msgstr "حقل العنوان المخصص" -#: pretix/base/settings.py:647 +#: pretix/base/settings.py:662 msgid "" "If you use the custom recipient field, you can specify a help text which " "will be displayed underneath the field. It will not be displayed on the " "invoice." msgstr "" -#: pretix/base/settings.py:658 +#: pretix/base/settings.py:673 msgid "Ask for VAT ID" msgstr "اطلب رقم ضريبة القيمة المضافة" -#: pretix/base/settings.py:660 +#: pretix/base/settings.py:675 #, fuzzy, python-brace-format #| msgid "" #| "Does only work if an invoice address is asked for. VAT ID is not required." @@ -10757,32 +10988,32 @@ msgid "" msgstr "" "لا يعمل إلا إذا تم طلب عنوان الفاتورة. رقم ضريبة القيمة المضافة غير مطلوب." -#: pretix/base/settings.py:680 +#: pretix/base/settings.py:695 #, fuzzy #| msgid "Require name" msgid "Require VAT ID in" msgstr "اطلب اسم" -#: pretix/base/settings.py:686 +#: pretix/base/settings.py:701 msgid "" "VAT ID is optional by default, because not all businesses are assigned a VAT " "ID in all countries. VAT ID will be required for all business addresses in " "the selected countries." msgstr "" -#: pretix/base/settings.py:702 +#: pretix/base/settings.py:717 msgid "Invoice address explanation" msgstr "شرح عنوان الفاتورة" -#: pretix/base/settings.py:705 +#: pretix/base/settings.py:720 msgid "This text will be shown above the invoice address form during checkout." msgstr "سيظهر هذا النص في أعلى نموذج عنوان الفاتورة أثناء تسجيل الخروج." -#: pretix/base/settings.py:715 +#: pretix/base/settings.py:730 msgid "Show paid amount on partially paid invoices" msgstr "إظهار المبلغ المدفوع في الفواتير المدفوعة جزئيا" -#: pretix/base/settings.py:716 +#: pretix/base/settings.py:731 msgid "" "If an invoice has already been paid partially, this option will add the paid " "and pending amount to the invoice." @@ -10790,11 +11021,11 @@ msgstr "" "إذا تم دفع الفاتورة جزئيا مسبقا ، فسيضيف هذا الخيار المبلغ المدفوع والمتأخر " "إلى الفاتورة." -#: pretix/base/settings.py:727 +#: pretix/base/settings.py:742 msgid "Show free products on invoices" msgstr "عرض المنتجات المجانية على الفواتير" -#: pretix/base/settings.py:728 +#: pretix/base/settings.py:743 msgid "" "Note that invoices will never be generated for orders that contain only free " "products." @@ -10802,21 +11033,21 @@ msgstr "" "لاحظ أنه لن يتم إنشاء فواتير مطلقا للطلبات التي لا تحتوي إلا على منتجات " "مجانية." -#: pretix/base/settings.py:739 +#: pretix/base/settings.py:754 msgid "Show expiration date of order" msgstr "إظهار تاريخ إنتهاء صلاحية الطلب" -#: pretix/base/settings.py:740 +#: pretix/base/settings.py:755 msgid "" "The expiration date will not be shown if the invoice is generated after the " "order is paid." msgstr "لن يظهر تاريخ إنتهاء الصلاحية إذا تم إنشاء الفاتورة بعد سداد الطلب." -#: pretix/base/settings.py:751 +#: pretix/base/settings.py:766 msgid "Minimum length of invoice number after prefix" msgstr "الحد الأدنى لطول رقم الفاتورة بعد الاختصار" -#: pretix/base/settings.py:752 +#: pretix/base/settings.py:767 msgid "" "The part of your invoice number after your prefix will be filled up with " "leading zeros up to this length, e.g. INV-001 or INV-00001." @@ -10824,20 +11055,20 @@ msgstr "" "سيتم ملء الجزء من رقم الفاتورة بعد رمز الاختصار الخاص بك بالأصفار حتى هذا " "النحو ، على سبيل المثال فاتورة-001 أو فاتورة -00001." -#: pretix/base/settings.py:765 +#: pretix/base/settings.py:780 msgid "Generate invoices with consecutive numbers" msgstr "إنشاء فواتير بأرقام متتالية" -#: pretix/base/settings.py:766 +#: pretix/base/settings.py:781 msgid "If deactivated, the order code will be used in the invoice number." msgstr "" "إذا تم إلغاء تفعيل هذا الخيار ، فسيتم استخدام رمز الطلب في رقم الفاتورة." -#: pretix/base/settings.py:776 +#: pretix/base/settings.py:791 msgid "Invoice number prefix" msgstr "الرمز الذي يسبق رقم الفاتورة" -#: pretix/base/settings.py:777 +#: pretix/base/settings.py:792 msgid "" "This will be prepended to invoice numbers. If you leave this field empty, " "your event slug will be used followed by a dash. Attention: If multiple " @@ -10855,17 +11086,17 @@ msgstr "" "استخدام %Y (مع السنة) %y (بدون السنة) لإدخال سنة الفاتورة أو %m و %d ليوم من " "الشهر." -#: pretix/base/settings.py:789 pretix/base/settings.py:813 +#: pretix/base/settings.py:804 pretix/base/settings.py:828 #, fuzzy, python-brace-format #| msgid "Please enter a shorter name." msgid "Please only use the characters {allowed} in this field." msgstr "الرجاء إدخال اسم أقصر." -#: pretix/base/settings.py:804 +#: pretix/base/settings.py:819 msgid "Invoice number prefix for cancellations" msgstr "رمز رقم الفاتورة للإلغاء" -#: pretix/base/settings.py:805 +#: pretix/base/settings.py:820 msgid "" "This will be prepended to invoice numbers of cancellations. If you leave " "this field empty, the same numbering scheme will be used that you configured " @@ -10874,44 +11105,44 @@ msgstr "" "سيتم إضافة هذا مسبقا إلى أرقام فواتير الإلغاءات. إذا تركت هذا الحقل فارغا ، " "فسيتم استخدام نفس نظام الترقيم الذي قمت بإعداده للفواتير العادية." -#: pretix/base/settings.py:828 +#: pretix/base/settings.py:843 msgid "Highlight order code to make it stand out visibly" msgstr "" -#: pretix/base/settings.py:829 pretix/base/settings.py:841 +#: pretix/base/settings.py:844 pretix/base/settings.py:856 #, fuzzy #| msgid "Only respected by modern browsers." msgid "Only respected by some invoice renderers." msgstr "يستخدم للمتصفحات الحديثة فقط." -#: pretix/base/settings.py:840 pretix/base/settings.py:3174 -#: pretix/control/templates/pretixcontrol/pdf/index.html:441 +#: pretix/base/settings.py:855 pretix/base/settings.py:3189 +#: pretix/control/templates/pretixcontrol/pdf/index.html:439 msgid "Font" msgstr "الخط" -#: pretix/base/settings.py:867 +#: pretix/base/settings.py:882 msgid "Length of ticket codes" msgstr "طول رموز التذاكر" -#: pretix/base/settings.py:894 +#: pretix/base/settings.py:909 msgid "Reservation period" msgstr "فترة الحجز" -#: pretix/base/settings.py:896 +#: pretix/base/settings.py:911 msgid "" "The number of minutes the items in a user's cart are reserved for this user." msgstr "عدد الدقائق المحجوزة للعناصر الموجودة في عربة التسوق لهذا المستخدم." -#: pretix/base/settings.py:905 +#: pretix/base/settings.py:920 msgid "" "Directly redirect to check-out after a product has been added to the cart." msgstr "إعادة التوجيه مباشرة لتسجيل الخروج بعد إضافة منتج إلى سلة التسوق." -#: pretix/base/settings.py:914 +#: pretix/base/settings.py:929 msgid "End of presale text" msgstr "نهاية النص الخاص بعرض ما قبل البيع" -#: pretix/base/settings.py:917 +#: pretix/base/settings.py:932 msgid "" "This text will be shown above the ticket shop once the designated sales " "timeframe for this event is over. You can use it to describe other options " @@ -10921,11 +11152,11 @@ msgstr "" "لهذه الفعالية. يمكنك استخدامه لوصف الخيارات الأخرى للحصول على تذكرة ، على " "سبيل المثال شباك التذاكر." -#: pretix/base/settings.py:932 +#: pretix/base/settings.py:947 msgid "Guidance text" msgstr "نص للتوجيه" -#: pretix/base/settings.py:933 +#: pretix/base/settings.py:948 msgid "" "This text will be shown above the payment options. You can explain the " "choices to the user here, if you want." @@ -10933,19 +11164,19 @@ msgstr "" "سيظهر هذا النص فوق خيارات الدفع. يمكنك شرح الاختيارات للمستخدم هنا ، إذا كنت " "تريد." -#: pretix/base/settings.py:944 pretix/base/settings.py:954 +#: pretix/base/settings.py:959 pretix/base/settings.py:969 msgid "in days" msgstr "بالأيام" -#: pretix/base/settings.py:945 pretix/base/settings.py:955 +#: pretix/base/settings.py:960 pretix/base/settings.py:970 msgid "in minutes" msgstr "بالدقائق" -#: pretix/base/settings.py:950 +#: pretix/base/settings.py:965 msgid "Set payment term" msgstr "تعيين مدة السداد" -#: pretix/base/settings.py:957 +#: pretix/base/settings.py:972 msgid "" "If using days, the order will expire at the end of the last day. Using " "minutes is more exact, but should only be used for real-time payment methods." @@ -10953,11 +11184,11 @@ msgstr "" "في حالة استخدام الأيام ، ستنتهي صلاحية الطلب في نهاية اليوم الأخير. يعد " "استخدام الدقائق أكثر دقة ، ولكن يجب استخدامه فقط لطرق الدفع الفوري." -#: pretix/base/settings.py:968 +#: pretix/base/settings.py:983 msgid "Payment term in days" msgstr "مدة السداد بالأيام" -#: pretix/base/settings.py:975 +#: pretix/base/settings.py:990 msgid "" "The number of days after placing an order the user has to pay to preserve " "their reservation. If you use slow payment methods like bank transfer, we " @@ -10969,11 +11200,11 @@ msgstr "" "نوصي ب 14 يوما. إذا كنت تستخدم طرق الدفع الفوري فقط ، فإننا نوصي بالاستمرار " "في تحديد يومين أو ثلاثة أيام للسماح للأشخاص بإعادة محاولة الدفع الفاشل." -#: pretix/base/settings.py:994 +#: pretix/base/settings.py:1009 msgid "Only end payment terms on weekdays" msgstr "إنهاء مدة الدفع في أيام العمل الأسبوعية فقط" -#: pretix/base/settings.py:995 +#: pretix/base/settings.py:1010 msgid "" "If this is activated and the payment term of any order ends on a Saturday or " "Sunday, it will be moved to the next Monday instead. This is required in " @@ -10984,11 +11215,11 @@ msgstr "" "نقله إلى يوم الاثنين التالي بدلا من ذلك. هذا مطلوب في بعض البلدان بموجب " "القانون المدني. لن يؤثر هذا على آخر تاريخ للمدفوعات التي تم إعدادها أدناه." -#: pretix/base/settings.py:1012 +#: pretix/base/settings.py:1027 msgid "Payment term in minutes" msgstr "مدة السداد بالدقائق" -#: pretix/base/settings.py:1013 +#: pretix/base/settings.py:1028 msgid "" "The number of minutes after placing an order the user has to pay to preserve " "their reservation. Only use this if you exclusively offer real-time payment " @@ -11000,11 +11231,11 @@ msgstr "" "أنه لأسباب فنية ، قد يكون الإطار الزمني الفعلي أطول ببضع دقائق قبل أن يتم " "وضع علامة على الطلب على أنه منتهي الصلاحية." -#: pretix/base/settings.py:1037 +#: pretix/base/settings.py:1052 msgid "Last date of payments" msgstr "آخر موعد للمدفوعات" -#: pretix/base/settings.py:1038 +#: pretix/base/settings.py:1053 msgid "" "The last date any payments are accepted. This has precedence over the terms " "configured above. If you use the event series feature and an order contains " @@ -11014,11 +11245,11 @@ msgstr "" "إعدادها أعلاه. إذا كنت تستخدم ميزة سلسلة الفعاليات وكان الطلب يحتوي على " "تذاكر لتواريخ متعددة ، فسيتم استخدام أقرب تاريخ." -#: pretix/base/settings.py:1050 +#: pretix/base/settings.py:1065 msgid "Automatically expire unpaid orders" msgstr "إنهاء الطلبات غير المسددة تلقائيا" -#: pretix/base/settings.py:1051 +#: pretix/base/settings.py:1066 msgid "" "If checked, all unpaid orders will automatically go from 'pending' to " "'expired' after the end of their payment deadline. This means that those " @@ -11028,13 +11259,13 @@ msgstr "" "إلى \"منتهية الصلاحية\" بعد إنتهاء الموعد النهائي للدفع. هذا يعني أن هذه " "التذاكر تعود إلى الموقع ويمكن لأشخاص آخرين طلبها." -#: pretix/base/settings.py:1063 +#: pretix/base/settings.py:1078 #, fuzzy #| msgid "Expiration date" msgid "Expiration delay" msgstr "تاريخ إنتهاء الصلاحية" -#: pretix/base/settings.py:1064 +#: pretix/base/settings.py:1079 msgid "" "The order will only actually expire this many days after the expiration date " "communicated to the customer. If you select \"Only end payment terms on " @@ -11043,11 +11274,11 @@ msgid "" "enforced." msgstr "" -#: pretix/base/settings.py:1086 +#: pretix/base/settings.py:1101 msgid "Hide \"payment pending\" state on customer-facing pages" msgstr "إخفاء حالة \"الدفع المعلق\" من الصفحات التي تظهر للعملاء" -#: pretix/base/settings.py:1087 +#: pretix/base/settings.py:1102 msgid "" "The payment instructions panel will still be shown to the primary customer, " "but no indication of missing payment will be visible on the ticket pages of " @@ -11056,7 +11287,7 @@ msgstr "" "ستظل لوحة تعليمات الدفع معروضة للعميل الأساسي ، ولكن لن تظهر أي إشارة لفقدان " "السداد على صفحات تذاكر الحاضرين الذين لم يشتروا التذكرة بأنفسهم." -#: pretix/base/settings.py:1105 +#: pretix/base/settings.py:1120 msgid "" "If you have a gift card, please enter the gift card code here. If the gift " "card does not have enough credit to pay for the full order, you will be " @@ -11067,11 +11298,11 @@ msgstr "" "هديةرصيد كاف لدفع للنظام كامل، وسوف يعرض لك هذه الصفحة مرة أخرى ويمكنك " "إمااستبدال بطاقة هدية أخرى أو تحديد طريقة دفع مختلفة للفرق." -#: pretix/base/settings.py:1124 +#: pretix/base/settings.py:1139 msgid "Accept late payments" msgstr "قبول المدفوعات المتأخرة" -#: pretix/base/settings.py:1125 +#: pretix/base/settings.py:1140 msgid "" "Accept payments for orders even when they are in 'expired' state as long as " "enough capacity is available. No payments will ever be accepted after the " @@ -11081,124 +11312,124 @@ msgstr "" "متوفرة. لن يتم قبول أي مدفوعات بعد \"آخر تاريخ للدفعات\" والذي تم إعداده " "أعلاه." -#: pretix/base/settings.py:1136 +#: pretix/base/settings.py:1151 msgid "Show start date" msgstr "عرض تاريخ البداية" -#: pretix/base/settings.py:1137 +#: pretix/base/settings.py:1152 msgid "Show the presale start date before presale has started." msgstr "اعرض تاريخ بداية البيع المسبق قبل أن بدايته." -#: pretix/base/settings.py:1148 pretix/base/settings.py:1157 -#: pretix/base/settings.py:1171 pretix/base/settings.py:1180 +#: pretix/base/settings.py:1163 pretix/base/settings.py:1172 +#: pretix/base/settings.py:1186 pretix/base/settings.py:1195 #, fuzzy #| msgid "Default price" msgid "Use default tax rate" msgstr "السعر الافتراضي" -#: pretix/base/settings.py:1149 pretix/base/settings.py:1158 -#: pretix/base/settings.py:1169 pretix/base/settings.py:1178 +#: pretix/base/settings.py:1164 pretix/base/settings.py:1173 +#: pretix/base/settings.py:1184 pretix/base/settings.py:1193 #, fuzzy msgid "Charge no taxes" msgstr "تم تحديث الرسوم." -#: pretix/base/settings.py:1154 +#: pretix/base/settings.py:1169 #, fuzzy #| msgid "Tax rule for payment fees" msgid "Tax handling on payment fees" msgstr "حكم الضرائب لدفع الرسوم" -#: pretix/base/settings.py:1170 pretix/base/settings.py:1179 +#: pretix/base/settings.py:1185 pretix/base/settings.py:1194 msgid "Use same taxes as order positions (split according to net prices)" msgstr "" -#: pretix/base/settings.py:1175 +#: pretix/base/settings.py:1190 #, fuzzy #| msgid "Keep a fixed cancellation fee" msgid "Tax handling on cancellation fees" msgstr "احتفظ برسوم إلغاء ثابتة" -#: pretix/base/settings.py:1191 pretix/base/settings.py:1204 +#: pretix/base/settings.py:1206 pretix/base/settings.py:1219 msgid "Do not generate invoices" msgstr "لا تصدر فواتير" -#: pretix/base/settings.py:1192 pretix/base/settings.py:1209 +#: pretix/base/settings.py:1207 pretix/base/settings.py:1224 msgid "Only manually in admin panel" msgstr "فقط يدويا في لوحة الإدارة" -#: pretix/base/settings.py:1193 pretix/base/settings.py:1207 +#: pretix/base/settings.py:1208 pretix/base/settings.py:1222 msgid "Automatically on user request" msgstr "تلقائيا بناء على طلب المستخدم" -#: pretix/base/settings.py:1194 pretix/base/settings.py:1208 +#: pretix/base/settings.py:1209 pretix/base/settings.py:1223 #, fuzzy #| msgid "Automatically on user request" msgid "Automatically on user request for paid orders" msgstr "تلقائيا بناء على طلب المستخدم" -#: pretix/base/settings.py:1195 +#: pretix/base/settings.py:1210 msgid "Automatically for all created orders" msgstr "تلقائيا لجميع الطلبات التي تم إنشاؤها" -#: pretix/base/settings.py:1196 +#: pretix/base/settings.py:1211 msgid "Automatically on payment or when required by payment method" msgstr "تلقائيا عند الدفع أو عند الطلب بواسطة طريقة السداد" -#: pretix/base/settings.py:1201 +#: pretix/base/settings.py:1216 msgid "Generate invoices" msgstr "إنشاء الفواتير" -#: pretix/base/settings.py:1205 +#: pretix/base/settings.py:1220 #, fuzzy #| msgid "Automatically on payment or when required by payment method" msgid "Automatically after payment or when required by payment method" msgstr "تلقائيا عند الدفع أو عند الطلب بواسطة طريقة السداد" -#: pretix/base/settings.py:1206 +#: pretix/base/settings.py:1221 #, fuzzy #| msgid "Automatically for all created orders" msgid "Automatically before payment for all created orders" msgstr "تلقائيا لجميع الطلبات التي تم إنشاؤها" -#: pretix/base/settings.py:1211 +#: pretix/base/settings.py:1226 msgid "Invoices will never be automatically generated for free orders." msgstr "لن يتم إنشاء الفواتير تلقائيا للطلبات المجانية." -#: pretix/base/settings.py:1221 pretix/base/settings.py:1233 +#: pretix/base/settings.py:1236 pretix/base/settings.py:1248 msgid "" "Automatic based on ticket-specific validity, membership validity, event " "series date, or event date" msgstr "" -#: pretix/base/settings.py:1222 pretix/base/settings.py:1234 +#: pretix/base/settings.py:1237 pretix/base/settings.py:1249 msgid "Automatic, but prefer invoice date over event date" msgstr "" -#: pretix/base/settings.py:1225 pretix/base/settings.py:1237 +#: pretix/base/settings.py:1240 pretix/base/settings.py:1252 #, fuzzy #| msgctxt "invoice" #| msgid "Invoice date" msgid "Invoice date" msgstr "تاريخ الفاتورة" -#: pretix/base/settings.py:1230 +#: pretix/base/settings.py:1245 #, fuzzy #| msgctxt "subevent" #| msgid "Date ordering" msgid "Date of service" msgstr "ترتيب التاريخ" -#: pretix/base/settings.py:1239 +#: pretix/base/settings.py:1254 msgid "" "This controls what dates are shown on the invoice, but is especially " "important for electronic invoicing." msgstr "" -#: pretix/base/settings.py:1251 +#: pretix/base/settings.py:1266 msgid "Automatically cancel and reissue invoice on address changes" msgstr "إلغاء الفاتورة تلقائيا عند تغيير العنوان وإعادة إصدارها" -#: pretix/base/settings.py:1252 +#: pretix/base/settings.py:1267 msgid "" "If customers change their invoice address on an existing order, the invoice " "will automatically be canceled and a new invoice will be issued. This " @@ -11208,56 +11439,56 @@ msgstr "" "الفاتورة تلقائيا وسيتم إصدار فاتورة جديدة. لن يؤثر هذا الإعداد على التعديلات " "في لوحة التحكم." -#: pretix/base/settings.py:1264 -msgid "Allow to update existing invoices" +#: pretix/base/settings.py:1279 +msgid "Allow updating existing invoices" msgstr "" -#: pretix/base/settings.py:1265 +#: pretix/base/settings.py:1280 msgid "" "By default, invoices can never again be changed once they are issued. In " "most countries, we recommend to leave this option turned off and always " "issue a new invoice if a change needs to be made." msgstr "" -#: pretix/base/settings.py:1281 +#: pretix/base/settings.py:1296 #, fuzzy #| msgid "Business customers" msgid "Only issue invoices to business customers" msgstr "عملاء قطاع الأعمال" -#: pretix/base/settings.py:1291 +#: pretix/base/settings.py:1306 msgid "Address line" msgstr "العنوان" -#: pretix/base/settings.py:1295 +#: pretix/base/settings.py:1310 msgid "Albert Einstein Road 52" msgstr "شارع ألبرت أينشتاين 52" -#: pretix/base/settings.py:1375 +#: pretix/base/settings.py:1390 msgid "Domestic tax ID" msgstr "معرف الضريبة المحلية" -#: pretix/base/settings.py:1376 +#: pretix/base/settings.py:1391 msgid "e.g. tax number in Germany, ABN in Australia, …" msgstr "على سبيل المثال الرقم الضريبي في ألمانيا ، رقم العمل الأسترالي،…" -#: pretix/base/settings.py:1387 +#: pretix/base/settings.py:1402 msgid "EU VAT ID" msgstr "رقم ضريبة القيمة المضافة في الاتحاد الأوروبي" -#: pretix/base/settings.py:1402 +#: pretix/base/settings.py:1417 msgid "e.g. With this document, we sent you the invoice for your ticket order." msgstr "على سبيل المثال باستخدام هذا المستند ، أرسلنا إليك فاتورة طلب تذكرتك." -#: pretix/base/settings.py:1405 +#: pretix/base/settings.py:1420 msgid "Introductory text" msgstr "نص تمهيدي" -#: pretix/base/settings.py:1406 +#: pretix/base/settings.py:1421 msgid "Will be printed on every invoice above the invoice rows." msgstr "ستتم طباعتها على كل فاتورة فوق صفوف الفاتورة." -#: pretix/base/settings.py:1420 +#: pretix/base/settings.py:1435 msgid "" "e.g. Thank you for your purchase! You can find more information on the event " "at ..." @@ -11265,15 +11496,15 @@ msgstr "" "مثلا شكرا لك على الشراء! يمكنك العثور على مزيد من المعلومات حول هذه الفعالية " "في ..." -#: pretix/base/settings.py:1423 +#: pretix/base/settings.py:1438 msgid "Additional text" msgstr "نص إضافي" -#: pretix/base/settings.py:1424 +#: pretix/base/settings.py:1439 msgid "Will be printed on every invoice below the invoice total." msgstr "ستتم الطباعة على كل فاتورة تحت إجمالي الفاتورة." -#: pretix/base/settings.py:1438 +#: pretix/base/settings.py:1453 msgid "" "e.g. your bank details, legal details like your VAT ID, registration " "numbers, etc." @@ -11281,21 +11512,21 @@ msgstr "" "مثلا تفاصيل حسابك المصرفي، التفاصيل القانونية مثل معرف ضريبة القيمة المضافة، " "أرقام التسجيل، الخ." -#: pretix/base/settings.py:1441 +#: pretix/base/settings.py:1456 msgid "Footer" msgstr "تذييل" -#: pretix/base/settings.py:1442 +#: pretix/base/settings.py:1457 msgid "" "Will be printed centered and in a smaller font at the end of every invoice " "page." msgstr "ستتم طباعتها في المنتصف وبخط أصغر في نهاية كل صفحة فاتورة." -#: pretix/base/settings.py:1457 +#: pretix/base/settings.py:1472 msgid "Attach invoices to emails" msgstr "إرفق الفواتير في رسائل البريد الإلكتروني" -#: pretix/base/settings.py:1458 +#: pretix/base/settings.py:1473 msgid "" "If invoices are automatically generated for all orders, they will be " "attached to the order confirmation mail. If they are automatically generated " @@ -11306,11 +11537,11 @@ msgstr "" "الطلب. إذا تم إنشاؤها تلقائيا عند الدفع ، فسيتم إرفاقها ببريد تأكيد الدفع. " "إذا لم يتم إنشاؤها تلقائيا ، فلن يتم إرفاقها برسائل البريد الإلكتروني." -#: pretix/base/settings.py:1471 +#: pretix/base/settings.py:1486 msgid "Email address to receive a copy of each invoice" msgstr "عنوان البريد الإلكتروني لتلقي نسخة من كل فاتورة" -#: pretix/base/settings.py:1472 +#: pretix/base/settings.py:1487 msgid "" "Each newly created invoice will be sent to this email address shortly after " "creation. You can use this for an automated import of invoices to your " @@ -11320,28 +11551,28 @@ msgstr "" "وقت قصير من إنشائها. يمكنك استخدام هذا للاستيراد الآلي للفواتير إلى نظام " "المحاسبة الخاص بك. ستكون الفاتورة هي المرفق الوحيد بالبريد الإلكتروني." -#: pretix/base/settings.py:1487 +#: pretix/base/settings.py:1502 msgid "Show items outside presale period" msgstr "إظهار العناصر خارج فترة عرض ما قبل البيع" -#: pretix/base/settings.py:1488 +#: pretix/base/settings.py:1503 msgid "" "Show item details before presale has started and after presale has ended" msgstr "إظهار تفاصيل العنصر قبل بداية البيع المسبق وبعد انتهائه" -#: pretix/base/settings.py:1508 +#: pretix/base/settings.py:1523 msgid "Available languages" msgstr "اللغات المتاحة" -#: pretix/base/settings.py:1524 pretix/control/forms/event.py:151 +#: pretix/base/settings.py:1539 pretix/control/forms/event.py:151 msgid "Default language" msgstr "اللغة الافتراضية" -#: pretix/base/settings.py:1534 +#: pretix/base/settings.py:1549 msgid "Region" msgstr "منطقة" -#: pretix/base/settings.py:1535 +#: pretix/base/settings.py:1550 msgid "" "Will be used to determine date and time formatting as well as default " "country for customer addresses and phone numbers. For formatting, this takes " @@ -11353,13 +11584,13 @@ msgstr "" "من اللغة وبالتالي فهو مناسب في الغالب للغات المستخدمة في مناطق مختلفة على " "مستوى العالم (مثل اللغة الإنجليزية)." -#: pretix/base/settings.py:1547 +#: pretix/base/settings.py:1562 #, fuzzy #| msgid "This is not an event series." msgid "This shop represents an event" msgstr "هذه ليست سلسلة فعالية." -#: pretix/base/settings.py:1549 +#: pretix/base/settings.py:1564 msgid "" "Uncheck this box if you are only selling something that has no specific " "date, such as gift cards or a ticket that can be used any time. The system " @@ -11368,19 +11599,19 @@ msgid "" "may still show up in other places." msgstr "" -#: pretix/base/settings.py:1562 +#: pretix/base/settings.py:1577 msgid "Show event end date" msgstr "إظهار تاريخ انتهاء الفعالية" -#: pretix/base/settings.py:1563 +#: pretix/base/settings.py:1578 msgid "If disabled, only event's start date will be displayed to the public." msgstr "إذا تم تعطيل هذا الخيار، فسيظهر للجمهور تاريخ بداية الفعالية فقط." -#: pretix/base/settings.py:1572 +#: pretix/base/settings.py:1587 msgid "Show dates with time" msgstr "عرض التواريخ مع الوقت" -#: pretix/base/settings.py:1573 +#: pretix/base/settings.py:1588 msgid "" "If disabled, the event's start and end date will be displayed without the " "time of day." @@ -11388,27 +11619,27 @@ msgstr "" "إذا تم تعطيل هذا الخيار ، فسيتم عرض تاريخ بداية الفعالية وانتهائها بدون " "توقيت اليوم." -#: pretix/base/settings.py:1582 +#: pretix/base/settings.py:1597 msgid "Hide all products that are sold out" msgstr "إخفاء جميع المنتجات التي تم بيعها" -#: pretix/base/settings.py:1592 pretix/control/forms/event.py:1870 +#: pretix/base/settings.py:1607 pretix/control/forms/event.py:1870 msgid "Publicly show how many tickets of a certain type are still available." msgstr "اعرض علنا عدد التذاكر من نوع معين والتي لا تزال متاحة." -#: pretix/base/settings.py:1601 +#: pretix/base/settings.py:1616 msgid "Ask search engines not to index the ticket shop" msgstr "اطلب من محركات البحث عدم فهرسة متجر التذاكر" -#: pretix/base/settings.py:1610 +#: pretix/base/settings.py:1625 msgid "Show variations of a product expanded by default" msgstr "إظهار الأشكال المختلفة للمنتج موسعة بشكل افتراضي" -#: pretix/base/settings.py:1619 +#: pretix/base/settings.py:1634 msgid "Enable waiting list" msgstr "تمكين قائمة الانتظار" -#: pretix/base/settings.py:1620 pretix/control/forms/event.py:1875 +#: pretix/base/settings.py:1635 pretix/control/forms/event.py:1875 #, fuzzy msgid "" "Once a ticket is sold out, people can add themselves to a waiting list. As " @@ -11420,11 +11651,11 @@ msgstr "" "تصبح التذكرة متاحة مرة أخرى ، سيتم حجزها لأول شخص في قائمة الانتظار وسيتلقى " "هذا الشخص إشعارا بالبريد الإلكتروني مع قسيمة يمكن استخدامها لشراء تذكرة." -#: pretix/base/settings.py:1631 +#: pretix/base/settings.py:1646 msgid "Automatic waiting list assignments" msgstr "مهام قائمة الانتظار التلقائية" -#: pretix/base/settings.py:1632 +#: pretix/base/settings.py:1647 #, fuzzy msgid "" "If ticket capacity becomes free, automatically create a voucher and send it " @@ -11438,11 +11669,11 @@ msgstr "" "البريد الإلكتروني تلقائيا ولكن يمكنك إرسالها يدويا عبر لوحة التحكم. إذا قمت " "بتعطيل قائمة الانتظار مع إبقاء هذا الخيار مفعلا ، فسيستمر إرسال التذاكر." -#: pretix/base/settings.py:1648 +#: pretix/base/settings.py:1663 msgid "Waiting list response time" msgstr "وقت استجابة قائمة الانتظار" -#: pretix/base/settings.py:1651 +#: pretix/base/settings.py:1666 #, fuzzy msgid "" "If a ticket voucher is sent to a person on the waiting list, it has to be " @@ -11453,13 +11684,13 @@ msgstr "" "خلال هذا العدد من الساعات حتى تنتهي صلاحيتها ويمكن إعادة تخصيصها إلى الشخص " "التالي في القائمة." -#: pretix/base/settings.py:1662 +#: pretix/base/settings.py:1677 #, fuzzy #| msgid "Enable waiting list" msgid "Disable waiting list" msgstr "تمكين قائمة الانتظار" -#: pretix/base/settings.py:1663 +#: pretix/base/settings.py:1678 msgid "" "The waiting list will be fully disabled after this date. This means that " "nobody can add themselves to the waiting list any more, but also that " @@ -11468,56 +11699,56 @@ msgid "" "remain active." msgstr "" -#: pretix/base/settings.py:1675 +#: pretix/base/settings.py:1690 msgid "Ask for a name" msgstr "اطلب الاسم" -#: pretix/base/settings.py:1676 +#: pretix/base/settings.py:1691 msgid "Ask for a name when signing up to the waiting list." msgstr "اطلب اسما عند التسجيل في قائمة الانتظار." -#: pretix/base/settings.py:1685 +#: pretix/base/settings.py:1700 msgid "Require name" msgstr "اطلب اسم" -#: pretix/base/settings.py:1686 +#: pretix/base/settings.py:1701 msgid "Require a name when signing up to the waiting list.." msgstr "طلب اسم عند التسجيل في قائمة الانتظار .." -#: pretix/base/settings.py:1696 +#: pretix/base/settings.py:1711 msgid "Ask for a phone number" msgstr "اطلب رقم هاتف" -#: pretix/base/settings.py:1697 +#: pretix/base/settings.py:1712 msgid "Ask for a phone number when signing up to the waiting list." msgstr "اطلب رقم هاتف عند التسجيل في قائمة الانتظار." -#: pretix/base/settings.py:1706 +#: pretix/base/settings.py:1721 msgid "Require phone number" msgstr "يلزم رقم الهاتف" -#: pretix/base/settings.py:1707 +#: pretix/base/settings.py:1722 msgid "Require a phone number when signing up to the waiting list.." msgstr "طلب رقم هاتف عند التسجيل في قائمة الانتظار .." -#: pretix/base/settings.py:1717 +#: pretix/base/settings.py:1732 msgid "Phone number explanation" msgstr "تفسير رقم الهاتف" -#: pretix/base/settings.py:1720 +#: pretix/base/settings.py:1735 msgid "" "If you ask for a phone number, explain why you do so and what you will use " "the phone number for." msgstr "" "إذا طلبت رقم هاتف ، اشرح سبب قيامك بذلك وما الذي ستستخدم رقم الهاتف لأجله." -#: pretix/base/settings.py:1732 +#: pretix/base/settings.py:1747 #, fuzzy #| msgid "Maximum number of items per order" msgid "Maximum number of entries per email address for the same product" msgstr "الحد الأقصى لعدد العناصر لكل طلب" -#: pretix/base/settings.py:1736 +#: pretix/base/settings.py:1751 msgid "" "With an increased limit, a customer may request more than one ticket for a " "specific product using the same, unique email address. However, regardless " @@ -11526,13 +11757,13 @@ msgid "" "ticket at a time." msgstr "" -#: pretix/base/settings.py:1748 +#: pretix/base/settings.py:1763 #, fuzzy #| msgid "Show number of tickets left" msgid "Show number of check-ins to customer" msgstr "إظهار عدد التذاكر المتبقية" -#: pretix/base/settings.py:1749 +#: pretix/base/settings.py:1764 msgid "" "With this option enabled, your customers will be able to see how many times " "they entered the event. This is usually not necessary, but might be useful " @@ -11542,19 +11773,19 @@ msgid "" "check-in lists." msgstr "" -#: pretix/base/settings.py:1762 +#: pretix/base/settings.py:1777 msgid "Allow users to download tickets" msgstr "السماح للمستخدمين بتحميل التذاكر" -#: pretix/base/settings.py:1763 +#: pretix/base/settings.py:1778 msgid "If this is off, nobody can download a ticket." msgstr "إذا تم تعطيل هذا الخيار، فلا يمكن لأي شخص تنزيل تذكرة." -#: pretix/base/settings.py:1772 +#: pretix/base/settings.py:1787 msgid "Download date" msgstr "تاريخ التنزيل" -#: pretix/base/settings.py:1773 +#: pretix/base/settings.py:1788 msgid "" "Ticket download will be offered after this date. If you use the event series " "feature and an order contains tickets for multiple event dates, download of " @@ -11564,13 +11795,13 @@ msgstr "" "الفعاليات وكان الطلب يحتوي على تذاكر لتواريخ فعاليات متعددة ، فسيكون تنزيل " "جميع التذاكر متاحا إذا سمح بذلك أحد تواريخ الفعالية على الأقل." -#: pretix/base/settings.py:1784 +#: pretix/base/settings.py:1799 #, fuzzy #| msgid "Generate tickets for add-on products" msgid "Generate tickets for add-on products and bundled products" msgstr "إنشاء تذاكر للمنتجات الإضافية" -#: pretix/base/settings.py:1785 +#: pretix/base/settings.py:1800 #, fuzzy #| msgid "" #| "By default, tickets are only issued for products selected individually, " @@ -11585,11 +11816,11 @@ msgstr "" "للمنتجات الإضافية. باستخدام هذا الخيار ، يتم إصدار تذكرة منفصلة لكل منتج " "إضافي أيضا." -#: pretix/base/settings.py:1798 +#: pretix/base/settings.py:1813 msgid "Generate tickets for all products" msgstr "إنشاء تذاكر لجميع المنتجات" -#: pretix/base/settings.py:1799 +#: pretix/base/settings.py:1814 msgid "" "If turned off, tickets are only issued for products that are marked as an " "\"admission ticket\"in the product settings. You can also turn off ticket " @@ -11599,11 +11830,11 @@ msgstr "" "\"بطاقة دخول\" عليها في إعدادات المنتج. يمكنك أيضا إيقاف تشغيل إصدار التذاكر " "لكل منتج على حدة." -#: pretix/base/settings.py:1811 +#: pretix/base/settings.py:1826 msgid "Generate tickets for pending orders" msgstr "إصدار تذاكر للطلبات المعلقة" -#: pretix/base/settings.py:1812 +#: pretix/base/settings.py:1827 msgid "" "If turned off, ticket downloads are only possible after an order has been " "marked as paid." @@ -11611,11 +11842,11 @@ msgstr "" "إذا تم إيقاف تشغيل هذا الخيار، فلن يكون تنزيل التذاكر ممكنا إلا بعد وضع " "علامة على الطلب على أنه مدفوع." -#: pretix/base/settings.py:1823 +#: pretix/base/settings.py:1838 msgid "Do not issue ticket before email address is validated" msgstr "لا تصدر تذكرة قبل التحقق من صحة عنوان البريد الإلكتروني" -#: pretix/base/settings.py:1824 +#: pretix/base/settings.py:1839 msgid "" "If turned on, tickets will not be offered for download directly after " "purchase. They will be attached to the payment confirmation email (if the " @@ -11628,13 +11859,13 @@ msgstr "" "جدا)، وسيتمكن العميل من تنزيلها من الصفحة بمجرد النقر على الرابط في البريد " "الإلكتروني. لا يؤثر على الطلبات المنفذة من خلال قنوات البيع الأخرى." -#: pretix/base/settings.py:1840 +#: pretix/base/settings.py:1855 #, fuzzy #| msgid "Quota availabilities" msgid "Low availability threshold" msgstr "توافر الحصة" -#: pretix/base/settings.py:1841 +#: pretix/base/settings.py:1856 msgid "" "If the availability of tickets falls below this percentage, the event (or a " "date, if it is an event series) will be highlighted to have low availability " @@ -11642,11 +11873,11 @@ msgid "" "availability will not be shown publicly." msgstr "" -#: pretix/base/settings.py:1855 +#: pretix/base/settings.py:1870 msgid "Show availability in event overviews" msgstr "إظهار التوفر في \"نبذة عن الفعالية\"" -#: pretix/base/settings.py:1856 +#: pretix/base/settings.py:1871 msgid "" "If checked, the list of events will show if events are sold out. This might " "make for longer page loading times if you have lots of events and the shown " @@ -11656,24 +11887,24 @@ msgstr "" "يؤدي هذا إلى إطالة وقت تحميل الصفحات إذا كان لديك الكثير من الفعاليات وقد " "تكون الحالة المعروضة قديمة لمدة تصل إلى دقيقتين." -#: pretix/base/settings.py:1869 pretix/base/settings.py:1877 +#: pretix/base/settings.py:1884 pretix/base/settings.py:1892 #: pretix/presale/templates/pretixpresale/fragment_calendar_nav.html:8 msgid "List" msgstr "قائمة" -#: pretix/base/settings.py:1870 pretix/base/settings.py:1878 +#: pretix/base/settings.py:1885 pretix/base/settings.py:1893 msgid "Week calendar" msgstr "تقويم الأسبوع" -#: pretix/base/settings.py:1871 pretix/base/settings.py:1879 +#: pretix/base/settings.py:1886 pretix/base/settings.py:1894 msgid "Month calendar" msgstr "تقويم الشهر" -#: pretix/base/settings.py:1875 +#: pretix/base/settings.py:1890 msgid "Default overview style" msgstr "نمط النظرة العامة الافتراضي" -#: pretix/base/settings.py:1881 +#: pretix/base/settings.py:1896 msgid "" "If your event series has more than 50 dates in the future, only the month or " "week calendar can be used." @@ -11681,13 +11912,13 @@ msgstr "" "إذا كانت سلسلة الفعاليات الخاصة بك تحتوي على أكثر من 50 تاريخا في المستقبل ، " "فيمكن استخدام تقويم الشهر أو الأسبوع فقط." -#: pretix/base/settings.py:1890 +#: pretix/base/settings.py:1905 #, fuzzy #| msgid "Hide all unavailable dates from calendar or list views" msgid "Show filter options for calendar or list view" msgstr "إخفاء جميع التواريخ غير المتاحة من التقويم أو طرق عرض القائمة" -#: pretix/base/settings.py:1891 +#: pretix/base/settings.py:1906 #, fuzzy #| msgid "The selected product is not active or has no price set." msgid "" @@ -11695,57 +11926,57 @@ msgid "" "settings." msgstr "المنتج المحدد غير نشط أو ليس له سعر محدد." -#: pretix/base/settings.py:1900 +#: pretix/base/settings.py:1915 msgid "Hide all unavailable dates from calendar or list views" msgstr "إخفاء جميع التواريخ غير المتاحة من التقويم أو طرق عرض القائمة" -#: pretix/base/settings.py:1901 pretix/base/settings.py:1912 +#: pretix/base/settings.py:1916 pretix/base/settings.py:1927 msgid "" "This option currently only affects the calendar of this event series, not " "the organizer-wide calendar." msgstr "" -#: pretix/base/settings.py:1911 +#: pretix/base/settings.py:1926 #, fuzzy #| msgid "Hide all unavailable dates from calendar or list views" msgid "Hide all past dates from calendar" msgstr "إخفاء جميع التواريخ غير المتاحة من التقويم أو طرق عرض القائمة" -#: pretix/base/settings.py:1923 pretix/base/settings.py:1932 +#: pretix/base/settings.py:1938 pretix/base/settings.py:1947 msgid "No modifications after order was submitted" msgstr "" -#: pretix/base/settings.py:1924 pretix/base/settings.py:1933 +#: pretix/base/settings.py:1939 pretix/base/settings.py:1948 #, fuzzy #| msgid "Only pending or paid orders can be changed." msgid "Only the person who ordered can make changes" msgstr "يمكن فقط تغيير الطلبات المعلقة أو المدفوعة." -#: pretix/base/settings.py:1925 pretix/base/settings.py:1934 +#: pretix/base/settings.py:1940 pretix/base/settings.py:1949 msgid "Both the attendee and the person who ordered can make changes" msgstr "" -#: pretix/base/settings.py:1929 +#: pretix/base/settings.py:1944 #, fuzzy #| msgid "Allow customers to modify their information after they checked in." msgid "Allow customers to modify their information" msgstr "اسمح للعملاء بتعديل معلوماتهم بعد تمام التسجيل." -#: pretix/base/settings.py:1944 +#: pretix/base/settings.py:1959 msgid "Allow customers to modify their information after they checked in." msgstr "اسمح للعملاء بتعديل معلوماتهم بعد تمام التسجيل." -#: pretix/base/settings.py:1945 +#: pretix/base/settings.py:1960 msgid "" "By default, no more modifications are possible for an order as soon as one " "of the tickets in the order has been checked in." msgstr "" -#: pretix/base/settings.py:1955 +#: pretix/base/settings.py:1970 msgid "Last date of modifications" msgstr "آخر موعد لإجراء التعديلات" -#: pretix/base/settings.py:1956 +#: pretix/base/settings.py:1971 msgid "" "The last date users can modify details of their orders, such as attendee " "names or answers to questions. If you use the event series feature and an " @@ -11756,58 +11987,58 @@ msgstr "" "الحضور أو إجابات الأسئلة. إذا كنت تستخدم ميزة سلسلة الفعاليات وكان الطلب " "يحتوي على تذاكر لتواريخ فعاليات متعددة ، فسيتم استخدام أقرب تاريخ." -#: pretix/base/settings.py:1967 +#: pretix/base/settings.py:1982 msgid "Customers can change the variation of the products they purchased" msgstr "يمكن للعملاء تغيير تنوع المنتجات التي قاموا بشرائها" -#: pretix/base/settings.py:1976 +#: pretix/base/settings.py:1991 #, fuzzy #| msgid "Customers can cancel their paid orders" msgid "Customers can change their selected add-on products" msgstr "يمكن للعملاء إلغاء طلباتهم المدفوعة" -#: pretix/base/settings.py:1986 pretix/base/settings.py:1997 +#: pretix/base/settings.py:2001 pretix/base/settings.py:2012 msgid "" "Only allow changes if the resulting price is higher or equal than the " "previous price." msgstr "السماح بالتغييرات فقط إذا كان السعر الناتج أعلى أو يساوي السعر السابق." -#: pretix/base/settings.py:1987 pretix/base/settings.py:1998 +#: pretix/base/settings.py:2002 pretix/base/settings.py:2013 msgid "" "Only allow changes if the resulting price is higher than the previous price." msgstr "السماح بالتغييرات فقط إذا كان السعر الناتج أعلى من السعر السابق." -#: pretix/base/settings.py:1988 pretix/base/settings.py:1999 +#: pretix/base/settings.py:2003 pretix/base/settings.py:2014 msgid "" "Only allow changes if the resulting price is equal to the previous price." msgstr "السماح بالتغييرات فقط إذا كان السعر الناتج أعلى من السعر السابق." -#: pretix/base/settings.py:1989 pretix/base/settings.py:2000 +#: pretix/base/settings.py:2004 pretix/base/settings.py:2015 msgid "" "Allow changes regardless of price, as long as no refund is required (i.e. " "the resulting price is not lower than what has already been paid)." msgstr "" -#: pretix/base/settings.py:1991 pretix/base/settings.py:2002 +#: pretix/base/settings.py:2006 pretix/base/settings.py:2017 msgid "Allow changes regardless of price, even if this results in a refund." msgstr "" "السماح بالتغييرات بغض النظر عن السعر ، حتى لو أدى ذلك إلى استرداد الأموال." -#: pretix/base/settings.py:1995 +#: pretix/base/settings.py:2010 msgid "Requirement for changed prices" msgstr "شرط تغيير الأسعار" -#: pretix/base/settings.py:2013 +#: pretix/base/settings.py:2028 msgid "Do not allow changes after" msgstr "لا تسمح بالتغييرات بعد" -#: pretix/base/settings.py:2022 +#: pretix/base/settings.py:2037 #, fuzzy #| msgid "The payment for this invoice has already been received." msgid "Allow change even though the ticket has already been checked in" msgstr "تم إستلام قيمة هذه الفاتورة مسبقا." -#: pretix/base/settings.py:2023 +#: pretix/base/settings.py:2038 msgid "" "By default, order changes are disabled after any ticket in the order has " "been checked in. If you check this box, this requirement is lifted. It is " @@ -11816,11 +12047,11 @@ msgid "" "limitation on price changes above." msgstr "" -#: pretix/base/settings.py:2035 +#: pretix/base/settings.py:2050 msgid "Allow individual attendees to change their ticket" msgstr "" -#: pretix/base/settings.py:2036 +#: pretix/base/settings.py:2051 msgid "" "By default, only the person who ordered the tickets can make any changes. If " "you check this box, individual attendees can also make changes. However, " @@ -11829,45 +12060,45 @@ msgid "" "customer." msgstr "" -#: pretix/base/settings.py:2048 +#: pretix/base/settings.py:2063 msgid "Customers can cancel their unpaid orders" msgstr "يمكن للعملاء إلغاء طلباتهم غير المدفوعة" -#: pretix/base/settings.py:2060 +#: pretix/base/settings.py:2075 #, fuzzy #| msgid "Keep a fixed cancellation fee" msgid "Charge a fixed cancellation fee" msgstr "احتفظ برسوم إلغاء ثابتة" -#: pretix/base/settings.py:2061 pretix/base/settings.py:2072 -#: pretix/base/settings.py:2086 +#: pretix/base/settings.py:2076 pretix/base/settings.py:2087 +#: pretix/base/settings.py:2101 msgid "" "Only affects orders pending payments, a cancellation fee for free orders is " "never charged. Note that it will be your responsibility to claim the " "cancellation fee from the user." msgstr "" -#: pretix/base/settings.py:2071 +#: pretix/base/settings.py:2086 #, fuzzy #| msgid "Keep payment, shipping and service fees" msgid "Charge payment, shipping and service fees" msgstr "احتفظ برسوم السداد والشحن والخدمة" -#: pretix/base/settings.py:2085 +#: pretix/base/settings.py:2100 #, fuzzy #| msgid "Keep a percentual cancellation fee" msgid "Charge a percentual cancellation fee" msgstr "احتفظ بنسبة رسوم الإلغاء" -#: pretix/base/settings.py:2096 pretix/base/settings.py:2235 +#: pretix/base/settings.py:2111 pretix/base/settings.py:2250 msgid "Do not allow cancellations after" msgstr "لا تسمح بالإلغاء بعد" -#: pretix/base/settings.py:2105 +#: pretix/base/settings.py:2120 msgid "Customers can cancel their paid orders" msgstr "يمكن للعملاء إلغاء طلباتهم المدفوعة" -#: pretix/base/settings.py:2106 +#: pretix/base/settings.py:2121 msgid "" "Paid money will be automatically paid back if the payment method allows it. " "Otherwise, a manual refund will be created for you to process manually." @@ -11875,29 +12106,29 @@ msgstr "" "سيتم رد الأموال المدفوعة تلقائيا إذا كانت طريقة الدفع تسمح بذلك. وبخلاف " "ذلك ، سيتم إنشاء استرداد يدوي لتتم معالجته يدويا." -#: pretix/base/settings.py:2119 pretix/control/forms/orders.py:909 +#: pretix/base/settings.py:2134 pretix/control/forms/orders.py:917 msgid "Keep a fixed cancellation fee" msgstr "احتفظ برسوم إلغاء ثابتة" -#: pretix/base/settings.py:2128 +#: pretix/base/settings.py:2143 msgid "Keep payment, shipping and service fees" msgstr "احتفظ برسوم السداد والشحن والخدمة" -#: pretix/base/settings.py:2140 pretix/control/forms/orders.py:920 +#: pretix/base/settings.py:2155 pretix/control/forms/orders.py:928 msgid "Keep a percentual cancellation fee" msgstr "احتفظ بنسبة رسوم الإلغاء" -#: pretix/base/settings.py:2149 +#: pretix/base/settings.py:2164 msgid "Allow customers to voluntarily choose a lower refund" msgstr "السماح للعملاء طواعية باختيار استرداد أقل" -#: pretix/base/settings.py:2150 +#: pretix/base/settings.py:2165 msgid "" "With this option enabled, your customers can choose to get a smaller refund " "to support you." msgstr "مع تمكين هذا الخيار ، يمكن لعملائك اختيار استرداد مبلغ أصغر لدعمك." -#: pretix/base/settings.py:2155 +#: pretix/base/settings.py:2170 msgid "" "However, if you want us to help keep the lights on here, please consider " "using the slider below to request a smaller refund. Thank you!" @@ -11905,12 +12136,12 @@ msgstr "" "إذا كنت تريد منا المساعدة في استمرار النشاط، فيرجى استخدام شريط التمرير " "أدناه لطلب استرداد مبلغ أقل. شكرا لك!" -#: pretix/base/settings.py:2162 +#: pretix/base/settings.py:2177 #, fuzzy msgid "Voluntary lower refund explanation" msgstr "تبرير تخفيض المبلغ الطوعي" -#: pretix/base/settings.py:2165 +#: pretix/base/settings.py:2180 msgid "" "This text will be shown in between the explanation of how the refunds work " "and the slider which your customers can use to choose the amount they would " @@ -11921,11 +12152,11 @@ msgstr "" "الذي يمكن لعملائك استخدامه لاختيار المبلغ الذي يرغبون في استلامه. يمكنك " "استخدامه على سبيل المثال لشرح اختيار استرداد أقل مما سيساعد مؤسستك." -#: pretix/base/settings.py:2180 +#: pretix/base/settings.py:2195 msgid "Step size for reduction amount" msgstr "حجم مبلغ التخفيض" -#: pretix/base/settings.py:2181 +#: pretix/base/settings.py:2196 msgid "" "By default, customers can choose an arbitrary amount for you to keep. If you " "set this to e.g. 10, they will only be able to choose values in increments " @@ -11935,7 +12166,7 @@ msgstr "" "ذلك على سبيل المثال 10 ، سيكونون قادرين فقط على اختيار القيم بزيادات قدرها " "10." -#: pretix/base/settings.py:2191 +#: pretix/base/settings.py:2206 msgid "" "Customers can only request a cancellation that needs to be approved by the " "event organizer before the order is canceled and a refund is issued." @@ -11943,68 +12174,68 @@ msgstr "" "يمكن للعملاء فقط طلب الإلغاء الذي يحتاج إلى موافقة منظم الفالية قبل إلغاء " "الطلب وإصدار أمر الاسترداد." -#: pretix/base/settings.py:2201 +#: pretix/base/settings.py:2216 msgid "" "Do not show the cancellation fee to users when they request cancellation." msgstr "" -#: pretix/base/settings.py:2210 pretix/base/settings.py:2220 +#: pretix/base/settings.py:2225 pretix/base/settings.py:2235 msgid "All refunds are issued to the original payment method" msgstr "يتم إصدار جميع المبالغ المستردة بطريقة الدفع الأصلية" -#: pretix/base/settings.py:2211 pretix/base/settings.py:2221 +#: pretix/base/settings.py:2226 pretix/base/settings.py:2236 msgid "" "Customers can choose between a gift card and a refund to their payment method" msgstr "" "يمكن للعملاء الاختيار بين بطاقة هدايا واسترداد الأموال بطريقة الدفع الخاصة " "بهم" -#: pretix/base/settings.py:2212 pretix/base/settings.py:2222 +#: pretix/base/settings.py:2227 pretix/base/settings.py:2237 msgid "All refunds are issued as gift cards" msgstr "يتم إصدار جميع المبالغ المستردة كبطاقات هدايا" -#: pretix/base/settings.py:2213 pretix/base/settings.py:2223 +#: pretix/base/settings.py:2228 pretix/base/settings.py:2238 msgid "Do not handle refunds automatically at all" msgstr "" -#: pretix/base/settings.py:2218 -#: pretix/control/templates/pretixcontrol/order/index.html:149 +#: pretix/base/settings.py:2233 +#: pretix/control/templates/pretixcontrol/order/index.html:182 msgid "Refund method" msgstr "طريقة الاسترداد" -#: pretix/base/settings.py:2244 pretix/base/settings.py:2257 +#: pretix/base/settings.py:2259 pretix/base/settings.py:2272 #, fuzzy #| msgid "Generate cancellation" msgid "Terms of cancellation" msgstr "توليد إلغاء" -#: pretix/base/settings.py:2247 +#: pretix/base/settings.py:2262 msgid "" "This text will be shown when cancellation is allowed for a paid order. Leave " "empty if you want pretix to automatically generate the terms of cancellation " "based on your settings." msgstr "" -#: pretix/base/settings.py:2260 +#: pretix/base/settings.py:2275 msgid "" "This text will be shown when cancellation is allowed for an unpaid or free " "order. Leave empty if you want pretix to automatically generate the terms of " "cancellation based on your settings." msgstr "" -#: pretix/base/settings.py:2270 pretix/control/forms/event.py:1898 +#: pretix/base/settings.py:2285 pretix/control/forms/event.py:1898 msgid "Contact address" msgstr "عنوان الإتصال" -#: pretix/base/settings.py:2271 pretix/control/forms/event.py:1900 +#: pretix/base/settings.py:2286 pretix/control/forms/event.py:1900 msgid "We'll show this publicly to allow attendees to contact you." msgstr "سيظهر هذا علنا للسماح للحاضرين بالاتصال بك." -#: pretix/base/settings.py:2279 pretix/control/forms/event.py:1892 +#: pretix/base/settings.py:2294 pretix/control/forms/event.py:1892 msgid "Imprint URL" msgstr "رابط موقع مقدم الخدمة" -#: pretix/base/settings.py:2280 pretix/control/forms/event.py:1893 +#: pretix/base/settings.py:2295 pretix/control/forms/event.py:1893 msgid "" "This should point e.g. to a part of your website that has your contact " "details and legal information." @@ -12012,11 +12243,11 @@ msgstr "" "ينبغي أن يشير هذا إلى على سبيل المثال جزء من موقع الويب الخاص بك الذي يحتوي " "على تفاصيل الاتصال الخاصة بك والمعلومات القانونية." -#: pretix/base/settings.py:2290 +#: pretix/base/settings.py:2305 msgid "Privacy Policy URL" msgstr "" -#: pretix/base/settings.py:2291 +#: pretix/base/settings.py:2306 #, fuzzy #| msgid "" #| "This should point e.g. to a part of your website that has your contact " @@ -12028,13 +12259,13 @@ msgstr "" "ينبغي أن يشير هذا إلى على سبيل المثال جزء من موقع الويب الخاص بك الذي يحتوي " "على تفاصيل الاتصال الخاصة بك والمعلومات القانونية." -#: pretix/base/settings.py:2302 +#: pretix/base/settings.py:2317 #, fuzzy #| msgid "Account information" msgid "Accessibility information URL" msgstr "معلومات الحساب" -#: pretix/base/settings.py:2303 +#: pretix/base/settings.py:2318 #, fuzzy #| msgid "" #| "This should point e.g. to a part of your website that has your contact " @@ -12046,7 +12277,7 @@ msgstr "" "ينبغي أن يشير هذا إلى على سبيل المثال جزء من موقع الويب الخاص بك الذي يحتوي " "على تفاصيل الاتصال الخاصة بك والمعلومات القانونية." -#: pretix/base/settings.py:2310 +#: pretix/base/settings.py:2325 #: pretix/presale/templates/pretixpresale/event/base.html:229 #: pretix/presale/templates/pretixpresale/event/base.html:234 #: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6 @@ -12057,23 +12288,23 @@ msgstr "" msgid "Accessibility information" msgstr "معلومات الحساب" -#: pretix/base/settings.py:2314 +#: pretix/base/settings.py:2329 #, fuzzy #| msgid "Account information" msgid "Accessibility information title" msgstr "معلومات الحساب" -#: pretix/base/settings.py:2324 +#: pretix/base/settings.py:2339 #, fuzzy #| msgid "Account information" msgid "Accessibility information text" msgstr "معلومات الحساب" -#: pretix/base/settings.py:2345 +#: pretix/base/settings.py:2360 msgid "Attach ticket files" msgstr "إرفق ملفات التذكرة" -#: pretix/base/settings.py:2347 +#: pretix/base/settings.py:2362 #, python-brace-format msgid "" "Tickets will never be attached if they're larger than {size} to avoid email " @@ -12082,36 +12313,36 @@ msgstr "" "لن يتم إرفاق التذاكر أبدا إذا كان حجمها أكبر من {size} لتجنب مشاكل إرسال " "البريد الإلكتروني." -#: pretix/base/settings.py:2358 pretix/plugins/sendmail/forms.py:201 +#: pretix/base/settings.py:2373 pretix/plugins/sendmail/forms.py:201 #: pretix/plugins/sendmail/models.py:263 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:66 msgid "Attach calendar files" msgstr "إرفق ملفات التقويم" -#: pretix/base/settings.py:2359 +#: pretix/base/settings.py:2374 msgid "" "If enabled, we will attach an .ics calendar file to order confirmation " "emails." msgstr "" "في حالة التمكين، سنرفق ملف تقويم ics. لرسائل البريد الإلكتروني لتأكيد الطلب." -#: pretix/base/settings.py:2368 +#: pretix/base/settings.py:2383 msgid "Attach calendar files only after order has been paid" msgstr "" -#: pretix/base/settings.py:2369 +#: pretix/base/settings.py:2384 msgid "" "Use this if you e.g. put a private access link into the calendar file to " "make sure people only receive it after their payment was confirmed." msgstr "" -#: pretix/base/settings.py:2378 +#: pretix/base/settings.py:2393 #, fuzzy #| msgid "Product description" msgid "Event description" msgstr "وصف المنتج" -#: pretix/base/settings.py:2381 +#: pretix/base/settings.py:2396 msgid "" "You can use this to share information with your attendees, such as travel " "information or the link to a digital event. If you keep it empty, we will " @@ -12121,11 +12352,11 @@ msgid "" "people." msgstr "" -#: pretix/base/settings.py:2394 +#: pretix/base/settings.py:2409 msgid "Subject prefix" msgstr "الرمز الذي يسبق الموضوع" -#: pretix/base/settings.py:2395 +#: pretix/base/settings.py:2410 msgid "" "This will be prepended to the subject of all outgoing emails, formatted as " "[prefix]. Choose, for example, a short form of your event name." @@ -12133,23 +12364,23 @@ msgstr "" "سيتم إضافة هذا مسبقا إلى موضوع جميع رسائل البريد الإلكتروني الصادرة ، محدد " "مثل [prefix]. اختر ، على سبيل المثال ، مسمى قصير لاسم الفعالية الخاصة بك." -#: pretix/base/settings.py:2409 pretix/control/forms/mailsetup.py:37 +#: pretix/base/settings.py:2424 pretix/control/forms/mailsetup.py:37 #: pretix/control/forms/mailsetup.py:119 #: pretix/control/templates/pretixcontrol/event/mail.html:39 #: pretix/control/templates/pretixcontrol/organizers/mail.html:40 msgid "Sender address" msgstr "عنوان المرسل" -#: pretix/base/settings.py:2410 pretix/control/forms/mailsetup.py:38 +#: pretix/base/settings.py:2425 pretix/control/forms/mailsetup.py:38 #: pretix/control/forms/mailsetup.py:120 msgid "Sender address for outgoing emails" msgstr "عنوان المرسل لرسائل البريد الإلكتروني الصادرة" -#: pretix/base/settings.py:2419 +#: pretix/base/settings.py:2434 msgid "Sender name" msgstr "اسم المرسل" -#: pretix/base/settings.py:2420 +#: pretix/base/settings.py:2435 msgid "" "Sender name used in conjunction with the sender address for outgoing emails. " "Defaults to your event name." @@ -12157,20 +12388,20 @@ msgstr "" "يتم استخدام اسم المرسل مع عنوان المرسل لرسائل البريد الإلكتروني الصادرة. " "افتراضات لاسم الفعالية الخاصة بك." -#: pretix/base/settings.py:2438 pretix/base/settings.py:2495 -#: pretix/base/settings.py:2512 pretix/base/settings.py:2530 +#: pretix/base/settings.py:2453 pretix/base/settings.py:2510 +#: pretix/base/settings.py:2527 pretix/base/settings.py:2545 #, python-brace-format msgid "Your order: {code}" msgstr "طلبك هو: {code}" -#: pretix/base/settings.py:2442 pretix/base/settings.py:2475 -#: pretix/base/settings.py:2580 pretix/base/settings.py:2813 -#: pretix/base/settings.py:2850 +#: pretix/base/settings.py:2457 pretix/base/settings.py:2490 +#: pretix/base/settings.py:2595 pretix/base/settings.py:2828 +#: pretix/base/settings.py:2865 #, python-brace-format msgid "Your event registration: {code}" msgstr "تسجيل الفعالية الخاصة بك:{code}" -#: pretix/base/settings.py:2446 +#: pretix/base/settings.py:2461 #, python-brace-format msgid "" "Hello,\n" @@ -12195,12 +12426,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2459 +#: pretix/base/settings.py:2474 #, python-brace-format msgid "Your orders for {event}" msgstr "طلباتكم ل{event}" -#: pretix/base/settings.py:2463 +#: pretix/base/settings.py:2478 #, python-brace-format msgid "" "Hello,\n" @@ -12223,7 +12454,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2479 +#: pretix/base/settings.py:2494 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -12246,7 +12477,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2499 +#: pretix/base/settings.py:2514 #, python-brace-format msgid "" "Hello,\n" @@ -12271,7 +12502,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2516 +#: pretix/base/settings.py:2531 #, python-brace-format msgid "" "Hello,\n" @@ -12298,7 +12529,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2534 +#: pretix/base/settings.py:2549 #, python-brace-format msgid "" "Hello,\n" @@ -12328,13 +12559,13 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2552 +#: pretix/base/settings.py:2567 #, fuzzy #| msgid "Split into new order" msgid "Attachment for new orders" msgstr "تنقسم إلى النظام الجديد" -#: pretix/base/settings.py:2557 +#: pretix/base/settings.py:2572 #, python-brace-format msgid "" "This file will be attached to the first email that we send for every new " @@ -12346,7 +12577,7 @@ msgid "" "vital email going to spam, you can only upload PDF files of up to {size} MB." msgstr "" -#: pretix/base/settings.py:2584 +#: pretix/base/settings.py:2599 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -12369,12 +12600,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2596 +#: pretix/base/settings.py:2611 #, python-brace-format msgid "Your order has been changed: {code}" msgstr "تم تغيير طلبك: {code}" -#: pretix/base/settings.py:2600 +#: pretix/base/settings.py:2615 #, python-brace-format msgid "" "Hello,\n" @@ -12397,12 +12628,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2612 +#: pretix/base/settings.py:2627 #, python-brace-format msgid "Payment received for your order: {code}" msgstr "تم إستلام الدفع لطلبك: {code}" -#: pretix/base/settings.py:2616 +#: pretix/base/settings.py:2631 #, python-brace-format msgid "" "Hello,\n" @@ -12429,12 +12660,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2634 +#: pretix/base/settings.py:2649 #, python-brace-format msgid "Event registration confirmed: {code}" msgstr "تم تأكيد تسجيل الفعالية: {code}" -#: pretix/base/settings.py:2638 +#: pretix/base/settings.py:2653 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -12457,12 +12688,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2655 pretix/control/forms/event.py:1294 +#: pretix/base/settings.py:2670 pretix/control/forms/event.py:1294 #: pretix/control/forms/event.py:1416 pretix/plugins/sendmail/models.py:268 msgid "Number of days" msgstr "عدد الأيام" -#: pretix/base/settings.py:2657 pretix/control/forms/event.py:1297 +#: pretix/base/settings.py:2672 pretix/control/forms/event.py:1297 msgid "" "This email will be sent out this many days before the order expires. If the " "value is 0, the mail will never be sent." @@ -12470,12 +12701,12 @@ msgstr "" "سيتم إرسال هذا البريد الإلكتروني من هذا عدة أيام قبل انتهاء صلاحية النظام. " "إذا كانت القيمة 0، لن يتم إرسال البريد." -#: pretix/base/settings.py:2665 +#: pretix/base/settings.py:2680 #, python-brace-format msgid "Your order is about to expire: {code}" msgstr "طلبك على وشك الانتهاء: {code}" -#: pretix/base/settings.py:2669 +#: pretix/base/settings.py:2684 #, python-brace-format msgid "" "Hello,\n" @@ -12502,12 +12733,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2683 +#: pretix/base/settings.py:2698 #, python-brace-format msgid "Your order is pending payment: {code}" msgstr "طلبك في انتظار الدفع: {code}" -#: pretix/base/settings.py:2687 +#: pretix/base/settings.py:2702 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -12545,13 +12776,13 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2700 +#: pretix/base/settings.py:2715 #, fuzzy, python-brace-format #| msgid "Payment received for your order: {code}" msgid "Incomplete payment received: {code}" msgstr "تم إستلام الدفع لطلبك: {code}" -#: pretix/base/settings.py:2704 +#: pretix/base/settings.py:2719 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -12592,13 +12823,13 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2720 +#: pretix/base/settings.py:2735 #, fuzzy, python-brace-format #| msgid "Payment received for your order: {code}" msgid "Payment failed for your order: {code}" msgstr "تم إستلام الدفع لطلبك: {code}" -#: pretix/base/settings.py:2724 +#: pretix/base/settings.py:2739 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -12639,12 +12870,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2738 +#: pretix/base/settings.py:2753 #, python-brace-format msgid "You have been selected from the waitinglist for {event}" msgstr "لقد تم اختيارك من قائمة الانتظار ل{event}" -#: pretix/base/settings.py:2742 +#: pretix/base/settings.py:2757 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -12716,12 +12947,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2771 +#: pretix/base/settings.py:2786 #, python-brace-format msgid "Order canceled: {code}" msgstr "تم إلغاء الطلب: {code}" -#: pretix/base/settings.py:2775 +#: pretix/base/settings.py:2790 #, python-brace-format msgid "" "Hello,\n" @@ -12748,12 +12979,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2789 +#: pretix/base/settings.py:2804 #, python-brace-format msgid "Order approved and awaiting payment: {code}" msgstr "تمت الموافقة على الطلب وفي انتظار الدفع: {code}" -#: pretix/base/settings.py:2793 +#: pretix/base/settings.py:2808 #, python-brace-format msgid "" "Hello,\n" @@ -12783,7 +13014,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2817 pretix/base/settings.py:2854 +#: pretix/base/settings.py:2832 pretix/base/settings.py:2869 #, fuzzy, python-brace-format #| msgid "" #| "Hello {attendee_name},\n" @@ -12816,12 +13047,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2829 +#: pretix/base/settings.py:2844 #, python-brace-format msgid "Order approved and confirmed: {code}" msgstr "تمت الموافقة على الطلب وتأكيده: {code}" -#: pretix/base/settings.py:2833 +#: pretix/base/settings.py:2848 #, python-brace-format msgid "" "Hello,\n" @@ -12846,12 +13077,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2866 +#: pretix/base/settings.py:2881 #, python-brace-format msgid "Order denied: {code}" msgstr "الطلب مرفوض: {code}" -#: pretix/base/settings.py:2870 +#: pretix/base/settings.py:2885 #, python-brace-format msgid "" "Hello,\n" @@ -12880,7 +13111,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2885 +#: pretix/base/settings.py:2900 #, python-brace-format msgid "" "Hello,\n" @@ -12899,13 +13130,13 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2895 +#: pretix/base/settings.py:2910 #, fuzzy, python-brace-format #| msgid "Invoice number" msgid "Invoice {invoice_number}" msgstr "رقم الفاتورة" -#: pretix/base/settings.py:2899 +#: pretix/base/settings.py:2914 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -12937,12 +13168,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2917 pretix/base/settings.py:2933 +#: pretix/base/settings.py:2932 pretix/base/settings.py:2948 #, python-brace-format msgid "Your ticket is ready for download: {code}" msgstr "تذكرتك جاهزة للتنزيل: {code}" -#: pretix/base/settings.py:2921 +#: pretix/base/settings.py:2936 #, fuzzy, python-brace-format #| msgid "" #| "Hello {attendee_name},\n" @@ -12975,7 +13206,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2937 +#: pretix/base/settings.py:2952 #, python-brace-format msgid "" "Hello,\n" @@ -12998,12 +13229,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2949 +#: pretix/base/settings.py:2964 #, python-brace-format msgid "Activate your account at {organizer}" msgstr "قم بتفعيل حسابك على {organizer}" -#: pretix/base/settings.py:2953 +#: pretix/base/settings.py:2968 #, python-brace-format msgid "" "Hello {name},\n" @@ -13038,12 +13269,12 @@ msgstr "" "\n" "فريق {organizer} الخاص بك" -#: pretix/base/settings.py:2971 +#: pretix/base/settings.py:2986 #, python-brace-format msgid "Confirm email address for your account at {organizer}" msgstr "تأكيد عنوان البريد الإلكتروني لحسابك على {organizer}" -#: pretix/base/settings.py:2975 +#: pretix/base/settings.py:2990 #, python-brace-format msgid "" "Hello {name},\n" @@ -13078,12 +13309,12 @@ msgstr "" "\n" "فريق {organizer} الخاص بك" -#: pretix/base/settings.py:2993 +#: pretix/base/settings.py:3008 #, python-brace-format msgid "Set a new password for your account at {organizer}" msgstr "قم بتعيين كلمة مرور جديدة لحسابك على {organizer}" -#: pretix/base/settings.py:2997 +#: pretix/base/settings.py:3012 #, python-brace-format msgid "" "Hello {name},\n" @@ -13118,13 +13349,13 @@ msgstr "" "\n" "فريق {organizer} الخاص بك" -#: pretix/base/settings.py:3015 +#: pretix/base/settings.py:3030 #, fuzzy, python-brace-format #| msgid "Activate your account at {organizer}" msgid "Changes to your account at {organizer}" msgstr "قم بتفعيل حسابك على {organizer}" -#: pretix/base/settings.py:3019 +#: pretix/base/settings.py:3034 #, fuzzy, python-brace-format #| msgid "" #| "Hello {name},\n" @@ -13176,57 +13407,57 @@ msgstr "" "\n" "فريق {organizer} الخاص بك" -#: pretix/base/settings.py:3071 pretix/base/settings.py:3078 -#: pretix/base/settings.py:3092 pretix/base/settings.py:3100 -#: pretix/base/settings.py:3114 pretix/base/settings.py:3122 -#: pretix/base/settings.py:3136 pretix/base/settings.py:3143 +#: pretix/base/settings.py:3086 pretix/base/settings.py:3093 +#: pretix/base/settings.py:3107 pretix/base/settings.py:3115 +#: pretix/base/settings.py:3129 pretix/base/settings.py:3137 +#: pretix/base/settings.py:3151 pretix/base/settings.py:3158 msgid "Please enter the hexadecimal code of a color, e.g. #990000." msgstr "الرجاء إدخال رمز عشري للون على سبيل المثال # 990000." -#: pretix/base/settings.py:3075 +#: pretix/base/settings.py:3090 msgid "Primary color" msgstr "لون أساسي" -#: pretix/base/settings.py:3096 +#: pretix/base/settings.py:3111 msgid "Accent color for success" msgstr "درجة لون لنجاح العملية" -#: pretix/base/settings.py:3097 +#: pretix/base/settings.py:3112 msgid "We strongly suggest to use a shade of green." msgstr "نقترح بشدة استخدام الظل الأخضر." -#: pretix/base/settings.py:3118 +#: pretix/base/settings.py:3133 msgid "Accent color for errors" msgstr "درجة لون الأخطاء" -#: pretix/base/settings.py:3119 +#: pretix/base/settings.py:3134 msgid "We strongly suggest to use a shade of red." msgstr "نقترح بشدة استخدام الظل الأحمر." -#: pretix/base/settings.py:3140 +#: pretix/base/settings.py:3155 msgid "Page background color" msgstr "لون خلفية الصفحة" -#: pretix/base/settings.py:3155 +#: pretix/base/settings.py:3170 msgid "Use round edges" msgstr "استخدم حواف مستديرة" -#: pretix/base/settings.py:3164 +#: pretix/base/settings.py:3179 msgid "" "Use native spinners in the widget instead of custom ones for numeric inputs " "such as quantity." msgstr "" -#: pretix/base/settings.py:3175 +#: pretix/base/settings.py:3190 msgid "Only respected by modern browsers." msgstr "يستخدم للمتصفحات الحديثة فقط." -#: pretix/base/settings.py:3186 pretix/base/settings.py:3230 -#: pretix/control/forms/organizer.py:642 +#: pretix/base/settings.py:3201 pretix/base/settings.py:3245 +#: pretix/control/forms/organizer.py:652 msgid "Header image" msgstr "صورة رأسية" -#: pretix/base/settings.py:3189 +#: pretix/base/settings.py:3204 #, fuzzy #| msgid "" #| "If you provide a logo image, we will by default not show your event name " @@ -13246,26 +13477,26 @@ msgstr "" "120 بكسل. يمكنك زيادة الحجم من خلال الإعداد أدناه. نوصي بعدم استخدام " "التفاصيل الصغيرة على الصورة حيث سيتغير حجمها على الشاشات الصغيرة." -#: pretix/base/settings.py:3210 pretix/base/settings.py:3253 +#: pretix/base/settings.py:3225 pretix/base/settings.py:3268 msgid "Use header image in its full size" msgstr "استخدم الصورة الرأسية بحجمها الكامل" -#: pretix/base/settings.py:3211 pretix/base/settings.py:3254 +#: pretix/base/settings.py:3226 pretix/base/settings.py:3269 msgid "We recommend to upload a picture at least 1170 pixels wide." msgstr "نوصي بتحميل صورة لا يقل عرضها عن 1170 بكسل." -#: pretix/base/settings.py:3220 +#: pretix/base/settings.py:3235 msgid "Show event title even if a header image is present" msgstr "أعرض عنوان الفعالية حتى إذا كانت الصورة الرأسية موجودة" -#: pretix/base/settings.py:3221 +#: pretix/base/settings.py:3236 msgid "" "The title will only be shown on the event front page. If no header image is " "uploaded for the event, but the header image from the organizer profile is " "used, this option will be ignored and the event title will always be shown." msgstr "" -#: pretix/base/settings.py:3233 pretix/control/forms/organizer.py:646 +#: pretix/base/settings.py:3248 pretix/control/forms/organizer.py:656 #, fuzzy #| msgid "" #| "If you provide a logo image, we will by default not show your " @@ -13285,15 +13516,15 @@ msgstr "" "الحجم من الإعداد أدناه. نوصي بعدم استخدام التفاصيل الصغيرة على الصورة حيث " "سيتم تغيير حجمها على الشاشات الصغيرة." -#: pretix/base/settings.py:3263 +#: pretix/base/settings.py:3278 msgid "Use header image also for events without an individually uploaded logo" msgstr "" -#: pretix/base/settings.py:3271 +#: pretix/base/settings.py:3286 msgid "Favicon" msgstr "فافيكون" -#: pretix/base/settings.py:3274 +#: pretix/base/settings.py:3289 msgid "" "If you provide a favicon, we will show it instead of the default pretix " "icon. We recommend a size of at least 200x200px to accommodate most devices." @@ -13301,11 +13532,11 @@ msgstr "" "إذا قمت بتوفير فافيكون، وسوف نعرض بدلا من الافتراضي pretix رمز. نوصي حجم " "200x200px على الأقل لاستيعاب معظم الأجهزة." -#: pretix/base/settings.py:3290 +#: pretix/base/settings.py:3305 msgid "Social media image" msgstr "صورة وسائل التواصل الاجتماعي" -#: pretix/base/settings.py:3293 +#: pretix/base/settings.py:3308 msgid "" "This picture will be used as a preview if you post links to your ticket shop " "on social media. Facebook advises to use a picture size of 1200 x 630 " @@ -13319,19 +13550,19 @@ msgstr "" "لذلك نوصي بالتأكد من أنها لا تزال تبدو جيدة في حال كان المربع الأوسط هو الذي " "يظهر فقط. إذا لم تقم بملء هذا ، فسنستخدم الشعار المقدم أعلاه." -#: pretix/base/settings.py:3311 +#: pretix/base/settings.py:3326 msgid "Logo image" msgstr "صورة الشعار" -#: pretix/base/settings.py:3315 +#: pretix/base/settings.py:3330 msgid "We will show your logo with a maximal height and width of 2.5 cm." msgstr "سنعرض شعارك بارتفاع وعرض 2.5 سم كحد أقصى." -#: pretix/base/settings.py:3342 pretix/base/settings.py:3448 +#: pretix/base/settings.py:3357 pretix/base/settings.py:3463 msgid "Info text" msgstr "معلومات النص" -#: pretix/base/settings.py:3345 pretix/base/settings.py:3450 +#: pretix/base/settings.py:3360 pretix/base/settings.py:3465 msgid "" "Not displayed anywhere by default, but if you want to, you can use this e.g. " "in ticket templates." @@ -13339,11 +13570,11 @@ msgstr "" "لا يتم عرضه في أي مكان بشكل افتراضي ، ولكن إذا كنت ترغب في ذلك ، يمكنك " "استخدام هذا على سبيل المثال في قوالب التذاكر." -#: pretix/base/settings.py:3354 +#: pretix/base/settings.py:3369 msgid "Banner text (top)" msgstr "نص الشعار (أعلى)" -#: pretix/base/settings.py:3357 +#: pretix/base/settings.py:3372 msgid "" "This text will be shown above every page of your shop. Please only use this " "for very important messages." @@ -13351,11 +13582,11 @@ msgstr "" "سيظهر هذا النص فوق كل صفحة من صفحات متجرك. الرجاء استخدام هذا فقط للرسائل " "الهامة جدا." -#: pretix/base/settings.py:3367 +#: pretix/base/settings.py:3382 msgid "Banner text (bottom)" msgstr "نص الشعار (أسفل)" -#: pretix/base/settings.py:3370 +#: pretix/base/settings.py:3385 msgid "" "This text will be shown below every page of your shop. Please only use this " "for very important messages." @@ -13363,11 +13594,11 @@ msgstr "" "سيظهر هذا النص أسفل كل صفحة من صفحات متجرك. الرجاء استخدام هذا فقط للرسائل " "الهامة جدا." -#: pretix/base/settings.py:3380 +#: pretix/base/settings.py:3395 msgid "Voucher explanation" msgstr "تفسير لكود الخصم" -#: pretix/base/settings.py:3383 +#: pretix/base/settings.py:3398 msgid "" "This text will be shown next to the input for a voucher code. You can use it " "e.g. to explain how to obtain a voucher code." @@ -13375,11 +13606,11 @@ msgstr "" "سيظهر هذا النص بجانب إدخال رمز كود الخصم. يمكنك استخدامه على سبيل المثال " "لشرح كيفية الحصول على رمز قسيمة." -#: pretix/base/settings.py:3393 +#: pretix/base/settings.py:3408 msgid "Attendee data explanation" msgstr "شرح بيانات الحضور" -#: pretix/base/settings.py:3396 +#: pretix/base/settings.py:3411 #, fuzzy #| msgid "" #| "This text will be shown above the questions asked for every admission " @@ -13392,11 +13623,11 @@ msgstr "" "سيتم عرض هذا النص فوق الأسئلة المطروحة لكل منتج مدخل. يمكنك استخدامه على " "سبيل المثال لشرح سبب حاجتك إلى معلومات منهم." -#: pretix/base/settings.py:3406 +#: pretix/base/settings.py:3421 msgid "Additional success message" msgstr "رسالة نجاح إضافية" -#: pretix/base/settings.py:3407 +#: pretix/base/settings.py:3422 msgid "" "This message will be shown after an order has been created successfully. It " "will be shown in additional to the default text." @@ -13404,11 +13635,11 @@ msgstr "" "ستظهر هذه الرسالة بعد إنشاء الطلب بنجاح. سيتم عرضه بالإضافة إلى النص " "الافتراضي." -#: pretix/base/settings.py:3419 +#: pretix/base/settings.py:3434 msgid "Help text of the phone number field" msgstr "نص المساعدة لحقل رقم الهاتف" -#: pretix/base/settings.py:3426 +#: pretix/base/settings.py:3441 msgid "" "Make sure to enter a valid email address. We will send you an order " "confirmation including a link that you need to access your order later." @@ -13416,15 +13647,15 @@ msgstr "" "تأكد من إدخال عنوان بريد إلكتروني صالح. سنرسل إليك تأكيدا لطلبك يتضمن رابطا " "تحتاجه للوصول إلى طلبك لاحقا." -#: pretix/base/settings.py:3433 +#: pretix/base/settings.py:3448 msgid "Help text of the email field" msgstr "نص المساعدة لحقل البريد الإلكتروني" -#: pretix/base/settings.py:3459 +#: pretix/base/settings.py:3474 msgid "Allow creating a new team during event creation" msgstr "السماح بإنشاء فريق جديد أثناء إنشاء الفعالية" -#: pretix/base/settings.py:3460 +#: pretix/base/settings.py:3475 msgid "" "Users that do not have access to all events under this organizer, must " "select one of their teams to have access to the created event. This setting " @@ -13436,36 +13667,36 @@ msgstr "" "الإعداد للمستخدمين بإنشاء فريق محدد للفعاية أثناء التنقل ، حتى عندما لا يكون " "لديهم إذن \"إمكانية تغيير الفرق والتصاريح\"." -#: pretix/base/settings.py:3532 pretix/base/settings.py:3542 +#: pretix/base/settings.py:3547 pretix/base/settings.py:3557 msgid "Event start time (descending)" msgstr "وقت بدء الفعالية (تنازلي)" -#: pretix/base/settings.py:3534 pretix/base/settings.py:3544 +#: pretix/base/settings.py:3549 pretix/base/settings.py:3559 msgid "Name (descending)" msgstr "الاسم (تنازلي)" -#: pretix/base/settings.py:3539 +#: pretix/base/settings.py:3554 msgctxt "subevent" msgid "Date ordering" msgstr "ترتيب التاريخ" -#: pretix/base/settings.py:3555 +#: pretix/base/settings.py:3570 msgid "Link back to organizer overview on all event pages" msgstr "قم بنظرة عامة للمنظم للاطلاع على جميع صفحات الفعالية" -#: pretix/base/settings.py:3564 +#: pretix/base/settings.py:3579 msgid "Homepage text" msgstr "نص الصفحة الرئيسية" -#: pretix/base/settings.py:3566 +#: pretix/base/settings.py:3581 msgid "This will be displayed on the organizer homepage." msgstr "سيتم عرض هذا على الصفحة الرئيسية للمنظم." -#: pretix/base/settings.py:3581 +#: pretix/base/settings.py:3596 msgid "Length of gift card codes" msgstr "طول رموز بطاقات الهدايا" -#: pretix/base/settings.py:3582 +#: pretix/base/settings.py:3597 #, python-brace-format msgid "" "The system generates by default {}-character long gift card codes. However, " @@ -13474,11 +13705,11 @@ msgstr "" "ينشئ النظام افتراضيا رموز بطاقات هدايا طويلة مكونة من {}-حرف. ومع ذلك ، إذا " "تم طلب طول مختلف، فيمكن تعيينه هنا." -#: pretix/base/settings.py:3598 +#: pretix/base/settings.py:3613 msgid "Validity of gift card codes in years" msgstr "صلاحية رموز بطاقات الهدايا بالسنوات" -#: pretix/base/settings.py:3599 +#: pretix/base/settings.py:3614 msgid "" "If you set a number here, gift cards will by default expire at the end of " "the year after this many years. If you keep it empty, gift cards do not have " @@ -13488,23 +13719,23 @@ msgstr "" "العام بعد هذه السنوات العديدة. إذا أبقيت الخانة فارغة ، فلن يكون لبطاقات " "الهدايا تاريخ انتهاء صلاحية صريح." -#: pretix/base/settings.py:3610 +#: pretix/base/settings.py:3625 msgid "Enable cookie consent management features" msgstr "" -#: pretix/base/settings.py:3616 +#: pretix/base/settings.py:3631 msgid "" "By clicking \"Accept all cookies\", you agree to the storing of cookies and " "use of similar technologies on your device." msgstr "" -#: pretix/base/settings.py:3623 +#: pretix/base/settings.py:3638 #, fuzzy #| msgid "Additional text" msgid "Dialog text" msgstr "نص إضافي" -#: pretix/base/settings.py:3630 +#: pretix/base/settings.py:3645 msgid "" "We use cookies and similar technologies to gather data that allows us to " "improve this website and our offerings. If you do not agree, we will only " @@ -13512,49 +13743,49 @@ msgid "" "offers." msgstr "" -#: pretix/base/settings.py:3638 +#: pretix/base/settings.py:3653 msgid "Secondary dialog text" msgstr "" -#: pretix/base/settings.py:3644 +#: pretix/base/settings.py:3659 #, fuzzy #| msgid "Price settings" msgid "Privacy settings" msgstr "ضبط الأسعار" -#: pretix/base/settings.py:3649 +#: pretix/base/settings.py:3664 #, fuzzy #| msgid "Allowed titles" msgid "Dialog title" msgstr "عناوين سمح" -#: pretix/base/settings.py:3655 +#: pretix/base/settings.py:3670 msgid "Accept all cookies" msgstr "" -#: pretix/base/settings.py:3660 +#: pretix/base/settings.py:3675 #, fuzzy #| msgid "Product variation description" msgid "\"Accept\" button description" msgstr "وصف نوع المنتج" -#: pretix/base/settings.py:3666 +#: pretix/base/settings.py:3681 #, fuzzy #| msgid "Required question" msgid "Required cookies only" msgstr "سؤال مطلوب" -#: pretix/base/settings.py:3671 +#: pretix/base/settings.py:3686 #, fuzzy #| msgid "Product variation description" msgid "\"Reject\" button description" msgstr "وصف نوع المنتج" -#: pretix/base/settings.py:3681 +#: pretix/base/settings.py:3696 msgid "Customers can choose their own seats" msgstr "يمكن للعملاء اختيار مقاعدهم الخاصة" -#: pretix/base/settings.py:3682 +#: pretix/base/settings.py:3697 msgid "" "If disabled, you will need to manually assign seats in the backend. Note " "that this can mean people will not know their seat after their purchase and " @@ -13564,164 +13795,164 @@ msgstr "" "لاحظ أن هذا قد يعني أن الأشخاص لن يعرفوا مقعدهم بعد شرائه وقد لا يكون مكتوبا " "على تذكرتهم." -#: pretix/base/settings.py:3708 +#: pretix/base/settings.py:3723 msgid "Show button to copy user input from other products" msgstr "أظهر الزر لنسخ مدخلات المستخدم من المنتجات الأخرى" -#: pretix/base/settings.py:3718 +#: pretix/base/settings.py:3737 msgid "Most common English titles" msgstr "العناوين الإنجليزية الأكثر شيوعا" -#: pretix/base/settings.py:3728 +#: pretix/base/settings.py:3747 msgid "Most common German titles" msgstr "العناوين الألمانية الأكثر شيوعا" -#: pretix/base/settings.py:3741 +#: pretix/base/settings.py:3760 msgctxt "person_name_salutation" msgid "Ms" msgstr "آنسة" -#: pretix/base/settings.py:3742 +#: pretix/base/settings.py:3761 msgctxt "person_name_salutation" msgid "Mr" msgstr "السيد" -#: pretix/base/settings.py:3743 +#: pretix/base/settings.py:3762 msgctxt "person_name_salutation" msgid "Mx" msgstr "السيد\\السيدة" -#: pretix/base/settings.py:3780 pretix/base/settings.py:3796 -#: pretix/base/settings.py:3812 pretix/base/settings.py:3827 -#: pretix/base/settings.py:3845 pretix/base/settings.py:3860 -#: pretix/base/settings.py:3890 pretix/base/settings.py:3914 -#: pretix/base/settings.py:3946 pretix/base/settings.py:3968 -#: pretix/base/settings.py:3999 +#: pretix/base/settings.py:3799 pretix/base/settings.py:3815 +#: pretix/base/settings.py:3831 pretix/base/settings.py:3846 +#: pretix/base/settings.py:3864 pretix/base/settings.py:3879 +#: pretix/base/settings.py:3909 pretix/base/settings.py:3933 +#: pretix/base/settings.py:3965 pretix/base/settings.py:3987 +#: pretix/base/settings.py:4018 msgctxt "person_name_sample" msgid "John" msgstr "جون" -#: pretix/base/settings.py:3781 pretix/base/settings.py:3797 -#: pretix/base/settings.py:3813 pretix/base/settings.py:3829 -#: pretix/base/settings.py:3847 pretix/base/settings.py:3861 -#: pretix/base/settings.py:3891 pretix/base/settings.py:3947 -#: pretix/base/settings.py:3969 pretix/base/settings.py:4000 +#: pretix/base/settings.py:3800 pretix/base/settings.py:3816 +#: pretix/base/settings.py:3832 pretix/base/settings.py:3848 +#: pretix/base/settings.py:3866 pretix/base/settings.py:3880 +#: pretix/base/settings.py:3910 pretix/base/settings.py:3966 +#: pretix/base/settings.py:3988 pretix/base/settings.py:4019 msgctxt "person_name_sample" msgid "Doe" msgstr "دو" -#: pretix/base/settings.py:3787 pretix/base/settings.py:3803 -#: pretix/base/settings.py:3835 pretix/base/settings.py:3954 -#: pretix/base/settings.py:3976 +#: pretix/base/settings.py:3806 pretix/base/settings.py:3822 +#: pretix/base/settings.py:3854 pretix/base/settings.py:3973 +#: pretix/base/settings.py:3995 msgctxt "person_name" msgid "Title" msgstr "عنوان" -#: pretix/base/settings.py:3795 pretix/base/settings.py:3811 -#: pretix/base/settings.py:3844 pretix/base/settings.py:3967 -#: pretix/base/settings.py:3998 +#: pretix/base/settings.py:3814 pretix/base/settings.py:3830 +#: pretix/base/settings.py:3863 pretix/base/settings.py:3986 +#: pretix/base/settings.py:4017 msgctxt "person_name_sample" msgid "Dr" msgstr "الدكتور" -#: pretix/base/settings.py:3819 pretix/base/settings.py:3836 +#: pretix/base/settings.py:3838 pretix/base/settings.py:3855 msgid "First name" msgstr "الاسم الاول" -#: pretix/base/settings.py:3820 pretix/base/settings.py:3837 +#: pretix/base/settings.py:3839 pretix/base/settings.py:3856 msgid "Middle name" msgstr "الاسم الأوسط" -#: pretix/base/settings.py:3901 pretix/base/settings.py:3913 -#: pretix/control/forms/organizer.py:793 +#: pretix/base/settings.py:3920 pretix/base/settings.py:3932 +#: pretix/control/forms/organizer.py:803 msgctxt "person_name_sample" msgid "John Doe" msgstr "جون دو" -#: pretix/base/settings.py:3907 +#: pretix/base/settings.py:3926 msgid "Calling name" msgstr "اسم النداء" -#: pretix/base/settings.py:3921 +#: pretix/base/settings.py:3940 msgid "Latin transcription" msgstr "الإملاء بالحروف اللاتينية" -#: pretix/base/settings.py:3933 pretix/base/settings.py:3953 -#: pretix/base/settings.py:3975 +#: pretix/base/settings.py:3952 pretix/base/settings.py:3972 +#: pretix/base/settings.py:3994 msgctxt "person_name" msgid "Salutation" msgstr "تحية" -#: pretix/base/settings.py:3945 pretix/base/settings.py:3966 -#: pretix/base/settings.py:3997 +#: pretix/base/settings.py:3964 pretix/base/settings.py:3985 +#: pretix/base/settings.py:4016 msgctxt "person_name_sample" msgid "Mr" msgstr "السيد" -#: pretix/base/settings.py:3979 +#: pretix/base/settings.py:3998 msgctxt "person_name" msgid "Degree (after name)" msgstr "الدرجة (بعد الاسم)" -#: pretix/base/settings.py:4001 +#: pretix/base/settings.py:4020 msgctxt "person_name_sample" msgid "MA" msgstr "MA" -#: pretix/base/settings.py:4027 pretix/base/settings.py:4029 +#: pretix/base/settings.py:4046 pretix/base/settings.py:4048 #, fuzzy #| msgid "Product name" msgctxt "address" msgid "Province" msgstr "اسم المنتج" -#: pretix/base/settings.py:4028 +#: pretix/base/settings.py:4047 #, fuzzy #| msgid "Use feature" msgctxt "address" msgid "Prefecture" msgstr "استخدام ميزة" -#: pretix/base/settings.py:4119 pretix/control/forms/event.py:242 +#: pretix/base/settings.py:4138 pretix/control/forms/event.py:242 msgid "" "Your default locale must also be enabled for your event (see box above)." msgstr "يجب أيضا تمكين لغتك الافتراضية للفعالية الخاصة بك (انظر المربع أعلاه)." -#: pretix/base/settings.py:4123 +#: pretix/base/settings.py:4142 msgid "" "You cannot require specifying attendee names if you do not ask for them." msgstr "لا يمكنك طلب تحديد أسماء الحضور إذا لم تطلبها." -#: pretix/base/settings.py:4127 +#: pretix/base/settings.py:4146 msgid "You have to ask for attendee emails if you want to make them required." msgstr "" "عليك أن تطلب رسائل البريد الإلكتروني للحضور إذا كنت ترغب في جعلها إلزامية." -#: pretix/base/settings.py:4131 +#: pretix/base/settings.py:4150 msgid "" "You have to ask for invoice addresses if you want to make them required." msgstr "عليك أن تطلب عناوين الفواتير إذا كنت ترغب في جعلها إلزامية." -#: pretix/base/settings.py:4135 +#: pretix/base/settings.py:4154 msgid "You have to require invoice addresses to require for company names." msgstr "عليك أن تطلب عنوان الفاتورة لطلب أسماء الشركات." -#: pretix/base/settings.py:4157 +#: pretix/base/settings.py:4176 #, python-brace-format msgid "VAT-ID is not supported for \"{}\"." msgstr "" -#: pretix/base/settings.py:4164 +#: pretix/base/settings.py:4183 msgid "The last payment date cannot be before the end of presale." msgstr "لا يمكن أن يكون تاريخ الدفع الأخير قبل نهاية فترة عرض البيع المسبق." -#: pretix/base/settings.py:4172 +#: pretix/base/settings.py:4191 #, fuzzy, python-brace-format #| msgid "Please enter a valid sales channel." msgid "The value \"{identifier}\" is not a valid sales channel." msgstr "الرجاء إدخال قناة بيع صالحة." -#: pretix/base/settings.py:4187 +#: pretix/base/settings.py:4206 msgid "This needs to be disabled if other NFC-based types are active." msgstr "" @@ -13911,7 +14142,7 @@ msgid "You do not have access to this page." msgstr "ليس لديك صلاحية الوصول إلى هذه الصفحة." #: pretix/base/templates/403.html:20 pretix/base/templates/404.html:16 -#: pretix/control/templates/pretixcontrol/base.html:197 +#: pretix/control/templates/pretixcontrol/base.html:200 #: pretix/control/templates/pretixcontrol/user/staff_session_start.html:4 #: pretix/control/templates/pretixcontrol/user/staff_session_start.html:6 #: pretix/presale/templates/pretixpresale/event/offline.html:21 @@ -14028,7 +14259,7 @@ msgstr "" msgid "Click here to view and change your notification settings" msgstr "انقر هنا لعرض وتغيير إعدادات الإشعارات" -#: pretix/base/templates/pretixbase/email/notification.html:60 +#: pretix/base/templates/pretixbase/email/notification.html:61 msgid "Click here disable all notifications immediately." msgstr "انقر هنا لتعطيل جميع الإشعارات على الفور." @@ -14081,6 +14312,7 @@ msgstr "أنت تتلقى هذا البريد الإلكتروني لأنك قد #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:98 #: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:114 #: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:21 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:214 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:390 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:114 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:95 @@ -14142,25 +14374,25 @@ msgstr "" msgid "%(number)s days %(relation)s %(relation_to)s at %(time_of_day)s" msgstr "" -#: pretix/base/templates/pretixbase/redirect.html:5 -#: pretix/base/templates/pretixbase/redirect.html:9 +#: pretix/base/templates/pretixbase/redirect.html:6 +#: pretix/base/templates/pretixbase/redirect.html:10 #, fuzzy #| msgid "Redirection" msgid "Redirect" msgstr "إعادة توجيه" -#: pretix/base/templates/pretixbase/redirect.html:11 +#: pretix/base/templates/pretixbase/redirect.html:12 #, python-format msgid "" "The link you clicked on wants to redirect you to a destination on the " "website %(host)s." msgstr "" -#: pretix/base/templates/pretixbase/redirect.html:14 +#: pretix/base/templates/pretixbase/redirect.html:15 msgid "Please only proceed if you trust this website to be safe." msgstr "" -#: pretix/base/templates/pretixbase/redirect.html:20 +#: pretix/base/templates/pretixbase/redirect.html:21 #, fuzzy, python-format #| msgid "Proceed with checkout" msgid "Proceed to %(host)s" @@ -14560,11 +14792,18 @@ msgctxt "timeline" msgid "Payment provider \"{name}\" can no longer be selected" msgstr "مقدم الدفع \"{name}\" لم يعد من الممكن تحديده" -#: pretix/base/validators.py:51 +#: pretix/base/validators.py:53 #, python-format msgid "This field has an invalid value: %(value)s." msgstr "هذا الحقل يحتوي على قيمة غير صالحة: %(value)s." +#: pretix/base/validators.py:139 +#, python-format +msgid "" +"You entered an URL, which is not allowed. Please remove %(match)s from your " +"input." +msgstr "" + #: pretix/base/views/errors.py:48 msgid "" "You are seeing this message because this HTTPS site requires a 'Referer " @@ -14643,11 +14882,11 @@ msgctxt "tax_id_portugal" msgid "VAT ID / NIF" msgstr "رقم تعريف ضريبة القيمة المضافة" -#: pretix/base/views/tasks.py:185 +#: pretix/base/views/tasks.py:189 msgid "An unexpected error has occurred, please try again later." msgstr "حدث خطأ غير متوقع ، يرجى المحاولة مرة أخرى في وقت لاحق." -#: pretix/base/views/tasks.py:188 +#: pretix/base/views/tasks.py:192 msgid "The task has been completed." msgstr "تم إنهاء المهمة." @@ -14734,8 +14973,8 @@ msgid "Support for check-in questions" msgstr "آلية الدخول" #: pretix/control/forms/checkin.py:197 pretix/control/forms/checkin.py:213 -#: pretix/control/forms/filter.py:2550 pretix/control/forms/filter.py:2592 -#: pretix/control/forms/filter.py:2757 +#: pretix/control/forms/filter.py:2683 pretix/control/forms/filter.py:2725 +#: pretix/control/forms/filter.py:2890 #, fuzzy #| msgctxt "subevent" #| msgid "All dates" @@ -14842,7 +15081,7 @@ msgid "Copy configuration from" msgstr "تكوين نسخة من" #: pretix/control/forms/event.py:350 pretix/control/forms/event.py:353 -#: pretix/control/forms/item.py:414 +#: pretix/control/forms/item.py:469 msgid "Do not copy" msgstr "لا تنسخ" @@ -14852,8 +15091,8 @@ msgid "" "selected in the previous step." msgstr "" -#: pretix/control/forms/event.py:387 pretix/control/forms/item.py:1304 -#: pretix/control/forms/subevents.py:411 +#: pretix/control/forms/event.py:387 pretix/control/forms/item.py:1359 +#: pretix/control/forms/subevents.py:421 #, python-brace-format msgid "Default ({value})" msgstr "تلقائي ({value})" @@ -14891,11 +15130,11 @@ msgid "" "{error}" msgstr "" -#: pretix/control/forms/event.py:587 pretix/control/forms/organizer.py:579 +#: pretix/control/forms/event.py:587 pretix/control/forms/organizer.py:588 msgid "Name format" msgstr "تنسيق اسم" -#: pretix/control/forms/event.py:588 pretix/control/forms/organizer.py:580 +#: pretix/control/forms/event.py:588 pretix/control/forms/organizer.py:589 msgid "" "This defines how pretix will ask for human names. Changing this after you " "already received orders might lead to unexpected behavior when sorting or " @@ -14904,11 +15143,11 @@ msgstr "" "هذا يعرف كيف pretix سيطلب أسماء الإنسان. تغيير هذا بعد تلقي أوامر بالفعل قد " "يؤدي إلى سلوك غير متوقع عندما يكون الترتيب أو تغيير أسماء." -#: pretix/control/forms/event.py:593 pretix/control/forms/organizer.py:585 +#: pretix/control/forms/event.py:593 pretix/control/forms/organizer.py:594 msgid "Allowed titles" msgstr "عناوين سمح" -#: pretix/control/forms/event.py:594 pretix/control/forms/organizer.py:586 +#: pretix/control/forms/event.py:594 pretix/control/forms/organizer.py:595 msgid "" "If the naming scheme you defined above allows users to input a title, you " "can use this to restrict the set of selectable titles." @@ -14916,12 +15155,12 @@ msgstr "" "إذا كان نظام تسمية قمت بتعريفه فوق يتيح للمستخدمين إدخال العنوان، يمكنك " "استخدام هذا للحد من مجموعة من العناوين اختيار." -#: pretix/control/forms/event.py:712 pretix/control/forms/organizer.py:661 +#: pretix/control/forms/event.py:712 pretix/control/forms/organizer.py:671 #, python-brace-format msgid "Ask for {fields}, display like {example}" msgstr "طلب {fields}، العرض مثل {example}" -#: pretix/control/forms/event.py:718 pretix/control/forms/organizer.py:667 +#: pretix/control/forms/event.py:718 pretix/control/forms/organizer.py:677 msgid "Free text input" msgstr "إدخال النص الحر" @@ -15069,17 +15308,17 @@ msgid "" "shop must be enabled." msgstr "" -#: pretix/control/forms/event.py:1150 pretix/control/forms/organizer.py:702 +#: pretix/control/forms/event.py:1150 pretix/control/forms/organizer.py:712 msgid "Bcc address" msgstr "عنوان مخفية" -#: pretix/control/forms/event.py:1152 pretix/control/forms/organizer.py:704 +#: pretix/control/forms/event.py:1152 pretix/control/forms/organizer.py:714 #, fuzzy #| msgid "All emails will be sent to this address as a Bcc copy" msgid "All emails will be sent to this address as a Bcc copy." msgstr "سيتم إرسال جميع رسائل البريد الإلكتروني إلى هذا العنوان كنسخة مخفية" -#: pretix/control/forms/event.py:1160 pretix/control/forms/organizer.py:713 +#: pretix/control/forms/event.py:1160 pretix/control/forms/organizer.py:723 msgid "Signature" msgstr "التوقيع" @@ -15088,7 +15327,7 @@ msgstr "التوقيع" msgid "This will be attached to every email. Available placeholders: {event}" msgstr "وسيلحق هذا على كل البريد الإلكتروني. النائبة المتاحة: {event}" -#: pretix/control/forms/event.py:1168 pretix/control/forms/organizer.py:721 +#: pretix/control/forms/event.py:1168 pretix/control/forms/organizer.py:731 msgid "e.g. your contact details" msgstr "مثلا تفاصيل الاتصال الخاصة بك" @@ -15142,8 +15381,8 @@ msgstr "إرسالها النص إلى الحضور" #: pretix/control/forms/event.py:1264 pretix/control/forms/event.py:1338 #: pretix/control/forms/event.py:1348 pretix/control/forms/event.py:1358 #: pretix/control/forms/event.py:1363 pretix/control/forms/event.py:1375 -#: pretix/control/forms/organizer.py:732 pretix/control/forms/organizer.py:742 -#: pretix/control/forms/organizer.py:752 pretix/control/forms/organizer.py:762 +#: pretix/control/forms/organizer.py:742 pretix/control/forms/organizer.py:752 +#: pretix/control/forms/organizer.py:762 pretix/control/forms/organizer.py:772 #: pretix/control/templates/pretixcontrol/event/mail.html:88 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:122 msgid "Text" @@ -15604,8 +15843,8 @@ msgid "Follow-up due" msgstr "" #: pretix/control/forms/filter.py:483 pretix/control/forms/filter.py:1267 -#: pretix/control/forms/filter.py:2053 pretix/control/forms/filter.py:2308 -#: pretix/control/forms/filter.py:2612 pretix/control/forms/filter.py:2631 +#: pretix/control/forms/filter.py:2186 pretix/control/forms/filter.py:2441 +#: pretix/control/forms/filter.py:2745 pretix/control/forms/filter.py:2764 #: pretix/control/forms/vouchers.py:151 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:121 #: pretix/plugins/sendmail/models.py:244 @@ -15613,19 +15852,19 @@ msgid "All products" msgstr "جميع المنتجات" #: pretix/control/forms/filter.py:487 pretix/control/forms/filter.py:1271 -#: pretix/control/forms/filter.py:2312 pretix/control/forms/filter.py:2616 -#: pretix/control/forms/vouchers.py:139 pretix/control/views/typeahead.py:663 -#: pretix/control/views/typeahead.py:780 +#: pretix/control/forms/filter.py:2445 pretix/control/forms/filter.py:2749 +#: pretix/control/forms/vouchers.py:139 pretix/control/views/typeahead.py:682 +#: pretix/control/views/typeahead.py:799 #, python-brace-format msgid "{product} – Any variation" msgstr "{product} - أي تباين" -#: pretix/control/forms/filter.py:566 pretix/control/forms/orders.py:862 +#: pretix/control/forms/filter.py:566 pretix/control/forms/orders.py:870 msgctxt "subevent" msgid "All dates starting at or after" msgstr "" -#: pretix/control/forms/filter.py:572 pretix/control/forms/orders.py:869 +#: pretix/control/forms/filter.py:572 pretix/control/forms/orders.py:877 msgctxt "subevent" msgid "All dates starting before" msgstr "" @@ -15666,12 +15905,12 @@ msgstr "" #: pretix/control/forms/filter.py:927 pretix/control/forms/filter.py:932 #: pretix/control/forms/filter.py:1045 pretix/control/forms/filter.py:1050 -#: pretix/control/forms/filter.py:1842 pretix/control/forms/filter.py:1847 +#: pretix/control/forms/filter.py:1975 pretix/control/forms/filter.py:1980 msgid "All organizers" msgstr "جميع المنظمين" -#: pretix/control/forms/filter.py:1037 pretix/control/forms/filter.py:1826 -#: pretix/control/forms/filter.py:2836 +#: pretix/control/forms/filter.py:1037 pretix/control/forms/filter.py:1959 +#: pretix/control/forms/filter.py:2969 msgid "All events" msgstr "كل الأحداث" @@ -15708,8 +15947,8 @@ msgstr "حتى تاريخ" #: pretix/control/forms/filter.py:1230 #: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html:31 #: pretix/control/templates/pretixcontrol/orders/overview.html:88 -#: pretix/plugins/checkinlists/exporters.py:504 -#: pretix/plugins/checkinlists/exporters.py:699 +#: pretix/plugins/checkinlists/exporters.py:503 +#: pretix/plugins/checkinlists/exporters.py:698 #: pretix/plugins/reports/exporters.py:397 #: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:23 msgid "Paid" @@ -15720,360 +15959,349 @@ msgctxt "subevent" msgid "Date doesn't start in selected date range." msgstr "" -#: pretix/control/forms/filter.py:1361 pretix/control/forms/filter.py:1828 +#: pretix/control/forms/filter.py:1367 pretix/control/forms/filter.py:1961 msgid "Shop live and presale running" msgstr "تسوق الحية و[خبر] تشغيل" -#: pretix/control/forms/filter.py:1362 pretix/control/forms/filter.py:2166 +#: pretix/control/forms/filter.py:1368 pretix/control/forms/filter.py:2299 msgid "Inactive" msgstr "غير نشط" -#: pretix/control/forms/filter.py:1363 pretix/control/forms/filter.py:1830 -#: pretix/control/templates/pretixcontrol/events/index.html:170 -#: pretix/control/templates/pretixcontrol/organizers/detail.html:139 -#: pretix/control/templates/pretixcontrol/subevents/index.html:174 -msgid "Presale not started" -msgstr "لم يبدأ البيع الأولي بعد" - -#: pretix/control/forms/filter.py:1364 pretix/control/forms/filter.py:1831 -#: pretix/control/templates/pretixcontrol/events/index.html:168 -#: pretix/control/templates/pretixcontrol/organizers/detail.html:137 -#: pretix/control/templates/pretixcontrol/subevents/index.html:172 -msgid "Presale over" -msgstr "انتهى البيع الأولي" - -#: pretix/control/forms/filter.py:1369 pretix/control/forms/filter.py:1372 -#: pretix/control/forms/filter.py:1857 pretix/control/forms/filter.py:1860 -#: pretix/control/forms/filter.py:2490 +#: pretix/control/forms/filter.py:1375 pretix/control/forms/filter.py:1378 +#: pretix/control/forms/filter.py:1553 pretix/control/forms/filter.py:1556 +#: pretix/control/forms/filter.py:1990 pretix/control/forms/filter.py:1993 +#: pretix/control/forms/filter.py:2623 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html:84 msgid "Date from" msgstr "التاريخ من" -#: pretix/control/forms/filter.py:1376 pretix/control/forms/filter.py:1379 -#: pretix/control/forms/filter.py:1864 pretix/control/forms/filter.py:1867 -#: pretix/control/forms/filter.py:2495 +#: pretix/control/forms/filter.py:1382 pretix/control/forms/filter.py:1385 +#: pretix/control/forms/filter.py:1560 pretix/control/forms/filter.py:1563 +#: pretix/control/forms/filter.py:1997 pretix/control/forms/filter.py:2000 +#: pretix/control/forms/filter.py:2628 msgid "Date until" msgstr "التاريخ وحتى" -#: pretix/control/forms/filter.py:1383 +#: pretix/control/forms/filter.py:1389 pretix/control/forms/filter.py:1567 #, fuzzy #| msgid "Date from" msgid "Start time from" msgstr "التاريخ من" -#: pretix/control/forms/filter.py:1388 +#: pretix/control/forms/filter.py:1394 pretix/control/forms/filter.py:1572 #, fuzzy #| msgid "Date until" msgid "Start time until" msgstr "التاريخ وحتى" -#: pretix/control/forms/filter.py:1393 pretix/control/forms/rrule.py:112 -#: pretix/control/forms/rrule.py:151 +#: pretix/control/forms/filter.py:1399 pretix/control/forms/filter.py:1577 +#: pretix/control/forms/rrule.py:112 pretix/control/forms/rrule.py:151 msgid "Weekday" msgstr "يوم من أيام الأسبوع" -#: pretix/control/forms/filter.py:1594 pretix/control/forms/filter.py:1596 -#: pretix/control/forms/filter.py:1645 pretix/control/forms/filter.py:1647 -#: pretix/control/forms/filter.py:1717 pretix/control/forms/filter.py:1719 -#: pretix/control/forms/filter.py:1771 pretix/control/forms/filter.py:1773 -#: pretix/control/forms/filter.py:2180 pretix/control/forms/filter.py:2182 -#: pretix/control/forms/filter.py:2748 pretix/control/forms/filter.py:2750 +#: pretix/control/forms/filter.py:1727 pretix/control/forms/filter.py:1729 +#: pretix/control/forms/filter.py:1778 pretix/control/forms/filter.py:1780 +#: pretix/control/forms/filter.py:1850 pretix/control/forms/filter.py:1852 +#: pretix/control/forms/filter.py:1904 pretix/control/forms/filter.py:1906 +#: pretix/control/forms/filter.py:2313 pretix/control/forms/filter.py:2315 +#: pretix/control/forms/filter.py:2881 pretix/control/forms/filter.py:2883 msgid "Search query" msgstr "البحث في الاستفسارات" -#: pretix/control/forms/filter.py:1656 pretix/control/forms/filter.py:1728 +#: pretix/control/forms/filter.py:1789 pretix/control/forms/filter.py:1861 #: pretix/control/templates/pretixcontrol/organizers/customer.html:47 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:47 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:54 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:126 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:133 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:37 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:49 #, fuzzy #| msgid "Inactive" msgid "active" msgstr "غير نشط" -#: pretix/control/forms/filter.py:1658 +#: pretix/control/forms/filter.py:1791 #: pretix/control/templates/pretixcontrol/organizers/customer.html:45 #, fuzzy #| msgid "Deactivate" msgid "not yet activated" msgstr "إلغاء تنشيط" -#: pretix/control/forms/filter.py:1662 +#: pretix/control/forms/filter.py:1795 #: pretix/control/templates/pretixcontrol/organizers/customer.html:113 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:6 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:12 -#: pretix/presale/views/customer.py:368 +#: pretix/presale/views/customer.py:370 msgid "Memberships" msgstr "العضويات" -#: pretix/control/forms/filter.py:1666 +#: pretix/control/forms/filter.py:1799 #, fuzzy #| msgid "Team memberships" msgid "Has no memberships" msgstr "عضوية فريق" -#: pretix/control/forms/filter.py:1667 +#: pretix/control/forms/filter.py:1800 #, fuzzy #| msgid "Team memberships" msgid "Has any membership" msgstr "عضوية فريق" -#: pretix/control/forms/filter.py:1668 +#: pretix/control/forms/filter.py:1801 #, fuzzy #| msgid "Require a valid membership" msgid "Has valid membership" msgstr "يتتطلب عضوية سارية المفعول" -#: pretix/control/forms/filter.py:1827 +#: pretix/control/forms/filter.py:1960 msgid "Shop live" msgstr "متجر على الهواء مباشرة" -#: pretix/control/forms/filter.py:1829 +#: pretix/control/forms/filter.py:1962 msgid "Shop not live" msgstr "تسوق لا يعيش" -#: pretix/control/forms/filter.py:1832 +#: pretix/control/forms/filter.py:1965 msgid "Single event running or in the future" msgstr "حدث واحد قيد التشغيل أو في المستقبل" -#: pretix/control/forms/filter.py:1833 +#: pretix/control/forms/filter.py:1966 msgid "Single event in the past" msgstr "حدث واحد في الماضي" -#: pretix/control/forms/filter.py:2032 pretix/control/forms/filter.py:2034 +#: pretix/control/forms/filter.py:2165 pretix/control/forms/filter.py:2167 msgid "Search attendee…" msgstr "بحث الحضور ..." -#: pretix/control/forms/filter.py:2039 -#: pretix/plugins/checkinlists/exporters.py:106 +#: pretix/control/forms/filter.py:2172 +#: pretix/plugins/checkinlists/exporters.py:107 msgid "Check-in status" msgstr "تحقق ذات المركز" -#: pretix/control/forms/filter.py:2041 -#: pretix/plugins/checkinlists/exporters.py:108 +#: pretix/control/forms/filter.py:2174 +#: pretix/plugins/checkinlists/exporters.py:109 msgid "All attendees" msgstr "جميع الحاضرين" -#: pretix/control/forms/filter.py:2042 +#: pretix/control/forms/filter.py:2175 #: pretix/control/templates/pretixcontrol/checkin/index.html:183 #: pretix/control/templates/pretixcontrol/checkin/lists.html:104 -#: pretix/plugins/checkinlists/exporters.py:109 -#: pretix/plugins/checkinlists/exporters.py:501 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:138 +#: pretix/plugins/checkinlists/exporters.py:110 +#: pretix/plugins/checkinlists/exporters.py:500 msgid "Checked in" msgstr "إيداعه" -#: pretix/control/forms/filter.py:2043 -#: pretix/plugins/checkinlists/exporters.py:110 +#: pretix/control/forms/filter.py:2176 +#: pretix/plugins/checkinlists/exporters.py:111 msgctxt "checkin state" msgid "Present" msgstr "حاضر" -#: pretix/control/forms/filter.py:2044 -#: pretix/plugins/checkinlists/exporters.py:111 +#: pretix/control/forms/filter.py:2177 +#: pretix/plugins/checkinlists/exporters.py:112 msgctxt "checkin state" msgid "Checked in but left" msgstr "سجل لكنه غادر" -#: pretix/control/forms/filter.py:2045 +#: pretix/control/forms/filter.py:2178 #: pretix/control/templates/pretixcontrol/checkin/index.html:178 -#: pretix/plugins/checkinlists/exporters.py:112 +#: pretix/plugins/checkinlists/exporters.py:113 msgid "Not checked in" msgstr "غير محددة في" -#: pretix/control/forms/filter.py:2064 +#: pretix/control/forms/filter.py:2197 #, fuzzy #| msgid "Date from" msgctxt "subevent" msgid "Date start from" msgstr "التاريخ من" -#: pretix/control/forms/filter.py:2070 +#: pretix/control/forms/filter.py:2203 #, fuzzy #| msgid "Date until" msgctxt "subevent" msgid "Date start until" msgstr "التاريخ وحتى" -#: pretix/control/forms/filter.py:2171 pretix/control/forms/filter.py:2174 +#: pretix/control/forms/filter.py:2304 pretix/control/forms/filter.py:2307 #: pretix/control/templates/pretixcontrol/users/index.html:52 msgid "Administrator" msgstr "مدير" -#: pretix/control/forms/filter.py:2175 +#: pretix/control/forms/filter.py:2308 msgid "No administrator" msgstr "لا المسؤول" -#: pretix/control/forms/filter.py:2245 +#: pretix/control/forms/filter.py:2378 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:51 msgid "Valid" msgstr "ساري المفعول" -#: pretix/control/forms/filter.py:2246 +#: pretix/control/forms/filter.py:2379 msgid "Unredeemed" msgstr "غير معوض" -#: pretix/control/forms/filter.py:2247 +#: pretix/control/forms/filter.py:2380 msgid "Redeemed at least once" msgstr "افتدى على الأقل مرة واحدة" -#: pretix/control/forms/filter.py:2248 +#: pretix/control/forms/filter.py:2381 msgid "Fully redeemed" msgstr "افتدى بالكامل" -#: pretix/control/forms/filter.py:2250 +#: pretix/control/forms/filter.py:2383 msgid "Redeemed and checked in with ticket" msgstr "مطفأة وإيداعه مع تذكرة" -#: pretix/control/forms/filter.py:2255 +#: pretix/control/forms/filter.py:2388 msgid "Quota handling" msgstr "التعامل مع الحصص" -#: pretix/control/forms/filter.py:2259 +#: pretix/control/forms/filter.py:2392 msgid "Allow to ignore quota" msgstr "السماح لتجاهل الحصص" -#: pretix/control/forms/filter.py:2264 pretix/control/forms/filter.py:2266 +#: pretix/control/forms/filter.py:2397 pretix/control/forms/filter.py:2399 msgid "Filter by tag" msgstr "تصفية حسب العلامة" -#: pretix/control/forms/filter.py:2271 pretix/control/forms/filter.py:2273 +#: pretix/control/forms/filter.py:2404 pretix/control/forms/filter.py:2406 msgid "Search voucher" msgstr "بحث قسيمة" -#: pretix/control/forms/filter.py:2318 pretix/control/forms/vouchers.py:130 -#: pretix/control/views/typeahead.py:788 pretix/control/views/typeahead.py:792 +#: pretix/control/forms/filter.py:2451 pretix/control/forms/vouchers.py:130 +#: pretix/control/views/typeahead.py:807 pretix/control/views/typeahead.py:811 #: pretix/control/views/vouchers.py:133 #, python-brace-format msgid "Any product in quota \"{quota}\"" msgstr "أي منتج في الحصص \"{quota}\"" -#: pretix/control/forms/filter.py:2440 +#: pretix/control/forms/filter.py:2573 msgid "Refund status" msgstr "حالة إعادة الأموال" -#: pretix/control/forms/filter.py:2442 +#: pretix/control/forms/filter.py:2575 msgid "All open refunds" msgstr "كل مبلغ معاد المفتوحة" -#: pretix/control/forms/filter.py:2443 +#: pretix/control/forms/filter.py:2576 msgid "All refunds" msgstr "كل مبلغ معاد" -#: pretix/control/forms/filter.py:2481 pretix/plugins/reports/exporters.py:704 +#: pretix/control/forms/filter.py:2614 pretix/plugins/reports/exporters.py:704 msgid "Date filter" msgstr "تاريخ فلتر" -#: pretix/control/forms/filter.py:2483 pretix/plugins/reports/exporters.py:706 +#: pretix/control/forms/filter.py:2616 pretix/plugins/reports/exporters.py:706 msgid "Filter by…" msgstr "مصنف بواسطة…" -#: pretix/control/forms/filter.py:2485 pretix/plugins/reports/exporters.py:708 +#: pretix/control/forms/filter.py:2618 pretix/plugins/reports/exporters.py:708 msgid "Date of last successful payment" msgstr "تاريخ الدفع الناجح الماضي" -#: pretix/control/forms/filter.py:2525 +#: pretix/control/forms/filter.py:2658 #, fuzzy #| msgid "All check-in lists" msgid "All check-ins" msgstr "جميع قوائم التسجيل" -#: pretix/control/forms/filter.py:2526 +#: pretix/control/forms/filter.py:2659 #, fuzzy #| msgid "Successful payments" msgid "Successful check-ins" msgstr "المدفوعات ناجحة" -#: pretix/control/forms/filter.py:2527 +#: pretix/control/forms/filter.py:2660 #, fuzzy #| msgid "Only successful payments" msgid "Unsuccessful check-ins" msgstr "المدفوعات الناجحة فقط" -#: pretix/control/forms/filter.py:2532 +#: pretix/control/forms/filter.py:2665 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:64 -#: pretix/plugins/checkinlists/exporters.py:759 +#: pretix/plugins/checkinlists/exporters.py:758 msgid "Scan type" msgstr "نوع المسح الضوئي" -#: pretix/control/forms/filter.py:2534 +#: pretix/control/forms/filter.py:2667 #, fuzzy #| msgid "All actions" msgid "All directions" msgstr "جميع الإجراءات" -#: pretix/control/forms/filter.py:2543 pretix/control/forms/filter.py:2583 +#: pretix/control/forms/filter.py:2676 pretix/control/forms/filter.py:2716 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:67 -#: pretix/plugins/checkinlists/exporters.py:765 +#: pretix/plugins/checkinlists/exporters.py:764 msgid "Device" msgstr "جهاز" -#: pretix/control/forms/filter.py:2544 pretix/control/forms/filter.py:2579 -#: pretix/control/forms/filter.py:2770 +#: pretix/control/forms/filter.py:2677 pretix/control/forms/filter.py:2712 +#: pretix/control/forms/filter.py:2903 #, fuzzy #| msgid "All invoices" msgid "All devices" msgstr "جميع الفواتير" -#: pretix/control/forms/filter.py:2558 +#: pretix/control/forms/filter.py:2691 #, fuzzy #| msgid "Start date" msgctxt "filter" msgid "Start date" msgstr "تاريخ البداية" -#: pretix/control/forms/filter.py:2564 +#: pretix/control/forms/filter.py:2697 #, fuzzy #| msgid "End date" msgctxt "filter" msgid "End date" msgstr "تاريخ الإنتهاء" -#: pretix/control/forms/filter.py:2606 -#: pretix/plugins/checkinlists/exporters.py:883 +#: pretix/control/forms/filter.py:2739 +#: pretix/plugins/checkinlists/exporters.py:882 msgid "All check-in lists" msgstr "جميع قوائم التسجيل" -#: pretix/control/forms/filter.py:2610 +#: pretix/control/forms/filter.py:2743 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:64 -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:10 -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:25 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:11 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:26 #: pretix/plugins/autocheckin/forms.py:182 #: pretix/plugins/autocheckin/models.py:46 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:29 #: pretix/plugins/checkinlists/exporters.py:81 #: pretix/plugins/checkinlists/exporters.py:154 -#: pretix/plugins/checkinlists/exporters.py:475 -#: pretix/plugins/checkinlists/exporters.py:758 -#: pretix/plugins/checkinlists/exporters.py:846 +#: pretix/plugins/checkinlists/exporters.py:474 +#: pretix/plugins/checkinlists/exporters.py:757 +#: pretix/plugins/checkinlists/exporters.py:845 msgid "Check-in list" msgstr "تحقق في قائمة" -#: pretix/control/forms/filter.py:2761 +#: pretix/control/forms/filter.py:2894 #: pretix/control/templates/pretixcontrol/organizers/devices.html:86 msgid "Software" msgstr "البرمجيات" -#: pretix/control/forms/filter.py:2768 +#: pretix/control/forms/filter.py:2901 #, fuzzy #| msgid "Devices" msgid "Device status" msgstr "الأجهزة" -#: pretix/control/forms/filter.py:2771 +#: pretix/control/forms/filter.py:2904 #, fuzzy #| msgid "All invoices" msgid "Active devices" msgstr "جميع الفواتير" -#: pretix/control/forms/filter.py:2772 +#: pretix/control/forms/filter.py:2905 #, fuzzy #| msgid "Revoke device access:" msgid "Revoked devices" msgstr "وصول الجهاز إلغاء:" -#: pretix/control/forms/filter.py:2827 pretix/control/forms/filter.py:2829 +#: pretix/control/forms/filter.py:2960 pretix/control/forms/filter.py:2962 #, fuzzy #| msgid "Require email addresses per ticket" msgid "Search email address or subject" @@ -16136,11 +16364,11 @@ msgid "" "association" msgstr "" -#: pretix/control/forms/global_settings.py:122 +#: pretix/control/forms/global_settings.py:129 msgid "Perform update checks" msgstr "تنفيذ اختبارات التحديث" -#: pretix/control/forms/global_settings.py:123 +#: pretix/control/forms/global_settings.py:130 msgid "" "During the update check, pretix will report an anonymous, unique " "installation ID, the current version of pretix and your installed plugins " @@ -16155,11 +16383,11 @@ msgstr "" "البيانات مجهولة المصدر، أبدا أي عناوين IP ونحن لن نعرف من أنت أو من أين تجد " "مثيل. يمكنك تعطيل هذا السلوك هنا في أي وقت." -#: pretix/control/forms/global_settings.py:131 +#: pretix/control/forms/global_settings.py:138 msgid "Email notifications" msgstr "اشعارات البريد الالكتروني" -#: pretix/control/forms/global_settings.py:132 +#: pretix/control/forms/global_settings.py:139 msgid "" "We will notify you at this address if we detect that a new update is " "available. This address will not be transmitted to pretix.eu, the emails " @@ -16169,137 +16397,137 @@ msgstr "" "ينتقل هذا العنوان إلى pretix.eu، سيتم إرسال رسائل البريد الإلكتروني من قبل " "هذا الملقم محليا." -#: pretix/control/forms/global_settings.py:145 +#: pretix/control/forms/global_settings.py:152 msgid "Changes to pretix" msgstr "تغيير في pretix" -#: pretix/control/forms/global_settings.py:148 +#: pretix/control/forms/global_settings.py:155 msgid "" "This installation of pretix is running without any custom modifications or " "extensions (except for installed plugins)." msgstr "" -#: pretix/control/forms/global_settings.py:150 +#: pretix/control/forms/global_settings.py:157 msgid "" "This installation of pretix includes changes or extensions made to the " "source code." msgstr "" -#: pretix/control/forms/global_settings.py:155 +#: pretix/control/forms/global_settings.py:162 msgid "Usage of pretix" msgstr "استخدام pretix" -#: pretix/control/forms/global_settings.py:158 +#: pretix/control/forms/global_settings.py:165 msgid "" "I only use pretix to organize events which are executed by my own company or " "its affiliated companies, or to sell products sold by my own company." msgstr "" -#: pretix/control/forms/global_settings.py:160 +#: pretix/control/forms/global_settings.py:167 msgid "" "I use pretix to sell tickets of other event organizers (e.g. a ticketing " "company) or I offer the functionality of pretix to others (e.g. a Software-" "as-a-Service company)." msgstr "" -#: pretix/control/forms/global_settings.py:162 +#: pretix/control/forms/global_settings.py:169 msgid "I'm not sure which option applies." msgstr "" -#: pretix/control/forms/global_settings.py:167 +#: pretix/control/forms/global_settings.py:174 msgid "License choice" msgstr "" -#: pretix/control/forms/global_settings.py:170 +#: pretix/control/forms/global_settings.py:177 msgid "" "I want to use pretix under the additional permission granted to everyone by " "the copyright holders which allows me to not share modifications if I only " "use pretix internally." msgstr "" -#: pretix/control/forms/global_settings.py:173 +#: pretix/control/forms/global_settings.py:180 msgid "" "I want to use pretix under the terms of the AGPLv3 license without " "restriction on the scope of usage and therefore without making use of any " "additional permission." msgstr "" -#: pretix/control/forms/global_settings.py:175 +#: pretix/control/forms/global_settings.py:182 msgid "" "I have obtained a paid pretix Enterprise license which is currently valid." msgstr "" -#: pretix/control/forms/global_settings.py:180 +#: pretix/control/forms/global_settings.py:187 msgid "" "This installation of pretix has installed plugins which are available freely " "under a non-copyleft license (Apache License, MIT License, BSD license, …)." msgstr "" -#: pretix/control/forms/global_settings.py:185 +#: pretix/control/forms/global_settings.py:192 msgid "" "This installation of pretix has installed plugins which are available freely " "under a license with strong copyleft (GPL, AGPL, …)." msgstr "" -#: pretix/control/forms/global_settings.py:190 +#: pretix/control/forms/global_settings.py:197 msgid "" "This installation of pretix has installed plugins which have been created " "internally or obtained under a proprietary license by a third party." msgstr "" -#: pretix/control/forms/global_settings.py:195 +#: pretix/control/forms/global_settings.py:202 msgid "" "This installation of pretix has installed pretix Enterprise plugins with a " "valid license." msgstr "" -#: pretix/control/forms/global_settings.py:199 +#: pretix/control/forms/global_settings.py:206 msgid "Footer: \"powered by\" name (optional)" msgstr "" -#: pretix/control/forms/global_settings.py:200 +#: pretix/control/forms/global_settings.py:207 msgid "" "If you want the \"powered by\" message in the page footer to include the " "name of your company or organization (if you made any changes to pretix), " "set the name here." msgstr "" -#: pretix/control/forms/global_settings.py:205 +#: pretix/control/forms/global_settings.py:212 msgid "Link for powered by name" msgstr "" -#: pretix/control/forms/global_settings.py:206 +#: pretix/control/forms/global_settings.py:213 msgid "" "If you used the previous option, you can set an URL to link to in the footer." msgstr "" -#: pretix/control/forms/global_settings.py:210 +#: pretix/control/forms/global_settings.py:217 #, fuzzy #| msgid "Your registration" msgid "Source code instructions" msgstr "تعليمات رمز المصدر" -#: pretix/control/forms/global_settings.py:212 +#: pretix/control/forms/global_settings.py:219 msgid "" "If you use pretix under AGPLv3 terms, describe exactly how to download the " "current source code of the site including all modifications and installed " "plugins. This will be publicly available. Make sure to keep it up to date!" msgstr "" -#: pretix/control/forms/item.py:99 +#: pretix/control/forms/item.py:100 #, fuzzy #| msgid "Products in this category are add-on products" msgid "" "Products in this category are regular products displayed on the front page." msgstr "المنتجات في هذه الفئة هي منتجات إضافية" -#: pretix/control/forms/item.py:102 +#: pretix/control/forms/item.py:103 #, fuzzy #| msgid "Product category" msgid "Add-on product category" msgstr "فئة المنتج" -#: pretix/control/forms/item.py:103 +#: pretix/control/forms/item.py:104 #, fuzzy #| msgid "Products in this category are add-on products" msgid "" @@ -16307,43 +16535,43 @@ msgid "" "ons." msgstr "المنتجات في هذه الفئة هي منتجات إضافية" -#: pretix/control/forms/item.py:107 +#: pretix/control/forms/item.py:108 msgid "" "Products in this category are regular products, but are only shown in the " "cross-selling step, according to the configuration below." msgstr "" -#: pretix/control/forms/item.py:112 +#: pretix/control/forms/item.py:113 msgid "" "Products in this category are regular products displayed on the front page, " "but are additionally shown in the cross-selling step, according to the " "configuration below." msgstr "" -#: pretix/control/forms/item.py:141 pretix/control/forms/item.py:217 +#: pretix/control/forms/item.py:142 pretix/control/forms/item.py:218 msgid "This field is required" msgstr "هذه الخانة مطلوبه" -#: pretix/control/forms/item.py:219 +#: pretix/control/forms/item.py:220 msgid "Dependencies between questions are not supported during check-in." msgstr "غير معتمدة تبعيات بين الأسئلة أثناء التسجيل في مكتب الاستقبال." -#: pretix/control/forms/item.py:314 +#: pretix/control/forms/item.py:315 #, fuzzy #| msgid "All products" msgid "No products" msgstr "جميع المنتجات" -#: pretix/control/forms/item.py:354 +#: pretix/control/forms/item.py:355 #: pretix/control/templates/pretixcontrol/items/fragment_quota_availability.html:11 msgid "Unlimited" msgstr "غير محدود" -#: pretix/control/forms/item.py:382 +#: pretix/control/forms/item.py:437 msgid "The product should exist in multiple variations" msgstr "يجب أن تكون موجودة المنتج في أشكال مختلفة" -#: pretix/control/forms/item.py:383 +#: pretix/control/forms/item.py:438 msgid "" "Select this option e.g. for t-shirts that come in multiple sizes. You can " "select the variations in the next step." @@ -16351,72 +16579,72 @@ msgstr "" "حدد هذا الخيار على سبيل المثال للالقمصان التي تأتي في أحجام متعددة. يمكنك " "تحديد الاختلافات في الخطوة التالية." -#: pretix/control/forms/item.py:403 pretix/control/forms/item.py:731 +#: pretix/control/forms/item.py:458 pretix/control/forms/item.py:786 msgid "No category" msgstr "ليس هناك فئة" -#: pretix/control/forms/item.py:411 +#: pretix/control/forms/item.py:466 msgid "Copy product information" msgstr "معلومات عن المنتج نسخة" -#: pretix/control/forms/item.py:420 +#: pretix/control/forms/item.py:475 msgid "No taxation" msgstr "لا ضرائب" -#: pretix/control/forms/item.py:424 +#: pretix/control/forms/item.py:479 msgid "Do not add to a quota now" msgstr "لا تضيف إلى الحصة الآن" -#: pretix/control/forms/item.py:425 +#: pretix/control/forms/item.py:480 msgid "Add product to an existing quota" msgstr "إضافة منتج إلى الحصة الحالية" -#: pretix/control/forms/item.py:426 +#: pretix/control/forms/item.py:481 msgid "Create a new quota for this product" msgstr "إنشاء حصص جديدة لهذا المنتج" -#: pretix/control/forms/item.py:432 +#: pretix/control/forms/item.py:487 msgid "Quota options" msgstr "خيارات الحصص" -#: pretix/control/forms/item.py:440 +#: pretix/control/forms/item.py:495 msgid "Add to existing quota" msgstr "إضافة إلى الحصص الحالية" -#: pretix/control/forms/item.py:449 +#: pretix/control/forms/item.py:504 msgid "New quota name" msgstr "اسم الحصص الجديد" -#: pretix/control/forms/item.py:455 +#: pretix/control/forms/item.py:510 msgid "Size" msgstr "بحجم" -#: pretix/control/forms/item.py:456 +#: pretix/control/forms/item.py:511 msgid "Number of tickets" msgstr "عدد التذاكر" -#: pretix/control/forms/item.py:590 +#: pretix/control/forms/item.py:645 msgid "Quota name is required." msgstr "مطلوب اسم الحصص." -#: pretix/control/forms/item.py:595 +#: pretix/control/forms/item.py:650 msgid "Please select a quota." msgstr "يرجى تحديد الحصص." -#: pretix/control/forms/item.py:617 pretix/plugins/badges/forms.py:85 +#: pretix/control/forms/item.py:672 pretix/plugins/badges/forms.py:85 #: pretix/plugins/ticketoutputpdf/forms.py:55 msgid "(Event default)" msgstr "(الافتراضي الأحداث)" -#: pretix/control/forms/item.py:627 +#: pretix/control/forms/item.py:682 msgid "Choose automatically depending on event settings" msgstr "اختيار تلقائيا اعتمادا على إعدادات الحدث" -#: pretix/control/forms/item.py:628 +#: pretix/control/forms/item.py:683 msgid "Yes, if ticket generation is enabled in general" msgstr "نعم، يتم تمكين إذا الجيل تذكرة في عام" -#: pretix/control/forms/item.py:646 +#: pretix/control/forms/item.py:701 msgid "" "e.g. This reduced price is available for full-time students, jobless and " "people over 65. This ticket includes access to all parts of the event, " @@ -16425,27 +16653,27 @@ msgstr "" "مثلا هذا السعر المخفض متاح للطلاب بدوام كامل، والعاطلين عن العمل والناس على " "65. هذه التذكرة تشمل الوصول إلى جميع أجزاء من هذا الحدث، باستثناء منطقة VIP." -#: pretix/control/forms/item.py:690 +#: pretix/control/forms/item.py:745 msgid "" "This option is deprecated. For new products, use the newer option below that " "refers to another product instead of a quota." msgstr "" -#: pretix/control/forms/item.py:701 pretix/control/forms/item.py:717 +#: pretix/control/forms/item.py:756 pretix/control/forms/item.py:772 msgid "Shown independently of other products" msgstr "" -#: pretix/control/forms/item.py:742 +#: pretix/control/forms/item.py:797 #, fuzzy #| msgid "Canceled by customer" msgid "Date chosen by customer" msgstr "تم الإلغاء من قبل العميل" -#: pretix/control/forms/item.py:751 +#: pretix/control/forms/item.py:806 msgid "No membership granted" msgstr "" -#: pretix/control/forms/item.py:770 +#: pretix/control/forms/item.py:825 #, fuzzy #| msgid "" #| "Gift card products should not be associated with non-zero tax rates since " @@ -16457,20 +16685,20 @@ msgstr "" "يجب ألا ترتبط منتجات بطاقات الهدايا بمعدلات ضريبية غير صفرية حيث سيتم تطبيق " "ضريبة المبيعات عند استرداد بطاقة الهدايا." -#: pretix/control/forms/item.py:776 +#: pretix/control/forms/item.py:831 msgid "" "Do not set a specific validity for gift card products as it will not " "restrict the validity of the gift card. A validity of gift cards can be set " "in your organizer settings." msgstr "" -#: pretix/control/forms/item.py:795 pretix/control/forms/item.py:1062 +#: pretix/control/forms/item.py:850 pretix/control/forms/item.py:1117 msgid "" "If a valid membership is required, at least one valid membership type needs " "to be selected." msgstr "" -#: pretix/control/forms/item.py:806 +#: pretix/control/forms/item.py:861 msgid "" "Your product grants a non-transferable membership and should therefore be a " "personalized admission ticket. Otherwise customers might not be able to use " @@ -16478,19 +16706,19 @@ msgid "" "the membership type to be transferable." msgstr "" -#: pretix/control/forms/item.py:815 +#: pretix/control/forms/item.py:870 #, fuzzy #| msgid "The last payment date cannot be before the end of presale." msgid "The start of validity must be before the end of validity." msgstr "لا يمكن أن يكون تاريخ الدفع الأخير قبل نهاية فترة عرض البيع المسبق." -#: pretix/control/forms/item.py:822 +#: pretix/control/forms/item.py:877 msgid "" "You have selected dynamic validity but have not entered a time period. This " "would render the tickets unusable." msgstr "" -#: pretix/control/forms/item.py:927 +#: pretix/control/forms/item.py:982 #, python-format msgid "" "The variation \"%s\" cannot be deleted because it has already been ordered " @@ -16500,21 +16728,21 @@ msgstr "" "الاختلاف \"%s\" لا يمكن حذفها لأنه قد تم بالفعل أمر بذلك من قبل مستخدم أو " "حاليا هي في عربة المستخدم. الرجاء ضبط التباين بأنه \"غير نشطة\" بدلا من ذلك." -#: pretix/control/forms/item.py:1004 +#: pretix/control/forms/item.py:1059 #, fuzzy #| msgid "Calculate from product" msgid "Use value from product" msgstr "احسب من المنتج" -#: pretix/control/forms/item.py:1089 +#: pretix/control/forms/item.py:1144 msgid "Add-ons" msgstr "إضافات" -#: pretix/control/forms/item.py:1113 +#: pretix/control/forms/item.py:1168 msgid "You added the same add-on category twice" msgstr "لقد قمت بإضافة نفس إضافة على فئة مرتين" -#: pretix/control/forms/item.py:1158 +#: pretix/control/forms/item.py:1213 msgid "" "Be aware that setting a minimal number makes it impossible to buy this " "product if all available add-ons are sold out." @@ -16522,30 +16750,34 @@ msgstr "" "كن على علم أن تحديد أقل عدد ممكن يجعل من المستحيل لشراء هذا المنتج إذا بعت " "كل ما هو متاح من الإضافات بها." -#: pretix/control/forms/item.py:1165 +#: pretix/control/forms/item.py:1220 msgid "Bundled products" msgstr "المنتجات المجمعة" -#: pretix/control/forms/item.py:1215 +#: pretix/control/forms/item.py:1270 msgid "You added the same bundled product twice." msgstr "لقد قمت بإضافة نفس حزمة المنتج مرتين" -#: pretix/control/forms/item.py:1221 +#: pretix/control/forms/item.py:1276 #: pretix/control/templates/pretixcontrol/item/include_bundles.html:23 #: pretix/control/templates/pretixcontrol/item/include_bundles.html:50 msgid "Bundled product" msgstr "المنتجات المجمعة" -#: pretix/control/forms/item.py:1246 pretix/control/forms/orders.py:379 -#: pretix/control/forms/orders.py:568 +#: pretix/control/forms/item.py:1301 pretix/control/forms/orders.py:383 +#: pretix/control/forms/orders.py:576 msgid "inactive" msgstr "غير نشط" -#: pretix/control/forms/item.py:1331 +#: pretix/control/forms/item.py:1414 #, fuzzy -#| msgid "Printing time" -msgid "Program times" -msgstr "وقت الطباعة" +#| msgid "" +#| "Sample Conference Center\n" +#| "Heidelberg, Germany" +msgid "Sample Conference Center, Heidelberg, Germany" +msgstr "" +"مركز المؤتمرات عينة\n" +"هايدلبرغ، ألمانيا" #: pretix/control/forms/mailsetup.py:42 msgid "Hostname" @@ -16851,11 +17083,17 @@ msgstr "إرسال بريد إلكتروني إلى إخطار العملاء ا msgid "Allow to overbook quotas when performing this operation" msgstr "السماح لحصص حجز إضافي عند تنفيذ هذه العملية" -#: pretix/control/forms/orders.py:340 +#: pretix/control/forms/orders.py:335 +#, fuzzy +#| msgid "Number of orders" +msgid "Number of products to add" +msgstr "عدد الطلبات" + +#: pretix/control/forms/orders.py:344 msgid "Add-on to" msgstr "إضافة إلى" -#: pretix/control/forms/orders.py:345 +#: pretix/control/forms/orders.py:349 #: pretix/control/templates/pretixcontrol/checkin/index.html:104 #: pretix/control/templates/pretixcontrol/order/change.html:127 #: pretix/control/views/vouchers.py:121 @@ -16864,91 +17102,97 @@ msgstr "إضافة إلى" msgid "Seat" msgstr "مقعد" -#: pretix/control/forms/orders.py:348 +#: pretix/control/forms/orders.py:352 #: pretix/control/templates/pretixcontrol/order/change.html:182 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:5 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:9 #: pretix/control/templates/pretixcontrol/organizers/customer_membership_delete.html:5 #: pretix/control/templates/pretixcontrol/organizers/customer_membership_delete.html:9 -#: pretix/presale/forms/checkout.py:238 +#: pretix/presale/forms/checkout.py:195 msgid "Membership" msgstr "عضويات" -#: pretix/control/forms/orders.py:356 +#: pretix/control/forms/orders.py:360 msgid "Including taxes, if any. Keep empty for the product's default price" msgstr "" "بما في ذلك الضرائب، إن وجدت. تبقي فارغة للحصول على السعر الافتراضي المنتج" -#: pretix/control/forms/orders.py:470 pretix/control/forms/orders.py:474 -#: pretix/control/forms/orders.py:502 pretix/control/forms/orders.py:544 -#: pretix/control/forms/orders.py:563 pretix/control/forms/orders.py:581 -#: pretix/control/forms/orders.py:609 +#: pretix/control/forms/orders.py:441 +#, fuzzy +#| msgid "You can not select the same seat multiple times." +msgid "You can not choose a seat when adding multiple products at once." +msgstr "لا يمكنك اختيار نفس المقعد عدة مرات." + +#: pretix/control/forms/orders.py:478 pretix/control/forms/orders.py:482 +#: pretix/control/forms/orders.py:510 pretix/control/forms/orders.py:552 +#: pretix/control/forms/orders.py:571 pretix/control/forms/orders.py:589 +#: pretix/control/forms/orders.py:617 msgid "(Unchanged)" msgstr "(دون تغيير)" -#: pretix/control/forms/orders.py:480 pretix/control/forms/orders.py:604 +#: pretix/control/forms/orders.py:488 pretix/control/forms/orders.py:612 msgid "New price (gross)" msgstr "السعر الجديد (إجمالي)" -#: pretix/control/forms/orders.py:484 +#: pretix/control/forms/orders.py:492 #, fuzzy #| msgid "Client secret" msgid "Ticket is blocked" msgstr "كلمة سر التذكرة" -#: pretix/control/forms/orders.py:489 +#: pretix/control/forms/orders.py:497 msgid "Validity start" msgstr "" -#: pretix/control/forms/orders.py:494 +#: pretix/control/forms/orders.py:502 #, fuzzy #| msgid "Valid until" msgid "Validity end" msgstr "حتى تاريخ" -#: pretix/control/forms/orders.py:506 +#: pretix/control/forms/orders.py:514 msgid "Generate a new secret" msgstr "توليد سر جديدة" -#: pretix/control/forms/orders.py:507 +#: pretix/control/forms/orders.py:515 msgid "" "This affects both the ticket secret (often used as a QR code) as well as the " "link used to individually access the ticket." msgstr "" -#: pretix/control/forms/orders.py:512 +#: pretix/control/forms/orders.py:520 msgid "Cancel this position" msgstr "إلغاء هذا المنصب" -#: pretix/control/forms/orders.py:516 +#: pretix/control/forms/orders.py:524 msgid "Split into new order" msgstr "تنقسم إلى النظام الجديد" -#: pretix/control/forms/orders.py:582 +#: pretix/control/forms/orders.py:590 msgid "(No membership)" msgstr "(لا توجد عضوية)" -#: pretix/control/forms/orders.py:613 +#: pretix/control/forms/orders.py:621 msgid "Remove this fee" msgstr "" -#: pretix/control/forms/orders.py:631 +#: pretix/control/forms/orders.py:639 msgid "" "Note that payment fees have a special semantic and might automatically be " "changed if the payment method of the order is changed." msgstr "" -#: pretix/control/forms/orders.py:639 +#: pretix/control/forms/orders.py:647 #: pretix/control/templates/pretixcontrol/order/change.html:214 -#: pretix/control/templates/pretixcontrol/order/change.html:438 +#: pretix/control/templates/pretixcontrol/order/change.html:440 msgid "including all taxes" msgstr "بما في ذلك جميع الضرائب" -#: pretix/control/forms/orders.py:677 +#: pretix/control/forms/orders.py:685 msgid "Invalidate secrets" msgstr "أسرار يبطل" -#: pretix/control/forms/orders.py:678 +#: pretix/control/forms/orders.py:686 msgid "" "Regenerates the order and ticket secrets. You will need to re-send the link " "to the order page to the user and the user will need to download his tickets " @@ -16958,81 +17202,81 @@ msgstr "" "للمستخدم وسوف يحتاج المستخدم إلى تحميل تذاكر له مرة أخرى. سوف الإصدارات " "القديمة تكون غير صالحة." -#: pretix/control/forms/orders.py:734 pretix/plugins/sendmail/forms.py:196 +#: pretix/control/forms/orders.py:742 pretix/plugins/sendmail/forms.py:196 #, fuzzy #| msgid "Attach ticket files" msgid "Attach tickets" msgstr "إرفق ملفات التذكرة" -#: pretix/control/forms/orders.py:735 pretix/plugins/sendmail/forms.py:197 +#: pretix/control/forms/orders.py:743 pretix/plugins/sendmail/forms.py:197 msgid "" "Will be ignored if tickets exceed a given size limit to ensure email " "deliverability." msgstr "" -#: pretix/control/forms/orders.py:742 +#: pretix/control/forms/orders.py:750 #, fuzzy #| msgid "Attach invoices to emails" msgid "Attach invoices" msgstr "إرفق الفواتير في رسائل البريد الإلكتروني" -#: pretix/control/forms/orders.py:763 +#: pretix/control/forms/orders.py:771 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:20 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:30 msgid "Recipient" msgstr "مستلم" -#: pretix/control/forms/orders.py:778 +#: pretix/control/forms/orders.py:786 #, fuzzy, python-brace-format #| msgid "Attach ticket files" msgid "Attach {file}" msgstr "إرفق ملفات التذكرة" -#: pretix/control/forms/orders.py:806 +#: pretix/control/forms/orders.py:814 msgid "" "Cancel the order. All tickets will no longer work. This can not be reverted." msgstr "الغي الطلب. وجميع التذاكر لم تعد تعمل. هذا لا يمكن عاد." -#: pretix/control/forms/orders.py:807 +#: pretix/control/forms/orders.py:815 msgid "" "Mark the order as pending and allow the user to pay the open amount with " "another payment method." msgstr "" "نحتفل النظام كما المعلقة وتسمح للمستخدم لدفع المبلغ مفتوح مع طريقة دفع أخرى." -#: pretix/control/forms/orders.py:809 +#: pretix/control/forms/orders.py:817 msgid "Do nothing and keep the order as it is." msgstr "لا تفعل شيئا والحفاظ على النظام كما هو عليه." -#: pretix/control/forms/orders.py:836 +#: pretix/control/forms/orders.py:844 #, python-brace-format msgid "The refund amount needs to be positive and less than {}." msgstr "احتياجات المبلغ المسترد لتكون إيجابية وأقل من {}." -#: pretix/control/forms/orders.py:842 +#: pretix/control/forms/orders.py:850 msgid "You need to specify an amount for a partial refund." msgstr "تحتاج إلى تحديد مبلغ للحصول على رد جزئي." -#: pretix/control/forms/orders.py:854 +#: pretix/control/forms/orders.py:862 msgid "Cancel all dates" msgstr "إلغاء جميع التواريخ" -#: pretix/control/forms/orders.py:873 +#: pretix/control/forms/orders.py:881 msgid "Automatically refund money if possible" msgstr "استرد المبلغ تلقائيا إن أمكن الأمر" -#: pretix/control/forms/orders.py:876 +#: pretix/control/forms/orders.py:884 msgid "" "Only available for payment method that support automatic refunds. Tickets " "that have been blocked (manually or by a plugin) are not auto-canceled and " "you will need to deal with them manually." msgstr "" -#: pretix/control/forms/orders.py:880 +#: pretix/control/forms/orders.py:888 msgid "Create refund in the manual refund to-do list" msgstr "" -#: pretix/control/forms/orders.py:883 +#: pretix/control/forms/orders.py:891 msgid "" "Manual refunds will be created which will be listed in the manual refund to-" "do list. When combined with the automatic refund functionally, only payments " @@ -17041,29 +17285,29 @@ msgid "" "orders by offsetting with different orders or issuing gift cards." msgstr "" -#: pretix/control/forms/orders.py:889 +#: pretix/control/forms/orders.py:897 msgid "" "Refund order value to a gift card instead instead of the original payment " "method" msgstr "" -#: pretix/control/forms/orders.py:895 +#: pretix/control/forms/orders.py:903 msgid "Gift card validity" msgstr "صلاحية بطاقة هدية" -#: pretix/control/forms/orders.py:914 +#: pretix/control/forms/orders.py:922 msgid "Keep a fixed cancellation fee per ticket" msgstr "الحفاظ على رسوم إلغاء الثابتة للتذكرة" -#: pretix/control/forms/orders.py:915 +#: pretix/control/forms/orders.py:923 msgid "Free tickets and add-on products are not counted" msgstr "لا يتم احتساب التذاكر المجانية والمنتجات المضافة" -#: pretix/control/forms/orders.py:925 +#: pretix/control/forms/orders.py:933 msgid "Keep fees" msgstr "احتفظ بالرسوم" -#: pretix/control/forms/orders.py:928 +#: pretix/control/forms/orders.py:936 msgid "" "The selected types of fees will not be refunded but instead added to the " "cancellation fee. Fees are never refunded in when an order in an event " @@ -17071,20 +17315,20 @@ msgid "" "dates." msgstr "" -#: pretix/control/forms/orders.py:934 +#: pretix/control/forms/orders.py:942 msgid "Send information via email" msgstr "أرسل المعلومات إلى البريد الإلكتروني" -#: pretix/control/forms/orders.py:940 +#: pretix/control/forms/orders.py:948 msgid "Send information to waiting list" msgstr "أرسم المعلومات إلى قائمة الإنتظار" -#: pretix/control/forms/orders.py:955 pretix/control/forms/orders.py:981 +#: pretix/control/forms/orders.py:963 pretix/control/forms/orders.py:989 #, python-brace-format msgid "Canceled: {event}" msgstr "ملغية: {event}" -#: pretix/control/forms/orders.py:966 +#: pretix/control/forms/orders.py:974 #, python-brace-format msgid "" "Hello,\n" @@ -17115,7 +17359,7 @@ msgstr "" "\n" "فريق {event}" -#: pretix/control/forms/orders.py:993 +#: pretix/control/forms/orders.py:1001 #, python-brace-format msgid "" "Hello,\n" @@ -17138,37 +17382,37 @@ msgstr "" "\n" "فريق الفعالية {event}" -#: pretix/control/forms/orders.py:1025 pretix/plugins/sendmail/forms.py:115 +#: pretix/control/forms/orders.py:1033 pretix/plugins/sendmail/forms.py:115 #: pretix/plugins/sendmail/forms.py:208 msgctxt "subevent" msgid "Please either select a specific date or a date range, not both." msgstr "الرجاء اختيار يوم محدد أو تواريخ تقريبية وليس الإثنان معا." -#: pretix/control/forms/orders.py:1027 +#: pretix/control/forms/orders.py:1035 msgctxt "subevent" msgid "Please either select all dates or a date range, not both." msgstr "الرجاء اختيار كافة الأيام أو تاريخ تقريبي وليس الإثنان معا." -#: pretix/control/forms/orders.py:1029 pretix/plugins/sendmail/forms.py:117 +#: pretix/control/forms/orders.py:1037 pretix/plugins/sendmail/forms.py:117 #: pretix/plugins/sendmail/forms.py:210 msgctxt "subevent" msgid "If you set a date range, please set both a start and an end." msgstr "" -#: pretix/control/forms/orders.py:1031 +#: pretix/control/forms/orders.py:1039 msgid "Please confirm that you want to cancel ALL dates in this event series." msgstr "" -#: pretix/control/forms/orders.py:1037 +#: pretix/control/forms/orders.py:1045 msgid "I understand that this is not reversible and want to continue" msgstr "" -#: pretix/control/forms/orders.py:1042 +#: pretix/control/forms/orders.py:1050 msgid "" "We have just emailed you a confirmation code to enter to confirm this action" msgstr "" -#: pretix/control/forms/orders.py:1055 +#: pretix/control/forms/orders.py:1063 #, fuzzy #| msgid "The confirm code you entered was incorrect." msgid "The confirmation code is incorrect." @@ -17209,11 +17453,11 @@ msgstr "تحتاج إلى تحديد تاريخ." msgid "You may set only one organizer domain." msgstr "" -#: pretix/control/forms/organizer.py:322 +#: pretix/control/forms/organizer.py:331 msgid "Provided by a plugin" msgstr "" -#: pretix/control/forms/organizer.py:438 +#: pretix/control/forms/organizer.py:447 msgid "" "The changes could not be saved because there would be no remaining team with " "the permission to change teams and permissions." @@ -17221,117 +17465,117 @@ msgstr "" "لا يمكن حفظ التغييرات لأنه لن يكون هناك أي فريق المتبقية مع الإذن لفرق " "التغيير والأذونات." -#: pretix/control/forms/organizer.py:487 pretix/control/forms/organizer.py:525 +#: pretix/control/forms/organizer.py:496 pretix/control/forms/organizer.py:534 msgid "" "Your device will not have access to anything, please select some events." msgstr "سوف جهازك لا يحصلون على أي شيء، يرجى اختيار بعض الأحداث." -#: pretix/control/forms/organizer.py:677 pretix/plugins/stripe/payment.py:330 +#: pretix/control/forms/organizer.py:687 pretix/plugins/stripe/payment.py:330 #, fuzzy #| msgid "Features" msgid "experimental" msgstr "المميزات" -#: pretix/control/forms/organizer.py:683 +#: pretix/control/forms/organizer.py:693 msgid "" "This feature is currently in an experimental stage. It only supports very " "limited use cases and might change at any point." msgstr "" -#: pretix/control/forms/organizer.py:706 +#: pretix/control/forms/organizer.py:716 msgid "Sensitive emails like password resets will not be sent in Bcc." msgstr "" -#: pretix/control/forms/organizer.py:716 +#: pretix/control/forms/organizer.py:726 msgid "This will be attached to every email." msgstr "سيرفق هذا مع كل بريد إلكتروني." -#: pretix/control/forms/organizer.py:790 pretix/control/logdisplay.py:671 +#: pretix/control/forms/organizer.py:800 pretix/control/logdisplay.py:671 #: pretix/control/views/user.py:850 pretix/presale/views/customer.py:289 -#: pretix/presale/views/customer.py:545 +#: pretix/presale/views/customer.py:547 msgid "Your password has been changed." msgstr "تم تغيير كلمة السر الخاصة بك." -#: pretix/control/forms/organizer.py:823 +#: pretix/control/forms/organizer.py:833 msgctxt "webhooks" msgid "Event types" msgstr "أنواع الأحداث" -#: pretix/control/forms/organizer.py:857 +#: pretix/control/forms/organizer.py:867 msgid "Gift card value" msgstr "قيمة بطاقة هدية" -#: pretix/control/forms/organizer.py:961 +#: pretix/control/forms/organizer.py:971 #, fuzzy #| msgid "An account with this email address is already registered." msgid "An medium with this type and identifier is already registered." msgstr "هناك حساب مرتبط بهذا البريد الإلكتروني مسبقا." -#: pretix/control/forms/organizer.py:1059 +#: pretix/control/forms/organizer.py:1069 #, fuzzy #| msgid "An account with this email address is already registered." msgid "An account with this customer ID is already registered." msgstr "هناك حساب مرتبط بهذا البريد الإلكتروني مسبقا." -#: pretix/control/forms/organizer.py:1076 +#: pretix/control/forms/organizer.py:1086 #: pretix/control/templates/pretixcontrol/organizers/customer.html:62 -#: pretix/presale/forms/customer.py:169 pretix/presale/forms/customer.py:506 +#: pretix/presale/forms/customer.py:169 pretix/presale/forms/customer.py:507 msgid "Phone" msgstr "" -#: pretix/control/forms/organizer.py:1190 +#: pretix/control/forms/organizer.py:1200 #, fuzzy #| msgid "Target URL" msgctxt "sso_oidc" msgid "Base URL" msgstr "الرابط المستهدف" -#: pretix/control/forms/organizer.py:1194 +#: pretix/control/forms/organizer.py:1204 #, fuzzy #| msgid "Client ID" msgctxt "sso_oidc" msgid "Client ID" msgstr "هوية العميل" -#: pretix/control/forms/organizer.py:1198 +#: pretix/control/forms/organizer.py:1208 #, fuzzy #| msgid "Client secret" msgctxt "sso_oidc" msgid "Client secret" msgstr "سر العميل" -#: pretix/control/forms/organizer.py:1202 +#: pretix/control/forms/organizer.py:1212 msgctxt "sso_oidc" msgid "Scope" msgstr "" -#: pretix/control/forms/organizer.py:1203 +#: pretix/control/forms/organizer.py:1213 msgctxt "sso_oidc" msgid "Multiple scopes separated with spaces." msgstr "" -#: pretix/control/forms/organizer.py:1207 +#: pretix/control/forms/organizer.py:1217 #, fuzzy #| msgid "User profile only" msgctxt "sso_oidc" msgid "User ID field" msgstr "ملف تعريف المستخدم فقط" -#: pretix/control/forms/organizer.py:1208 +#: pretix/control/forms/organizer.py:1218 msgctxt "sso_oidc" msgid "" "We will assume that the contents of the user ID fields are unique and can " "never change for a user." msgstr "" -#: pretix/control/forms/organizer.py:1214 +#: pretix/control/forms/organizer.py:1224 #, fuzzy #| msgid "All invoices" msgctxt "sso_oidc" msgid "Email field" msgstr "جميع الفواتير" -#: pretix/control/forms/organizer.py:1215 +#: pretix/control/forms/organizer.py:1225 msgctxt "sso_oidc" msgid "" "We will assume that all email addresses received from the SSO provider are " @@ -17339,19 +17583,19 @@ msgid "" "security issues might arise." msgstr "" -#: pretix/control/forms/organizer.py:1222 +#: pretix/control/forms/organizer.py:1232 #, fuzzy #| msgid "Phone number" msgctxt "sso_oidc" msgid "Phone field" msgstr "رقم الجوال" -#: pretix/control/forms/organizer.py:1226 +#: pretix/control/forms/organizer.py:1236 msgctxt "sso_oidc" msgid "Query parameters" msgstr "" -#: pretix/control/forms/organizer.py:1227 +#: pretix/control/forms/organizer.py:1237 #, python-brace-format msgctxt "sso_oidc" msgid "" @@ -17359,25 +17603,25 @@ msgid "" "endpoint. Enter as: {example}" msgstr "" -#: pretix/control/forms/organizer.py:1288 +#: pretix/control/forms/organizer.py:1298 #, fuzzy #| msgid "A new client secret has been generated and is now effective." msgid "Invalidate old client secret and generate a new one" msgstr "تم إنشاء سر عميل جديد، وهو الآن فعال." -#: pretix/control/forms/organizer.py:1321 +#: pretix/control/forms/organizer.py:1331 #, fuzzy #| msgid "Organizer name" msgid "Organizer short name" msgstr "اسم المنظم" -#: pretix/control/forms/organizer.py:1325 +#: pretix/control/forms/organizer.py:1335 #, fuzzy #| msgid "Disable selected" msgid "Allow access to reusable media" msgstr "تعطيل المختارة" -#: pretix/control/forms/organizer.py:1326 +#: pretix/control/forms/organizer.py:1336 msgid "" "This is required if you want the other organizer to participate in a shared " "system with e.g. NFC payment chips. You should only use this option for " @@ -17386,25 +17630,25 @@ msgid "" "to interact with the media type." msgstr "" -#: pretix/control/forms/organizer.py:1342 +#: pretix/control/forms/organizer.py:1352 #, fuzzy #| msgid "The selected date does not exist in this event series." msgid "The selected organizer does not exist or cannot be invited." msgstr "التاريخ المحدد غير موجود في سلسلة الفعاليات هذه." -#: pretix/control/forms/organizer.py:1344 +#: pretix/control/forms/organizer.py:1354 #, fuzzy #| msgid "The selected organizer was not found." msgid "The selected organizer has already been invited." msgstr "لم يتم العثور على المنظم المحدد." -#: pretix/control/forms/organizer.py:1379 +#: pretix/control/forms/organizer.py:1389 #, fuzzy #| msgid "A voucher with this code already exists." msgid "A sales channel with the same identifier already exists." msgstr "يوجد كود الخصم مسبقا يحمل هذا الرمز." -#: pretix/control/forms/organizer.py:1391 +#: pretix/control/forms/organizer.py:1401 msgid "Events with active plugin" msgstr "" @@ -17482,27 +17726,41 @@ msgstr "يوم" msgid "Weekend day" msgstr "يوم عطلة نهاية الأسبوع" -#: pretix/control/forms/subevents.py:118 +#: pretix/control/forms/subevents.py:106 +msgctxt "subevent" +msgid "Skip dates that overlap with any existing date" +msgstr "" + +#: pretix/control/forms/subevents.py:109 +msgctxt "subevent" +msgid "" +"This can be useful if all your dates happen in the same location and no " +"repeated dates should be created in conflict with existing special events. " +"This respects even inactive dates and works best if all dates have both a " +"start and end time." +msgstr "" + +#: pretix/control/forms/subevents.py:128 msgid "Keep the current values" msgstr "احتفظ بالقيمة الحالية" -#: pretix/control/forms/subevents.py:135 pretix/control/forms/subevents.py:141 +#: pretix/control/forms/subevents.py:145 pretix/control/forms/subevents.py:151 msgid "Selection contains various values" msgstr "" -#: pretix/control/forms/subevents.py:288 pretix/control/forms/subevents.py:317 +#: pretix/control/forms/subevents.py:298 pretix/control/forms/subevents.py:327 #, fuzzy #| msgid "The end of the event has to be later than its start." msgid "The end of availability should be after the start of availability." msgstr "نهاية الفعالية يجب أن تكون في وقت لاحق بعد بدايتها." -#: pretix/control/forms/subevents.py:350 +#: pretix/control/forms/subevents.py:360 #, fuzzy #| msgid "Available until" msgid "Available_until" msgstr "متاحة حتى" -#: pretix/control/forms/subevents.py:470 +#: pretix/control/forms/subevents.py:480 msgid "Exclude these dates instead of adding them." msgstr "استبعاد هذه التواريخ بدلا من إضافتها." @@ -17937,7 +18195,7 @@ msgid "The check-in of position #{posid} on list \"{list}\" has been reverted." msgstr "في الاختيار من موقف # {posid} على قائمة \"{list}\" وقد عادت." #: pretix/control/logdisplay.py:359 pretix/control/logdisplay.py:361 -#: pretix/control/logdisplay.py:995 pretix/control/logdisplay.py:997 +#: pretix/control/logdisplay.py:998 pretix/control/logdisplay.py:1000 msgid "(unknown)" msgstr "(غير معروف)" @@ -17992,7 +18250,7 @@ msgstr "أكد المستخدم الرسالة التالية: \"{}\"" msgid "The order has been canceled (comment: \"{comment}\")." msgstr "تم رفض الطلب." -#: pretix/control/logdisplay.py:422 pretix/control/views/orders.py:1569 +#: pretix/control/logdisplay.py:422 pretix/control/views/orders.py:1573 #: pretix/presale/views/order.py:1138 msgid "The order has been canceled." msgstr "تم إلغاء هذا الأمر." @@ -18033,11 +18291,11 @@ msgstr "" msgid "Internal error while transferring data to {provider_display_name}." msgstr "" -#: pretix/control/logdisplay.py:489 pretix/control/logdisplay.py:842 +#: pretix/control/logdisplay.py:489 pretix/control/logdisplay.py:845 msgid "The settings of a payment provider have been changed." msgstr "تم تغيير الإعدادات من مقدم الدفع." -#: pretix/control/logdisplay.py:492 pretix/control/logdisplay.py:841 +#: pretix/control/logdisplay.py:492 pretix/control/logdisplay.py:844 msgid "The settings of a ticket output provider have been changed." msgstr "تم تغيير إعدادات مزود الناتج التذاكر." @@ -18084,11 +18342,11 @@ msgstr "تم وضع علامة على الترتيب كما المدفوعة." msgid "The order has been set to require payment before use." msgstr "تم إرسال كود الخصم إلى {recipient}." -#: pretix/control/logdisplay.py:511 pretix/control/views/orders.py:1574 +#: pretix/control/logdisplay.py:511 pretix/control/views/orders.py:1578 msgid "The order has been marked as expired." msgstr "تم وضع علامة على النظام ومنتهية الصلاحية." -#: pretix/control/logdisplay.py:512 pretix/control/views/orders.py:1476 +#: pretix/control/logdisplay.py:512 pretix/control/views/orders.py:1480 msgid "The order has been marked as paid." msgstr "تم وضع علامة على الترتيب كما المدفوعة." @@ -18100,7 +18358,7 @@ msgstr "تم حذف طلب الإلغاء." msgid "The order has been refunded." msgstr "وقد تم ترتيب ردها." -#: pretix/control/logdisplay.py:515 pretix/control/views/orders.py:1914 +#: pretix/control/logdisplay.py:515 pretix/control/views/orders.py:1918 msgid "The order has been reactivated." msgstr "تم إعادة تنشيط الطلب." @@ -18112,7 +18370,7 @@ msgstr "تم إنشاء هذا الأمر." msgid "The order requires approval before it can continue to be processed." msgstr "الأمر يتطلب موافقة قبل أن تتمكن من الاستمرار في معالجتها." -#: pretix/control/logdisplay.py:519 pretix/control/views/orders.py:796 +#: pretix/control/logdisplay.py:519 pretix/control/views/orders.py:800 msgid "The order has been approved." msgstr "تمت الموافقة على النظام." @@ -18155,7 +18413,7 @@ msgstr "تم تغيير حساب العميل." msgid "The order locale has been changed." msgstr "تم تغيير لغة النظام." -#: pretix/control/logdisplay.py:531 pretix/control/views/orders.py:1613 +#: pretix/control/logdisplay.py:531 pretix/control/views/orders.py:1617 #: pretix/presale/views/order.py:797 pretix/presale/views/order.py:877 msgid "The invoice has been generated." msgstr "تم إنشاء الفاتورة." @@ -18166,11 +18424,11 @@ msgstr "تم إنشاء الفاتورة." msgid "The invoice could not be generated." msgstr "تم إنشاء الفاتورة." -#: pretix/control/logdisplay.py:533 pretix/control/views/orders.py:1694 +#: pretix/control/logdisplay.py:533 pretix/control/views/orders.py:1698 msgid "The invoice has been regenerated." msgstr "تم إعادة إنشاء الفاتورة." -#: pretix/control/logdisplay.py:534 pretix/control/views/orders.py:1751 +#: pretix/control/logdisplay.py:534 pretix/control/views/orders.py:1755 #: pretix/presale/views/order.py:897 msgid "The invoice has been reissued." msgstr "تم إعادة إصدار الفاتورة." @@ -18235,7 +18493,7 @@ msgid "An unidentified type email has been sent." msgstr "تم ارسال نوع البريد الإلكتروني مجهول." #: pretix/control/logdisplay.py:549 pretix/control/logdisplay.py:742 -#: pretix/control/logdisplay.py:748 pretix/control/logdisplay.py:776 +#: pretix/control/logdisplay.py:751 pretix/control/logdisplay.py:779 msgid "Sending of an email has failed." msgstr "ارسال بريد الكتروني قد فشلت." @@ -18457,7 +18715,7 @@ msgstr "تم تمكين حسابك." msgid "Your account has been disabled." msgstr "تم تعطيل حسابك." -#: pretix/control/logdisplay.py:680 pretix/presale/views/customer.py:642 +#: pretix/control/logdisplay.py:680 pretix/presale/views/customer.py:644 #, fuzzy, python-brace-format #| msgid "" #| "The email address has been changed from \"{old_email}\" to \"{new_email}" @@ -18494,37 +18752,37 @@ msgstr "تم تغيير المنظم." msgid "The organizer settings have been changed." msgstr "تم تغيير إعدادات المنظم." -#: pretix/control/logdisplay.py:704 pretix/control/logdisplay.py:849 +#: pretix/control/logdisplay.py:704 pretix/control/logdisplay.py:852 #, fuzzy #| msgid "The order details have been changed." msgid "The footer links have been changed." msgstr "تم تغيير تفاصيل النظام." -#: pretix/control/logdisplay.py:705 pretix/control/logdisplay.py:754 +#: pretix/control/logdisplay.py:705 pretix/control/logdisplay.py:757 #, fuzzy #| msgid "The quota has been added." msgid "A scheduled export has been added." msgstr "تمت إضافة الحصص." -#: pretix/control/logdisplay.py:706 pretix/control/logdisplay.py:755 +#: pretix/control/logdisplay.py:706 pretix/control/logdisplay.py:758 #, fuzzy #| msgid "The product has been changed." msgid "A scheduled export has been changed." msgstr "تم تغيير المنتج." -#: pretix/control/logdisplay.py:707 pretix/control/logdisplay.py:756 +#: pretix/control/logdisplay.py:707 pretix/control/logdisplay.py:759 #, fuzzy #| msgid "The selected product has been deleted." msgid "A scheduled export has been deleted." msgstr "تم حذف المنتج المحدد." -#: pretix/control/logdisplay.py:708 pretix/control/logdisplay.py:757 +#: pretix/control/logdisplay.py:708 pretix/control/logdisplay.py:760 #, fuzzy #| msgid "The selected product has been deleted." msgid "A scheduled export has been executed." msgstr "تم حذف المنتج المحدد." -#: pretix/control/logdisplay.py:709 pretix/control/logdisplay.py:758 +#: pretix/control/logdisplay.py:709 pretix/control/logdisplay.py:761 #, python-brace-format msgid "A scheduled export has failed: {reason}." msgstr "" @@ -18627,7 +18885,7 @@ msgstr "تم تغيير الحساب." msgid "The SSO client has been deleted." msgstr "الحدث تم الغائه." -#: pretix/control/logdisplay.py:728 pretix/control/views/organizer.py:2719 +#: pretix/control/logdisplay.py:728 pretix/control/views/organizer.py:2715 msgid "The membership type has been created." msgstr "تم انشاء نوع العضوية." @@ -18639,7 +18897,7 @@ msgstr "تم تغيير نوع العضوية." msgid "The membership type has been deleted." msgstr "تم حذف نوع العضوية." -#: pretix/control/logdisplay.py:731 pretix/control/views/organizer.py:3560 +#: pretix/control/logdisplay.py:731 pretix/control/views/organizer.py:3591 #, fuzzy #| msgctxt "subevent" #| msgid "The new date has been created." @@ -18712,560 +18970,579 @@ msgstr "تم تغيير القاعدة الضريبية." #: pretix/control/logdisplay.py:746 #, fuzzy +#| msgid "The new member has been added to the team." +msgid "A new ticket has been added to the medium." +msgstr "تمت إضافة عضو جديد إلى الفريق." + +#: pretix/control/logdisplay.py:747 +#, fuzzy +#| msgid "{user} has been removed from the team." +msgid "A ticket has been removed from the medium." +msgstr "{user} تمت إزالته من الفريق." + +#: pretix/control/logdisplay.py:748 +#, fuzzy #| msgid "The email has been queued to be sent." msgid "The medium has been connected to a new ticket." msgstr "وقد تم في قائمة الانتظار البريد الإلكتروني لإرسالها." -#: pretix/control/logdisplay.py:747 +#: pretix/control/logdisplay.py:749 +#, python-brace-format +msgid "" +"The ticket #{positionid} was exchanged for reusable medium " +"{medium_identifier}." +msgstr "" + +#: pretix/control/logdisplay.py:750 #, fuzzy #| msgid "The email has been queued to be sent." msgid "The medium has been connected to a new gift card." msgstr "وقد تم في قائمة الانتظار البريد الإلكتروني لإرسالها." -#: pretix/control/logdisplay.py:749 +#: pretix/control/logdisplay.py:752 msgid "The event's internal comment has been updated." msgstr "تم تحديث التعليق الداخلي للحدث." -#: pretix/control/logdisplay.py:750 +#: pretix/control/logdisplay.py:753 msgid "The event has been canceled." msgstr "تم إلغاء الفعالية." -#: pretix/control/logdisplay.py:751 +#: pretix/control/logdisplay.py:754 msgid "An event has been deleted." msgstr "تم حذف فعالية." -#: pretix/control/logdisplay.py:752 +#: pretix/control/logdisplay.py:755 msgid "A removal process for personal data has been started." msgstr "" -#: pretix/control/logdisplay.py:753 +#: pretix/control/logdisplay.py:756 msgid "A removal process for personal data has been completed." msgstr "" -#: pretix/control/logdisplay.py:759 +#: pretix/control/logdisplay.py:762 msgid "The user has been created." msgstr "تم إنشاء المستخدم." -#: pretix/control/logdisplay.py:760 +#: pretix/control/logdisplay.py:763 #, python-brace-format msgid "" "A first login using {agent_type} on {os_type} from {country} has been " "detected." msgstr "" -#: pretix/control/logdisplay.py:762 pretix/control/views/user.py:474 +#: pretix/control/logdisplay.py:765 pretix/control/views/user.py:474 #: pretix/control/views/user.py:534 pretix/control/views/user.py:593 msgid "Two-factor authentication has been enabled." msgstr "تم تمكين مصادقة اثنين عامل." -#: pretix/control/logdisplay.py:763 pretix/control/views/user.py:377 +#: pretix/control/logdisplay.py:766 pretix/control/views/user.py:377 #: pretix/control/views/user.py:609 msgid "Two-factor authentication has been disabled." msgstr "تم تعطيل المصادقة اثنين عامل." -#: pretix/control/logdisplay.py:764 pretix/control/views/user.py:626 +#: pretix/control/logdisplay.py:767 pretix/control/views/user.py:626 msgid "Your two-factor emergency codes have been regenerated." msgstr "وقد جددت بك رموز الطوارئ اثنين عامل." -#: pretix/control/logdisplay.py:765 +#: pretix/control/logdisplay.py:768 #, fuzzy #| msgid "Your two-factor emergency codes have been regenerated." msgid "A two-factor emergency code has been generated." msgstr "وقد جددت بك رموز الطوارئ اثنين عامل." -#: pretix/control/logdisplay.py:766 +#: pretix/control/logdisplay.py:769 #, python-brace-format msgid "" "A new two-factor authentication device \"{name}\" has been added to your " "account." msgstr "A اثنين عامل جهاز التوثيق جديد \"{name}\" قد أضيفت إلى حسابك." -#: pretix/control/logdisplay.py:768 +#: pretix/control/logdisplay.py:771 #, python-brace-format msgid "" "The two-factor authentication device \"{name}\" has been removed from your " "account." msgstr "الجهاز اثنين عامل التوثيق \"{name}\" تمت إزالة من حسابك." -#: pretix/control/logdisplay.py:770 +#: pretix/control/logdisplay.py:773 msgid "Notifications have been enabled." msgstr "تم تمكين الإشعارات." -#: pretix/control/logdisplay.py:771 +#: pretix/control/logdisplay.py:774 msgid "Notifications have been disabled." msgstr "تم تعطيل الإشعارات." -#: pretix/control/logdisplay.py:772 +#: pretix/control/logdisplay.py:775 msgid "Your notification settings have been changed." msgstr "تم تغيير إعدادات الإشعار." -#: pretix/control/logdisplay.py:773 +#: pretix/control/logdisplay.py:776 msgid "This user has been anonymized." msgstr "تم طمس هويتها لهذا المستخدم." -#: pretix/control/logdisplay.py:777 +#: pretix/control/logdisplay.py:780 msgid "Password reset mail sent." msgstr "إرسال كلمة المرور الإلكتروني إعادة تعيين." -#: pretix/control/logdisplay.py:778 +#: pretix/control/logdisplay.py:781 msgid "The password has been reset." msgstr "وقد تم إعادة تعيين كلمة المرور." -#: pretix/control/logdisplay.py:779 +#: pretix/control/logdisplay.py:782 msgid "" "A repeated password reset has been denied, as the last request was less than " "24 hours ago." msgstr "" -#: pretix/control/logdisplay.py:781 +#: pretix/control/logdisplay.py:784 #, python-brace-format msgid "The organizer \"{name}\" has been deleted." msgstr "منظم \"{name}\" تم حذفها." -#: pretix/control/logdisplay.py:782 pretix/control/logdisplay.py:1013 +#: pretix/control/logdisplay.py:785 pretix/control/logdisplay.py:1016 msgid "A voucher has been sent to a person on the waiting list." msgstr "تم إرسال قسيمة لشخص على قائمة الانتظار." -#: pretix/control/logdisplay.py:783 +#: pretix/control/logdisplay.py:786 #, fuzzy #| msgid "An entry has been added to the waiting list." msgid "An entry has been transferred to another waiting list." msgstr "تمت إضافة إدخال إلى قائمة الانتظار." -#: pretix/control/logdisplay.py:784 +#: pretix/control/logdisplay.py:787 msgid "The team has been created." msgstr "تم إنشاء فريق." -#: pretix/control/logdisplay.py:785 +#: pretix/control/logdisplay.py:788 msgid "The team settings have been changed." msgstr "تم تغيير إعدادات الفريق." -#: pretix/control/logdisplay.py:786 +#: pretix/control/logdisplay.py:789 msgid "The team has been deleted." msgstr "تم حذف الفريق." -#: pretix/control/logdisplay.py:787 pretix/control/views/organizer.py:2385 +#: pretix/control/logdisplay.py:790 pretix/control/views/organizer.py:2381 msgid "The gate has been created." msgstr "تم إنشاء البوابة." -#: pretix/control/logdisplay.py:788 +#: pretix/control/logdisplay.py:791 msgid "The gate has been changed." msgstr "تم تغيير البوابة." -#: pretix/control/logdisplay.py:789 +#: pretix/control/logdisplay.py:792 msgid "The gate has been deleted." msgstr "تم حذف البوابة." -#: pretix/control/logdisplay.py:790 +#: pretix/control/logdisplay.py:793 msgctxt "subevent" msgid "The event date has been deleted." msgstr "تم حذف تاريخ الحدث." -#: pretix/control/logdisplay.py:791 +#: pretix/control/logdisplay.py:794 msgctxt "subevent" msgid "The event date has been canceled." msgstr "تم تغيير تاريخ الفعالية." -#: pretix/control/logdisplay.py:792 +#: pretix/control/logdisplay.py:795 msgctxt "subevent" msgid "The event date has been changed." msgstr "تم تغيير تاريخ الحدث." -#: pretix/control/logdisplay.py:793 +#: pretix/control/logdisplay.py:796 msgctxt "subevent" msgid "The event date has been created." msgstr "تم إنشاء تاريخ الحدث." -#: pretix/control/logdisplay.py:794 +#: pretix/control/logdisplay.py:797 msgctxt "subevent" msgid "A quota has been added to the event date." msgstr "تمت إضافة الحصص لتاريخ الحدث." -#: pretix/control/logdisplay.py:795 +#: pretix/control/logdisplay.py:798 msgctxt "subevent" msgid "A quota has been changed on the event date." msgstr "تم تغيير الحصص في تاريخ الحدث." -#: pretix/control/logdisplay.py:796 +#: pretix/control/logdisplay.py:799 msgctxt "subevent" msgid "A quota has been removed from the event date." msgstr "تمت إزالة حصة من تاريخ الحدث." -#: pretix/control/logdisplay.py:797 +#: pretix/control/logdisplay.py:800 msgid "The device has been created." msgstr "تم إنشاء الجهاز." -#: pretix/control/logdisplay.py:798 +#: pretix/control/logdisplay.py:801 msgid "The device has been changed." msgstr "تم تغيير الجهاز." -#: pretix/control/logdisplay.py:799 +#: pretix/control/logdisplay.py:802 msgid "Access of the device has been revoked." msgstr "تم إبطال الوصول للجهاز." -#: pretix/control/logdisplay.py:800 +#: pretix/control/logdisplay.py:803 msgid "The device has been initialized." msgstr "تم تهيئة الجهاز." -#: pretix/control/logdisplay.py:801 +#: pretix/control/logdisplay.py:804 msgid "The access token of the device has been regenerated." msgstr "تم إعادة إنشاء الوصول رمزية للجهاز." -#: pretix/control/logdisplay.py:802 +#: pretix/control/logdisplay.py:805 msgid "The device has notified the server of an hardware or software update." msgstr "وقد أخطرت جهاز الخادم من تحديث الأجهزة أو البرامج." -#: pretix/control/logdisplay.py:803 +#: pretix/control/logdisplay.py:806 msgid "The gift card has been created." msgstr "تم إنشاء بطاقة هدية." -#: pretix/control/logdisplay.py:804 pretix/control/views/organizer.py:1947 +#: pretix/control/logdisplay.py:807 pretix/control/views/organizer.py:1943 msgid "The gift card has been changed." msgstr "تم تغيير بطاقة الهدية." -#: pretix/control/logdisplay.py:805 +#: pretix/control/logdisplay.py:808 msgid "A manual transaction has been performed." msgstr "تم إجراء عملية يدوية." -#: pretix/control/logdisplay.py:806 +#: pretix/control/logdisplay.py:809 #, fuzzy #| msgid "This payment has been canceled." msgid "A payment has been performed." msgstr "تم إلغاء هذا الدفع." -#: pretix/control/logdisplay.py:807 +#: pretix/control/logdisplay.py:810 #, fuzzy #| msgid "The refund has been processed." msgid "A refund has been performed. " msgstr "تم معالجة استرداد." -#: pretix/control/logdisplay.py:808 +#: pretix/control/logdisplay.py:811 #, python-brace-format msgid "The token \"{name}\" has been created." msgstr "ورمزي \"{name}\" تم إنشاؤه." -#: pretix/control/logdisplay.py:809 +#: pretix/control/logdisplay.py:812 #, python-brace-format msgid "The token \"{name}\" has been revoked." msgstr "ورمزي \"{name}\" تم إبطال." -#: pretix/control/logdisplay.py:810 +#: pretix/control/logdisplay.py:813 #, fuzzy #| msgid "The check-in list has been deleted." msgid "The check-in and print log state has been reset." msgstr "تم حذف الاختيار في القائمة." -#: pretix/control/logdisplay.py:817 pretix/control/logdisplay.py:876 +#: pretix/control/logdisplay.py:820 pretix/control/logdisplay.py:879 #, fuzzy #| msgid "A plugin has been enabled." msgid "The plugin has been enabled." msgstr "تم تمكين البرنامج المساعد." -#: pretix/control/logdisplay.py:818 pretix/control/logdisplay.py:877 -#: pretix/control/views/event.py:489 pretix/control/views/organizer.py:756 +#: pretix/control/logdisplay.py:821 pretix/control/logdisplay.py:880 +#: pretix/control/views/event.py:498 pretix/control/views/organizer.py:757 #, fuzzy #| msgid "A plugin has been disabled." msgid "The plugin has been disabled." msgstr "تم تعطيل البرنامج المساعد." -#: pretix/control/logdisplay.py:821 pretix/control/logdisplay.py:880 +#: pretix/control/logdisplay.py:824 pretix/control/logdisplay.py:883 #, fuzzy, python-brace-format #| msgid "Question {val}" msgid "Plugin {val}" msgstr "سؤال{val}" -#: pretix/control/logdisplay.py:836 +#: pretix/control/logdisplay.py:839 #, fuzzy #| msgid "A user has been added to the event team." msgid "A meta property has been added to this event." msgstr "تمت إضافة المستخدم إلى فريق الحدث." -#: pretix/control/logdisplay.py:837 +#: pretix/control/logdisplay.py:840 #, fuzzy #| msgid "A user has been removed from the event team." msgid "A meta property has been removed from this event." msgstr "تمت إزالة مستخدم من فريق الحدث." -#: pretix/control/logdisplay.py:838 +#: pretix/control/logdisplay.py:841 #, fuzzy #| msgctxt "subevent" #| msgid "A quota has been changed on the event date." msgid "A meta property has been changed on this event." msgstr "تم تغيير الحصص في تاريخ الحدث." -#: pretix/control/logdisplay.py:839 +#: pretix/control/logdisplay.py:842 msgid "The event settings have been changed." msgstr "تم تغيير إعدادات الحدث." -#: pretix/control/logdisplay.py:840 +#: pretix/control/logdisplay.py:843 msgid "The ticket download settings have been changed." msgstr "تم تغيير إعدادات تذكرة تنزيل." -#: pretix/control/logdisplay.py:843 +#: pretix/control/logdisplay.py:846 msgid "The shop has been taken live." msgstr "وقد اتخذت المحل الحية." -#: pretix/control/logdisplay.py:844 +#: pretix/control/logdisplay.py:847 msgid "The shop has been taken offline." msgstr "وقد اتخذت المحل حاليا." -#: pretix/control/logdisplay.py:845 +#: pretix/control/logdisplay.py:848 msgid "The shop has been taken into test mode." msgstr "وقد اتخذت المحل في وضع الاختبار." -#: pretix/control/logdisplay.py:846 +#: pretix/control/logdisplay.py:849 msgid "The test mode has been disabled." msgstr "تم تعطيل وضع الاختبار." -#: pretix/control/logdisplay.py:847 +#: pretix/control/logdisplay.py:850 msgid "The event has been created." msgstr "تم إنشاء هذا الحدث." -#: pretix/control/logdisplay.py:848 +#: pretix/control/logdisplay.py:851 msgid "The event details have been changed." msgstr "تم تغيير تفاصيل الفعالية." -#: pretix/control/logdisplay.py:850 +#: pretix/control/logdisplay.py:853 msgid "An answer option has been added to the question." msgstr "تمت إضافة خيار الإجابة على السؤال." -#: pretix/control/logdisplay.py:851 +#: pretix/control/logdisplay.py:854 msgid "An answer option has been removed from the question." msgstr "تمت إزالة خيار الإجابة عن السؤال." -#: pretix/control/logdisplay.py:852 +#: pretix/control/logdisplay.py:855 msgid "An answer option has been changed." msgstr "تم تغيير خيار الإجابة." -#: pretix/control/logdisplay.py:853 +#: pretix/control/logdisplay.py:856 msgid "A user has been added to the event team." msgstr "تمت إضافة المستخدم إلى فريق الحدث." -#: pretix/control/logdisplay.py:854 +#: pretix/control/logdisplay.py:857 msgid "A user has been invited to the event team." msgstr "وقد وجهت الدعوة للمستخدم لفريق الحدث." -#: pretix/control/logdisplay.py:855 +#: pretix/control/logdisplay.py:858 msgid "A user's permissions have been changed." msgstr "تم تغيير الأذونات للمستخدم." -#: pretix/control/logdisplay.py:856 +#: pretix/control/logdisplay.py:859 msgid "A user has been removed from the event team." msgstr "تمت إزالة مستخدم من فريق الحدث." -#: pretix/control/logdisplay.py:863 +#: pretix/control/logdisplay.py:866 msgid "The check-in list has been added." msgstr "تمت إضافة الاختيار في القائمة." -#: pretix/control/logdisplay.py:864 pretix/control/logdisplay.py:865 +#: pretix/control/logdisplay.py:867 pretix/control/logdisplay.py:868 msgid "The check-in list has been deleted." msgstr "تم حذف الاختيار في القائمة." -#: pretix/control/logdisplay.py:866 +#: pretix/control/logdisplay.py:869 msgid "The check-in list has been changed." msgstr "تم تغيير الاختيار في القائمة." -#: pretix/control/logdisplay.py:869 +#: pretix/control/logdisplay.py:872 #, fuzzy, python-brace-format #| msgid "Check-in list" msgid "Check-in list {val}" msgstr "تحقق في قائمة" -#: pretix/control/logdisplay.py:896 +#: pretix/control/logdisplay.py:899 msgid "The product has been created." msgstr "تم إنشاء المنتج." -#: pretix/control/logdisplay.py:897 +#: pretix/control/logdisplay.py:900 msgid "The product has been changed." msgstr "تم تغيير المنتج." -#: pretix/control/logdisplay.py:898 +#: pretix/control/logdisplay.py:901 #, fuzzy #| msgid "The product has been created." msgid "The product has been reordered." msgstr "تم إنشاء المنتج." -#: pretix/control/logdisplay.py:899 +#: pretix/control/logdisplay.py:902 msgid "The product has been deleted." msgstr "تم حذف المنتج." -#: pretix/control/logdisplay.py:900 +#: pretix/control/logdisplay.py:903 msgid "An add-on has been added to this product." msgstr "تمت إضافة وظيفة إضافية على هذا المنتج." -#: pretix/control/logdisplay.py:901 +#: pretix/control/logdisplay.py:904 msgid "An add-on has been removed from this product." msgstr "تمت إزالة وظيفة إضافية على من هذا المنتج." -#: pretix/control/logdisplay.py:902 +#: pretix/control/logdisplay.py:905 msgid "An add-on has been changed on this product." msgstr "تم تغيير وظيفة إضافية على على هذا المنتج." -#: pretix/control/logdisplay.py:903 +#: pretix/control/logdisplay.py:906 msgid "A bundled item has been added to this product." msgstr "تمت إضافة بند المجمعة لهذا المنتج." -#: pretix/control/logdisplay.py:904 +#: pretix/control/logdisplay.py:907 msgid "A bundled item has been removed from this product." msgstr "تمت إزالة عنصر المجمعة من هذا المنتج." -#: pretix/control/logdisplay.py:905 +#: pretix/control/logdisplay.py:908 msgid "A bundled item has been changed on this product." msgstr "تم تغيير عنصر المجمعة لهذا المنتج." -#: pretix/control/logdisplay.py:906 +#: pretix/control/logdisplay.py:909 #, fuzzy #| msgid "An add-on has been added to this product." msgid "A program time has been added to this product." msgstr "تمت إضافة وظيفة إضافية على هذا المنتج." -#: pretix/control/logdisplay.py:907 +#: pretix/control/logdisplay.py:910 #, fuzzy #| msgid "An add-on has been changed on this product." msgid "A program time has been changed on this product." msgstr "تم تغيير وظيفة إضافية على على هذا المنتج." -#: pretix/control/logdisplay.py:908 +#: pretix/control/logdisplay.py:911 #, fuzzy #| msgid "An add-on has been removed from this product." msgid "A program time has been removed from this product." msgstr "تمت إزالة وظيفة إضافية على من هذا المنتج." -#: pretix/control/logdisplay.py:915 +#: pretix/control/logdisplay.py:918 #, python-brace-format msgid "The variation \"{value}\" has been created." msgstr "الاختلاف \"{value}\" تم إنشاؤه." -#: pretix/control/logdisplay.py:916 +#: pretix/control/logdisplay.py:919 #, python-brace-format msgid "The variation \"{value}\" has been deleted." msgstr "الاختلاف \"{value}\" تم حذفها." -#: pretix/control/logdisplay.py:917 +#: pretix/control/logdisplay.py:920 #, python-brace-format msgid "The variation \"{value}\" has been changed." msgstr "الاختلاف \"{value}\" تم تغيير." -#: pretix/control/logdisplay.py:934 +#: pretix/control/logdisplay.py:937 #, python-brace-format msgid "Payment {local_id} has been confirmed." msgstr "وقد تم تأكيد الدفع {local_id}." -#: pretix/control/logdisplay.py:935 +#: pretix/control/logdisplay.py:938 #, python-brace-format msgid "Payment {local_id} has been canceled." msgstr "تم إلغاء الدفع {local_id}." -#: pretix/control/logdisplay.py:936 +#: pretix/control/logdisplay.py:939 #, python-brace-format msgid "Canceling payment {local_id} has failed." msgstr "فشل إلغاء الدفع {local_id}." -#: pretix/control/logdisplay.py:937 +#: pretix/control/logdisplay.py:940 #, python-brace-format msgid "Payment {local_id} has been started." msgstr "وقد بدأ الدفع {local_id}." -#: pretix/control/logdisplay.py:938 +#: pretix/control/logdisplay.py:941 #, python-brace-format msgid "Payment {local_id} has failed." msgstr "فشلت الدفع {local_id}." -#: pretix/control/logdisplay.py:939 +#: pretix/control/logdisplay.py:942 #, python-brace-format msgid "The order could not be marked as paid: {message}" msgstr "لا يمكن أن تكون وضعت النظام كما المدفوعة: {message}" -#: pretix/control/logdisplay.py:940 +#: pretix/control/logdisplay.py:943 msgid "The order has been overpaid." msgstr "وقد تم ترتيب زائدة." -#: pretix/control/logdisplay.py:941 +#: pretix/control/logdisplay.py:944 #, python-brace-format msgid "Refund {local_id} has been created." msgstr "تم إنشاء استرداد {local_id}." -#: pretix/control/logdisplay.py:942 +#: pretix/control/logdisplay.py:945 #, python-brace-format msgid "Refund {local_id} has been created by an external entity." msgstr "تم إنشاء استرداد {local_id} كيان خارجي." -#: pretix/control/logdisplay.py:943 +#: pretix/control/logdisplay.py:946 msgid "The customer requested you to issue a refund." msgstr "طلب لك العملاء لإصدار رد." -#: pretix/control/logdisplay.py:944 +#: pretix/control/logdisplay.py:947 #, python-brace-format msgid "Refund {local_id} has been completed." msgstr "وقد تم الانتهاء استرداد {local_id}." -#: pretix/control/logdisplay.py:945 +#: pretix/control/logdisplay.py:948 #, python-brace-format msgid "Refund {local_id} has been canceled." msgstr "تم إلغاء استرداد {local_id}." -#: pretix/control/logdisplay.py:946 +#: pretix/control/logdisplay.py:949 #, python-brace-format msgid "Refund {local_id} has failed." msgstr "فشل استرداد {local_id}." -#: pretix/control/logdisplay.py:953 +#: pretix/control/logdisplay.py:956 msgid "The quota has been added." msgstr "تمت إضافة الحصص." -#: pretix/control/logdisplay.py:954 +#: pretix/control/logdisplay.py:957 msgid "The quota has been deleted." msgstr "تم حذف الحصص." -#: pretix/control/logdisplay.py:955 +#: pretix/control/logdisplay.py:958 msgid "The quota has been changed." msgstr "تم تغيير الحصص." -#: pretix/control/logdisplay.py:956 +#: pretix/control/logdisplay.py:959 msgid "The quota has closed." msgstr "وقد أغلقت الحصص." -#: pretix/control/logdisplay.py:957 pretix/control/views/item.py:1065 +#: pretix/control/logdisplay.py:960 pretix/control/views/item.py:1236 msgid "The quota has been re-opened." msgstr "وكانت الحصة إعادة فتح." -#: pretix/control/logdisplay.py:964 +#: pretix/control/logdisplay.py:967 msgid "The question has been added." msgstr "تمت إضافة هذا السؤال." -#: pretix/control/logdisplay.py:965 +#: pretix/control/logdisplay.py:968 msgid "The question has been deleted." msgstr "تم حذف السؤال." -#: pretix/control/logdisplay.py:966 +#: pretix/control/logdisplay.py:969 msgid "The question has been changed." msgstr "تم تغيير السؤال." -#: pretix/control/logdisplay.py:967 +#: pretix/control/logdisplay.py:970 #, fuzzy #| msgid "The question has been deleted." msgid "The question has been reordered." msgstr "تم حذف السؤال." -#: pretix/control/logdisplay.py:974 +#: pretix/control/logdisplay.py:977 #, fuzzy #| msgid "The quota has been added." msgid "The discount has been added." msgstr "تمت إضافة الحصص." -#: pretix/control/logdisplay.py:975 +#: pretix/control/logdisplay.py:978 #, fuzzy #| msgid "The product has been deleted." msgid "The discount has been deleted." msgstr "تم حذف المنتج." -#: pretix/control/logdisplay.py:976 +#: pretix/control/logdisplay.py:979 #, fuzzy #| msgid "The account has been changed." msgid "The discount has been changed." msgstr "تم تغيير الحساب." -#: pretix/control/logdisplay.py:1000 +#: pretix/control/logdisplay.py:1003 #, python-brace-format msgid "" "Position #{posid} has been checked in manually at {datetime} on list \"{list}" @@ -19273,7 +19550,7 @@ msgid "" msgstr "" "وقد تم التحقق من موقف # {posid} في يدويا في{datetime} على قائمة \"{list}\"." -#: pretix/control/logdisplay.py:1005 +#: pretix/control/logdisplay.py:1008 #, python-brace-format msgid "" "Position #{posid} has been checked in again at {datetime} on list \"{list}\"." @@ -19281,15 +19558,15 @@ msgstr "" "وقد تم التحقق من موقف # {posid} الدخول مرة أخرى في{datetime} على قائمة " "\"{list}\"." -#: pretix/control/logdisplay.py:1014 +#: pretix/control/logdisplay.py:1017 msgid "An entry has been removed from the waiting list." msgstr "تمت إزالة إدخال من قائمة الانتظار." -#: pretix/control/logdisplay.py:1015 +#: pretix/control/logdisplay.py:1018 msgid "An entry has been changed on the waiting list." msgstr "تم تغيير دخول على قائمة الانتظار." -#: pretix/control/logdisplay.py:1016 +#: pretix/control/logdisplay.py:1019 msgid "An entry has been added to the waiting list." msgstr "تمت إضافة إدخال إلى قائمة الانتظار." @@ -19313,7 +19590,7 @@ msgstr "لوحة القيادة" #: pretix/control/navigation.py:49 pretix/control/navigation.py:409 #: pretix/control/navigation.py:519 -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:38 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:39 #: pretix/control/templates/pretixcontrol/event/mail.html:14 #: pretix/control/templates/pretixcontrol/event/tax_edit.html:25 #: pretix/control/templates/pretixcontrol/item/index.html:13 @@ -19328,7 +19605,7 @@ msgstr "جنرال لواء" #: pretix/control/navigation.py:59 #: pretix/control/templates/pretixcontrol/event/quick_setup.html:151 -#: pretix/control/templates/pretixcontrol/order/index.html:921 +#: pretix/control/templates/pretixcontrol/order/index.html:956 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:37 #: pretix/plugins/banktransfer/apps.py:43 #: pretix/plugins/manualpayment/apps.py:39 pretix/plugins/paypal2/apps.py:45 @@ -19339,9 +19616,9 @@ msgstr "جنرال لواء" msgid "Payment" msgstr "دفع" -#: pretix/control/navigation.py:78 pretix/control/views/event.py:1650 -#: pretix/control/views/event.py:1652 pretix/control/views/event.py:1684 -#: pretix/control/views/event.py:1689 pretix/control/views/subevents.py:310 +#: pretix/control/navigation.py:78 pretix/control/views/event.py:1657 +#: pretix/control/views/event.py:1659 pretix/control/views/event.py:1691 +#: pretix/control/views/event.py:1696 pretix/control/views/subevents.py:316 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:60 #: pretix/plugins/ticketoutputpdf/apps.py:55 #: pretix/plugins/ticketoutputpdf/exporters.py:68 @@ -19354,7 +19631,7 @@ msgstr "تذاكر" #: pretix/control/navigation.py:97 #: pretix/control/templates/pretixcontrol/event/tax.html:4 #: pretix/control/templates/pretixcontrol/event/tax.html:6 -#: pretix/control/templates/pretixcontrol/order/index.html:764 +#: pretix/control/templates/pretixcontrol/order/index.html:799 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:457 msgid "Taxes" msgstr "الضرائب" @@ -19388,7 +19665,7 @@ msgid "Overview" msgstr "نظرة عامة" #: pretix/control/navigation.py:233 -#: pretix/control/templates/pretixcontrol/order/index.html:908 +#: pretix/control/templates/pretixcontrol/order/index.html:943 #: pretix/control/templates/pretixcontrol/orders/refunds.html:7 #: pretix/control/templates/pretixcontrol/orders/refunds.html:9 #: pretix/plugins/reports/accountingreport.py:498 @@ -19433,7 +19710,7 @@ msgid "Search" msgstr "بحث" #: pretix/control/navigation.py:393 -#: pretix/control/templates/pretixcontrol/order/index.html:814 +#: pretix/control/templates/pretixcontrol/order/index.html:849 #: pretix/plugins/reports/accountingreport.py:497 #: pretix/plugins/reports/accountingreport.py:680 #: pretix/plugins/reports/accountingreport.py:884 @@ -19537,13 +19814,13 @@ msgid "You do not have permission to view this content." msgstr "ليس لديك إذن لعرض هذا المحتوى." #: pretix/control/templates/pretixcontrol/auth/base.html:42 -#: pretix/control/templates/pretixcontrol/base.html:360 +#: pretix/control/templates/pretixcontrol/base.html:363 #, python-format msgid "You are currently working on behalf of %(user)s." msgstr "كنت أعمل حاليا باسم%(user)s." #: pretix/control/templates/pretixcontrol/auth/base.html:47 -#: pretix/control/templates/pretixcontrol/base.html:365 +#: pretix/control/templates/pretixcontrol/base.html:368 msgid "Stop impersonating" msgstr "توقف انتحالا للشخصية" @@ -19700,7 +19977,7 @@ msgid "Set new password" msgstr "كلمة المرور الجديدة تعيين" #: pretix/control/templates/pretixcontrol/auth/recover.html:16 -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:124 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:88 #: pretix/control/templates/pretixcontrol/email_setup_simple.html:82 #: pretix/control/templates/pretixcontrol/email_setup_smtp.html:38 #: pretix/control/templates/pretixcontrol/event/cancel.html:91 @@ -19719,6 +19996,7 @@ msgstr "كلمة المرور الجديدة تعيين" #: pretix/control/templates/pretixcontrol/items/category.html:49 #: pretix/control/templates/pretixcontrol/items/discount.html:79 #: pretix/control/templates/pretixcontrol/items/question_edit.html:153 +#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html:45 #: pretix/control/templates/pretixcontrol/items/quota_edit.html:48 #: pretix/control/templates/pretixcontrol/oauth/app_register.html:12 #: pretix/control/templates/pretixcontrol/oauth/app_update.html:12 @@ -19734,7 +20012,7 @@ msgstr "كلمة المرور الجديدة تعيين" #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:25 #: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html:42 #: pretix/control/templates/pretixcontrol/organizers/device_edit.html:30 -#: pretix/control/templates/pretixcontrol/organizers/edit.html:384 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:385 #: pretix/control/templates/pretixcontrol/organizers/export_form.html:50 #: pretix/control/templates/pretixcontrol/organizers/gate_edit.html:15 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_invite.html:15 @@ -19747,12 +20025,12 @@ msgstr "كلمة المرور الجديدة تعيين" #: pretix/control/templates/pretixcontrol/organizers/reusable_medium_edit.html:28 #: pretix/control/templates/pretixcontrol/organizers/ssoclient_edit.html:15 #: pretix/control/templates/pretixcontrol/organizers/ssoprovider_edit.html:28 -#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:47 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:71 #: pretix/control/templates/pretixcontrol/organizers/webhook_edit.html:21 -#: pretix/control/templates/pretixcontrol/pdf/index.html:46 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:632 +#: pretix/control/templates/pretixcontrol/pdf/index.html:44 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:634 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:368 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:289 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:292 #: pretix/control/templates/pretixcontrol/user/notifications.html:85 #: pretix/control/templates/pretixcontrol/user/settings.html:109 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:13 @@ -19778,76 +20056,76 @@ msgstr "احفظ" msgid "Create a new account" msgstr "انشاء حساب جديد" -#: pretix/control/templates/pretixcontrol/base.html:101 +#: pretix/control/templates/pretixcontrol/base.html:104 msgid "Toggle navigation" msgstr "تبديل الملاحة" -#: pretix/control/templates/pretixcontrol/base.html:116 -#: pretix/control/templates/pretixcontrol/base.html:141 -#: pretix/control/templates/pretixcontrol/base.html:145 -#: pretix/control/templates/pretixcontrol/base.html:146 +#: pretix/control/templates/pretixcontrol/base.html:119 +#: pretix/control/templates/pretixcontrol/base.html:144 +#: pretix/control/templates/pretixcontrol/base.html:148 +#: pretix/control/templates/pretixcontrol/base.html:149 msgid "Go to shop" msgstr "الذهاب للتسوق" -#: pretix/control/templates/pretixcontrol/base.html:122 -#: pretix/control/templates/pretixcontrol/base.html:152 -#: pretix/control/templates/pretixcontrol/base.html:153 +#: pretix/control/templates/pretixcontrol/base.html:125 +#: pretix/control/templates/pretixcontrol/base.html:155 +#: pretix/control/templates/pretixcontrol/base.html:156 msgid "Public profile" msgstr "حساب عام" -#: pretix/control/templates/pretixcontrol/base.html:204 +#: pretix/control/templates/pretixcontrol/base.html:207 msgid "End admin session" msgstr "إنهاء جلسة مشرف" -#: pretix/control/templates/pretixcontrol/base.html:216 +#: pretix/control/templates/pretixcontrol/base.html:219 msgid "Account Settings" msgstr "إعدادت الحساب" -#: pretix/control/templates/pretixcontrol/base.html:221 -#: pretix/control/templates/pretixcontrol/base.html:223 +#: pretix/control/templates/pretixcontrol/base.html:224 +#: pretix/control/templates/pretixcontrol/base.html:226 #: pretix/presale/templates/pretixpresale/fragment_login_status.html:14 msgid "Log out" msgstr "الخروج" -#: pretix/control/templates/pretixcontrol/base.html:249 +#: pretix/control/templates/pretixcontrol/base.html:252 msgid "Organizer account" msgstr "حساب منظم" -#: pretix/control/templates/pretixcontrol/base.html:272 +#: pretix/control/templates/pretixcontrol/base.html:275 msgid "Search for events" msgstr "البحث عن الأحداث" -#: pretix/control/templates/pretixcontrol/base.html:329 +#: pretix/control/templates/pretixcontrol/base.html:332 #: pretix/presale/templates/pretixpresale/base.html:51 msgid "" "We've detected that you are using Microsoft Internet Explorer." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:332 +#: pretix/control/templates/pretixcontrol/base.html:335 #: pretix/presale/templates/pretixpresale/base.html:54 msgid "" "Internet Explorer is an old browser that does not support lots of recent web-" "based technologies and is no longer supported by this website." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:336 +#: pretix/control/templates/pretixcontrol/base.html:339 #: pretix/presale/templates/pretixpresale/base.html:58 msgid "" "We kindly ask you to move to one of our supported browsers, such as " "Microsoft Edge, Mozilla Firefox, Google Chrome, or Safari." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:345 +#: pretix/control/templates/pretixcontrol/base.html:348 msgid "" "Please leave a short comment on what you did in the following admin sessions:" msgstr "يرجى ترك تعليق قصير على ما فعلتم في دورات المشرف التالية:" -#: pretix/control/templates/pretixcontrol/base.html:376 +#: pretix/control/templates/pretixcontrol/base.html:379 msgid "Read more" msgstr "اقرأ أكثر" -#: pretix/control/templates/pretixcontrol/base.html:393 +#: pretix/control/templates/pretixcontrol/base.html:396 msgid "" "Your event contains test mode orders even though " "test mode has been disabled. You should delete those orders " @@ -19858,11 +20136,11 @@ msgstr "" "من أن وضع على اختبار تم تعطيل . يجب حذف تلك الأوامر للتأكد " "من أنها لا تظهر في التقارير والإحصاءات وكتلة الناس من شراء تذاكر الواقع." -#: pretix/control/templates/pretixcontrol/base.html:400 +#: pretix/control/templates/pretixcontrol/base.html:403 msgid "Show all test mode orders" msgstr "عرض كل أوامر وضع الاختبار" -#: pretix/control/templates/pretixcontrol/base.html:408 +#: pretix/control/templates/pretixcontrol/base.html:411 msgid "" "Starting with version 1.2.0, pretix automatically checks for updates in the " "background. During this check, anonymous data is transmitted to servers " @@ -19876,20 +20154,20 @@ msgstr "" "الإلكتروني للحصول على إشعار عبر البريد الإلكتروني في حالة وصول التحديث " "الجديد. وسوف تختفي هذه الرسالة بمجرد النقر فوقه." -#: pretix/control/templates/pretixcontrol/base.html:421 +#: pretix/control/templates/pretixcontrol/base.html:424 msgid "" "Click here to do a license compliance check to make sure your usage of " "pretix is in line with pretix' license." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:430 +#: pretix/control/templates/pretixcontrol/base.html:433 msgid "" "The cronjob component of pretix was not executed in the last hours. Please " "check that you have completed all installation steps and your cronjob is " "executed correctly." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:439 +#: pretix/control/templates/pretixcontrol/base.html:442 msgid "" "pretix is running in debug mode. For security reasons, please never run " "debug mode on a production instance." @@ -19897,22 +20175,22 @@ msgstr "" "يشغل pretix في وضع التصحيح. لأسباب أمنية، من فضلك لا تشغيل وضع التصحيح على " "نسخة الإنتاج." -#: pretix/control/templates/pretixcontrol/base.html:445 +#: pretix/control/templates/pretixcontrol/base.html:448 msgid "" "For security reasons, please change your password before you continue. " "Afterwards you will be redirected to your original destination." msgstr "" -#: pretix/control/templates/pretixcontrol/base.html:457 +#: pretix/control/templates/pretixcontrol/base.html:460 #, python-format msgid "Times displayed in %(tz)s" msgstr "عرض مرة في %(tz)s" -#: pretix/control/templates/pretixcontrol/base.html:463 +#: pretix/control/templates/pretixcontrol/base.html:466 msgid "running in development mode" msgstr "يعمل في نمط التنمية" -#: pretix/control/templates/pretixcontrol/base.html:472 +#: pretix/control/templates/pretixcontrol/base.html:475 #: pretix/presale/templates/pretixpresale/fragment_modals.html:38 #: pretix/presale/templates/pretixpresale/postmessage.html:27 #: pretix/presale/templates/pretixpresale/waiting.html:42 @@ -19929,6 +20207,7 @@ msgid "Receipt ID" msgstr "ID استلام" #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:11 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:29 msgid "ID" msgstr "هوية شخصية" @@ -20119,10 +20398,11 @@ msgstr[5] "" #: pretix/control/templates/pretixcontrol/items/discount_delete.html:33 #: pretix/control/templates/pretixcontrol/items/question_delete.html:22 #: pretix/control/templates/pretixcontrol/items/quota_delete.html:37 +#: pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html:27 #: pretix/control/templates/pretixcontrol/oauth/app_delete.html:12 #: pretix/control/templates/pretixcontrol/oauth/app_rollkeys.html:12 #: pretix/control/templates/pretixcontrol/oauth/auth_revoke.html:12 -#: pretix/control/templates/pretixcontrol/order/change.html:543 +#: pretix/control/templates/pretixcontrol/order/change.html:545 #: pretix/control/templates/pretixcontrol/order/change_contact.html:25 #: pretix/control/templates/pretixcontrol/order/change_locale.html:30 #: pretix/control/templates/pretixcontrol/order/change_questions.html:84 @@ -20149,10 +20429,11 @@ msgstr[5] "" #: pretix/control/templates/pretixcontrol/organizers/ssoprovider_delete.html:16 #: pretix/control/templates/pretixcontrol/organizers/team_delete.html:10 #: pretix/control/templates/pretixcontrol/organizers/team_delete.html:21 -#: pretix/control/templates/pretixcontrol/pdf/index.html:153 +#: pretix/control/templates/pretixcontrol/pdf/index.html:151 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:378 #: pretix/control/templates/pretixcontrol/subevents/delete.html:12 #: pretix/control/templates/pretixcontrol/subevents/delete_bulk.html:41 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:289 #: pretix/control/templates/pretixcontrol/user/2fa_delete.html:18 #: pretix/control/templates/pretixcontrol/user/2fa_disable.html:17 #: pretix/control/templates/pretixcontrol/user/2fa_enable.html:18 @@ -20193,6 +20474,7 @@ msgstr "قم بالإلغاء" #: pretix/control/templates/pretixcontrol/items/discount_delete.html:36 #: pretix/control/templates/pretixcontrol/items/index.html:177 #: pretix/control/templates/pretixcontrol/items/quota_delete.html:40 +#: pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html:30 #: pretix/control/templates/pretixcontrol/order/index.html:39 #: pretix/control/templates/pretixcontrol/orders/export.html:80 #: pretix/control/templates/pretixcontrol/orders/export_delete.html:15 @@ -20208,7 +20490,7 @@ msgstr "قم بالإلغاء" #: pretix/control/templates/pretixcontrol/organizers/ssoclient_delete.html:20 #: pretix/control/templates/pretixcontrol/organizers/ssoprovider_delete.html:20 #: pretix/control/templates/pretixcontrol/organizers/team_delete.html:24 -#: pretix/control/templates/pretixcontrol/pdf/index.html:111 +#: pretix/control/templates/pretixcontrol/pdf/index.html:109 #: pretix/control/templates/pretixcontrol/subevents/delete.html:15 #: pretix/control/templates/pretixcontrol/subevents/delete_bulk.html:44 #: pretix/control/templates/pretixcontrol/user/2fa_delete.html:21 @@ -20217,7 +20499,7 @@ msgstr "قم بالإلغاء" #: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:16 #: pretix/control/templates/pretixcontrol/waitinglist/delete.html:15 #: pretix/control/templates/pretixcontrol/waitinglist/delete_bulk.html:36 -#: pretix/control/views/orders.py:390 +#: pretix/control/views/orders.py:391 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/delete.html:15 #: pretix/plugins/badges/templates/pretixplugins/badges/delete.html:16 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_delete.html:15 @@ -20240,6 +20522,8 @@ msgstr "احذف" #: pretix/control/templates/pretixcontrol/events/index.html:54 #: pretix/control/templates/pretixcontrol/items/question.html:22 #: pretix/control/templates/pretixcontrol/items/question.html:44 +#: pretix/control/templates/pretixcontrol/items/quotas.html:35 +#: pretix/control/templates/pretixcontrol/items/quotas.html:68 #: pretix/control/templates/pretixcontrol/orders/index.html:56 #: pretix/control/templates/pretixcontrol/orders/index.html:93 #: pretix/control/templates/pretixcontrol/orders/overview.html:25 @@ -20299,21 +20583,21 @@ msgid "Time of scan" msgstr "اسم البنك" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:65 -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:49 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:50 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:14 -#: pretix/plugins/checkinlists/exporters.py:770 +#: pretix/plugins/checkinlists/exporters.py:769 msgid "Result" msgstr "النتيجة" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:78 -#: pretix/control/templates/pretixcontrol/order/index.html:437 +#: pretix/control/templates/pretixcontrol/order/index.html:470 #, fuzzy, python-format #| msgid "Automatically checked in: %(date)s" msgid "Automatically marked not present: %(date)s" msgstr "التحقق تلقائيا في: %(date)s" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:82 -#: pretix/control/templates/pretixcontrol/order/index.html:442 +#: pretix/control/templates/pretixcontrol/order/index.html:475 #, fuzzy, python-format #| msgid "First scanned: %(date)s" msgid "Additional entry scan: %(date)s" @@ -20326,7 +20610,7 @@ msgid "Offline scan. Upload time: %(date)s" msgstr "الممسوحة ضوئيا أولا: %(date)s" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:88 -#: pretix/control/templates/pretixcontrol/order/index.html:444 +#: pretix/control/templates/pretixcontrol/order/index.html:477 #, python-format msgid "Automatically checked in: %(date)s" msgstr "التحقق تلقائيا في: %(date)s" @@ -20355,28 +20639,29 @@ msgstr "أمر مرفوض" #: pretix/control/templates/pretixcontrol/event/index.html:24 #: pretix/control/templates/pretixcontrol/organizers/device_connect.html:27 #: pretix/control/templates/pretixcontrol/organizers/device_connect.html:33 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:33 msgid "Copy to clipboard" msgstr "" #: pretix/control/templates/pretixcontrol/checkin/index.html:7 #: pretix/control/templates/pretixcontrol/checkin/index.html:11 -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:8 -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:16 -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:11 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:9 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:17 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:12 #, python-format msgid "Check-in list: %(name)s" msgstr "%(name)s: تحقق في قائمة" #: pretix/control/templates/pretixcontrol/checkin/index.html:16 -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:16 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:17 msgid "Edit list configuration" msgstr "تعديل تشكيل القائمة" #: pretix/control/templates/pretixcontrol/checkin/index.html:22 -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:21 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:22 #: pretix/control/templates/pretixcontrol/checkin/lists.html:167 -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:8 -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:20 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:9 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:21 #, fuzzy #| msgid "Check-in list" msgid "Check-in simulator" @@ -20398,6 +20683,7 @@ msgstr "لم يتم العثور على سجل الحضور." #: pretix/control/templates/pretixcontrol/checkin/index.html:91 #: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:19 +#: pretix/control/templates/pretixcontrol/items/quotas.html:90 #: pretix/control/templates/pretixcontrol/orders/index.html:127 #: pretix/control/templates/pretixcontrol/organizers/devices.html:71 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html:58 @@ -20413,6 +20699,7 @@ msgid "Timestamp" msgstr "الطابع الزمني" #: pretix/control/templates/pretixcontrol/checkin/index.html:125 +#: pretix/control/templates/pretixcontrol/items/quotas.html:118 #: pretix/control/templates/pretixcontrol/orders/index.html:165 #: pretix/control/templates/pretixcontrol/organizers/devices.html:103 #: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html:80 @@ -20478,77 +20765,38 @@ msgstr "" msgid "Delete list and all check-ins" msgstr "مسألة الحذف" -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:48 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:49 #: pretix/control/templates/pretixcontrol/event/payment.html:84 #: pretix/control/templates/pretixcontrol/event/tax_edit.html:33 #: pretix/control/templates/pretixcontrol/items/question_edit.html:128 msgid "Advanced" msgstr "المتقدمة" -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:50 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:51 msgid "" "These settings on this page are intended for professional users with very " "specific check-in situations. Please reach out to support if you have " "questions about setting this up." msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:57 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:58 msgid "" "Make sure to always use the latest version of our scanning apps for these " "options to work." msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:61 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:62 msgid "" "If you make use of these advanced options, we recommend using our Android " "and Desktop apps." msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:76 +#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:77 #, fuzzy #| msgid "Automated check-in" msgid "Custom check-in rule" msgstr "آلية الدخول" -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:83 -#: pretix/control/templates/pretixcontrol/event/mail.html:33 -#: pretix/control/templates/pretixcontrol/event/mail.html:47 -#: pretix/control/templates/pretixcontrol/event/mail_settings_fragment.html:26 -#: pretix/control/templates/pretixcontrol/items/categories.html:64 -#: pretix/control/templates/pretixcontrol/items/index.html:59 -#: pretix/control/templates/pretixcontrol/items/index.html:175 -#: pretix/control/templates/pretixcontrol/orders/export.html:73 -#: pretix/control/templates/pretixcontrol/orders/index.html:40 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:100 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:170 -#: pretix/control/templates/pretixcontrol/organizers/export.html:73 -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:16 -#: pretix/control/templates/pretixcontrol/organizers/mail.html:34 -#: pretix/control/templates/pretixcontrol/organizers/mail.html:48 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:83 -#: pretix/control/templates/pretixcontrol/organizers/team_members.html:10 -#: pretix/control/templates/pretixcontrol/organizers/webhooks.html:72 -#: pretix/control/templates/pretixcontrol/vouchers/bulk.html:94 -#: pretix/control/templates/pretixcontrol/vouchers/bulk.html:117 -#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:85 -msgid "Edit" -msgstr "تصحيح" - -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:89 -msgid "Visualize" -msgstr "" - -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:107 -msgid "" -"Your rule always filters by product or variation, but the following products " -"or variations are not contained in any of your rule parts so people with " -"these tickets will not get in:" -msgstr "" - -#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:113 -msgid "Please double-check if this was intentional." -msgstr "" - #: pretix/control/templates/pretixcontrol/checkin/lists.html:10 msgid "" "You can create check-in lists that you can use e.g. at the entrance of your " @@ -20619,7 +20867,8 @@ msgstr "الاختيار في حذف قائمة" #: pretix/control/templates/pretixcontrol/items/categories.html:66 #: pretix/control/templates/pretixcontrol/items/discounts.html:158 #: pretix/control/templates/pretixcontrol/items/index.html:176 -#: pretix/control/templates/pretixcontrol/items/quotas.html:101 +#: pretix/control/templates/pretixcontrol/items/quotas.html:162 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:185 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:89 #: pretix/plugins/badges/templates/pretixplugins/badges/index.html:72 #: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/index.html:69 @@ -20677,7 +20926,7 @@ msgstr "" msgid "Proceed with reset" msgstr "إتمام عملية الدفع" -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:22 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:23 msgid "" "This tool allows you to validate your check-in configuration. You can enter " "a barcode plus some optional parameters and we will show you the response of " @@ -20685,28 +20934,41 @@ msgid "" "to the system state is made." msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:40 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:41 msgid "Simulate" msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:66 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:69 #, fuzzy #| msgid "All check-in lists" msgid "Valid check-in" msgstr "جميع قوائم التسجيل" -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:68 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:71 #, fuzzy #| msgid "Additional information" msgid "Additional information required" msgstr "معلومة اضافية" -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:70 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:73 msgid "" "The following questions must be answered before check-in can be completed:" msgstr "" -#: pretix/control/templates/pretixcontrol/checkin/simulator.html:92 +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:85 +#, fuzzy +#| msgid "Requires special attention" +msgid "Media exchange required" +msgstr "يتطلب اهتماما خاصا" + +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:87 +#, python-format +msgid "" +"This ticket needs to be exchanged into a %(media_type)s " +"reusable medium. %(media_policy)s." +msgstr "" + +#: pretix/control/templates/pretixcontrol/checkin/simulator.html:103 #, fuzzy #| msgid "Requires special attention" msgid "Special attention required" @@ -21269,20 +21531,20 @@ msgid "Cancel or delete event" msgstr "إلغاء أو حذف فعالية" #: pretix/control/templates/pretixcontrol/event/dangerzone.html:9 -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:25 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:27 #: pretix/control/templates/pretixcontrol/event/delete.html:60 #: pretix/control/templates/pretixcontrol/event/live.html:31 msgid "Go offline" msgstr "العودة متواجد حاليا" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:13 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:14 msgid "" "You can take your event offline. Nobody except your team will be able to see " "or access it any more." msgstr "" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:34 -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:48 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:35 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:51 #: pretix/control/templates/pretixcontrol/orders/cancel.html:5 #: pretix/control/templates/pretixcontrol/orders/cancel.html:7 #: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:6 @@ -21290,39 +21552,39 @@ msgstr "" msgid "Cancel event" msgstr "حذف فعالية" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:38 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:40 msgid "" "If you need to call off your event you want to cancel and refund all " "tickets, you can do so through this option." msgstr "" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:51 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:53 #, fuzzy #| msgid "Permissions" msgid "No permission" msgstr "أذونات" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:59 -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:72 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:62 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:76 #: pretix/control/templates/pretixcontrol/event/delete.html:56 #: pretix/control/templates/pretixcontrol/event/delete.html:70 msgid "Delete personal data" msgstr "حذف البيانات الشخصية" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:63 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:67 msgid "" "You can remove personal data such as names and email addresses from your " "event and only retain the financial information such as the number and type " "of tickets sold." msgstr "" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:80 -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:93 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:84 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:99 #: pretix/control/templates/pretixcontrol/event/delete.html:5 msgid "Delete event" msgstr "حدث الحذف" -#: pretix/control/templates/pretixcontrol/event/dangerzone.html:84 +#: pretix/control/templates/pretixcontrol/event/dangerzone.html:89 msgid "" "You can delete your event completely only as long as it does not contain any " "undeletable data, such as orders not performed in test mode." @@ -21459,6 +21721,7 @@ msgid "Shop URL:" msgstr "URL النظام:" #: pretix/control/templates/pretixcontrol/event/index.html:27 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:38 #: pretix/control/templates/pretixcontrol/vouchers/detail.html:57 #, fuzzy #| msgid "Order code" @@ -21540,7 +21803,7 @@ msgid "Show sync problems" msgstr "" #: pretix/control/templates/pretixcontrol/event/index.html:151 -#: pretix/control/templates/pretixcontrol/order/index.html:1093 +#: pretix/control/templates/pretixcontrol/order/index.html:1128 msgid "Update comment" msgstr "تحديث تعليق" @@ -21775,10 +22038,10 @@ msgstr "تم إجراء هذا التغيير من قبل مسؤول pretix." #: pretix/control/templates/pretixcontrol/event/logs.html:86 #: pretix/control/templates/pretixcontrol/event/logs_embed.html:47 #: pretix/control/templates/pretixcontrol/includes/logs.html:42 -#: pretix/control/templates/pretixcontrol/order/index.html:367 -#: pretix/control/templates/pretixcontrol/order/index.html:876 -#: pretix/control/templates/pretixcontrol/order/index.html:888 -#: pretix/control/templates/pretixcontrol/order/index.html:993 +#: pretix/control/templates/pretixcontrol/order/index.html:400 +#: pretix/control/templates/pretixcontrol/order/index.html:911 +#: pretix/control/templates/pretixcontrol/order/index.html:923 +#: pretix/control/templates/pretixcontrol/order/index.html:1028 #: pretix/control/templates/pretixcontrol/organizers/device_logs.html:42 #: pretix/control/templates/pretixcontrol/organizers/logs.html:72 #: pretix/control/templates/pretixcontrol/search/payments.html:147 @@ -21815,6 +22078,30 @@ msgstr "استخدام خادم SMTP مخصص" msgid "System-provided email server" msgstr "" +#: pretix/control/templates/pretixcontrol/event/mail.html:33 +#: pretix/control/templates/pretixcontrol/event/mail.html:47 +#: pretix/control/templates/pretixcontrol/event/mail_settings_fragment.html:26 +#: pretix/control/templates/pretixcontrol/items/categories.html:64 +#: pretix/control/templates/pretixcontrol/items/index.html:59 +#: pretix/control/templates/pretixcontrol/items/index.html:175 +#: pretix/control/templates/pretixcontrol/orders/export.html:73 +#: pretix/control/templates/pretixcontrol/orders/index.html:40 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:100 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:170 +#: pretix/control/templates/pretixcontrol/organizers/export.html:73 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:16 +#: pretix/control/templates/pretixcontrol/organizers/mail.html:34 +#: pretix/control/templates/pretixcontrol/organizers/mail.html:48 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:95 +#: pretix/control/templates/pretixcontrol/organizers/team_members.html:10 +#: pretix/control/templates/pretixcontrol/organizers/webhooks.html:72 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:18 +#: pretix/control/templates/pretixcontrol/vouchers/bulk.html:94 +#: pretix/control/templates/pretixcontrol/vouchers/bulk.html:117 +#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:85 +msgid "Edit" +msgstr "تصحيح" + #: pretix/control/templates/pretixcontrol/event/mail.html:60 #, fuzzy #| msgid "resend invite" @@ -21828,7 +22115,7 @@ msgstr "البريد الإلكتروني تصميم" #: pretix/control/templates/pretixcontrol/event/mail.html:79 #: pretix/control/templates/pretixcontrol/event/mail_settings_fragment.html:29 #: pretix/control/templates/pretixcontrol/event/tickets.html:35 -#: pretix/control/templates/pretixcontrol/pdf/index.html:41 +#: pretix/control/templates/pretixcontrol/pdf/index.html:39 #: pretix/control/templates/pretixcontrol/vouchers/bulk.html:97 #: pretix/control/templates/pretixcontrol/vouchers/bulk.html:120 msgid "Preview" @@ -21852,8 +22139,8 @@ msgid "Free order" msgstr "طلب مجاني" #: pretix/control/templates/pretixcontrol/event/mail.html:99 -#: pretix/control/templates/pretixcontrol/order/index.html:249 -#: pretix/control/templates/pretixcontrol/order/index.html:589 +#: pretix/control/templates/pretixcontrol/order/index.html:282 +#: pretix/control/templates/pretixcontrol/order/index.html:624 msgid "Resend link" msgstr "رابط إعادة إرسال" @@ -21897,6 +22184,7 @@ msgid "Enabled" msgstr "تمكين" #: pretix/control/templates/pretixcontrol/event/payment.html:28 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:34 #: pretix/control/templates/pretixcontrol/subevents/index.html:170 #: pretix/control/templates/pretixcontrol/user/settings.html:81 msgid "Disabled" @@ -21970,41 +22258,42 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/plugins.html:15 #: pretix/control/templates/pretixcontrol/organizers/plugins.html:15 -#: pretix/control/views/checkin.py:425 pretix/control/views/discounts.py:113 -#: pretix/control/views/event.py:246 pretix/control/views/event.py:575 -#: pretix/control/views/event.py:614 pretix/control/views/event.py:816 -#: pretix/control/views/event.py:1057 pretix/control/views/event.py:1420 -#: pretix/control/views/event.py:1460 +#: pretix/control/views/checkin.py:426 pretix/control/views/discounts.py:113 +#: pretix/control/views/event.py:255 pretix/control/views/event.py:584 +#: pretix/control/views/event.py:623 pretix/control/views/event.py:820 +#: pretix/control/views/event.py:1061 pretix/control/views/event.py:1427 +#: pretix/control/views/event.py:1467 #: pretix/control/views/global_settings.py:65 -#: pretix/control/views/global_settings.py:88 pretix/control/views/item.py:266 -#: pretix/control/views/item.py:779 pretix/control/views/item.py:1105 -#: pretix/control/views/item.py:1283 pretix/control/views/item.py:1434 -#: pretix/control/views/mailsetup.py:151 pretix/control/views/mailsetup.py:163 -#: pretix/control/views/mailsetup.py:190 pretix/control/views/mailsetup.py:258 -#: pretix/control/views/organizer.py:278 pretix/control/views/organizer.py:306 -#: pretix/control/views/organizer.py:522 pretix/control/views/organizer.py:853 -#: pretix/control/views/organizer.py:942 pretix/control/views/organizer.py:1337 -#: pretix/control/views/organizer.py:1435 -#: pretix/control/views/organizer.py:1599 -#: pretix/control/views/organizer.py:2425 -#: pretix/control/views/organizer.py:2562 -#: pretix/control/views/organizer.py:2759 -#: pretix/control/views/organizer.py:2875 -#: pretix/control/views/organizer.py:3004 -#: pretix/control/views/organizer.py:3201 -#: pretix/control/views/organizer.py:3230 -#: pretix/control/views/organizer.py:3270 -#: pretix/control/views/organizer.py:3347 -#: pretix/control/views/organizer.py:3444 -#: pretix/control/views/organizer.py:3473 -#: pretix/control/views/organizer.py:3611 pretix/control/views/subevents.py:542 -#: pretix/control/views/subevents.py:1617 pretix/control/views/user.py:241 +#: pretix/control/views/global_settings.py:88 pretix/control/views/item.py:271 +#: pretix/control/views/item.py:784 pretix/control/views/item.py:1035 +#: pretix/control/views/item.py:1276 pretix/control/views/item.py:1454 +#: pretix/control/views/item.py:1605 pretix/control/views/mailsetup.py:151 +#: pretix/control/views/mailsetup.py:163 pretix/control/views/mailsetup.py:190 +#: pretix/control/views/mailsetup.py:258 pretix/control/views/organizer.py:278 +#: pretix/control/views/organizer.py:306 pretix/control/views/organizer.py:522 +#: pretix/control/views/organizer.py:849 pretix/control/views/organizer.py:938 +#: pretix/control/views/organizer.py:1333 +#: pretix/control/views/organizer.py:1431 +#: pretix/control/views/organizer.py:1595 +#: pretix/control/views/organizer.py:2421 +#: pretix/control/views/organizer.py:2558 +#: pretix/control/views/organizer.py:2755 +#: pretix/control/views/organizer.py:2873 +#: pretix/control/views/organizer.py:3002 +#: pretix/control/views/organizer.py:3199 +#: pretix/control/views/organizer.py:3228 +#: pretix/control/views/organizer.py:3268 +#: pretix/control/views/organizer.py:3345 +#: pretix/control/views/organizer.py:3448 +#: pretix/control/views/organizer.py:3504 +#: pretix/control/views/organizer.py:3642 pretix/control/views/subevents.py:608 +#: pretix/control/views/subevents.py:1739 pretix/control/views/user.py:241 #: pretix/control/views/user.py:857 pretix/control/views/users.py:113 #: pretix/control/views/vouchers.py:306 pretix/plugins/autocheckin/views.py:164 #: pretix/plugins/badges/views.py:158 pretix/plugins/sendmail/views.py:645 #: pretix/plugins/stripe/views.py:699 #: pretix/plugins/ticketoutputpdf/views.py:172 -#: pretix/presale/views/customer.py:544 pretix/presale/views/customer.py:597 +#: pretix/presale/views/customer.py:546 pretix/presale/views/customer.py:599 msgid "Your changes have been saved." msgstr "تم حفظ التغييرات." @@ -22084,7 +22373,7 @@ msgid "Disable" msgstr "تعطيل" #: pretix/control/templates/pretixcontrol/event/plugins.html:141 -#: pretix/control/views/organizer.py:810 +#: pretix/control/views/organizer.py:803 #, fuzzy #| msgid "This plugin cannot be enabled for the following reasons:" msgid "This plugin can only be enabled for the entire organizer account." @@ -22219,9 +22508,9 @@ msgstr "مبادئ" #: pretix/control/templates/pretixcontrol/item/include_variations.html:97 #: pretix/control/templates/pretixcontrol/item/include_variations.html:202 #: pretix/control/templates/pretixcontrol/item/index.html:127 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:392 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:394 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:77 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:35 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:35 msgid "Meta data" msgstr "البيانات الوصفية" @@ -22302,9 +22591,9 @@ msgstr "تصميم متجر" #: pretix/control/templates/pretixcontrol/event/settings.html:232 #: pretix/control/templates/pretixcontrol/events/create_basics.html:59 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:411 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:413 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:96 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:54 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:54 msgid "Timeline" msgstr "الجدول الزمني" @@ -22598,7 +22887,7 @@ msgid "Add a new rule" msgstr "إضافة قاعدة جديدة" #: pretix/control/templates/pretixcontrol/event/tax_edit.html:153 -#: pretix/control/templates/pretixcontrol/organizers/edit.html:392 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:393 msgid "Change history" msgstr "تغيير السجل" @@ -22718,12 +23007,14 @@ msgstr "إنشاء منظم جديد" #: pretix/control/templates/pretixcontrol/item/create.html:11 #: pretix/control/templates/pretixcontrol/items/category.html:13 #: pretix/control/templates/pretixcontrol/items/discount.html:13 +#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html:22 #: pretix/control/templates/pretixcontrol/items/quota_edit.html:21 #: pretix/control/templates/pretixcontrol/organizers/create.html:11 -#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:20 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:384 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:21 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:386 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:31 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:23 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:25 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:23 msgid "General information" msgstr "معلومات عامة" @@ -22862,19 +23153,6 @@ msgstr "لا مواعيد" msgid "More quotas" msgstr "المزيد من الحصص" -#: pretix/control/templates/pretixcontrol/events/index.html:166 -#: pretix/control/templates/pretixcontrol/organizers/detail.html:135 -#: pretix/control/views/dashboards.py:543 -msgid "Shop disabled" -msgstr "البيع متوقف الآن" - -#: pretix/control/templates/pretixcontrol/events/index.html:172 -#: pretix/control/templates/pretixcontrol/organizers/detail.html:141 -#: pretix/control/templates/pretixcontrol/subevents/index.html:176 -#: pretix/control/views/dashboards.py:549 -msgid "On sale" -msgstr "للبيع" - #: pretix/control/templates/pretixcontrol/events/index.html:177 #: pretix/control/templates/pretixcontrol/organizers/detail.html:146 msgid "Open event dashboard" @@ -23139,8 +23417,8 @@ msgstr "إدارة الأسئلة" #: pretix/control/templates/pretixcontrol/item/base.html:27 #: pretix/control/templates/pretixcontrol/item/include_variations.html:82 -#: pretix/control/templates/pretixcontrol/items/quotas.html:35 -#: pretix/control/templates/pretixcontrol/items/quotas.html:41 +#: pretix/control/templates/pretixcontrol/items/quotas.html:27 +#: pretix/control/templates/pretixcontrol/items/quotas.html:75 msgid "Create a new quota" msgstr "إنشاء حصص جديدة" @@ -23413,13 +23691,13 @@ msgid "" msgstr "" #: pretix/control/templates/pretixcontrol/item/include_program_times.html:25 -#: pretix/control/templates/pretixcontrol/item/include_program_times.html:51 +#: pretix/control/templates/pretixcontrol/item/include_program_times.html:52 #, fuzzy #| msgid "Printing time" msgid "Program time" msgstr "وقت الطباعة" -#: pretix/control/templates/pretixcontrol/item/include_program_times.html:68 +#: pretix/control/templates/pretixcontrol/item/include_program_times.html:70 #, fuzzy #| msgid "Add a new ticket type" msgid "Add a program time" @@ -23519,8 +23797,8 @@ msgid "" msgstr "" #: pretix/control/templates/pretixcontrol/item/index.html:254 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:619 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:262 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:621 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:262 msgid "Additional settings" msgstr "إعدادات إضافية" @@ -23766,7 +24044,7 @@ msgstr "محفوظة بالكامل" #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:108 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:36 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:72 -#: pretix/presale/views/widget.py:461 +#: pretix/presale/views/widget.py:493 msgid "Sold out" msgstr "بيعت كلها" @@ -23842,8 +24120,8 @@ msgid "Can only be bought using a voucher" msgstr "لا يمكن إلا أن يكون اشترى استخدام قسيمة" #: pretix/control/templates/pretixcontrol/items/index.html:159 -#: pretix/control/templates/pretixcontrol/order/index.html:673 -#: pretix/control/templates/pretixcontrol/order/index.html:723 +#: pretix/control/templates/pretixcontrol/order/index.html:708 +#: pretix/control/templates/pretixcontrol/order/index.html:758 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:360 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:419 #, python-format @@ -23851,8 +24129,8 @@ msgid "plus %(rate)s%% %(taxname)s" msgstr " زائد %(rate)s%% %(taxname)s" #: pretix/control/templates/pretixcontrol/items/index.html:163 -#: pretix/control/templates/pretixcontrol/order/index.html:683 -#: pretix/control/templates/pretixcontrol/order/index.html:733 +#: pretix/control/templates/pretixcontrol/order/index.html:718 +#: pretix/control/templates/pretixcontrol/order/index.html:768 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:370 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:429 #, python-format @@ -24089,6 +24367,42 @@ msgstr "" msgid "Quota history" msgstr "تاريخ الحصص" +#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html:6 +#, fuzzy +#| msgctxt "subevent" +#| msgid "Create multiple dates" +msgid "Change multiple quotas" +msgstr "إنشاء عدة تواريخ" + +#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html:8 +#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html:8 +#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:14 +#, python-format +msgid "%(number)s selected" +msgstr "%(number)s تم اختيارها" + +#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html:27 +#: pretix/control/templates/pretixcontrol/items/quota_edit.html:29 +msgid "Items" +msgstr "العناصر" + +#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html:29 +#: pretix/control/templates/pretixcontrol/items/quota_edit.html:31 +#, fuzzy +msgid "" +"Please select the products or product variations this quota should be " +"applied to. If you apply two quotas to the same product, it will only be " +"available if both quotas have capacity left." +msgstr "" +"يرجى تحديد المنتجات أو خيارات المنتج يجب أن تنطبق هذه الحصص على. " +"إذا قمت بتطبيق حصتين لنفس المنتج فسوف تكون متاحة فقط في حالة في " +"حالة توفر سعة كافية." + +#: pretix/control/templates/pretixcontrol/items/quota_bulk_edit.html:38 +#: pretix/control/templates/pretixcontrol/items/quota_edit.html:41 +msgid "Advanced options" +msgstr "خيارات متقدمة" + #: pretix/control/templates/pretixcontrol/items/quota_delete.html:4 #: pretix/control/templates/pretixcontrol/items/quota_delete.html:6 msgid "Delete quota" @@ -24103,26 +24417,26 @@ msgstr "هل أنت متأكد أنك تريد حذف حصص %(quota)sboth quotas have capacity left." -msgstr "" -"يرجى تحديد المنتجات أو خيارات المنتج يجب أن تنطبق هذه الحصص على. " -"إذا قمت بتطبيق حصتين لنفس المنتج فسوف تكون متاحة فقط في حالة في " -"حالة توفر سعة كافية." +#| msgid "Delete quota" +msgid "Delete quotas" +msgstr "حصة الحذف" -#: pretix/control/templates/pretixcontrol/items/quota_edit.html:41 -msgid "Advanced options" -msgstr "خيارات متقدمة" +#: pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html:10 +#, fuzzy, python-format +#| msgid "Are you sure you want to delete the following dates?" +msgid "Are you sure you want to delete the following quota?" +msgid_plural "Are you sure you want to delete the following %(num)s quotas?" +msgstr[0] "هل أنت متأكد أنك تريد حذف التواريخ التالية؟" +msgstr[1] "هل أنت متأكد أنك تريد حذف التواريخ التالية؟" +msgstr[2] "هل أنت متأكد أنك تريد حذف التواريخ التالية؟" +msgstr[3] "هل أنت متأكد أنك تريد حذف التواريخ التالية؟" +msgstr[4] "هل أنت متأكد أنك تريد حذف التواريخ التالية؟" +msgstr[5] "هل أنت متأكد أنك تريد حذف التواريخ التالية؟" -#: pretix/control/templates/pretixcontrol/items/quotas.html:8 +#: pretix/control/templates/pretixcontrol/items/quotas.html:9 msgid "" "To make your products actually available, you also need quotas. Quotas " "define, how many instances of your product pretix will sell. This way, you " @@ -24139,18 +24453,41 @@ msgstr "" "المثال إذا كنت ترغب في الحد من عدد التذاكر المباعة وعدد من نوع خاص التذاكر " "في نفس الوقت." -#: pretix/control/templates/pretixcontrol/items/quotas.html:25 -msgid "Your search did not match any quotas." -msgstr "بحثك لم تطابق اي حصص." - -#: pretix/control/templates/pretixcontrol/items/quotas.html:27 +#: pretix/control/templates/pretixcontrol/items/quotas.html:20 msgid "You haven't created any quotas yet." msgstr "لم تقم بإنشاء أي حصص حتى الان." -#: pretix/control/templates/pretixcontrol/items/quotas.html:64 +#: pretix/control/templates/pretixcontrol/items/quotas.html:108 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:84 msgid "Capacity left" msgstr "اليسار قدرة" +#: pretix/control/templates/pretixcontrol/items/quotas.html:129 +#: pretix/control/templates/pretixcontrol/orders/index.html:176 +#: pretix/control/templates/pretixcontrol/organizers/devices.html:114 +#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html:90 +#: pretix/control/templates/pretixcontrol/subevents/index.html:132 +#: pretix/control/templates/pretixcontrol/vouchers/index.html:153 +#: pretix/control/templates/pretixcontrol/waitinglist/index.html:195 +msgid "select row for batch-operation" +msgstr "" + +#: pretix/control/templates/pretixcontrol/items/quotas.html:176 +#: pretix/control/templates/pretixcontrol/subevents/index.html:215 +#: pretix/control/templates/pretixcontrol/vouchers/index.html:212 +#: pretix/control/templates/pretixcontrol/waitinglist/index.html:303 +msgid "Delete selected" +msgstr "احذف المختار" + +#: pretix/control/templates/pretixcontrol/items/quotas.html:180 +#: pretix/control/templates/pretixcontrol/organizers/devices.html:199 +#: pretix/control/templates/pretixcontrol/subevents/index.html:219 +#, fuzzy +#| msgctxt "subevent" +#| msgid "No date selected." +msgid "Edit selected" +msgstr "موعد المحدد." + #: pretix/control/templates/pretixcontrol/multi_languages_widget.html:12 msgid "" "This percentage of texts is translated across all parts of the system " @@ -24253,16 +24590,16 @@ msgstr "أذونات" msgid "No applications have access to your pretix account." msgstr "لا توجد تطبيقات من الوصول إلى حساب pretix الخاص بك." -#: pretix/control/templates/pretixcontrol/order/approve.html:4 -#: pretix/control/templates/pretixcontrol/order/approve.html:8 +#: pretix/control/templates/pretixcontrol/order/approve.html:5 +#: pretix/control/templates/pretixcontrol/order/approve.html:9 msgid "Approve order" msgstr "الموافقة على النظام" -#: pretix/control/templates/pretixcontrol/order/approve.html:10 +#: pretix/control/templates/pretixcontrol/order/approve.html:14 msgid "Do you really want to approve this order?" msgstr "هل تريد حقا أن الموافقة على هذا النظام؟" -#: pretix/control/templates/pretixcontrol/order/approve.html:20 +#: pretix/control/templates/pretixcontrol/order/approve.html:24 #: pretix/control/templates/pretixcontrol/order/cancel.html:46 #: pretix/control/templates/pretixcontrol/order/cancellation_request_delete.html:21 #: pretix/control/templates/pretixcontrol/order/delete.html:20 @@ -24273,14 +24610,14 @@ msgstr "هل تريد حقا أن الموافقة على هذا النظام؟" msgid "No, take me back" msgstr "لا، أعدني" -#: pretix/control/templates/pretixcontrol/order/approve.html:25 +#: pretix/control/templates/pretixcontrol/order/approve.html:29 msgid "Yes, approve order" msgstr "نعم، والموافقة على النظام" #: pretix/control/templates/pretixcontrol/order/cancel.html:6 #: pretix/control/templates/pretixcontrol/order/cancel.html:10 #: pretix/control/templates/pretixcontrol/order/index.html:68 -#: pretix/control/templates/pretixcontrol/order/index.html:166 +#: pretix/control/templates/pretixcontrol/order/index.html:199 #: pretix/presale/templates/pretixpresale/event/order.html:483 #: pretix/presale/templates/pretixpresale/event/order_cancel.html:7 msgid "Cancel order" @@ -24422,7 +24759,7 @@ msgid "" msgstr "" #: pretix/control/templates/pretixcontrol/order/change.html:101 -#: pretix/control/templates/pretixcontrol/order/change.html:413 +#: pretix/control/templates/pretixcontrol/order/change.html:415 msgid "Change to" msgstr "تغيير" @@ -24464,7 +24801,7 @@ msgid "Validity time" msgstr "حتى تاريخ" #: pretix/control/templates/pretixcontrol/order/change.html:247 -#: pretix/control/templates/pretixcontrol/order/index.html:500 +#: pretix/control/templates/pretixcontrol/order/index.html:535 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:107 #, fuzzy, python-format #| msgid "Admission: %(datetime)s" @@ -24472,7 +24809,7 @@ msgid "Valid from %(datetime)s" msgstr "القبول: %(datetime)s" #: pretix/control/templates/pretixcontrol/order/change.html:255 -#: pretix/control/templates/pretixcontrol/order/index.html:504 +#: pretix/control/templates/pretixcontrol/order/index.html:539 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:111 #, fuzzy, python-format #| msgid "Admission: %(datetime)s" @@ -24504,32 +24841,32 @@ msgid "" msgstr "سوف إزالة هذا الموقف أيضا إزالة كافة الوظائف الإضافية لهذا المنصب." #: pretix/control/templates/pretixcontrol/order/change.html:317 -#: pretix/control/templates/pretixcontrol/order/change.html:358 -#: pretix/control/templates/pretixcontrol/order/change.html:386 +#: pretix/control/templates/pretixcontrol/order/change.html:359 +#: pretix/control/templates/pretixcontrol/order/change.html:388 msgid "Add product" msgstr "أضف منتج" -#: pretix/control/templates/pretixcontrol/order/change.html:446 +#: pretix/control/templates/pretixcontrol/order/change.html:448 msgid "" "Manually modifying payment fees is discouraged since they might " "automatically be updated on subsequent order changes or when choosing a " "different payment method." msgstr "" -#: pretix/control/templates/pretixcontrol/order/change.html:466 -#: pretix/control/templates/pretixcontrol/order/change.html:493 -#: pretix/control/templates/pretixcontrol/order/change.html:513 +#: pretix/control/templates/pretixcontrol/order/change.html:468 +#: pretix/control/templates/pretixcontrol/order/change.html:495 +#: pretix/control/templates/pretixcontrol/order/change.html:515 #, fuzzy #| msgid "Additional fee" msgid "Add fee" msgstr "رسوم إضافية" -#: pretix/control/templates/pretixcontrol/order/change.html:520 +#: pretix/control/templates/pretixcontrol/order/change.html:522 #: pretix/control/templates/pretixcontrol/order/change_questions.html:66 msgid "Other operations" msgstr "عمليات أخرى" -#: pretix/control/templates/pretixcontrol/order/change.html:546 +#: pretix/control/templates/pretixcontrol/order/change.html:548 #: pretix/presale/templates/pretixpresale/event/order_change_confirm.html:30 #: pretix/presale/templates/pretixpresale/event/position_change_confirm.html:30 msgid "Perform changes" @@ -24556,7 +24893,7 @@ msgid "Change order information" msgstr "المعلومات تغيير النظام" #: pretix/control/templates/pretixcontrol/order/change_questions.html:25 -#: pretix/control/templates/pretixcontrol/order/index.html:1023 +#: pretix/control/templates/pretixcontrol/order/index.html:1058 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:74 #: pretix/presale/templates/pretixpresale/event/checkout_questions.html:35 #: pretix/presale/templates/pretixpresale/event/order_modify.html:29 @@ -24609,13 +24946,13 @@ msgstr "تفاصيل الطلب: %(code)s" #: pretix/control/templates/pretixcontrol/order/index.html:46 #: pretix/control/templates/pretixcontrol/orders/index.html:297 -#: pretix/control/views/orders.py:314 +#: pretix/control/views/orders.py:315 msgid "Approve" msgstr "يوافق" #: pretix/control/templates/pretixcontrol/order/index.html:51 #: pretix/control/templates/pretixcontrol/orders/index.html:304 -#: pretix/control/views/orders.py:328 +#: pretix/control/views/orders.py:329 msgid "Deny" msgstr "أنكر" @@ -24660,7 +24997,7 @@ msgstr "" "المجانية، يمكنك وضع علامة على أنها منتهية الصلاحية يدويا." #: pretix/control/templates/pretixcontrol/order/index.html:116 -#: pretix/control/views/orders.py:376 +#: pretix/control/views/orders.py:377 #, fuzzy #| msgid "Refund order" msgid "Refund for overpayment" @@ -24684,55 +25021,76 @@ msgid "" "payment deadline." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:143 +#: pretix/control/templates/pretixcontrol/order/index.html:140 +msgid "" +"This order was changed after the last invoice was generated. A new invoice " +"was not generated yet, because invoices are configured to be generated on " +"payment or if required by the payment method. A new invoice will be " +"generated once the customer pays the invoice or selects a payment method " +"that requires an invoice." +msgstr "" + +#: pretix/control/templates/pretixcontrol/order/index.html:152 +#, fuzzy +#| msgid "Request invoice" +msgid "Reissue invoice" +msgstr "اطلب فاتورة" + +#: pretix/control/templates/pretixcontrol/order/index.html:161 +#: pretix/control/templates/pretixcontrol/order/index.html:413 +#: pretix/control/templates/pretixcontrol/order/index.html:425 +msgid "Generate invoice" +msgstr "توليد فاتورة" + +#: pretix/control/templates/pretixcontrol/order/index.html:176 #, fuzzy #| msgid "Cancellation fee" msgid "Cancellation request" msgstr "رسوم الإلغاء" -#: pretix/control/templates/pretixcontrol/order/index.html:147 +#: pretix/control/templates/pretixcontrol/order/index.html:180 #, fuzzy #| msgid "You can cancel this order using the following button." msgid "The customer asked you to cancel the order with the following settings:" msgstr "يمكنك إلغاء الحجز باستخدام الزر التالي." -#: pretix/control/templates/pretixcontrol/order/index.html:154 +#: pretix/control/templates/pretixcontrol/order/index.html:187 #, fuzzy #| msgid "Enable payment method" msgid "Original payment method" msgstr "تمكين طريقة الدفع" -#: pretix/control/templates/pretixcontrol/order/index.html:163 +#: pretix/control/templates/pretixcontrol/order/index.html:196 #, fuzzy #| msgid "Delete question" msgid "Delete request" msgstr "مسألة الحذف" -#: pretix/control/templates/pretixcontrol/order/index.html:186 +#: pretix/control/templates/pretixcontrol/order/index.html:219 #, fuzzy #| msgctxt "invoice" #| msgid "Cancellation date" msgid "Cancellation date" msgstr "تاريخ الإلغاء" -#: pretix/control/templates/pretixcontrol/order/index.html:208 +#: pretix/control/templates/pretixcontrol/order/index.html:241 msgid "" "This order will not expire automatically since it is already confirmed and " "can be used." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:211 +#: pretix/control/templates/pretixcontrol/order/index.html:244 msgid "" "This order will not expire automatically as it has an open cancellation fee." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:230 +#: pretix/control/templates/pretixcontrol/order/index.html:263 #, fuzzy #| msgid "Contact information" msgid "Contact email" msgstr "معلومات التواصل" -#: pretix/control/templates/pretixcontrol/order/index.html:234 +#: pretix/control/templates/pretixcontrol/order/index.html:267 msgid "" "We know that this email address works because the user clicked a link we " "sent them." @@ -24740,181 +25098,176 @@ msgstr "" "ونحن نعلم أن عنوان البريد الإلكتروني هذا يعمل لأن المستخدم النقر على الرابط " "أرسلنا لهم." -#: pretix/control/templates/pretixcontrol/order/index.html:278 +#: pretix/control/templates/pretixcontrol/order/index.html:311 msgid "" "We don't know if this invoice was emailed to the customer since it was " "created before our system tracked this information" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:283 +#: pretix/control/templates/pretixcontrol/order/index.html:316 #, fuzzy #| msgid "Canceled by customer" msgid "Invoice was emailed to customer" msgstr "تم الإلغاء من قبل العميل" -#: pretix/control/templates/pretixcontrol/order/index.html:288 +#: pretix/control/templates/pretixcontrol/order/index.html:321 #, fuzzy #| msgid "Ticket download is not (yet) enabled for this order." msgid "Invoice was not yet emailed to customer" msgstr "لم يتم تمكين تنزيل التذاكر (حتى الآن) لهذا الطلب." -#: pretix/control/templates/pretixcontrol/order/index.html:294 +#: pretix/control/templates/pretixcontrol/order/index.html:327 #, fuzzy #| msgid "The webhook has been created." msgid "Invoice is scheduled to be transmitted" msgstr "تم إنشاء خطاف الويب." -#: pretix/control/templates/pretixcontrol/order/index.html:299 +#: pretix/control/templates/pretixcontrol/order/index.html:332 #, fuzzy #| msgid "Ticket download is not (yet) enabled for this order." msgid "Invoice is not yet transmitted" msgstr "لم يتم تمكين تنزيل التذاكر (حتى الآن) لهذا الطلب." -#: pretix/control/templates/pretixcontrol/order/index.html:302 +#: pretix/control/templates/pretixcontrol/order/index.html:335 #, fuzzy #| msgid "This ticket shop is currently disabled." msgid "Invoice is currently in transmission" msgstr "متجر التذاكر هذا معطل حاليا." -#: pretix/control/templates/pretixcontrol/order/index.html:307 +#: pretix/control/templates/pretixcontrol/order/index.html:340 #, fuzzy #| msgid "live and in test mode" msgid "Invoice not transmitted in test mode" msgstr "يعيش وفي وضع الاختبار" -#: pretix/control/templates/pretixcontrol/order/index.html:312 +#: pretix/control/templates/pretixcontrol/order/index.html:345 #, fuzzy #| msgid "Device registration failed." msgid "Invoice transmission failed" msgstr "فشل تسجيل الجهاز." -#: pretix/control/templates/pretixcontrol/order/index.html:317 +#: pretix/control/templates/pretixcontrol/order/index.html:350 #, fuzzy #| msgid "An invoice has been generated." msgid "Invoice has been transmitted" msgstr "تم إنشاء فاتورة." -#: pretix/control/templates/pretixcontrol/order/index.html:329 +#: pretix/control/templates/pretixcontrol/order/index.html:362 #, fuzzy #| msgctxt "refund_state" #| msgid "in transit" msgid "Transmit" msgstr "قيد الإرسال" -#: pretix/control/templates/pretixcontrol/order/index.html:331 +#: pretix/control/templates/pretixcontrol/order/index.html:364 #, fuzzy #| msgctxt "refund_state" #| msgid "in transit" msgid "Retransmit" msgstr "قيد الإرسال" -#: pretix/control/templates/pretixcontrol/order/index.html:342 +#: pretix/control/templates/pretixcontrol/order/index.html:375 msgid "Rebuild the invoice with updated data but the same invoice number." msgstr "إعادة بناء الفاتورة مع البيانات المحدثة ولكن نفس رقم الفاتورة." -#: pretix/control/templates/pretixcontrol/order/index.html:343 +#: pretix/control/templates/pretixcontrol/order/index.html:376 #: pretix/control/templates/pretixcontrol/user/2fa_regenemergency.html:20 msgid "Regenerate" msgstr "تجديد" -#: pretix/control/templates/pretixcontrol/order/index.html:354 +#: pretix/control/templates/pretixcontrol/order/index.html:387 msgid "" "Generate a cancellation document for this invoice and create a new invoice " "with a new invoice number." msgstr "" "توليد وثيقة الإلغاء لهذه الفاتورة وإنشاء فاتورة جديدة مع رقم الفاتورة الجديد." -#: pretix/control/templates/pretixcontrol/order/index.html:357 +#: pretix/control/templates/pretixcontrol/order/index.html:390 msgid "Generate cancellation" msgstr "توليد إلغاء" -#: pretix/control/templates/pretixcontrol/order/index.html:359 +#: pretix/control/templates/pretixcontrol/order/index.html:392 msgid "Cancel and reissue" msgstr "إلغاء وإعادة إصدار" -#: pretix/control/templates/pretixcontrol/order/index.html:380 -#: pretix/control/templates/pretixcontrol/order/index.html:392 -msgid "Generate invoice" -msgstr "توليد فاتورة" - -#: pretix/control/templates/pretixcontrol/order/index.html:406 +#: pretix/control/templates/pretixcontrol/order/index.html:439 msgid "Change answers" msgstr "الإجابات التغيير" -#: pretix/control/templates/pretixcontrol/order/index.html:410 +#: pretix/control/templates/pretixcontrol/order/index.html:443 msgid "Change products" msgstr "منتجات التغيير" -#: pretix/control/templates/pretixcontrol/order/index.html:415 +#: pretix/control/templates/pretixcontrol/order/index.html:448 #: pretix/presale/templates/pretixpresale/event/order.html:197 msgid "Ordered items" msgstr "تفاصيل الطلب" -#: pretix/control/templates/pretixcontrol/order/index.html:434 +#: pretix/control/templates/pretixcontrol/order/index.html:467 #, fuzzy, python-format #| msgid "First scanned: %(date)s" msgid "Denied scan: %(date)s" msgstr "الممسوحة ضوئيا أولا: %(date)s" -#: pretix/control/templates/pretixcontrol/order/index.html:439 +#: pretix/control/templates/pretixcontrol/order/index.html:472 #, fuzzy, python-format #| msgid "First scanned: %(date)s" msgid "Exit scan: %(date)s" msgstr "الممسوحة ضوئيا أولا: %(date)s" -#: pretix/control/templates/pretixcontrol/order/index.html:446 +#: pretix/control/templates/pretixcontrol/order/index.html:479 #, fuzzy, python-format #| msgid "First scanned: %(date)s" msgid "Entry scan: %(date)s" msgstr "الممسوحة ضوئيا أولا: %(date)s" -#: pretix/control/templates/pretixcontrol/order/index.html:465 +#: pretix/control/templates/pretixcontrol/order/index.html:498 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:55 msgid "Voucher code used:" msgstr "كود القسيمة المستخدمة:" -#: pretix/control/templates/pretixcontrol/order/index.html:467 +#: pretix/control/templates/pretixcontrol/order/index.html:500 #, fuzzy, python-format #| msgid "Maximum discount budget" msgid "Used %(amount)s discount from budget" msgstr "الحد الأقصى للخصم" -#: pretix/control/templates/pretixcontrol/order/index.html:484 +#: pretix/control/templates/pretixcontrol/order/index.html:519 msgid "" "The price of this product was reduced because of an automatic discount or " "this product was part of the discount calculation for a different product in " "this order." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:496 +#: pretix/control/templates/pretixcontrol/order/index.html:531 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:103 #, fuzzy, python-format #| msgid "Admission: %(datetime)s" msgid "Valid %(datetime_range)s" msgstr "القبول: %(datetime)s" -#: pretix/control/templates/pretixcontrol/order/index.html:542 +#: pretix/control/templates/pretixcontrol/order/index.html:577 #, fuzzy #| msgid "Client secret" msgid "Ticket page" msgstr "كلمة سر الزبون" -#: pretix/control/templates/pretixcontrol/order/index.html:573 -#: pretix/control/templates/pretixcontrol/order/index.html:594 -#: pretix/control/templates/pretixcontrol/order/index.html:603 -#: pretix/control/templates/pretixcontrol/order/index.html:617 -#: pretix/control/templates/pretixcontrol/order/index.html:655 -#: pretix/control/templates/pretixcontrol/order/index.html:662 +#: pretix/control/templates/pretixcontrol/order/index.html:608 +#: pretix/control/templates/pretixcontrol/order/index.html:629 +#: pretix/control/templates/pretixcontrol/order/index.html:638 +#: pretix/control/templates/pretixcontrol/order/index.html:652 +#: pretix/control/templates/pretixcontrol/order/index.html:690 +#: pretix/control/templates/pretixcontrol/order/index.html:697 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:228 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:234 msgid "not answered" msgstr "بلا جواب" -#: pretix/control/templates/pretixcontrol/order/index.html:627 +#: pretix/control/templates/pretixcontrol/order/index.html:662 msgid "This question will be asked during check-in." msgstr "سوف يتم طرح هذا السؤال أثناء التسجيل في مكتب الاستقبال." -#: pretix/control/templates/pretixcontrol/order/index.html:639 +#: pretix/control/templates/pretixcontrol/order/index.html:674 msgid "" "This file has been uploaded by a user and could contain viruses or other " "malicious content." @@ -24922,11 +25275,11 @@ msgstr "" "وقد تم تحميل هذا الملف من قبل المستخدم، ويمكن أن تحتوي على فيروسات أو غيرها " "من المحتويات الضارة." -#: pretix/control/templates/pretixcontrol/order/index.html:640 +#: pretix/control/templates/pretixcontrol/order/index.html:675 msgid "UNSAFE" msgstr "UNSAFE" -#: pretix/control/templates/pretixcontrol/order/index.html:773 +#: pretix/control/templates/pretixcontrol/order/index.html:808 #: pretix/control/templates/pretixcontrol/orders/overview.html:89 #: pretix/control/templates/pretixcontrol/orders/overview.html:177 #: pretix/plugins/reports/accountingreport.py:499 @@ -24938,22 +25291,22 @@ msgstr "UNSAFE" msgid "Total" msgstr "المجموع" -#: pretix/control/templates/pretixcontrol/order/index.html:789 +#: pretix/control/templates/pretixcontrol/order/index.html:824 #: pretix/presale/templates/pretixpresale/event/order.html:210 msgid "Successful payments" msgstr "المدفوعات ناجحة" -#: pretix/control/templates/pretixcontrol/order/index.html:798 +#: pretix/control/templates/pretixcontrol/order/index.html:833 #: pretix/presale/templates/pretixpresale/event/order.html:219 msgid "Pending total" msgstr "مجموعه انتظار" -#: pretix/control/templates/pretixcontrol/order/index.html:824 +#: pretix/control/templates/pretixcontrol/order/index.html:859 #: pretix/control/templates/pretixcontrol/search/payments.html:88 msgid "Confirmation date" msgstr "تاريخ تأكيدا" -#: pretix/control/templates/pretixcontrol/order/index.html:837 +#: pretix/control/templates/pretixcontrol/order/index.html:872 #: pretix/control/templates/pretixcontrol/search/payments.html:125 msgid "" "This payment was created with an older version of pretix, therefore accurate " @@ -24962,71 +25315,71 @@ msgstr "" "تم إنشاء هذا المبلغ مع نسخة قديمة من pretix، وبالتالي قد لا تكون البيانات " "دقيقة المتاحة." -#: pretix/control/templates/pretixcontrol/order/index.html:838 +#: pretix/control/templates/pretixcontrol/order/index.html:873 #: pretix/control/templates/pretixcontrol/search/payments.html:126 msgid "MIGRATED" msgstr "هاجر" -#: pretix/control/templates/pretixcontrol/order/index.html:850 +#: pretix/control/templates/pretixcontrol/order/index.html:885 #: pretix/control/templates/pretixcontrol/order/pay_cancel.html:4 #: pretix/control/templates/pretixcontrol/order/pay_cancel.html:8 msgid "Cancel payment" msgstr "الغاء الدفع" -#: pretix/control/templates/pretixcontrol/order/index.html:855 +#: pretix/control/templates/pretixcontrol/order/index.html:890 msgid "Confirm as paid" msgstr "تأكيد كما المدفوعة" -#: pretix/control/templates/pretixcontrol/order/index.html:898 +#: pretix/control/templates/pretixcontrol/order/index.html:933 msgid "Create a refund" msgstr "إنشاء استرداد" -#: pretix/control/templates/pretixcontrol/order/index.html:919 +#: pretix/control/templates/pretixcontrol/order/index.html:954 #: pretix/control/templates/pretixcontrol/orders/refunds.html:60 msgid "Source" msgstr "مصدر" -#: pretix/control/templates/pretixcontrol/order/index.html:952 +#: pretix/control/templates/pretixcontrol/order/index.html:987 msgid "Cancel transfer" msgstr "إلغاء نقل" -#: pretix/control/templates/pretixcontrol/order/index.html:957 +#: pretix/control/templates/pretixcontrol/order/index.html:992 #: pretix/control/templates/pretixcontrol/orders/refunds.html:113 msgid "Confirm as done" msgstr "تأكيد كما القيام به" -#: pretix/control/templates/pretixcontrol/order/index.html:964 +#: pretix/control/templates/pretixcontrol/order/index.html:999 #: pretix/control/templates/pretixcontrol/orders/refunds.html:119 msgid "Ignore" msgstr "تجاهل" -#: pretix/control/templates/pretixcontrol/order/index.html:970 +#: pretix/control/templates/pretixcontrol/order/index.html:1005 #: pretix/control/templates/pretixcontrol/order/refund_process.html:58 #: pretix/control/templates/pretixcontrol/orders/refunds.html:124 msgid "Process refund" msgstr "عملية استرداد الأموال" -#: pretix/control/templates/pretixcontrol/order/index.html:1018 +#: pretix/control/templates/pretixcontrol/order/index.html:1053 #: pretix/presale/templates/pretixpresale/event/base.html:142 #: pretix/presale/templates/pretixpresale/event/timemachine.html:31 msgid "Change" msgstr "يتغيرون" -#: pretix/control/templates/pretixcontrol/order/index.html:1034 +#: pretix/control/templates/pretixcontrol/order/index.html:1069 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:90 #: pretix/presale/templates/pretixpresale/event/order.html:318 msgid "ZIP code and city" msgstr "الرمز البريدي والمدينة" -#: pretix/control/templates/pretixcontrol/order/index.html:1047 +#: pretix/control/templates/pretixcontrol/order/index.html:1082 msgid "Valid EU VAT ID" msgstr "صحيح معرف ضريبة القيمة المضافة في الاتحاد الأوروبي" -#: pretix/control/templates/pretixcontrol/order/index.html:1053 +#: pretix/control/templates/pretixcontrol/order/index.html:1088 msgid "Check" msgstr "التحقق من" -#: pretix/control/templates/pretixcontrol/order/index.html:1107 +#: pretix/control/templates/pretixcontrol/order/index.html:1142 msgid "Order history" msgstr "تاريخ الطلب" @@ -25139,11 +25492,18 @@ msgid "How should the refund be sent?" msgstr "كيف يجب أن يتم إرسال المبلغ؟" #: pretix/control/templates/pretixcontrol/order/refund_choose.html:25 +#, fuzzy +#| msgid "" +#| "Any payments that you selected for automatical refunds will be " +#| "immediately communicate the refund request to the respective payment " +#| "provider. Manual refunds will be created as pending refunds, you can then " +#| "later mark them as done once you actually transferred the money back to " +#| "the customer." msgid "" -"Any payments that you selected for automatical refunds will be immediately " -"communicate the refund request to the respective payment provider. Manual " -"refunds will be created as pending refunds, you can then later mark them as " -"done once you actually transferred the money back to the customer." +"Any payments you selected for automatic refunds will have the refund request " +"sent immediately to the respective payment provider. Manual refunds will be " +"created as pending refunds, which you can later mark as done once you have " +"actually transferred the money back to the customer." msgstr "" "أي مدفوعات التي حددتها لتسديدات آلي سيكون الاتصال فورا على طلب إعادة الأموال " "إلى مزود دفع المعنيين. سيتم إنشاء استرداد دليل على النحو المبالغ المستردة " @@ -25915,19 +26275,12 @@ msgstr "فلتر إزالة" msgid "Order paid / total" msgstr "المجموع" -#: pretix/control/templates/pretixcontrol/orders/index.html:176 -#: pretix/control/templates/pretixcontrol/organizers/devices.html:114 -#: pretix/control/templates/pretixcontrol/organizers/outgoing_mails.html:90 -#: pretix/control/templates/pretixcontrol/subevents/index.html:132 -#: pretix/control/templates/pretixcontrol/vouchers/index.html:153 -#: pretix/control/templates/pretixcontrol/waitinglist/index.html:195 -msgid "select row for batch-operation" -msgstr "" - #: pretix/control/templates/pretixcontrol/orders/index.html:192 #: pretix/control/templates/pretixcontrol/orders/index.html:194 #: pretix/control/templates/pretixcontrol/search/orders.html:80 #: pretix/control/templates/pretixcontrol/search/orders.html:82 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:265 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:269 #, fuzzy, python-format #| msgid "Exit: %(date)s" msgctxt "followup" @@ -26002,14 +26355,14 @@ msgid "Select action" msgstr "اختر ولايه" #: pretix/control/templates/pretixcontrol/orders/index.html:311 -#: pretix/control/views/orders.py:360 +#: pretix/control/views/orders.py:361 #, fuzzy #| msgid "Refund full paid amount" msgid "Refund overpaid amount" msgstr "برد المبلغ المدفوع كاملا" #: pretix/control/templates/pretixcontrol/orders/index.html:319 -#: pretix/control/views/orders.py:345 +#: pretix/control/views/orders.py:346 msgid "Mark as expired if overdue" msgstr "" @@ -26307,12 +26660,6 @@ msgstr "منظم: %(name)s" msgid "Change multiple devices" msgstr "إنشاء عدة تواريخ" -#: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html:8 -#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:14 -#, python-format -msgid "%(number)s selected" -msgstr "%(number)s تم اختيارها" - #: pretix/control/templates/pretixcontrol/organizers/device_bulk_edit.html:36 #: pretix/control/templates/pretixcontrol/organizers/device_edit.html:24 #: pretix/control/templates/pretixcontrol/vouchers/bulk.html:73 @@ -26464,14 +26811,6 @@ msgstr "الاتصال" msgid "Logs" msgstr "سجلات" -#: pretix/control/templates/pretixcontrol/organizers/devices.html:199 -#: pretix/control/templates/pretixcontrol/subevents/index.html:219 -#, fuzzy -#| msgctxt "subevent" -#| msgid "No date selected." -msgid "Edit selected" -msgstr "موعد المحدد." - #: pretix/control/templates/pretixcontrol/organizers/edit.html:12 msgid "Organizer settings" msgstr "ضبط منظم" @@ -26548,11 +26887,11 @@ msgid "" "pretix. This will be ignored if a URL is configured." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:229 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:230 msgid "Barcode media" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:233 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:234 msgid "" "A \"barcode medium\" can be any printed or digital representation of a " "barcode. The medium will initially be created through the sale of a product " @@ -26561,59 +26900,59 @@ msgid "" "same barcode may be re-used during the sale of a different product." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:240 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:241 msgid "Barcode media can currently only be connected to tickets." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:243 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:244 msgid "" "This subsequent reuse of the barcode is currently only supported during POS " "sales." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:260 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:261 msgid "" "This medium type can work with almost any type of NFC chip. With this " "option, only the UID of the NFC chip is used for identification." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:264 -#: pretix/control/templates/pretixcontrol/organizers/edit.html:296 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:265 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:297 msgid "NFC media can currently only be connected to gift cards." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:270 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:271 msgid "" "This method does not provide a high level of protection against abuse since " "it is possible for malicious users to clone someone's chip with the same UID." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:291 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:292 msgid "" "This medium type works only with NFC chips of the type Mifare Ultralight AES " "made by NXP. This provides a higher level of security than other approaches, " "but requires all chips to be encoded prior to use." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:318 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:319 #, fuzzy #| msgid "Known domains" msgid "Domains" msgstr "نطاقات معروفة" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:320 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:321 #, fuzzy #| msgid "This action is only allowed for pending orders." msgid "This dialog is intended for advanced users." msgstr "يسمح هذا الإجراء فقط لانتظار أوامر." -#: pretix/control/templates/pretixcontrol/organizers/edit.html:321 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:322 msgid "" "The domain needs to be configured on your webserver before it can be used " "here." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/edit.html:377 +#: pretix/control/templates/pretixcontrol/organizers/edit.html:378 #, fuzzy #| msgid "Address line" msgid "Add domain" @@ -27169,7 +27508,7 @@ msgid "Media type" msgstr "نوع الرسوم" #: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:63 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:40 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:52 #, fuzzy #| msgid "Connect" msgctxt "reusable_media" @@ -27186,7 +27525,7 @@ msgctxt "reusable_media" msgid "Medium %(id)s" msgstr "عنوان البريد الإلكتروني التحقق منها" -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:94 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:106 #, fuzzy #| msgid "Team history" msgctxt "reusable_media" @@ -27295,20 +27634,41 @@ msgstr "" msgid "Are you sure you want to delete the team?" msgstr "هل أنت متأكد أنك تريد حذف الفريق؟" -#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:7 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:8 #: pretix/control/templates/pretixcontrol/organizers/team_members.html:6 msgid "Team:" msgstr "الفريق:" -#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:9 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:10 #: pretix/control/templates/pretixcontrol/organizers/teams.html:30 msgid "Create a new team" msgstr "إنشاء فريق جديد" -#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:11 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:12 msgid "You will be able to add team members in the next step." msgstr "سوف تكون قادرا على إضافة أعضاء الفريق في الخطوة التالية." +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:31 +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:55 +msgid "" +"Even if a team has no access to a certain category of data, they might still " +"be able to see parts of this data when it is linked to data they can see." +msgstr "" + +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:35 +msgid "" +"For example, someone with access to customer accounts will be able to see " +"some information about gift cards linked to a customer account, even if they " +"generally can't see gift cards directly." +msgstr "" + +#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:59 +msgid "" +"For example, someone with access to orders will be able to see some " +"information about vouchers used to create an order, even if they generally " +"can't see vouchers directly." +msgstr "" + #: pretix/control/templates/pretixcontrol/organizers/team_members.html:21 msgid "Member" msgstr "عضو" @@ -27501,69 +27861,69 @@ msgstr "الصفحة %(page)s" msgid "PDF Editor" msgstr "PDF محرر" -#: pretix/control/templates/pretixcontrol/pdf/index.html:36 +#: pretix/control/templates/pretixcontrol/pdf/index.html:34 #: pretix/plugins/banktransfer/refund_export.py:47 msgid "Code" msgstr "الشفرة" -#: pretix/control/templates/pretixcontrol/pdf/index.html:52 +#: pretix/control/templates/pretixcontrol/pdf/index.html:50 #, fuzzy #| msgid "Text color" msgid "Text box" msgstr "لون الخط" -#: pretix/control/templates/pretixcontrol/pdf/index.html:59 +#: pretix/control/templates/pretixcontrol/pdf/index.html:57 #, fuzzy #| msgid "Code" msgid "QR Code" msgstr "الشفرة" -#: pretix/control/templates/pretixcontrol/pdf/index.html:64 +#: pretix/control/templates/pretixcontrol/pdf/index.html:62 msgid "QR code for Check-In" msgstr "رمز الاستجابة السريعة لتسلم الغرف" -#: pretix/control/templates/pretixcontrol/pdf/index.html:71 +#: pretix/control/templates/pretixcontrol/pdf/index.html:69 msgid "QR code for Lead Scanning" msgstr "رمز الاستجابة السريعة لالضوئي الرصاص" -#: pretix/control/templates/pretixcontrol/pdf/index.html:78 +#: pretix/control/templates/pretixcontrol/pdf/index.html:76 #, fuzzy #| msgid "Order code" msgid "Other QR code" msgstr "رمز الطلب" -#: pretix/control/templates/pretixcontrol/pdf/index.html:87 +#: pretix/control/templates/pretixcontrol/pdf/index.html:85 msgid "Image" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:92 +#: pretix/control/templates/pretixcontrol/pdf/index.html:90 msgid "" "You can use this to add user-uploaded pictures from questions or pictures " "generated by plugins. If you want to embed a logo or other images, use a " "custom background instead." msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:93 +#: pretix/control/templates/pretixcontrol/pdf/index.html:91 msgid "Dynamic image" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:100 +#: pretix/control/templates/pretixcontrol/pdf/index.html:98 msgid "pretix Logo" msgstr "pretix شعار" -#: pretix/control/templates/pretixcontrol/pdf/index.html:107 +#: pretix/control/templates/pretixcontrol/pdf/index.html:105 msgid "Duplicate" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:117 +#: pretix/control/templates/pretixcontrol/pdf/index.html:115 msgid "Undo" msgstr "تراجع" -#: pretix/control/templates/pretixcontrol/pdf/index.html:121 +#: pretix/control/templates/pretixcontrol/pdf/index.html:119 msgid "Redo" msgstr "الإعادة" -#: pretix/control/templates/pretixcontrol/pdf/index.html:142 +#: pretix/control/templates/pretixcontrol/pdf/index.html:140 msgid "" "This feature is only intended for advanced users. We recommend to only use " "it to copy and share ticket designs, not to modify the design source code." @@ -27571,20 +27931,20 @@ msgstr "" "والغرض من هذه الميزة فقط للمستخدمين المتقدمين. من المستحسن استخدامه فقط لنسخ " "والتصاميم حصة التذاكر، وليس لتعديل التعليمات البرمجية المصدر التصميم." -#: pretix/control/templates/pretixcontrol/pdf/index.html:156 +#: pretix/control/templates/pretixcontrol/pdf/index.html:154 #: pretix/presale/templates/pretixpresale/giftcard/checkout.html:26 msgid "Apply" msgstr "تطبيق" -#: pretix/control/templates/pretixcontrol/pdf/index.html:164 +#: pretix/control/templates/pretixcontrol/pdf/index.html:162 msgid "Uploading new PDF background…" msgstr "تحميل خلفية PDF جديدة ..." -#: pretix/control/templates/pretixcontrol/pdf/index.html:172 +#: pretix/control/templates/pretixcontrol/pdf/index.html:170 msgid "Welcome to the PDF ticket editor!" msgstr "أهلا وسهلا بك إلى المحرر PDF تذكرة!" -#: pretix/control/templates/pretixcontrol/pdf/index.html:174 +#: pretix/control/templates/pretixcontrol/pdf/index.html:172 msgid "" "This editor allows you to create a design for the PDF tickets of your event. " "You can upload a background PDF and then use this tool to place texts and a " @@ -27594,7 +27954,7 @@ msgstr "" "تحميل خلفية PDF ومن ثم استخدام هذه الأداة لنصوص المكان ورمز الاستجابة " "السريعة على التذكرة." -#: pretix/control/templates/pretixcontrol/pdf/index.html:185 +#: pretix/control/templates/pretixcontrol/pdf/index.html:183 msgid "" "Please note that the editor can only provide a rough preview. Some details, " "for example in text rendering, might look slightly different in the final " @@ -27605,7 +27965,7 @@ msgstr "" "المثال في تقديم النص، قد تبدو مختلفة قليلا في تذاكر النهائي. يمكنك استخدام " "زر \"معاينة\" على اليمين لمعاينة أكثر دقة." -#: pretix/control/templates/pretixcontrol/pdf/index.html:199 +#: pretix/control/templates/pretixcontrol/pdf/index.html:197 msgid "" "The editor is tested with recent versions of Google Chrome, Mozilla Firefox " "and Opera. Other browsers, especially Internet Explorer or Microsoft Edge, " @@ -27616,7 +27976,7 @@ msgstr "" "وأوبرا. المتصفحات الأخرى، وخاصة برنامج Internet Explorer أو Microsoft " "الحافة، قد تواجه مشاكل في عرض خلفيتك PDF أو تحميل الخطوط الصحيحة." -#: pretix/control/templates/pretixcontrol/pdf/index.html:207 +#: pretix/control/templates/pretixcontrol/pdf/index.html:205 msgid "" "The editor requires JavaScript to work. Please enable JavaScript in your " "browser to continue." @@ -27624,97 +27984,97 @@ msgstr "" "يتطلب محرر جافا سكريبت لعمل. الرجاء تمكين جافا سكريبت في المتصفح الخاص بك " "للمتابعة." -#: pretix/control/templates/pretixcontrol/pdf/index.html:217 -#: pretix/control/templates/pretixcontrol/pdf/index.html:233 +#: pretix/control/templates/pretixcontrol/pdf/index.html:215 +#: pretix/control/templates/pretixcontrol/pdf/index.html:231 msgid "Loading…" msgstr "جار التحميل…" -#: pretix/control/templates/pretixcontrol/pdf/index.html:220 +#: pretix/control/templates/pretixcontrol/pdf/index.html:218 msgid "Start editing" msgstr "بدء التعديل" -#: pretix/control/templates/pretixcontrol/pdf/index.html:240 +#: pretix/control/templates/pretixcontrol/pdf/index.html:238 #, fuzzy #| msgid "Seat name" msgid "Layout name" msgstr "اسم المقعد" -#: pretix/control/templates/pretixcontrol/pdf/index.html:247 +#: pretix/control/templates/pretixcontrol/pdf/index.html:245 #, fuzzy #| msgid "Use languages" msgid "Preferred language" msgstr "استخدام اللغات" -#: pretix/control/templates/pretixcontrol/pdf/index.html:260 -#: pretix/control/templates/pretixcontrol/pdf/index.html:270 +#: pretix/control/templates/pretixcontrol/pdf/index.html:258 +#: pretix/control/templates/pretixcontrol/pdf/index.html:268 #, fuzzy #| msgid "Upload custom background" msgid "Upload PDF as background" msgstr "خلفية مخصصة تحميل" -#: pretix/control/templates/pretixcontrol/pdf/index.html:262 +#: pretix/control/templates/pretixcontrol/pdf/index.html:260 msgid "" "You can upload a PDF to use as a custom background. The paper size will " "match the PDF." msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:274 +#: pretix/control/templates/pretixcontrol/pdf/index.html:272 #, python-format msgid "max. %(size)s, smaller is better" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:282 +#: pretix/control/templates/pretixcontrol/pdf/index.html:280 #, fuzzy #| msgid "Upload custom background" msgid "Download current background" msgstr "خلفية مخصصة تحميل" -#: pretix/control/templates/pretixcontrol/pdf/index.html:289 +#: pretix/control/templates/pretixcontrol/pdf/index.html:287 #, fuzzy #| msgid "Canceled by customer" msgid "Or choose custom paper size" msgstr "تم الإلغاء من قبل العميل" -#: pretix/control/templates/pretixcontrol/pdf/index.html:291 +#: pretix/control/templates/pretixcontrol/pdf/index.html:289 msgid "" "To manually change the paper size, you need to create a new, empty " "background." msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:299 -#: pretix/control/templates/pretixcontrol/pdf/index.html:386 -#: pretix/control/templates/pretixcontrol/pdf/index.html:428 +#: pretix/control/templates/pretixcontrol/pdf/index.html:297 +#: pretix/control/templates/pretixcontrol/pdf/index.html:384 +#: pretix/control/templates/pretixcontrol/pdf/index.html:426 msgid "Width (mm)" msgstr "العرض (مم)" -#: pretix/control/templates/pretixcontrol/pdf/index.html:303 -#: pretix/control/templates/pretixcontrol/pdf/index.html:391 +#: pretix/control/templates/pretixcontrol/pdf/index.html:301 +#: pretix/control/templates/pretixcontrol/pdf/index.html:389 msgid "Height (mm)" msgstr "الارتفاع (مم)" -#: pretix/control/templates/pretixcontrol/pdf/index.html:312 +#: pretix/control/templates/pretixcontrol/pdf/index.html:310 msgid "Create empty background" msgstr "إنشاء خلفية فارغة" -#: pretix/control/templates/pretixcontrol/pdf/index.html:319 +#: pretix/control/templates/pretixcontrol/pdf/index.html:317 msgid "Style" msgstr "قلم المدقة" -#: pretix/control/templates/pretixcontrol/pdf/index.html:321 +#: pretix/control/templates/pretixcontrol/pdf/index.html:319 msgid "Dark" msgstr "داكن" -#: pretix/control/templates/pretixcontrol/pdf/index.html:322 +#: pretix/control/templates/pretixcontrol/pdf/index.html:320 msgid "Light" msgstr "ضوء" -#: pretix/control/templates/pretixcontrol/pdf/index.html:328 +#: pretix/control/templates/pretixcontrol/pdf/index.html:326 #, fuzzy #| msgid "Email content" msgid "Image content" msgstr "البريد الإلكتروني المحتوى" -#: pretix/control/templates/pretixcontrol/pdf/index.html:339 +#: pretix/control/templates/pretixcontrol/pdf/index.html:337 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:20 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:34 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:29 @@ -27723,93 +28083,93 @@ msgstr "البريد الإلكتروني المحتوى" msgid "Content" msgstr "جهة اتصال:" -#: pretix/control/templates/pretixcontrol/pdf/index.html:348 +#: pretix/control/templates/pretixcontrol/pdf/index.html:346 #: pretix/control/templates/pretixcontrol/pdf/placeholders.html:50 msgid "Event attribute:" msgstr "السمة الحدث:" -#: pretix/control/templates/pretixcontrol/pdf/index.html:353 +#: pretix/control/templates/pretixcontrol/pdf/index.html:351 #: pretix/control/templates/pretixcontrol/pdf/placeholders.html:59 #, fuzzy #| msgid "Event attribute:" msgid "Item attribute:" msgstr "السمة الحدث:" -#: pretix/control/templates/pretixcontrol/pdf/index.html:356 +#: pretix/control/templates/pretixcontrol/pdf/index.html:354 msgid "Other… (multilingual)" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:357 +#: pretix/control/templates/pretixcontrol/pdf/index.html:355 msgid "Other…" msgstr "آخر…" -#: pretix/control/templates/pretixcontrol/pdf/index.html:367 +#: pretix/control/templates/pretixcontrol/pdf/index.html:365 #, fuzzy #| msgid "Available placeholders: {list}" msgid "Show available placeholders" msgstr "النائبة المتاحة: {list}" -#: pretix/control/templates/pretixcontrol/pdf/index.html:374 +#: pretix/control/templates/pretixcontrol/pdf/index.html:372 msgid "x (mm)" msgstr "س (مم)" -#: pretix/control/templates/pretixcontrol/pdf/index.html:379 +#: pretix/control/templates/pretixcontrol/pdf/index.html:377 msgid "y (mm)" msgstr "ص (مم)" -#: pretix/control/templates/pretixcontrol/pdf/index.html:398 +#: pretix/control/templates/pretixcontrol/pdf/index.html:396 msgid "Size (mm)" msgstr "حجم (مم)" -#: pretix/control/templates/pretixcontrol/pdf/index.html:405 +#: pretix/control/templates/pretixcontrol/pdf/index.html:403 #, fuzzy #| msgid "Text color" msgid "QR color" msgstr "لون الخط" -#: pretix/control/templates/pretixcontrol/pdf/index.html:420 +#: pretix/control/templates/pretixcontrol/pdf/index.html:418 msgid "Render without whitespace" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:422 +#: pretix/control/templates/pretixcontrol/pdf/index.html:420 msgid "" "Required for consistent size across platforms. Supported on Android starting " "with pretixPRINT 2.3.3 and on Desktop with pretixSCAN 1.9.3." msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:433 +#: pretix/control/templates/pretixcontrol/pdf/index.html:431 msgid "Rotation (°)" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:452 +#: pretix/control/templates/pretixcontrol/pdf/index.html:450 msgid "Font size (pt)" msgstr "حجم الخط (نقطة)" -#: pretix/control/templates/pretixcontrol/pdf/index.html:457 +#: pretix/control/templates/pretixcontrol/pdf/index.html:455 #, fuzzy #| msgid "Light" msgid "Line height" msgstr "ضوء" -#: pretix/control/templates/pretixcontrol/pdf/index.html:464 +#: pretix/control/templates/pretixcontrol/pdf/index.html:462 msgid "Text color" msgstr "لون الخط" -#: pretix/control/templates/pretixcontrol/pdf/index.html:487 +#: pretix/control/templates/pretixcontrol/pdf/index.html:485 msgid "Flow multiple lines downward from specified position" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:541 +#: pretix/control/templates/pretixcontrol/pdf/index.html:539 #, fuzzy #| msgid "Automatically refund money if possible" msgid "Automatically reduce font size to fit content" msgstr "استرد المبلغ تلقائيا إن أمكن الأمر" -#: pretix/control/templates/pretixcontrol/pdf/index.html:547 +#: pretix/control/templates/pretixcontrol/pdf/index.html:545 msgid "Allow long words to be split (preview is not accurate)" msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:558 +#: pretix/control/templates/pretixcontrol/pdf/index.html:556 #, python-format msgid "" "This layout uses new features. If you print from your device, make sure you " @@ -28076,28 +28436,28 @@ msgstr "إضافة نوع تذكرة جديدة" msgid "Add many time slots" msgstr "إضافة نوع تذكرة جديدة" -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:481 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:483 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:266 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:124 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:124 msgid "Add a new quota" msgstr "إضافة حصة جديدة" -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:485 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:128 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:487 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:128 #, fuzzy #| msgid "Price settings" msgid "Product settings" msgstr "ضبط الأسعار" -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:487 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:130 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:489 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:130 msgid "" "These settings are optional, if you leave them empty, the default values " "from the product settings will be used." msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:523 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:166 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:525 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:166 msgid "" "You can choose to either add one or more check-in lists for every date in " "your series individually, or use just one check-in list for all your dates " @@ -28109,9 +28469,9 @@ msgid "" "will be easier." msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:602 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:604 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:359 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:245 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:245 msgid "Add a new check-in list" msgstr "إضافة الاختيار في قائمة جديدة" @@ -28197,16 +28557,43 @@ msgid "" msgstr "" "لا يمكن حذف التواريخ التالية لأنها بالفعل أوامر، ولكن سيتم تعطيل بدلا من ذلك." -#: pretix/control/templates/pretixcontrol/subevents/detail.html:10 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:9 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:13 +#, fuzzy, python-format +#| msgid "Quota: %(name)s" msgctxt "subevent" -msgid "Create date" -msgstr "تاريخ إنشاء" +msgid "Date: %(name)s" +msgstr "الحصة: %(name)s" -#: pretix/control/templates/pretixcontrol/subevents/detail.html:279 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:234 +#, fuzzy +#| msgid "Partially paid" +msgid "partially canceled" +msgstr "مدفوع جزئيا" + +#: pretix/control/templates/pretixcontrol/subevents/detail.html:282 +#, fuzzy +#| msgid "View full log" +msgid "View all" +msgstr "عرض السجل الكامل" + +#: pretix/control/templates/pretixcontrol/subevents/detail.html:289 +#, fuzzy +#| msgid "No archived events found." +msgid "No orders found." +msgstr "لم يتم العثور على الفعاليات في الأرشيف." + +#: pretix/control/templates/pretixcontrol/subevents/detail.html:302 +#: pretix/control/templates/pretixcontrol/subevents/edit.html:279 msgctxt "subevent" msgid "Date history" msgstr "تاريخ التاريخ" +#: pretix/control/templates/pretixcontrol/subevents/edit.html:10 +msgctxt "subevent" +msgid "Create date" +msgstr "تاريخ إنشاء" + #: pretix/control/templates/pretixcontrol/subevents/fragment_unavail_mode_indicator.html:3 #: pretix/control/templates/pretixcontrol/subevents/fragment_unavail_mode_indicator.html:5 #, fuzzy @@ -28258,12 +28645,6 @@ msgctxt "subevent" msgid "Use as a template for many new dates" msgstr "استخدام كنموذج للعديد من مواعيد جديدة" -#: pretix/control/templates/pretixcontrol/subevents/index.html:215 -#: pretix/control/templates/pretixcontrol/vouchers/index.html:212 -#: pretix/control/templates/pretixcontrol/waitinglist/index.html:303 -msgid "Delete selected" -msgstr "احذف المختار" - #: pretix/control/templates/pretixcontrol/subevents/index.html:222 #, fuzzy #| msgid "Disable selected" @@ -29405,20 +29786,21 @@ msgstr "وقد اتسمت تذاكر اختياره إيداعه." msgid "The new check-in list has been created." msgstr "تم إنشاء الاختيار في قائمة جديدة." -#: pretix/control/views/checkin.py:382 pretix/control/views/checkin.py:442 +#: pretix/control/views/checkin.py:382 pretix/control/views/checkin.py:443 #: pretix/control/views/discounts.py:134 pretix/control/views/discounts.py:182 -#: pretix/control/views/event.py:275 pretix/control/views/event.py:578 -#: pretix/control/views/event.py:617 pretix/control/views/event.py:819 -#: pretix/control/views/event.py:1023 pretix/control/views/event.py:1373 -#: pretix/control/views/event.py:1439 pretix/control/views/event.py:1591 -#: pretix/control/views/item.py:282 pretix/control/views/item.py:329 -#: pretix/control/views/item.py:789 pretix/control/views/item.py:815 -#: pretix/control/views/item.py:935 pretix/control/views/item.py:1139 -#: pretix/control/views/item.py:1305 pretix/control/views/item.py:1501 -#: pretix/control/views/organizer.py:281 pretix/control/views/organizer.py:309 -#: pretix/control/views/organizer.py:1454 pretix/control/views/subevents.py:521 -#: pretix/control/views/subevents.py:647 pretix/control/views/subevents.py:1063 -#: pretix/control/views/subevents.py:1525 pretix/control/views/user.py:342 +#: pretix/control/views/event.py:284 pretix/control/views/event.py:587 +#: pretix/control/views/event.py:626 pretix/control/views/event.py:823 +#: pretix/control/views/event.py:1027 pretix/control/views/event.py:1380 +#: pretix/control/views/event.py:1446 pretix/control/views/event.py:1598 +#: pretix/control/views/item.py:287 pretix/control/views/item.py:334 +#: pretix/control/views/item.py:794 pretix/control/views/item.py:820 +#: pretix/control/views/item.py:1054 pretix/control/views/item.py:1106 +#: pretix/control/views/item.py:1310 pretix/control/views/item.py:1476 +#: pretix/control/views/item.py:1668 pretix/control/views/organizer.py:281 +#: pretix/control/views/organizer.py:309 pretix/control/views/organizer.py:1450 +#: pretix/control/views/subevents.py:586 pretix/control/views/subevents.py:740 +#: pretix/control/views/subevents.py:1185 +#: pretix/control/views/subevents.py:1647 pretix/control/views/user.py:342 #: pretix/control/views/user.py:861 pretix/control/views/user.py:901 #: pretix/control/views/vouchers.py:278 pretix/control/views/vouchers.py:352 #: pretix/control/views/vouchers.py:535 pretix/control/views/waitinglist.py:427 @@ -29430,11 +29812,11 @@ msgstr "تم إنشاء الاختيار في قائمة جديدة." msgid "We could not save your changes. See below for details." msgstr "لم نتمكن من حفظ التغييرات الخاصة بك. انظر أدناه للحصول على التفاصيل." -#: pretix/control/views/checkin.py:421 pretix/control/views/checkin.py:458 +#: pretix/control/views/checkin.py:422 pretix/control/views/checkin.py:459 msgid "The requested list does not exist." msgstr "عدم وجود قائمة المطلوب." -#: pretix/control/views/checkin.py:467 +#: pretix/control/views/checkin.py:468 msgid "The selected list has been deleted." msgstr "تم حذف القائمة المحددة." @@ -29523,7 +29905,7 @@ msgstr "اقامة الحدث" #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:117 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:48 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:80 -#: pretix/presale/views/widget.py:475 +#: pretix/presale/views/widget.py:507 msgid "Sale over" msgstr "انتهت فترة البيع" @@ -29531,7 +29913,7 @@ msgstr "انتهت فترة البيع" #: pretix/presale/templates/pretixpresale/fragment_calendar.html:119 #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:125 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:88 -#: pretix/presale/views/widget.py:486 +#: pretix/presale/views/widget.py:518 msgid "Soon" msgstr "هكذا" @@ -29617,10 +29999,10 @@ msgstr "تم إنشاء الموعد الجديد." msgid "The order of discounts has been updated." msgstr "تم تحديث ترتيب العناصر." -#: pretix/control/views/discounts.py:260 pretix/control/views/item.py:192 -#: pretix/control/views/item.py:404 pretix/control/views/item.py:538 -#: pretix/control/views/organizer.py:2645 -#: pretix/control/views/organizer.py:3706 +#: pretix/control/views/discounts.py:260 pretix/control/views/item.py:197 +#: pretix/control/views/item.py:409 pretix/control/views/item.py:543 +#: pretix/control/views/organizer.py:2641 +#: pretix/control/views/organizer.py:3737 #, fuzzy #| msgid "Some of the provided question ids are invalid." msgid "Some of the provided object ids are invalid." @@ -29632,7 +30014,7 @@ msgstr "بعض معرفات السؤال المقدمة غير صالحة." msgid "Not all discounts have been selected." msgstr "تم حذف السؤال." -#: pretix/control/views/event.py:455 +#: pretix/control/views/event.py:464 #, fuzzy #| msgid "You do not have permission to perform this action." msgid "" @@ -29640,55 +30022,55 @@ msgid "" "enabled for the entire organizer account." msgstr "ليس لديك إذن لتنفيذ هذا الإجراء." -#: pretix/control/views/event.py:472 pretix/control/views/organizer.py:716 +#: pretix/control/views/event.py:481 pretix/control/views/organizer.py:717 #, python-brace-format msgid "The plugin {} is now active, you can configure it here:" msgstr "" -#: pretix/control/views/event.py:481 pretix/control/views/organizer.py:725 +#: pretix/control/views/event.py:490 pretix/control/views/organizer.py:726 #, fuzzy, python-brace-format #| msgid "The selected ticket shop is currently not available." msgid "The plugin {} is now active." msgstr "متجر التذاكر المختار غير متوفر حاليا." -#: pretix/control/views/event.py:546 +#: pretix/control/views/event.py:555 msgid "" "This payment provider does not exist or the respective plugin is disabled." msgstr "عدم وجود هذا مزود خدمة الدفع أو تعطيل البرنامج المساعد المعني." -#: pretix/control/views/event.py:858 pretix/control/views/organizer.py:362 +#: pretix/control/views/event.py:862 pretix/control/views/organizer.py:362 #: pretix/control/views/vouchers.py:562 msgid "invalid item" msgstr "البند غير صالح" -#: pretix/control/views/event.py:945 +#: pretix/control/views/event.py:949 #, fuzzy, python-format #| msgid "Your order: {code}" msgid "Your order: %(code)s" msgstr "طلبك هو: {code}" -#: pretix/control/views/event.py:954 +#: pretix/control/views/event.py:958 msgid "Unknown email renderer." msgstr "غير معروف العارض البريد الإلكتروني." -#: pretix/control/views/event.py:970 pretix/control/views/orders.py:684 +#: pretix/control/views/event.py:974 pretix/control/views/orders.py:701 #: pretix/presale/views/order.py:1177 pretix/presale/views/order.py:1184 msgid "You requested an invalid ticket output type." msgstr "لقد طلبت صالح نوع الانتاج التذاكر." -#: pretix/control/views/event.py:1118 +#: pretix/control/views/event.py:1122 msgid "Your shop is live now!" msgstr "متجرك مباشرة الآن!" -#: pretix/control/views/event.py:1126 +#: pretix/control/views/event.py:1130 msgid "We've taken your shop down. You can re-enable it whenever you want!" msgstr "لقد اتخذنا متجر أسفل الخاص بك. يمكنك إعادة تمكينها وقتما تشاء!" -#: pretix/control/views/event.py:1134 +#: pretix/control/views/event.py:1138 msgid "Your shop is now in test mode!" msgstr "متجر الخاص بك هو الآن في وضع الاختبار!" -#: pretix/control/views/event.py:1151 +#: pretix/control/views/event.py:1158 msgid "" "An order could not be deleted as some constraints (e.g. data created by plug-" "ins) do not allow it." @@ -29696,19 +30078,19 @@ msgstr "" "لا يمكن حذف أمر وبعض القيود (مثل البيانات التي تم إنشاؤها من قبل المكونات " "الإضافية) لا تسمح بذلك." -#: pretix/control/views/event.py:1157 +#: pretix/control/views/event.py:1164 msgid "We've disabled test mode for you. Let's sell some real tickets!" msgstr "لقد تعطيل وضع الاختبار بالنسبة لك. دعونا بيع بعض التذاكر الحقيقية!" -#: pretix/control/views/event.py:1179 +#: pretix/control/views/event.py:1186 msgid "This event can not be deleted." msgstr "لا يمكن حذف هذا الحدث." -#: pretix/control/views/event.py:1202 +#: pretix/control/views/event.py:1209 msgid "The event has been deleted." msgstr "الحدث تم الغائه." -#: pretix/control/views/event.py:1205 +#: pretix/control/views/event.py:1212 msgid "" "The event could not be deleted as some constraints (e.g. data created by " "plug-ins) do not allow it." @@ -29716,47 +30098,47 @@ msgstr "" "لا يمكن حذف الحدث عن بعض القيود (مثل البيانات التي تم إنشاؤها من قبل " "المكونات الإضافية) لا تسمح بذلك." -#: pretix/control/views/event.py:1221 +#: pretix/control/views/event.py:1228 #, python-brace-format msgid "" "Specifically, the following plugins still contain data depends on this " "event: {plugin_names}" msgstr "" -#: pretix/control/views/event.py:1301 pretix/control/views/orders.py:777 +#: pretix/control/views/event.py:1308 pretix/control/views/orders.py:781 msgid "The comment has been updated." msgstr "تم تحديث التعليق." -#: pretix/control/views/event.py:1303 pretix/control/views/orders.py:779 +#: pretix/control/views/event.py:1310 pretix/control/views/orders.py:783 msgid "Could not update the comment." msgstr "لا يمكن تحديث للتعليق." -#: pretix/control/views/event.py:1331 pretix/control/views/main.py:362 +#: pretix/control/views/event.py:1338 pretix/control/views/main.py:362 msgid "VAT" msgstr "ضريبة" -#: pretix/control/views/event.py:1367 +#: pretix/control/views/event.py:1374 msgid "The new tax rule has been created." msgstr "تم إنشاء القاعدة الضريبية الجديدة." -#: pretix/control/views/event.py:1390 pretix/control/views/event.py:1453 -#: pretix/control/views/event.py:1499 +#: pretix/control/views/event.py:1397 pretix/control/views/event.py:1460 +#: pretix/control/views/event.py:1506 msgid "The requested tax rule does not exist." msgstr "عدم وجود حكم الضرائب المطلوبة." -#: pretix/control/views/event.py:1508 +#: pretix/control/views/event.py:1515 msgid "The selected tax rule has been deleted." msgstr "تم حذف قاعدة الضريبة المحدد." -#: pretix/control/views/event.py:1510 +#: pretix/control/views/event.py:1517 msgid "The selected tax rule can not be deleted." msgstr "لا يمكن حذف القاعدة الضريبية المحدد." -#: pretix/control/views/event.py:1561 +#: pretix/control/views/event.py:1568 msgid "Your event is not empty, you need to set it up manually." msgstr "لم يتم تفريغ هذا الحدث الخاص بك، تحتاج إلى إعداده يدويا." -#: pretix/control/views/event.py:1696 +#: pretix/control/views/event.py:1703 msgid "" "Your changes have been saved. You can now go on with looking at the details " "or take your event live to start selling!" @@ -29764,11 +30146,11 @@ msgstr "" "تم حفظ التغييرات. يمكنك الذهاب الآن فصاعدا مع النظر في التفاصيل أو يأخذ " "الحدث على الهواء مباشرة لبدء بيع!" -#: pretix/control/views/event.py:1717 +#: pretix/control/views/event.py:1724 msgid "Regular ticket" msgstr "تذكرة العادية" -#: pretix/control/views/event.py:1722 +#: pretix/control/views/event.py:1729 msgid "Reduced ticket" msgstr "تذكرة مخفضة" @@ -29848,119 +30230,126 @@ msgid "" "plugin \"{plugin}\" with license \"{license}\"." msgstr "" -#: pretix/control/views/item.py:141 pretix/control/views/item.py:1606 +#: pretix/control/views/item.py:146 pretix/control/views/item.py:1773 msgid "The requested product does not exist." msgstr "المنتج المطلوب غير موجود." -#: pretix/control/views/item.py:159 +#: pretix/control/views/item.py:164 msgid "The order of items has been updated." msgstr "تم تحديث ترتيب العناصر." -#: pretix/control/views/item.py:227 pretix/control/views/item.py:262 -#: pretix/control/views/item.py:353 +#: pretix/control/views/item.py:232 pretix/control/views/item.py:267 +#: pretix/control/views/item.py:358 msgid "The requested product category does not exist." msgstr "لا وجود فئة من فئات المنتجات المطلوبة." -#: pretix/control/views/item.py:238 +#: pretix/control/views/item.py:243 msgid "The selected category has been deleted." msgstr "تم حذف الفئة المختارة." -#: pretix/control/views/item.py:323 +#: pretix/control/views/item.py:328 msgid "The new category has been created." msgstr "تم إنشاء فئة جديدة." -#: pretix/control/views/item.py:371 +#: pretix/control/views/item.py:376 msgid "The order of categories has been updated." msgstr "تم تحديث ترتيب الفئات." -#: pretix/control/views/item.py:407 pretix/control/views/item.py:541 -#: pretix/control/views/organizer.py:2648 -#: pretix/control/views/organizer.py:3709 +#: pretix/control/views/item.py:412 pretix/control/views/item.py:546 +#: pretix/control/views/organizer.py:2644 +#: pretix/control/views/organizer.py:3740 #, fuzzy #| msgid "The question has been deleted." msgid "Not all objects have been selected." msgstr "تم حذف السؤال." -#: pretix/control/views/item.py:480 +#: pretix/control/views/item.py:485 #, fuzzy #| msgid "Street address" msgid "Street" msgstr "عنوان الشارع" -#: pretix/control/views/item.py:582 pretix/control/views/item.py:743 -#: pretix/control/views/item.py:765 +#: pretix/control/views/item.py:587 pretix/control/views/item.py:748 +#: pretix/control/views/item.py:770 msgid "The requested question does not exist." msgstr "عدم وجود مسألة المطلوبة." -#: pretix/control/views/item.py:600 +#: pretix/control/views/item.py:605 msgid "The selected question has been deleted." msgstr "تم حذف السؤال المحدد." -#: pretix/control/views/item.py:690 +#: pretix/control/views/item.py:695 msgid "File uploaded" msgstr "ملف مرفوع" -#: pretix/control/views/item.py:824 +#: pretix/control/views/item.py:829 msgid "The new question has been created." msgstr "تم إنشاء سؤالا جديدا." -#: pretix/control/views/item.py:903 +#: pretix/control/views/item.py:918 +#, fuzzy +#| msgctxt "subevent" +#| msgid "The selected dates have been deleted or disabled." +msgid "The selected quotas have been deleted or disabled." +msgstr "تم حذف المواعيد المحددة أو تعطيل." + +#: pretix/control/views/item.py:1074 msgid "The new quota has been created." msgstr "تم إنشاء نظام الحصص الجديدة." -#: pretix/control/views/item.py:966 +#: pretix/control/views/item.py:1137 #, fuzzy #| msgid "First scanned: %(date)s" msgid "Exit scans" msgstr "الممسوحة ضوئيا أولا: %(date)s" -#: pretix/control/views/item.py:973 +#: pretix/control/views/item.py:1144 msgid "Vouchers and waiting list reservations" msgstr "القسائم وانتظار التحفظات القائمة" -#: pretix/control/views/item.py:988 +#: pretix/control/views/item.py:1159 msgid "Available quota" msgstr "الحصة المتاحة" -#: pretix/control/views/item.py:994 +#: pretix/control/views/item.py:1165 msgid "Waiting list (pending)" msgstr "قائمة الانتظار (انتظار)" -#: pretix/control/views/item.py:1001 +#: pretix/control/views/item.py:1172 msgid "Currently for sale" msgstr "للبيع حاليا" -#: pretix/control/views/item.py:1055 pretix/control/views/item.py:1101 -#: pretix/control/views/item.py:1155 +#: pretix/control/views/item.py:1226 pretix/control/views/item.py:1272 +#: pretix/control/views/item.py:1326 msgid "The requested quota does not exist." msgstr "عدم وجود الحصص المطلوبة." -#: pretix/control/views/item.py:1076 +#: pretix/control/views/item.py:1247 msgid "The quota has been re-opened and will not close again." msgstr "وكانت الحصة إعادة فتحها وسوف يتم إغلاق مرة أخرى." -#: pretix/control/views/item.py:1169 +#: pretix/control/views/item.py:1340 msgid "The selected quota has been deleted." msgstr "تم حذف حصص المحدد." -#: pretix/control/views/item.py:1192 +#: pretix/control/views/item.py:1363 msgid "The requested item does not exist." msgstr "عدم وجود العنصر المطلوب." -#: pretix/control/views/item.py:1364 +#: pretix/control/views/item.py:1535 msgid "" "You cannot add add-ons to a product that is only available as an add-on " "itself." msgstr "" "لا يمكنك إضافة من الإضافات إلى المنتجات التي لا تتوفر إلا كإضافة على نفسها." -#: pretix/control/views/item.py:1374 +#: pretix/control/views/item.py:1545 msgid "" "You cannot add bundles to a product that is only available as an add-on " "itself." msgstr "لا يمكنك إضافة حزم إلى المنتجات التي لا تتوفر إلا كإضافة على نفسها." -#: pretix/control/views/item.py:1517 +#: pretix/control/views/item.py:1684 msgid "" "You disabled this item, but it is still part of a product bundle. Your " "participants won't be able to buy the bundle unless you remove this item " @@ -29969,7 +30358,7 @@ msgstr "" "قمت بتعطيل هذا البند، لكنه لا يزال جزءا من حزمة المنتج. سيقوم المشاركون " "الخاصة بك لن تكون قادرة على شراء حزمة إلا إذا قمت بإزالة هذا البند من ذلك." -#: pretix/control/views/item.py:1626 +#: pretix/control/views/item.py:1793 #, fuzzy #| msgid "" #| "The order could not be deleted as some constraints (e.g. data created by " @@ -29982,11 +30371,11 @@ msgstr "" "لا يمكن حذف النظام كما بعض القيود (مثل البيانات التي تم إنشاؤها من قبل " "المكونات الإضافية) لا تسمح بذلك." -#: pretix/control/views/item.py:1630 +#: pretix/control/views/item.py:1797 msgid "The selected product has been deleted." msgstr "تم حذف المنتج المحدد." -#: pretix/control/views/item.py:1639 +#: pretix/control/views/item.py:1806 msgid "The selected product has been deactivated." msgstr "تم إلغاء تنشيط المنتج المحدد." @@ -30126,33 +30515,33 @@ msgstr "" msgid "Access for the selected application has been revoked." msgstr "تم إبطال وصول التطبيق المحدد." -#: pretix/control/views/orders.py:196 +#: pretix/control/views/orders.py:197 #, fuzzy #| msgid "We could not save your changes. See below for details." msgid "We could not process your input. See below for details." msgstr "لم نتمكن من حفظ التغييرات الخاصة بك. انظر أدناه للحصول على التفاصيل." -#: pretix/control/views/orders.py:269 +#: pretix/control/views/orders.py:270 #, python-brace-format msgid "" "Successfully executed the action \"{label}\" on {success} of {total} orders." msgstr "" -#: pretix/control/views/orders.py:686 pretix/presale/views/order.py:114 +#: pretix/control/views/orders.py:703 pretix/presale/views/order.py:114 #: pretix/presale/views/order.py:382 pretix/presale/views/order.py:1006 -#: pretix/presale/views/order.py:1186 pretix/presale/views/order.py:1797 +#: pretix/presale/views/order.py:1186 pretix/presale/views/order.py:1794 msgid "Unknown order code or not authorized to access this order." msgstr "كود أجل غير معروف أو غير مخول للوصول إلى هذا النظام." -#: pretix/control/views/orders.py:688 pretix/presale/views/order.py:1191 +#: pretix/control/views/orders.py:705 pretix/presale/views/order.py:1191 msgid "Ticket download is not enabled for this product." msgstr "لم يتم تمكين حمل تذكرة لهذا المنتج." -#: pretix/control/views/orders.py:813 +#: pretix/control/views/orders.py:817 msgid "The order has been deleted." msgstr "تم حذف هذا الأمر." -#: pretix/control/views/orders.py:820 +#: pretix/control/views/orders.py:824 msgid "" "The order could not be deleted as some constraints (e.g. data created by " "plug-ins) do not allow it." @@ -30160,55 +30549,55 @@ msgstr "" "لا يمكن حذف النظام كما بعض القيود (مثل البيانات التي تم إنشاؤها من قبل " "المكونات الإضافية) لا تسمح بذلك." -#: pretix/control/views/orders.py:828 +#: pretix/control/views/orders.py:832 msgid "Only orders created in test mode can be deleted." msgstr "أوامر الوحيدة التي تم إنشاؤها في وضع الاختبار يمكن حذفها." -#: pretix/control/views/orders.py:849 +#: pretix/control/views/orders.py:853 msgid "The order has been denied and is therefore now canceled." msgstr "تم رفض الطلب، وبالتالي يتم إلغاء الآن." -#: pretix/control/views/orders.py:889 +#: pretix/control/views/orders.py:893 msgid "This payment has been canceled." msgstr "تم إلغاء هذا الدفع." -#: pretix/control/views/orders.py:891 +#: pretix/control/views/orders.py:895 msgid "This payment can not be canceled at the moment." msgstr "لا يمكن إلغاء هذه الدفعة في الوقت الراهن." -#: pretix/control/views/orders.py:917 +#: pretix/control/views/orders.py:921 msgid "The refund has been canceled." msgstr "تم إلغاء استرداد." -#: pretix/control/views/orders.py:919 +#: pretix/control/views/orders.py:923 msgid "This refund can not be canceled at the moment." msgstr "لا يمكن إلغاء هذا رد في الوقت الراهن." -#: pretix/control/views/orders.py:953 +#: pretix/control/views/orders.py:957 msgid "The refund has been processed." msgstr "تم معالجة استرداد." -#: pretix/control/views/orders.py:955 pretix/control/views/orders.py:981 +#: pretix/control/views/orders.py:959 pretix/control/views/orders.py:985 msgid "This refund can not be processed at the moment." msgstr "لا يمكن معالجة هذا رد في الوقت الراهن." -#: pretix/control/views/orders.py:979 +#: pretix/control/views/orders.py:983 msgid "The refund has been marked as done." msgstr "تم وضع علامة على المبلغ في القيام به." -#: pretix/control/views/orders.py:1005 +#: pretix/control/views/orders.py:1009 #, fuzzy #| msgid "The device has been verified and can now be used." msgid "The request has been removed. If you want, you can now inform the user." msgstr "تم التحقق من الجهاز ويمكن الآن أن تستخدم." -#: pretix/control/views/orders.py:1012 +#: pretix/control/views/orders.py:1016 #, fuzzy #| msgid "Cancellation fee" msgid "Your cancellation request" msgstr "رسوم الإلغاء" -#: pretix/control/views/orders.py:1013 +#: pretix/control/views/orders.py:1017 #, python-brace-format msgid "" "Hello,\n" @@ -30224,41 +30613,41 @@ msgstr "" "\n" "فريق فعاليتك{event}" -#: pretix/control/views/orders.py:1068 +#: pretix/control/views/orders.py:1072 msgid "The payment has been marked as complete." msgstr "تم وضع علامة الدفع على النحو الكامل." -#: pretix/control/views/orders.py:1070 +#: pretix/control/views/orders.py:1074 msgid "This payment can not be confirmed at the moment." msgstr "لا يمكن تأكيد هذه الدفعة في الوقت الراهن." -#: pretix/control/views/orders.py:1161 +#: pretix/control/views/orders.py:1165 msgid "" "The refund was prevented due to a refund already being processed at the same " "time. Please have a look at the order details and check if your refund is " "still necessary." msgstr "" -#: pretix/control/views/orders.py:1266 +#: pretix/control/views/orders.py:1270 #, fuzzy #| msgid "You entered an order that could not be found." msgid "You entered an order in an event with a different currency." msgstr "لقد أدخلت طلبا لا يمكن العثور عليه." -#: pretix/control/views/orders.py:1317 +#: pretix/control/views/orders.py:1321 msgid "" "You can not refund more than the amount of a payment that is not yet " "refunded." msgstr "لا يمكنك استرداد أكثر من مبلغ الدفعة التي لم يتم ردها حتى الان." -#: pretix/control/views/orders.py:1322 +#: pretix/control/views/orders.py:1326 msgid "" "You selected a partial refund for a payment method that only supports full " "refunds." msgstr "" "لقد حددت استرداد جزئي لطريقة الدفع التي تدعم فقط المبالغ المستردة كامل." -#: pretix/control/views/orders.py:1352 +#: pretix/control/views/orders.py:1356 #, python-brace-format msgid "" "One of the refunds failed to be processed. You should retry to refund in a " @@ -30267,12 +30656,12 @@ msgstr "" "فشل في معالجتها واحدة من المبالغ المستردة. يجب عليك إعادة المحاولة لاسترداد " "بطريقة مختلفة. وكانت رسالة الخطأ: {}" -#: pretix/control/views/orders.py:1358 +#: pretix/control/views/orders.py:1362 #, python-brace-format msgid "A refund of {} has been processed." msgstr "وقد تم تجهيز واسترداد {}." -#: pretix/control/views/orders.py:1362 +#: pretix/control/views/orders.py:1366 #, python-brace-format msgid "" "A refund of {} has been saved, but not yet fully executed. You can mark it " @@ -30281,16 +30670,16 @@ msgstr "" "تم حفظ استرداد {}، ولكن لم يتم تنفيذها بالكامل. يمكنك وضع علامة على أنها " "كاملة أدناه." -#: pretix/control/views/orders.py:1391 +#: pretix/control/views/orders.py:1395 msgid "" "A new gift card was created. You can now send the user their gift card code." msgstr "" -#: pretix/control/views/orders.py:1399 +#: pretix/control/views/orders.py:1403 msgid "Your gift card code" msgstr "" -#: pretix/control/views/orders.py:1401 +#: pretix/control/views/orders.py:1405 #, python-brace-format msgid "" "Hello,\n" @@ -30303,15 +30692,15 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/control/views/orders.py:1412 +#: pretix/control/views/orders.py:1416 msgid "The refunds you selected do not match the selected total refund amount." msgstr "المبالغ المستردة التي حددتها لا تتطابق إجمالي استرداد المبلغ المحدد." -#: pretix/control/views/orders.py:1542 +#: pretix/control/views/orders.py:1546 msgid "The payment has been created successfully." msgstr "تم إنشاء دفع بنجاح." -#: pretix/control/views/orders.py:1556 +#: pretix/control/views/orders.py:1560 msgid "" "The order has been canceled. You can now select how you want to transfer the " "money back to the user." @@ -30319,22 +30708,22 @@ msgstr "" "تم إلغاء هذا الأمر. يمكنك الآن تحديد كيف تريد لنقل الجزء الخلفي المال " "للمستخدم." -#: pretix/control/views/orders.py:1627 pretix/control/views/orders.py:1631 +#: pretix/control/views/orders.py:1631 pretix/control/views/orders.py:1635 msgid "No VAT ID specified." msgstr "يتم تحديد معرف ضريبة القيمة المضافة." -#: pretix/control/views/orders.py:1635 +#: pretix/control/views/orders.py:1639 msgid "No country specified." msgstr "تحديد أي بلد." -#: pretix/control/views/orders.py:1639 +#: pretix/control/views/orders.py:1643 #, fuzzy #| msgid "" #| "VAT ID could not be checked since a non-EU country has been specified." msgid "VAT ID could not be checked since this country is not supported." msgstr "ولم يتسن التحقق VAT ID منذ تم تحديد بلد خارج الاتحاد الأوروبي." -#: pretix/control/views/orders.py:1658 +#: pretix/control/views/orders.py:1662 msgid "" "The VAT ID could not be checked, as the VAT checking service of the country " "is currently not available." @@ -30342,74 +30731,74 @@ msgstr "" "ولم يتسن التحقق من هوية ضريبة القيمة المضافة، مثل خدمة فحص ضريبة القيمة " "المضافة من البلاد غير متوفرة حاليا." -#: pretix/control/views/orders.py:1661 +#: pretix/control/views/orders.py:1665 msgid "This VAT ID is valid." msgstr "هذا ID VAT صالح." -#: pretix/control/views/orders.py:1675 pretix/control/views/orders.py:1709 -#: pretix/control/views/orders.py:1741 +#: pretix/control/views/orders.py:1679 pretix/control/views/orders.py:1713 +#: pretix/control/views/orders.py:1745 msgid "Unknown invoice." msgstr "فاتورة غير معروفة." -#: pretix/control/views/orders.py:1678 +#: pretix/control/views/orders.py:1682 msgid "Invoices may not be changed after they are created." msgstr "" -#: pretix/control/views/orders.py:1680 +#: pretix/control/views/orders.py:1684 msgid "Invoices may not be changed after they are transmitted." msgstr "" -#: pretix/control/views/orders.py:1682 pretix/control/views/orders.py:1744 +#: pretix/control/views/orders.py:1686 pretix/control/views/orders.py:1748 msgid "The invoice has already been canceled." msgstr "وقد تم بالفعل إلغاء الفاتورة." -#: pretix/control/views/orders.py:1684 +#: pretix/control/views/orders.py:1688 #, fuzzy #| msgid "The invoice has already been canceled." msgid "The invoice file has already been exported." msgstr "وقد تم بالفعل إلغاء الفاتورة." -#: pretix/control/views/orders.py:1686 +#: pretix/control/views/orders.py:1690 #, fuzzy #| msgid "The invoice has been regenerated." msgid "The invoice file is too old to be regenerated." msgstr "تم إعادة إنشاء الفاتورة." -#: pretix/control/views/orders.py:1688 pretix/control/views/orders.py:1746 +#: pretix/control/views/orders.py:1692 pretix/control/views/orders.py:1750 msgid "The invoice has been cleaned of personal data." msgstr "وقد تم تنظيف الفاتورة البيانات الشخصية." -#: pretix/control/views/orders.py:1713 +#: pretix/control/views/orders.py:1717 msgid "" "The invoice is currently being transmitted. You can start a new attempt " "after the current one has been completed." msgstr "" -#: pretix/control/views/orders.py:1720 +#: pretix/control/views/orders.py:1724 #, fuzzy #| msgid "The invoice has been cleaned of personal data." msgid "The invoice has been scheduled for retransmission." msgstr "وقد تم تنظيف الفاتورة البيانات الشخصية." -#: pretix/control/views/orders.py:1754 +#: pretix/control/views/orders.py:1758 #, fuzzy #| msgid "The invoice has already been canceled." msgid "The invoice has been canceled." msgstr "وقد تم بالفعل إلغاء الفاتورة." -#: pretix/control/views/orders.py:1793 +#: pretix/control/views/orders.py:1797 msgid "The email has been queued to be sent." msgstr "وقد تم في قائمة الانتظار البريد الإلكتروني لإرسالها." -#: pretix/control/views/orders.py:1817 pretix/presale/views/order.py:1369 +#: pretix/control/views/orders.py:1821 pretix/presale/views/order.py:1365 msgid "This invoice has not been found" msgstr "لم يتم العثور على هذه الفاتورة" -#: pretix/control/views/orders.py:1824 pretix/presale/views/order.py:1376 +#: pretix/control/views/orders.py:1828 pretix/presale/views/order.py:1372 msgid "The invoice file is no longer stored on the server." msgstr "لم يعد تخزين الملف فاتورة على الخادم." -#: pretix/control/views/orders.py:1829 pretix/presale/views/order.py:1381 +#: pretix/control/views/orders.py:1833 pretix/presale/views/order.py:1377 msgid "" "The invoice file has not yet been generated, we will generate it for you " "now. Please try again in a few seconds." @@ -30417,85 +30806,85 @@ msgstr "" "لم يتم إنشاء ملف الفاتورة، وسوف تولد لانها لكم الآن. يرجى المحاولة مرة أخرى " "في بضع ثوان." -#: pretix/control/views/orders.py:1857 +#: pretix/control/views/orders.py:1861 msgid "The payment term has been changed." msgstr "تم تغيير مصطلح الدفع." -#: pretix/control/views/orders.py:1862 pretix/control/views/orders.py:1919 +#: pretix/control/views/orders.py:1866 pretix/control/views/orders.py:1923 msgid "" "We were not able to process the request completely as the server was too " "busy." msgstr "لم نكن قادرين على معالجة الطلب تماما كما كان الملقم مشغول جدا." -#: pretix/control/views/orders.py:1870 +#: pretix/control/views/orders.py:1874 msgid "This action is only allowed for pending orders." msgstr "يسمح هذا الإجراء فقط لانتظار أوامر." -#: pretix/control/views/orders.py:1925 +#: pretix/control/views/orders.py:1929 #, fuzzy #| msgid "This action is only allowed for pending orders." msgid "This action is only allowed for canceled orders." msgstr "يسمح هذا الإجراء فقط لانتظار أوامر." -#: pretix/control/views/orders.py:2183 pretix/presale/views/order.py:1664 +#: pretix/control/views/orders.py:2188 pretix/presale/views/order.py:1661 msgid "An error occurred. Please see the details below." msgstr "حدث خطأ. يرجى الاطلاع على التفاصيل أدناه." -#: pretix/control/views/orders.py:2191 +#: pretix/control/views/orders.py:2196 msgid "The order has been changed and the user has been notified." msgstr "تم تغيير النظام وتم إعلام المستخدم." -#: pretix/control/views/orders.py:2193 pretix/control/views/orders.py:2329 -#: pretix/control/views/orders.py:2366 pretix/presale/views/order.py:1700 +#: pretix/control/views/orders.py:2198 pretix/control/views/orders.py:2334 +#: pretix/control/views/orders.py:2371 pretix/presale/views/order.py:1697 msgid "The order has been changed." msgstr "تم تغيير النظام." -#: pretix/control/views/orders.py:2220 pretix/presale/checkoutflow.py:943 +#: pretix/control/views/orders.py:2225 pretix/presale/checkoutflow.py:964 #: pretix/presale/views/order.py:845 pretix/presale/views/order.py:981 msgid "" "We had difficulties processing your input. Please review the errors below." msgstr "كان لدينا صعوبات معالجة المدخلات الخاصة بك. يرجى مراجعة الأخطاء أدناه." -#: pretix/control/views/orders.py:2331 +#: pretix/control/views/orders.py:2336 msgid "Nothing about the order had to be changed." msgstr "كان شيئا عن هذا الأمر يجب أن يتغير." -#: pretix/control/views/orders.py:2412 pretix/plugins/sendmail/views.py:176 +#: pretix/control/views/orders.py:2417 pretix/plugins/sendmail/views.py:176 msgid "We could not send the email. See below for details." msgstr "لم نتمكن من إرسال البريد الإلكتروني. انظر أدناه للحصول على التفاصيل." -#: pretix/control/views/orders.py:2428 pretix/control/views/orders.py:2492 +#: pretix/control/views/orders.py:2433 pretix/control/views/orders.py:2497 #: pretix/plugins/sendmail/views.py:204 pretix/plugins/sendmail/views.py:671 #, python-brace-format msgid "Subject: {subject}" msgstr "الموضوع: {subject}" -#: pretix/control/views/orders.py:2446 pretix/control/views/orders.py:2511 +#: pretix/control/views/orders.py:2451 pretix/control/views/orders.py:2516 #, python-brace-format msgid "Your message has been queued and will be sent to {}." msgstr "وقد اصطف رسالتك وسوف يتم ارسالهم الى {}." -#: pretix/control/views/orders.py:2564 pretix/presale/views/order.py:1151 +#: pretix/control/views/orders.py:2569 pretix/presale/views/order.py:1151 msgid "" "This link is no longer valid. Please go back, refresh the page, and try " "again." msgstr "هذا الرابط لم يعد صالحا. يرجى العودة، بتحديث الصفحة وحاول مرة أخرى." -#: pretix/control/views/orders.py:2645 +#: pretix/control/views/orders.py:2650 msgid "There is no order with the given order code." msgstr "لا يوجد أي ترتيب مع رمز ترتيب معين." -#: pretix/control/views/orders.py:2754 pretix/control/views/organizer.py:2088 +#: pretix/control/views/orders.py:2759 pretix/control/views/organizer.py:2084 msgid "The selected exporter was not found." msgstr "لم يتم العثور على مصدر المحدد." -#: pretix/control/views/orders.py:2764 pretix/control/views/organizer.py:2098 +#: pretix/control/views/orders.py:2769 pretix/control/views/organizer.py:2094 msgid "There was a problem processing your input. See below for error details." msgstr "" "كانت هناك مشكلة معالجة المدخلات الخاصة بك. انظر أدناه للحصول على تفاصيل " "الخطأ." -#: pretix/control/views/orders.py:2801 pretix/control/views/organizer.py:2134 +#: pretix/control/views/orders.py:2806 pretix/control/views/organizer.py:2130 #, fuzzy #| msgid "You do not have permission to perform this action." msgid "" @@ -30503,7 +30892,7 @@ msgid "" "therefore you cannot change it." msgstr "ليس لديك إذن لتنفيذ هذا الإجراء." -#: pretix/control/views/orders.py:2810 pretix/control/views/organizer.py:2143 +#: pretix/control/views/orders.py:2815 pretix/control/views/organizer.py:2139 #, fuzzy #| msgid "You do not have permission to perform this action." msgid "" @@ -30511,24 +30900,24 @@ msgid "" "therefore you cannot schedule it." msgstr "ليس لديك إذن لتنفيذ هذا الإجراء." -#: pretix/control/views/orders.py:2826 pretix/control/views/organizer.py:2159 +#: pretix/control/views/orders.py:2831 pretix/control/views/organizer.py:2155 #, python-brace-format msgid "" "Your export schedule has been saved. The next export will start around " "{datetime}." msgstr "" -#: pretix/control/views/orders.py:2831 pretix/control/views/organizer.py:2164 +#: pretix/control/views/orders.py:2836 pretix/control/views/organizer.py:2160 msgid "Your export schedule has been saved, but no next export is planned." msgstr "" -#: pretix/control/views/orders.py:2876 pretix/control/views/organizer.py:2210 +#: pretix/control/views/orders.py:2881 pretix/control/views/organizer.py:2206 #, fuzzy, python-brace-format #| msgid "Export date" msgid "Export: {title}" msgstr "تاريخ التصدير" -#: pretix/control/views/orders.py:2877 pretix/control/views/organizer.py:2212 +#: pretix/control/views/orders.py:2882 pretix/control/views/organizer.py:2208 #, python-brace-format msgid "" "Hello,\n" @@ -30536,27 +30925,27 @@ msgid "" "attached to this email, you can find a new scheduled report for {name}." msgstr "" -#: pretix/control/views/orders.py:2983 pretix/control/views/organizer.py:2346 +#: pretix/control/views/orders.py:2988 pretix/control/views/organizer.py:2342 msgid "" "Your export is queued to start soon. The results will be send via email. " "Depending on system load and type and size of export, this may take a few " "minutes." msgstr "" -#: pretix/control/views/orders.py:3070 pretix/control/views/orders.py:3151 +#: pretix/control/views/orders.py:3075 pretix/control/views/orders.py:3156 #, fuzzy #| msgid "The order has been canceled." msgid "All orders have been canceled." msgstr "تم إلغاء هذا الأمر." -#: pretix/control/views/orders.py:3072 pretix/control/views/orders.py:3153 +#: pretix/control/views/orders.py:3077 pretix/control/views/orders.py:3158 #, python-brace-format msgid "" "The orders have been canceled. An error occurred with {count} orders, please " "check all uncanceled orders." msgstr "" -#: pretix/control/views/orders.py:3100 pretix/control/views/orders.py:3174 +#: pretix/control/views/orders.py:3105 pretix/control/views/orders.py:3179 #, fuzzy #| msgid "Your input was invalid, please try again." msgid "Your input was not valid." @@ -30597,60 +30986,66 @@ msgstr "تم إنشاء منظم جديد." msgid "Administrators" msgstr "المسؤولين" -#: pretix/control/views/organizer.py:806 +#: pretix/control/views/organizer.py:800 #, fuzzy #| msgid "Unknown plugin: '{name}'." msgid "Unknown plugin." msgstr "إضافة غير معروفة: '{name}'." -#: pretix/control/views/organizer.py:812 +#: pretix/control/views/organizer.py:805 #, fuzzy #| msgid "The selected ticket shop is currently not available." msgid "This plugin is currently not active on the organizer account." msgstr "متجر التذاكر المختار غير متوفر حاليا." -#: pretix/control/views/organizer.py:816 +#: pretix/control/views/organizer.py:809 #, fuzzy #| msgid "A payment is currently pending for this order." msgid "This plugin is currently not allowed for this organizer account." msgstr "دفعة سداد معلقة حاليا لهذا الطلب." -#: pretix/control/views/organizer.py:905 +#: pretix/control/views/organizer.py:832 +#, fuzzy, python-brace-format +#| msgid "This plugin cannot be enabled for the following reasons:" +msgid "This plugin cannot be activated for event {}." +msgstr "هذا البرنامج المساعد لا يمكن تمكين للأسباب التالية:" + +#: pretix/control/views/organizer.py:901 msgid "The team has been created. You can now add members to the team." msgstr "تم إنشاء فريق. يمكنك الآن إضافة أعضاء للفريق." -#: pretix/control/views/organizer.py:913 pretix/control/views/organizer.py:946 -#: pretix/control/views/organizer.py:1182 -#: pretix/control/views/organizer.py:1270 -#: pretix/control/views/organizer.py:1341 -#: pretix/control/views/organizer.py:1560 -#: pretix/control/views/organizer.py:1603 -#: pretix/control/views/organizer.py:2394 -#: pretix/control/views/organizer.py:2429 -#: pretix/control/views/organizer.py:2535 -#: pretix/control/views/organizer.py:2566 -#: pretix/control/views/organizer.py:2728 -#: pretix/control/views/organizer.py:2763 -#: pretix/control/views/organizer.py:2837 -#: pretix/control/views/organizer.py:2879 -#: pretix/control/views/organizer.py:2959 -#: pretix/control/views/organizer.py:3009 -#: pretix/control/views/organizer.py:3571 -#: pretix/control/views/organizer.py:3615 +#: pretix/control/views/organizer.py:909 pretix/control/views/organizer.py:942 +#: pretix/control/views/organizer.py:1178 +#: pretix/control/views/organizer.py:1266 +#: pretix/control/views/organizer.py:1337 +#: pretix/control/views/organizer.py:1556 +#: pretix/control/views/organizer.py:1599 +#: pretix/control/views/organizer.py:2390 +#: pretix/control/views/organizer.py:2425 +#: pretix/control/views/organizer.py:2531 +#: pretix/control/views/organizer.py:2562 +#: pretix/control/views/organizer.py:2724 +#: pretix/control/views/organizer.py:2759 +#: pretix/control/views/organizer.py:2833 +#: pretix/control/views/organizer.py:2877 +#: pretix/control/views/organizer.py:2957 +#: pretix/control/views/organizer.py:3007 +#: pretix/control/views/organizer.py:3602 +#: pretix/control/views/organizer.py:3646 msgid "Your changes could not be saved." msgstr "لا يمكن حفظ التغييرات الخاصة بك." -#: pretix/control/views/organizer.py:980 +#: pretix/control/views/organizer.py:976 msgid "The selected team cannot be deleted." msgstr "لا يمكن حذف الفريق المحدد." -#: pretix/control/views/organizer.py:992 +#: pretix/control/views/organizer.py:988 msgid "" "The team could not be deleted because the team or one of its API tokens is " "part of historical audit logs." msgstr "" -#: pretix/control/views/organizer.py:1000 +#: pretix/control/views/organizer.py:996 #, fuzzy #| msgid "" #| "The event could not be deleted as some constraints (e.g. data created by " @@ -30662,11 +31057,11 @@ msgstr "" "لا يمكن حذف الحدث عن بعض القيود (مثل البيانات التي تم إنشاؤها من قبل " "المكونات الإضافية) لا تسمح بذلك." -#: pretix/control/views/organizer.py:1006 +#: pretix/control/views/organizer.py:1002 msgid "The selected team has been deleted." msgstr "تم حذف فريق المحدد." -#: pretix/control/views/organizer.py:1069 +#: pretix/control/views/organizer.py:1065 msgid "" "You cannot remove the last member from this team as no one would be left " "with the permission to change teams." @@ -30674,44 +31069,44 @@ msgstr "" "لا يمكنك إزالة آخر عضو من هذا الفريق كما هو ترك أي واحد مع الإذن لفرق " "التغيير." -#: pretix/control/views/organizer.py:1080 +#: pretix/control/views/organizer.py:1076 msgid "The member has been removed from the team." msgstr "تمت إزالة عضو من الفريق." -#: pretix/control/views/organizer.py:1087 -#: pretix/control/views/organizer.py:1103 +#: pretix/control/views/organizer.py:1083 +#: pretix/control/views/organizer.py:1099 msgid "Invalid invite selected." msgstr "غير صالح مع المدعوين المحدد." -#: pretix/control/views/organizer.py:1096 +#: pretix/control/views/organizer.py:1092 msgid "The invite has been revoked." msgstr "تم إبطال الدعوة." -#: pretix/control/views/organizer.py:1112 +#: pretix/control/views/organizer.py:1108 msgid "The invite has been resent." msgstr "وكان يستاء دعوة." -#: pretix/control/views/organizer.py:1119 +#: pretix/control/views/organizer.py:1115 msgid "Invalid token selected." msgstr "رمز غير صالح المحدد." -#: pretix/control/views/organizer.py:1129 +#: pretix/control/views/organizer.py:1125 msgid "The token has been revoked." msgstr "تم إبطال الرمز المميز." -#: pretix/control/views/organizer.py:1141 +#: pretix/control/views/organizer.py:1137 msgid "Users need to have a pretix account before they can be invited." msgstr "يحتاج المستخدمون إلى لديك حساب pretix قبل أن يتمكنوا من المدعوين." -#: pretix/control/views/organizer.py:1151 +#: pretix/control/views/organizer.py:1147 msgid "The new member has been invited to the team." msgstr "وقد دعا عضو جديد إلى الفريق." -#: pretix/control/views/organizer.py:1166 +#: pretix/control/views/organizer.py:1162 msgid "The new member has been added to the team." msgstr "تمت إضافة عضو جديد إلى الفريق." -#: pretix/control/views/organizer.py:1177 +#: pretix/control/views/organizer.py:1173 #, python-brace-format msgid "" "A new API token has been created with the following secret: {}\n" @@ -30721,132 +31116,132 @@ msgstr "" "تم إنشاء رمز API جديدة مع سر التالية: {}\n" "يرجى نسخ هذا السر إلى مكان آمن. فلن تكون قادرا على مشاهدته مرة أخرى هنا." -#: pretix/control/views/organizer.py:1474 +#: pretix/control/views/organizer.py:1470 msgid "This device has been set up successfully." msgstr "تم تعيين هذا الجهاز تصل بنجاح." -#: pretix/control/views/organizer.py:1502 +#: pretix/control/views/organizer.py:1498 msgid "This device currently does not have access." msgstr "هذا الجهاز حاليا لا يستطيعون الوصول." -#: pretix/control/views/organizer.py:1514 +#: pretix/control/views/organizer.py:1510 msgid "Access for this device has been revoked." msgstr "تم إلغاء الوصول لهذا الجهاز." -#: pretix/control/views/organizer.py:1635 +#: pretix/control/views/organizer.py:1631 msgid "" "All requests will now be scheduled for an immediate attempt. Please allow " "for a few minutes before they are processed." msgstr "" -#: pretix/control/views/organizer.py:1642 +#: pretix/control/views/organizer.py:1638 msgid "All unprocessed webhooks have been stopped from retrying." msgstr "" -#: pretix/control/views/organizer.py:1677 +#: pretix/control/views/organizer.py:1673 #, fuzzy #| msgid "The selected organizer was not found." msgid "The selected organizer has been invited." msgstr "لم يتم العثور على المنظم المحدد." -#: pretix/control/views/organizer.py:1717 -#: pretix/control/views/organizer.py:1731 +#: pretix/control/views/organizer.py:1713 +#: pretix/control/views/organizer.py:1727 #, fuzzy #| msgid "The selected gift card issuer has been removed." msgid "The selected connection has been removed." msgstr "تمت إزالة مصدر البطاقة هدية المحدد." -#: pretix/control/views/organizer.py:1745 +#: pretix/control/views/organizer.py:1741 #, fuzzy #| msgid "The selected question has been deleted." msgid "The selected connection has been accepted." msgstr "تم حذف السؤال المحدد." -#: pretix/control/views/organizer.py:1805 -#: pretix/control/views/organizer.py:1842 +#: pretix/control/views/organizer.py:1801 +#: pretix/control/views/organizer.py:1838 msgid "Gift cards are not allowed to have negative values." msgstr "لا يسمح بطاقات هدية لديها قيم سلبية." -#: pretix/control/views/organizer.py:1832 +#: pretix/control/views/organizer.py:1828 #, fuzzy #| msgid "The pretix.eu server could not be reached." msgid "The transaction could not be reversed." msgstr "ولم يتسن الوصول الى خادم pretix.eu." -#: pretix/control/views/organizer.py:1834 +#: pretix/control/views/organizer.py:1830 #, fuzzy #| msgid "The manual transaction has been saved." msgid "The transaction has been reversed." msgstr "تم حفظ المعاملة اليدوية." -#: pretix/control/views/organizer.py:1839 +#: pretix/control/views/organizer.py:1835 msgid "Your input was invalid, please try again." msgstr "كان الإدخال غير صالحة، يرجى المحاولة مرة أخرى." -#: pretix/control/views/organizer.py:1859 +#: pretix/control/views/organizer.py:1855 msgid "The manual transaction has been saved." msgstr "تم حفظ المعاملة اليدوية." -#: pretix/control/views/organizer.py:1901 +#: pretix/control/views/organizer.py:1897 msgid "The gift card has been created and can now be used." msgstr "تم إنشاء بطاقة هدية، ويمكن الآن استخدامها." -#: pretix/control/views/organizer.py:2008 +#: pretix/control/views/organizer.py:2004 msgid "All events (that I have access to)" msgstr "" -#: pretix/control/views/organizer.py:2453 +#: pretix/control/views/organizer.py:2449 #, fuzzy #| msgctxt "subevent" #| msgid "The selected date has been deleted." msgid "The selected gate has been deleted." msgstr "تم حذف التاريخ المحدد." -#: pretix/control/views/organizer.py:2496 +#: pretix/control/views/organizer.py:2492 msgid "You cannot set a default value that is not a valid value." msgstr "لا يمكنك تعيين قيمة افتراضية غير صالحة." -#: pretix/control/views/organizer.py:2523 +#: pretix/control/views/organizer.py:2519 #, fuzzy #| msgid "The product has been created." msgid "The property has been created." msgstr "تم إنشاء المنتج." -#: pretix/control/views/organizer.py:2590 +#: pretix/control/views/organizer.py:2586 #, fuzzy #| msgid "The selected product has been deleted." msgid "The selected property has been deleted." msgstr "تم حذف المنتج المحدد." -#: pretix/control/views/organizer.py:2614 +#: pretix/control/views/organizer.py:2610 #, fuzzy #| msgid "The order of items has been updated." msgid "The order of properties has been updated." msgstr "تم تحديث ترتيب العناصر." -#: pretix/control/views/organizer.py:2793 -#: pretix/control/views/organizer.py:2909 -#: pretix/control/views/organizer.py:3039 -#: pretix/control/views/organizer.py:3308 +#: pretix/control/views/organizer.py:2789 +#: pretix/control/views/organizer.py:2907 +#: pretix/control/views/organizer.py:3037 +#: pretix/control/views/organizer.py:3306 #, fuzzy #| msgid "The selected product has been deleted." msgid "The selected object has been deleted." msgstr "تم حذف المنتج المحدد." -#: pretix/control/views/organizer.py:2828 +#: pretix/control/views/organizer.py:2824 #, fuzzy #| msgid "The order has been created." msgid "The provider has been created." msgstr "تم إنشاء هذا الأمر." -#: pretix/control/views/organizer.py:2948 +#: pretix/control/views/organizer.py:2946 #, python-brace-format msgid "" "The SSO client has been created. Please note down the following client " "secret, it will never be shown again: {secret}" msgstr "" -#: pretix/control/views/organizer.py:2998 +#: pretix/control/views/organizer.py:2996 #, fuzzy, python-brace-format #| msgid "" #| "Your changes have been saved. Please note that it can take a short period " @@ -30858,7 +31253,7 @@ msgstr "" "تم حفظ التغييرات. يرجى ملاحظة أنه يمكن أن يستغرق فترة قصيرة من الزمن حتى " "تصبح التغييرات نشطة." -#: pretix/control/views/organizer.py:3108 +#: pretix/control/views/organizer.py:3106 #, fuzzy #| msgid "" #| "We've sent you an email with further instructions on resetting your " @@ -30870,25 +31265,25 @@ msgstr "" "لقد أرسلنا إليك بريدا إلكترونيا يحتوي على مزيد من الإرشادات حول إعادة تعيين " "كلمة المرور الخاصة بك." -#: pretix/control/views/organizer.py:3373 +#: pretix/control/views/organizer.py:3371 #, fuzzy #| msgid "This user has been anonymized." msgid "The customer account has been anonymized." msgstr "تم طمس هويتها لهذا المستخدم." -#: pretix/control/views/organizer.py:3643 +#: pretix/control/views/organizer.py:3674 #, fuzzy #| msgid "This organizer can not be deleted." msgid "This channel can not be deleted." msgstr "لا يمكن حذف هذا منظم." -#: pretix/control/views/organizer.py:3648 +#: pretix/control/views/organizer.py:3679 #, fuzzy #| msgid "The selected list has been deleted." msgid "The selected sales channel has been deleted." msgstr "تم حذف القائمة المحددة." -#: pretix/control/views/organizer.py:3650 +#: pretix/control/views/organizer.py:3681 #, fuzzy #| msgid "" #| "The event could not be deleted as some constraints (e.g. data created by " @@ -30900,7 +31295,7 @@ msgstr "" "لا يمكن حذف الحدث عن بعض القيود (مثل البيانات التي تم إنشاؤها من قبل " "المكونات الإضافية) لا تسمح بذلك." -#: pretix/control/views/organizer.py:3675 +#: pretix/control/views/organizer.py:3706 #, fuzzy #| msgid "The order of items has been updated." msgid "The order of sales channels has been updated." @@ -30931,17 +31326,18 @@ msgstr "" msgid "The selected data was deleted successfully." msgstr "تم حذف البيانات المحددة بنجاح." -#: pretix/control/views/subevents.py:168 pretix/control/views/subevents.py:530 +#: pretix/control/views/subevents.py:174 pretix/control/views/subevents.py:526 +#: pretix/control/views/subevents.py:595 msgctxt "subevent" msgid "The requested date does not exist." msgstr "عدم وجود تاريخ الطلب." -#: pretix/control/views/subevents.py:172 pretix/control/views/subevents.py:184 +#: pretix/control/views/subevents.py:178 pretix/control/views/subevents.py:190 msgctxt "subevent" msgid "A date can not be deleted if orders already have been placed." msgstr "لا يمكن حذف موعد إذا أوامر بالفعل تم وضعها." -#: pretix/control/views/subevents.py:203 +#: pretix/control/views/subevents.py:209 #, fuzzy #| msgid "" #| "The event could not be deleted as some constraints (e.g. data created by " @@ -30954,22 +31350,22 @@ msgstr "" "لا يمكن حذف الحدث عن بعض القيود (مثل البيانات التي تم إنشاؤها من قبل " "المكونات الإضافية) لا تسمح بذلك." -#: pretix/control/views/subevents.py:207 +#: pretix/control/views/subevents.py:213 msgctxt "subevent" msgid "The selected date has been deleted." msgstr "تم حذف التاريخ المحدد." -#: pretix/control/views/subevents.py:619 +#: pretix/control/views/subevents.py:704 msgctxt "subevent" msgid "The new date has been created." msgstr "تم إنشاء الموعد الجديد." -#: pretix/control/views/subevents.py:688 +#: pretix/control/views/subevents.py:781 msgctxt "subevent" msgid "The selected dates have been disabled." msgstr "تم تعطيل التواريخ المحددة." -#: pretix/control/views/subevents.py:701 +#: pretix/control/views/subevents.py:794 #, fuzzy #| msgctxt "subevent" #| msgid "The selected dates have been disabled." @@ -30977,16 +31373,20 @@ msgctxt "subevent" msgid "The selected dates have been enabled." msgstr "تم تعطيل التواريخ المحددة." -#: pretix/control/views/subevents.py:730 +#: pretix/control/views/subevents.py:823 msgctxt "subevent" msgid "The selected dates have been deleted or disabled." msgstr "تم حذف المواعيد المحددة أو تعطيل." -#: pretix/control/views/subevents.py:918 +#: pretix/control/views/subevents.py:1011 msgid "Please do not create more than 100.000 dates at once." msgstr "" -#: pretix/control/views/subevents.py:1054 +#: pretix/control/views/subevents.py:1040 +msgid "All dates would be skipped because they conflict with existing dates." +msgstr "" + +#: pretix/control/views/subevents.py:1176 #, python-brace-format msgctxt "subevent" msgid "{} new dates have been created." @@ -31006,6 +31406,12 @@ msgstr "طلب {}" msgid "Voucher {}" msgstr "إيصال {}" +#: pretix/control/views/typeahead.py:179 pretix/control/views/typeahead.py:180 +#, fuzzy +#| msgid "Go to event" +msgid "No event" +msgstr "الذهاب إلى الحدث" + #: pretix/control/views/user.py:169 msgid "The password you entered was invalid, please try again." msgstr "وكانت كلمة المرور التي أدخلتها غير صالحة، يرجى المحاولة مرة أخرى." @@ -31377,7 +31783,7 @@ msgid "Automatically check-in specific tickets after they have been sold." msgstr "" #: pretix/plugins/autocheckin/apps.py:42 pretix/plugins/webcheckin/apps.py:40 -#: pretix/plugins/webcheckin/templates/pretixplugins/webcheckin/index.html:10 +#: pretix/plugins/webcheckin/templates/pretixplugins/webcheckin/index.html:11 msgid "Check-in" msgstr "التسجيل" @@ -31573,15 +31979,15 @@ msgstr "8 صفحات أفقية A7 على صفحة A4 واحدة" msgid "8 portrait A7 pages on one A4 page" msgstr "8 صفحات عمودية A7 على صفحة A4 واحدة" -#: pretix/plugins/badges/exporters.py:353 +#: pretix/plugins/badges/exporters.py:361 msgid "None of the selected products is configured to print badges." msgstr "لم يتم إعداد أي من المنتجات المحددة لطباعة الشارات." -#: pretix/plugins/badges/exporters.py:421 +#: pretix/plugins/badges/exporters.py:429 msgid "Attendee badges" msgstr "شارات الحضور" -#: pretix/plugins/badges/exporters.py:422 +#: pretix/plugins/badges/exporters.py:430 #: pretix/plugins/ticketoutputpdf/exporters.py:69 #, fuzzy #| msgid "All actions" @@ -31589,24 +31995,24 @@ msgctxt "export_category" msgid "PDF collections" msgstr "جميع الإجراءات" -#: pretix/plugins/badges/exporters.py:423 +#: pretix/plugins/badges/exporters.py:431 msgid "Download all attendee badges as one large PDF for printing." msgstr "" -#: pretix/plugins/badges/exporters.py:444 +#: pretix/plugins/badges/exporters.py:452 #: pretix/plugins/ticketoutputpdf/exporters.py:80 msgid "Include pending orders" msgstr "قم بتضمين الطلبات المعلقة" -#: pretix/plugins/badges/exporters.py:449 +#: pretix/plugins/badges/exporters.py:457 msgid "Include add-on or bundled positions" msgstr "قم بتضمين الوحدات الإضافية أو المجمعة" -#: pretix/plugins/badges/exporters.py:454 +#: pretix/plugins/badges/exporters.py:462 msgid "Rendering option" msgstr "خيار الترجيع" -#: pretix/plugins/badges/exporters.py:459 +#: pretix/plugins/badges/exporters.py:467 msgid "" "This option allows you to align multiple badges on one page, for example if " "you want to print to a sheet of stickers with a regular office printer. " @@ -31617,55 +32023,55 @@ msgstr "" "كنت تريد الطباعة على ورقة من الملصقات باستخدام طابعة مكتب عادية. يرجى ملاحظة " "أن نسق شارتك الفردية يجب أن تكون بالحجم الصحيح مسبقا." -#: pretix/plugins/badges/exporters.py:465 +#: pretix/plugins/badges/exporters.py:473 msgid "Start event date" msgstr "تاريخ بداية الفعالية" -#: pretix/plugins/badges/exporters.py:468 +#: pretix/plugins/badges/exporters.py:476 msgid "Only include tickets for dates on or after this date." msgstr "قم بتضمين تذاكر لفترة في هذا التاريخ أو بعده فقط." -#: pretix/plugins/badges/exporters.py:472 +#: pretix/plugins/badges/exporters.py:480 msgid "End event date" msgstr "تاريخ نهاية الفعالية" -#: pretix/plugins/badges/exporters.py:475 +#: pretix/plugins/badges/exporters.py:483 #, fuzzy #| msgid "Only include tickets for dates on or before this date." msgid "Only include tickets ordered on or before this date." msgstr "قم بتضمين تذاكر لفترة في هذا التاريخ أو قبله فقط." -#: pretix/plugins/badges/exporters.py:479 +#: pretix/plugins/badges/exporters.py:487 #, fuzzy #| msgid "Start date" msgid "Start order date" msgstr "تاريخ البداية" -#: pretix/plugins/badges/exporters.py:482 +#: pretix/plugins/badges/exporters.py:490 #, fuzzy #| msgid "Only include tickets for dates on or after this date." msgid "Only include tickets ordered on or after this date." msgstr "قم بتضمين تذاكر لفترة في هذا التاريخ أو بعده فقط." -#: pretix/plugins/badges/exporters.py:486 +#: pretix/plugins/badges/exporters.py:494 #, fuzzy #| msgid "Order date" msgid "End order date" msgstr "تاريخ الطلب" -#: pretix/plugins/badges/exporters.py:489 +#: pretix/plugins/badges/exporters.py:497 msgid "Only include tickets for dates on or before this date." msgstr "قم بتضمين تذاكر لفترة في هذا التاريخ أو قبله فقط." -#: pretix/plugins/badges/exporters.py:493 -#: pretix/plugins/checkinlists/exporters.py:118 +#: pretix/plugins/badges/exporters.py:501 +#: pretix/plugins/checkinlists/exporters.py:119 #: pretix/plugins/reports/exporters.py:510 #: pretix/plugins/reports/exporters.py:693 #: pretix/plugins/ticketoutputpdf/exporters.py:92 msgid "Sort by" msgstr "ترتيب حسب" -#: pretix/plugins/badges/exporters.py:661 +#: pretix/plugins/badges/exporters.py:669 #: pretix/plugins/ticketoutputpdf/exporters.py:242 msgid "" "Your data could not be converted as requested. This could be caused by " @@ -31747,6 +32153,11 @@ msgstr "" msgid "{width} x {height} mm label" msgstr "" +#: pretix/plugins/badges/templates.py:265 +#, python-brace-format +msgid "{width} x {height} inch label" +msgstr "" + #: pretix/plugins/badges/templates/pretixplugins/badges/control_order_info.html:16 #: pretix/plugins/badges/templates/pretixplugins/badges/index.html:27 msgid "Print badges" @@ -32563,132 +32974,132 @@ msgstr "تحقق في قائمة المصدر" msgid "This plugin allows you to generate check-in lists for your conference." msgstr "يتيح لك هذا المكون الإضافي إنشاء قوائم التسجيل لمؤتمرك." -#: pretix/plugins/checkinlists/exporters.py:92 +#: pretix/plugins/checkinlists/exporters.py:93 #: pretix/plugins/ticketoutputpdf/exporters.py:88 #, fuzzy #| msgid "Only include tickets for dates on or after this date." msgid "Only include tickets for dates within this range." msgstr "قم بتضمين تذاكر لفترة في هذا التاريخ أو بعده فقط." -#: pretix/plugins/checkinlists/exporters.py:96 +#: pretix/plugins/checkinlists/exporters.py:97 msgid "Include QR-code secret" msgstr "قم بتضمين رمز سري للاستجابة السريعة" -#: pretix/plugins/checkinlists/exporters.py:101 +#: pretix/plugins/checkinlists/exporters.py:102 msgid "Only tickets requiring special attention" msgstr "التذاكر التي تتطلب اهتماما خاصا فقط" -#: pretix/plugins/checkinlists/exporters.py:134 +#: pretix/plugins/checkinlists/exporters.py:135 msgid "Include questions" msgstr "قم بتضمين الأسئلة" -#: pretix/plugins/checkinlists/exporters.py:304 +#: pretix/plugins/checkinlists/exporters.py:303 msgid "Check-in list (PDF)" msgstr "قائمة التسجيل (PDF)" -#: pretix/plugins/checkinlists/exporters.py:305 -#: pretix/plugins/checkinlists/exporters.py:476 -#: pretix/plugins/checkinlists/exporters.py:674 -#: pretix/plugins/checkinlists/exporters.py:745 +#: pretix/plugins/checkinlists/exporters.py:304 +#: pretix/plugins/checkinlists/exporters.py:475 +#: pretix/plugins/checkinlists/exporters.py:673 +#: pretix/plugins/checkinlists/exporters.py:744 #, fuzzy #| msgid "Check-in" msgctxt "export_category" msgid "Check-in" msgstr "التسجيل" -#: pretix/plugins/checkinlists/exporters.py:306 +#: pretix/plugins/checkinlists/exporters.py:305 msgid "" "Download a PDF version of a check-in list that can be used to check people " "in at the event without digital methods." msgstr "" #. Translators: maximum 5 characters -#: pretix/plugins/checkinlists/exporters.py:374 +#: pretix/plugins/checkinlists/exporters.py:373 msgctxt "tablehead" msgid "paid" msgstr "مدفوع" -#: pretix/plugins/checkinlists/exporters.py:477 +#: pretix/plugins/checkinlists/exporters.py:476 msgid "" "Download a spreadsheet with all attendees that are included in a check-in " "list." msgstr "" -#: pretix/plugins/checkinlists/exporters.py:501 +#: pretix/plugins/checkinlists/exporters.py:500 msgid "Checked out" msgstr "تسجيل خروج" -#: pretix/plugins/checkinlists/exporters.py:501 -#: pretix/plugins/checkinlists/exporters.py:768 +#: pretix/plugins/checkinlists/exporters.py:500 +#: pretix/plugins/checkinlists/exporters.py:767 msgid "Automatically checked in" msgstr "تم التسجيل تلقائيا" -#: pretix/plugins/checkinlists/exporters.py:507 -#: pretix/plugins/checkinlists/exporters.py:696 -#: pretix/plugins/checkinlists/exporters.py:762 +#: pretix/plugins/checkinlists/exporters.py:506 +#: pretix/plugins/checkinlists/exporters.py:695 +#: pretix/plugins/checkinlists/exporters.py:761 #: pretix/plugins/paypal/payment.py:123 pretix/plugins/paypal2/payment.py:120 msgid "Secret" msgstr "سري" -#: pretix/plugins/checkinlists/exporters.py:673 +#: pretix/plugins/checkinlists/exporters.py:672 #, fuzzy #| msgid "All check-in lists" msgid "Valid check-in codes" msgstr "جميع قوائم التسجيل" -#: pretix/plugins/checkinlists/exporters.py:675 +#: pretix/plugins/checkinlists/exporters.py:674 msgid "" "Download a spreadsheet with all valid check-in barcodes e.g. for import into " "a different system. Does not included blocked codes or personal data." msgstr "" -#: pretix/plugins/checkinlists/exporters.py:744 +#: pretix/plugins/checkinlists/exporters.py:743 #, fuzzy #| msgid "Check-in log (all successful scans)" msgid "Check-in log (all scans)" msgstr "تسجيل الدخول (جميع عمليات الفحص الناجحة)" -#: pretix/plugins/checkinlists/exporters.py:746 +#: pretix/plugins/checkinlists/exporters.py:745 msgid "" "Download a spreadsheet with one line for every scan that happened at your " "check-in stations." msgstr "" -#: pretix/plugins/checkinlists/exporters.py:766 +#: pretix/plugins/checkinlists/exporters.py:765 #, fuzzy #| msgid "Go offline" msgid "Offline" msgstr "العودة متواجد حاليا" -#: pretix/plugins/checkinlists/exporters.py:767 +#: pretix/plugins/checkinlists/exporters.py:766 msgid "Offline override" msgstr "تجاوز وضع عدم الاتصال" -#: pretix/plugins/checkinlists/exporters.py:771 +#: pretix/plugins/checkinlists/exporters.py:770 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:83 msgid "Error message" msgstr "رسالة خاطئة" -#: pretix/plugins/checkinlists/exporters.py:772 +#: pretix/plugins/checkinlists/exporters.py:771 #, fuzzy #| msgid "Download date" msgid "Upload date" msgstr "تاريخ التنزيل" -#: pretix/plugins/checkinlists/exporters.py:773 +#: pretix/plugins/checkinlists/exporters.py:772 #, fuzzy #| msgid "Download time" msgid "Upload time" msgstr "وقت التنزيل" -#: pretix/plugins/checkinlists/exporters.py:830 +#: pretix/plugins/checkinlists/exporters.py:829 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:534 #: pretix/presale/templates/pretixpresale/fragment_modals.html:52 #: pretix/presale/templates/pretixpresale/fragment_modals.html:148 msgid "OK" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:862 +#: pretix/plugins/checkinlists/exporters.py:861 #, fuzzy #| msgid "Successful payments" msgid "Successful scans only" @@ -34514,13 +34925,13 @@ msgid "iDEAL" msgstr "نظام الدفع الكتروني المستخدم في هولندا iDEAL" #: pretix/plugins/stripe/payment.py:363 pretix/plugins/stripe/payment.py:371 -#: pretix/plugins/stripe/payment.py:379 pretix/plugins/stripe/payment.py:414 -#: pretix/plugins/stripe/payment.py:422 pretix/plugins/stripe/payment.py:430 -#: pretix/plugins/stripe/payment.py:439 pretix/plugins/stripe/payment.py:450 -#: pretix/plugins/stripe/payment.py:458 pretix/plugins/stripe/payment.py:466 -#: pretix/plugins/stripe/payment.py:474 pretix/plugins/stripe/payment.py:482 -#: pretix/plugins/stripe/payment.py:491 pretix/plugins/stripe/payment.py:504 -#: pretix/plugins/stripe/payment.py:528 +#: pretix/plugins/stripe/payment.py:379 pretix/plugins/stripe/payment.py:388 +#: pretix/plugins/stripe/payment.py:414 pretix/plugins/stripe/payment.py:422 +#: pretix/plugins/stripe/payment.py:430 pretix/plugins/stripe/payment.py:439 +#: pretix/plugins/stripe/payment.py:450 pretix/plugins/stripe/payment.py:458 +#: pretix/plugins/stripe/payment.py:466 pretix/plugins/stripe/payment.py:474 +#: pretix/plugins/stripe/payment.py:482 pretix/plugins/stripe/payment.py:491 +#: pretix/plugins/stripe/payment.py:504 pretix/plugins/stripe/payment.py:528 msgid "" "Some payment methods might need to be enabled in the settings of your Stripe " "account before they work properly." @@ -34540,12 +34951,6 @@ msgstr "الدفع عبر Bancontact" msgid "SEPA Direct Debit" msgstr "" -#: pretix/plugins/stripe/payment.py:388 -msgid "" -"Some payment methods might need to be enabled in the settings of your Stripe " -"account before work properly." -msgstr "" - #: pretix/plugins/stripe/payment.py:391 #, fuzzy #| msgid "" @@ -35532,17 +35937,17 @@ msgstr "" msgid "Web Check-in" msgstr "التسجيل عبر الويب" -#: pretix/presale/checkoutflow.py:117 +#: pretix/presale/checkoutflow.py:120 msgctxt "checkoutflow" msgid "Step" msgstr "خطوة" -#: pretix/presale/checkoutflow.py:249 +#: pretix/presale/checkoutflow.py:252 msgctxt "checkoutflow" msgid "Customer account" msgstr "حساب العميل" -#: pretix/presale/checkoutflow.py:336 +#: pretix/presale/checkoutflow.py:339 #, fuzzy #| msgid "" #| "We were not able to process your request completely as the server was too " @@ -35551,35 +35956,35 @@ msgid "We failed to process your authentication request, please try again." msgstr "" "لم نتمكن من معالجة طلبك بالكامل لأن الخادم كان مشغولا للغاية. حاول مرة اخرى." -#: pretix/presale/checkoutflow.py:399 +#: pretix/presale/checkoutflow.py:402 msgctxt "checkoutflow" msgid "Membership" msgstr "عضوية" -#: pretix/presale/checkoutflow.py:447 pretix/presale/checkoutflow.py:468 +#: pretix/presale/checkoutflow.py:450 pretix/presale/checkoutflow.py:471 msgid "" "Your cart includes a product that requires an active membership to be " "selected." msgstr "تتضمن سلة التسوق الخاصة بك منتجا يتطلب تحديد عضوية نشطة." -#: pretix/presale/checkoutflow.py:487 +#: pretix/presale/checkoutflow.py:490 msgctxt "checkoutflow" msgid "Add-on products" msgstr "المنتجات الإضافية" -#: pretix/presale/checkoutflow.py:676 pretix/presale/checkoutflow.py:684 +#: pretix/presale/checkoutflow.py:697 pretix/presale/checkoutflow.py:705 #: pretix/presale/views/cart.py:195 pretix/presale/views/cart.py:200 #: pretix/presale/views/cart.py:218 pretix/presale/views/cart.py:231 -#: pretix/presale/views/order.py:1585 pretix/presale/views/order.py:1593 +#: pretix/presale/views/order.py:1582 pretix/presale/views/order.py:1590 msgid "Please enter numbers only." msgstr "الرجاء إدخال أرقام فقط." -#: pretix/presale/checkoutflow.py:758 +#: pretix/presale/checkoutflow.py:779 msgctxt "checkoutflow" msgid "Your information" msgstr "معلوماتك" -#: pretix/presale/checkoutflow.py:992 +#: pretix/presale/checkoutflow.py:1013 msgid "" "Unfortunately, based on the invoice address you entered, we're not able to " "sell you the selected products for tax-related legal reasons." @@ -35587,7 +35992,7 @@ msgstr "" "للأسف ، بناء على عنوان الفاتورة التي أدخلتها ، لا يمكننا بيع المنتجات " "المحددة لك لأسباب قانونية متعلقة بالضرائب." -#: pretix/presale/checkoutflow.py:998 +#: pretix/presale/checkoutflow.py:1019 msgid "" "Due to the invoice address you entered, we need to apply a different tax " "rate to your purchase and the price of the products in your cart has changed " @@ -35596,30 +36001,30 @@ msgstr "" "نظرا لعنوان الفاتورة الذي أدخلته ، نحتاج إلى تطبيق معدل ضريبة مختلف على " "مشترياتك وتغير سعر المنتجات في سلة التسوق وفقا لذلك." -#: pretix/presale/checkoutflow.py:1022 pretix/presale/checkoutflow.py:1028 +#: pretix/presale/checkoutflow.py:1043 pretix/presale/checkoutflow.py:1049 msgid "Please enter a valid email address." msgstr "الرجاء قم بإدخال بريد الكتروني صحيح." -#: pretix/presale/checkoutflow.py:1035 +#: pretix/presale/checkoutflow.py:1056 msgid "Please enter your invoicing address." msgstr "الرجاء إدخال عنوان الفواتير الخاص بك." -#: pretix/presale/checkoutflow.py:1039 +#: pretix/presale/checkoutflow.py:1060 msgid "Please enter your name." msgstr "يرجى إدخال اسمك." -#: pretix/presale/checkoutflow.py:1074 pretix/presale/checkoutflow.py:1079 -#: pretix/presale/checkoutflow.py:1084 pretix/presale/checkoutflow.py:1089 -#: pretix/presale/checkoutflow.py:1094 +#: pretix/presale/checkoutflow.py:1095 pretix/presale/checkoutflow.py:1100 +#: pretix/presale/checkoutflow.py:1105 pretix/presale/checkoutflow.py:1110 +#: pretix/presale/checkoutflow.py:1115 msgid "Please fill in answers to all required questions." msgstr "يرجى ملء الإجابات على جميع الأسئلة المطلوبة." -#: pretix/presale/checkoutflow.py:1257 +#: pretix/presale/checkoutflow.py:1278 msgctxt "checkoutflow" msgid "Payment" msgstr "المبلغ" -#: pretix/presale/checkoutflow.py:1368 +#: pretix/presale/checkoutflow.py:1389 #, fuzzy, python-brace-format #| msgid "" #| "Your gift card has been applied, but {} still need to be paid. Please " @@ -35631,74 +36036,74 @@ msgstr "" "تم استعمال بطاقة الهدايا الخاصة بك، ولكن {} لا تزال بحاجة إلى أن يتم سدادها. " "الرجاء اختيار طريقة الدفع." -#: pretix/presale/checkoutflow.py:1393 pretix/presale/views/order.py:733 +#: pretix/presale/checkoutflow.py:1414 pretix/presale/views/order.py:733 msgid "Please select a payment method." msgstr "الرجاء اختيار طريقة الدفع." -#: pretix/presale/checkoutflow.py:1425 pretix/presale/checkoutflow.py:1445 -#: pretix/presale/checkoutflow.py:1456 +#: pretix/presale/checkoutflow.py:1446 pretix/presale/checkoutflow.py:1466 +#: pretix/presale/checkoutflow.py:1477 #, fuzzy #| msgid "Please select a payment method." msgid "Please select a payment method to proceed." msgstr "الرجاء اختيار طريقة الدفع." -#: pretix/presale/checkoutflow.py:1461 pretix/presale/views/order.py:489 +#: pretix/presale/checkoutflow.py:1482 pretix/presale/views/order.py:489 #: pretix/presale/views/order.py:559 msgid "The payment information you entered was incomplete." msgstr "معلومات الدفع التي أدخلتها غير مكتملة." -#: pretix/presale/checkoutflow.py:1506 +#: pretix/presale/checkoutflow.py:1527 msgctxt "checkoutflow" msgid "Review order" msgstr "مراجعة الطلب" -#: pretix/presale/checkoutflow.py:1604 +#: pretix/presale/checkoutflow.py:1625 msgid "You need to check all checkboxes on the bottom of the page." msgstr "تحتاج إلى تحديد جميع مربعات الاختيار أسفل الصفحة." -#: pretix/presale/forms/checkout.py:70 +#: pretix/presale/forms/checkout.py:67 msgid "Email address (repeated)" msgstr "عنوان البريد الإلكتروني (مكرر)" -#: pretix/presale/forms/checkout.py:71 +#: pretix/presale/forms/checkout.py:68 msgid "" "Please enter the same email address again to make sure you typed it " "correctly." msgstr "" "يرجى إدخال نفس عنوان البريد الإلكتروني مرة أخرى للتأكد من كتابته بشكل صحيح." -#: pretix/presale/forms/checkout.py:110 +#: pretix/presale/forms/checkout.py:107 msgid "Please enter the same email address twice." msgstr "الرجاء إدخال نفس عنوان البريد الإلكتروني مرتين." -#: pretix/presale/forms/checkout.py:125 +#: pretix/presale/forms/checkout.py:122 #, fuzzy #| msgid "Street address" msgid "Save to address" msgstr "عنوان الشارع" -#: pretix/presale/forms/checkout.py:126 +#: pretix/presale/forms/checkout.py:123 #, fuzzy #| msgctxt "subevent" #| msgid "Create a new date" msgid "Create new address" msgstr "إنشاء موعد جديد" -#: pretix/presale/forms/checkout.py:129 +#: pretix/presale/forms/checkout.py:126 msgid "Save address in my customer account for future purchases" msgstr "" -#: pretix/presale/forms/checkout.py:159 +#: pretix/presale/forms/checkout.py:156 msgid "Save answers to my customer profiles for future purchases" msgstr "" -#: pretix/presale/forms/checkout.py:166 +#: pretix/presale/forms/checkout.py:163 #, fuzzy #| msgid "View user profile" msgid "Save to profile" msgstr "عرض ملف تعريف المستخدم" -#: pretix/presale/forms/checkout.py:167 +#: pretix/presale/forms/checkout.py:164 #, fuzzy #| msgid "Create new export file" msgid "Create new profile" @@ -35789,19 +36194,19 @@ msgstr "" msgid "Please enter the correct result." msgstr "الرجاء إدخال اسم أقصر." -#: pretix/presale/forms/customer.py:346 +#: pretix/presale/forms/customer.py:347 msgid "For security reasons, please wait 10 minutes before you try again." msgstr "لأسباب أمنية ، يرجى الانتظار لمدة 10 دقائق قبل المحاولة مرة أخرى." -#: pretix/presale/forms/customer.py:347 +#: pretix/presale/forms/customer.py:348 msgid "A user with this email address is not known in our system." msgstr "المستخدم بعنوان البريد الإلكتروني هذا غير معروف في نظامنا." -#: pretix/presale/forms/customer.py:476 +#: pretix/presale/forms/customer.py:477 msgid "Only required if you change your email address" msgstr "مطلوب فقط إذا قمت بتغيير عنوان بريدك الإلكتروني" -#: pretix/presale/forms/customer.py:514 +#: pretix/presale/forms/customer.py:515 #, python-brace-format msgid "" "To change your email address, change it in your {provider} account and then " @@ -36480,17 +36885,19 @@ msgid "from %(from_price)s to %(to_price)s" msgstr "من %(minprice)s" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:98 +#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:102 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:113 +msgid "Show variants" +msgstr "قم بعرض الأنواع" + +#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:98 +#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:102 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:109 #, fuzzy #| msgid "Show variants" msgid "Hide variants" msgstr "قم بعرض الأنواع" -#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:102 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:113 -msgid "Show variants" -msgstr "قم بعرض الأنواع" - #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:129 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:271 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:151 @@ -36651,7 +37058,7 @@ msgstr "محجوزة بالكامل" #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:105 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:31 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:69 -#: pretix/presale/views/widget.py:456 +#: pretix/presale/views/widget.py:488 msgid "Reserved" msgstr "محجوز" @@ -37312,7 +37719,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_subevent_list.html:34 #: pretix/presale/templates/pretixpresale/organizers/index.html:93 -#: pretix/presale/views/widget.py:467 +#: pretix/presale/views/widget.py:499 msgid "More info" msgstr "مزيد من المعلومات" @@ -37346,14 +37753,14 @@ msgid "Choose date to book a ticket" msgstr "اختر تاريخا لحجز تذكرة" #: pretix/presale/templates/pretixpresale/event/index.html:155 -#: pretix/presale/views/waiting.py:141 pretix/presale/views/widget.py:806 +#: pretix/presale/views/waiting.py:146 pretix/presale/views/widget.py:839 #, fuzzy #| msgid "The presale period for this event is over." msgid "The booking period for this event is over." msgstr "انتهت فترة العرض ما قبل البيع لهذه الفعالية." #: pretix/presale/templates/pretixpresale/event/index.html:163 -#: pretix/presale/views/widget.py:808 +#: pretix/presale/views/widget.py:841 #, fuzzy, python-format #| msgid "The presale for this event will start on %(date)s at %(time)s." msgid "The booking period for this event will start on %(date)s at %(time)s." @@ -37505,7 +37912,7 @@ msgstr "" "أيضا رسالة بريد إلكتروني تحتوي على رابط العنوان الذي حددته." #: pretix/presale/templates/pretixpresale/event/order.html:75 -#: pretix/presale/templates/pretixpresale/event/position.html:18 +#: pretix/presale/templates/pretixpresale/event/position.html:19 msgid "View in backend" msgstr "استعرض في لوحة التحكم" @@ -37570,13 +37977,13 @@ msgstr "" "تصل إلى 14 يوما حتى تظهر في كشف حسابك." #: pretix/presale/templates/pretixpresale/event/order.html:199 -#: pretix/presale/templates/pretixpresale/event/position.html:33 +#: pretix/presale/templates/pretixpresale/event/position.html:34 msgid "Change ordered items" msgstr "قم بتغيير العناصر المطلوبة" #: pretix/presale/templates/pretixpresale/event/order.html:200 #: pretix/presale/templates/pretixpresale/event/order.html:291 -#: pretix/presale/templates/pretixpresale/event/position.html:34 +#: pretix/presale/templates/pretixpresale/event/position.html:35 msgid "Change details" msgstr "قم بتغيير التفاصيل" @@ -37871,23 +38278,23 @@ msgstr "" msgid "Scan the QR code with your banking app" msgstr "" -#: pretix/presale/templates/pretixpresale/event/position.html:7 +#: pretix/presale/templates/pretixpresale/event/position.html:8 msgid "Registration details" msgstr "تفاصيل التسجيل" -#: pretix/presale/templates/pretixpresale/event/position.html:10 +#: pretix/presale/templates/pretixpresale/event/position.html:11 msgid "Your registration" msgstr "تسجيلك" -#: pretix/presale/templates/pretixpresale/event/position.html:31 +#: pretix/presale/templates/pretixpresale/event/position.html:32 msgid "Your items" msgstr "البنود الخاصة بك" -#: pretix/presale/templates/pretixpresale/event/position.html:46 +#: pretix/presale/templates/pretixpresale/event/position.html:47 msgid "Additional information" msgstr "معلومة اضافية" -#: pretix/presale/templates/pretixpresale/event/position.html:51 +#: pretix/presale/templates/pretixpresale/event/position.html:52 #, python-format msgid "" "This order is managed for you by %(email)s. Please contact them for any " @@ -37896,14 +38303,14 @@ msgstr "" "هذا الطلب يديره لك%(email)s. يرجى الاتصال بهم لأية أسئلة بخصوص الدفع أو " "الإلغاء أو التغييرات في هذا الطلب." -#: pretix/presale/templates/pretixpresale/event/position.html:63 +#: pretix/presale/templates/pretixpresale/event/position.html:64 #, fuzzy #| msgid "Change your information" msgctxt "action" msgid "Change your ticket" msgstr "قم بتغيير بياناتك" -#: pretix/presale/templates/pretixpresale/event/position.html:68 +#: pretix/presale/templates/pretixpresale/event/position.html:69 #, fuzzy #| msgid "" #| "If you want to make changes to the products you bought, you can click on " @@ -37915,7 +38322,7 @@ msgstr "" "إذا كنت ترغب في إجراء تغييرات على المنتجات التي اشتريتها ، يمكنك النقر فوق " "الزر لتغيير طلبك." -#: pretix/presale/templates/pretixpresale/event/position.html:73 +#: pretix/presale/templates/pretixpresale/event/position.html:74 #, python-format msgid "" "You can only make some changes to this ticket yourself. For additional " @@ -37923,7 +38330,7 @@ msgid "" "(%(email)s)." msgstr "" -#: pretix/presale/templates/pretixpresale/event/position.html:82 +#: pretix/presale/templates/pretixpresale/event/position.html:83 #: pretix/presale/templates/pretixpresale/event/position_change.html:5 #: pretix/presale/templates/pretixpresale/event/position_change.html:10 #: pretix/presale/templates/pretixpresale/event/position_change_confirm.html:6 @@ -38124,7 +38531,7 @@ msgstr "المتابعة" #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:94 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:14 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:58 -#: pretix/presale/views/widget.py:441 +#: pretix/presale/views/widget.py:473 #, fuzzy #| msgid "PDF ticket layout" msgid "Few tickets left" @@ -38134,7 +38541,7 @@ msgstr "نسق تذكرة PDF" #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:97 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:19 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:61 -#: pretix/presale/views/widget.py:446 +#: pretix/presale/views/widget.py:478 #, fuzzy #| msgid "Pay now" msgctxt "available_event_in_list" @@ -38149,7 +38556,7 @@ msgstr "ادفع الآن" #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:44 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:63 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:78 -#: pretix/presale/views/widget.py:448 pretix/presale/views/widget.py:471 +#: pretix/presale/views/widget.py:480 pretix/presale/views/widget.py:503 msgid "Book now" msgstr "احجز الآن" @@ -38157,7 +38564,7 @@ msgstr "احجز الآن" #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:111 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:38 #: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:74 -#: pretix/presale/views/widget.py:463 +#: pretix/presale/views/widget.py:495 msgid "Fully booked" msgstr "محجوز بالكامل" @@ -38426,7 +38833,7 @@ msgstr "هل أنت متأكد أنك تريد حذف التواريخ التا #: pretix/presale/templates/pretixpresale/organizers/customer_addresses.html:5 #: pretix/presale/templates/pretixpresale/organizers/customer_addresses.html:11 -#: pretix/presale/views/customer.py:380 +#: pretix/presale/views/customer.py:382 #, fuzzy #| msgid "Address" msgid "Addresses" @@ -38589,7 +38996,7 @@ msgstr "هل أنت متأكد أنك تريد حذف التواريخ التا #: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:5 #: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:11 -#: pretix/presale/views/customer.py:386 +#: pretix/presale/views/customer.py:388 #, fuzzy #| msgid "Attendee address" msgid "Attendee profiles" @@ -38679,7 +39086,7 @@ msgstr "لم يتم تمكين هذه الميزة." msgid "The selected organizer was not found." msgstr "لم يتم العثور على المنظم المحدد." -#: pretix/presale/views/__init__.py:298 +#: pretix/presale/views/__init__.py:316 #, python-brace-format msgid "" "Your selected payment method can only be used for a payment of at least " @@ -38690,52 +39097,52 @@ msgstr "" msgid "Please enter positive numbers only." msgstr "الرجاء إدخال أرقام موجبة فقط." -#: pretix/presale/views/cart.py:441 +#: pretix/presale/views/cart.py:443 msgid "We applied the voucher to as many products in your cart as we could." msgstr "" "طبقنا كود الخصم على أكبر عدد ممكن من المنتجات في عربة التسوق الخاصة بك." -#: pretix/presale/views/cart.py:476 pretix/presale/views/cart.py:484 +#: pretix/presale/views/cart.py:478 pretix/presale/views/cart.py:486 msgid "" "The gift card has been saved to your cart. Please continue your checkout." msgstr "" -#: pretix/presale/views/cart.py:520 +#: pretix/presale/views/cart.py:522 msgid "Your cart has been updated." msgstr "تم تحديث عربة التسوق الخاصة بك." -#: pretix/presale/views/cart.py:523 pretix/presale/views/cart.py:549 +#: pretix/presale/views/cart.py:525 pretix/presale/views/cart.py:551 msgid "Your cart is now empty." msgstr "عربة التسوق الخاصة بك فارغة الآن." -#: pretix/presale/views/cart.py:570 +#: pretix/presale/views/cart.py:584 msgid "" "Your cart timeout was extended. Please note that some of the prices in your " "cart changed." msgstr "" -#: pretix/presale/views/cart.py:573 +#: pretix/presale/views/cart.py:587 #, fuzzy #| msgid "Your cart has been updated." msgid "Your cart timeout was extended." msgstr "تم تحديث عربة التسوق الخاصة بك." -#: pretix/presale/views/cart.py:588 +#: pretix/presale/views/cart.py:602 msgid "The products have been successfully added to your cart." msgstr "تمت إضافة المنتجات بنجاح إلى سلة التسوق الخاصة بك." -#: pretix/presale/views/cart.py:612 pretix/presale/views/event.py:543 -#: pretix/presale/views/widget.py:399 +#: pretix/presale/views/cart.py:626 pretix/presale/views/event.py:543 +#: pretix/presale/views/widget.py:431 msgid "Tickets for this event cannot be purchased on this sales channel." msgstr "لا يمكن شراء تذاكر هذه الفعالية من قناة المبيعات هذه." -#: pretix/presale/views/cart.py:767 +#: pretix/presale/views/cart.py:781 msgid "" "The gift card has been saved to your cart. Please now select the products " "you want to purchase." msgstr "" -#: pretix/presale/views/cart.py:795 +#: pretix/presale/views/cart.py:809 #, fuzzy #| msgid "We were unable to find the user you requested a new password for." msgctxt "subevent" @@ -38761,7 +39168,7 @@ msgstr "" "أرسلناه لك لتفعيل حسابك واختيار كلمة مرور." #: pretix/presale/views/customer.py:268 pretix/presale/views/customer.py:271 -#: pretix/presale/views/customer.py:625 pretix/presale/views/customer.py:631 +#: pretix/presale/views/customer.py:627 pretix/presale/views/customer.py:633 msgid "You clicked an invalid link." msgstr "لقد قمت بالنقر فوق رابط غير صالح." @@ -38770,14 +39177,14 @@ msgid "Your new password has been set! You can now use it to log in." msgstr "" "تم تعيين كلمة المرور الجديدة الخاصة بك! يمكنك الآن استخدامها لتسجيل الدخول." -#: pretix/presale/views/customer.py:333 +#: pretix/presale/views/customer.py:335 msgid "" "We've sent you an email with further instructions on resetting your password." msgstr "" "لقد أرسلنا إليك بريدا إلكترونيا يحتوي على مزيد من الإرشادات حول إعادة تعيين " "كلمة المرور الخاصة بك." -#: pretix/presale/views/customer.py:593 +#: pretix/presale/views/customer.py:595 msgid "" "Your changes have been saved. We've sent you an email with a link to update " "your email address. The email address of your account will be changed as " @@ -38787,61 +39194,61 @@ msgstr "" "بريدك الإلكتروني. سيتم تغيير عنوان البريد الإلكتروني الخاص بحسابك بمجرد " "النقر فوق هذا الارتباط." -#: pretix/presale/views/customer.py:646 +#: pretix/presale/views/customer.py:648 msgid "" "Your email address has not been updated since the address is already in use " "for another customer account." msgstr "" -#: pretix/presale/views/customer.py:649 +#: pretix/presale/views/customer.py:651 msgid "Your email address has been updated." msgstr "تم تحديث عنوان بريدك الإلكتروني." -#: pretix/presale/views/customer.py:866 pretix/presale/views/customer.py:877 +#: pretix/presale/views/customer.py:868 pretix/presale/views/customer.py:879 #, python-brace-format msgid "" "We were unable to use your login since the email address {email} is already " "used for a different account in this system." msgstr "" -#: pretix/presale/views/event.py:921 +#: pretix/presale/views/event.py:919 msgid "Unknown event code or not authorized to access this event." msgstr "رمز فعالية غير معروف أو غير مخول للوصول إلى هذه الفعالية." -#: pretix/presale/views/event.py:928 +#: pretix/presale/views/event.py:926 msgctxt "subevent" msgid "No date selected." msgstr "لم يتم تحديد تاريخ." -#: pretix/presale/views/event.py:931 +#: pretix/presale/views/event.py:929 msgctxt "subevent" msgid "Unknown date selected." msgstr "تم تحديد تاريخ غير معروف." -#: pretix/presale/views/event.py:956 pretix/presale/views/event.py:964 -#: pretix/presale/views/event.py:967 +#: pretix/presale/views/event.py:954 pretix/presale/views/event.py:962 +#: pretix/presale/views/event.py:965 msgid "Please go back and try again." msgstr "الرجاء العودة والمحاولة مجددا." -#: pretix/presale/views/event.py:980 +#: pretix/presale/views/event.py:978 #, fuzzy #| msgid "Purchased" msgid "Fake date time" msgstr "اشترى" -#: pretix/presale/views/event.py:992 +#: pretix/presale/views/event.py:990 #, fuzzy #| msgid "You do not have access to this page." msgid "You are not allowed to access time machine mode." msgstr "ليس لديك صلاحية الوصول إلى هذه الصفحة." -#: pretix/presale/views/event.py:994 +#: pretix/presale/views/event.py:992 #, fuzzy #| msgid "This gift card can only be used in test mode." msgid "This feature is only available in test mode." msgstr "لا يمكن استخدام بطاقة الهدايا هذه إلا في وضع الاختبار." -#: pretix/presale/views/event.py:1011 +#: pretix/presale/views/event.py:1009 #, fuzzy #| msgid "This account is disabled." msgid "Time machine disabled!" @@ -38900,7 +39307,7 @@ msgstr "" "الرجاء الضغط على الرابط الذي أرسلناه لك عبر البريد الإلكتروني لتنزيل التذاكر " "الخاصة بك." -#: pretix/presale/views/order.py:1692 +#: pretix/presale/views/order.py:1689 #, python-brace-format msgid "" "The order has been changed. You can now proceed by paying the open amount of " @@ -38908,44 +39315,44 @@ msgid "" msgstr "" "تم تغيير الطلب. يمكنك الآن المضي قدما بدفع المبلغ المفتوح وقدره{amount}." -#: pretix/presale/views/order.py:1704 +#: pretix/presale/views/order.py:1701 #, fuzzy #| msgid "Your search did not match any vouchers." msgid "You did not make any changes." msgstr "بحثك لم تطابق اي القسائم." -#: pretix/presale/views/order.py:1729 +#: pretix/presale/views/order.py:1726 msgid "You may not change your order in a way that reduces the total price." msgstr "" -#: pretix/presale/views/order.py:1731 +#: pretix/presale/views/order.py:1728 msgid "You may only change your order in a way that increases the total price." msgstr "" -#: pretix/presale/views/order.py:1733 +#: pretix/presale/views/order.py:1730 msgid "You may not change your order in a way that changes the total price." msgstr "" -#: pretix/presale/views/order.py:1735 +#: pretix/presale/views/order.py:1732 #, fuzzy #| msgid "You can cancel this order, but you will not receive a refund." msgid "You may not change your order in a way that would require a refund." msgstr "يمكنك إلغاء هذا الطلب ، لكنك لن تسترد المبلغ." -#: pretix/presale/views/order.py:1743 +#: pretix/presale/views/order.py:1740 msgid "" "You may not change your order in a way that increases the total price since " "payments are no longer being accepted for this event." msgstr "" -#: pretix/presale/views/order.py:1749 +#: pretix/presale/views/order.py:1746 msgid "" "You may not change your order in a way that requires additional payment " "while we are processing your current payment. Please check back after your " "current payment has been accepted." msgstr "" -#: pretix/presale/views/order.py:1768 pretix/presale/views/order.py:1799 +#: pretix/presale/views/order.py:1765 pretix/presale/views/order.py:1796 msgid "You cannot change this order." msgstr "لا يمكنك تغيير هذا الطلب." @@ -38974,23 +39381,23 @@ msgstr "" "إذا كانت هناك أي طلبات من قبل هذا المستخدم ، فسيتلقى بريدا إلكترونيا برموز " "الطلبات الخاصة به." -#: pretix/presale/views/waiting.py:127 +#: pretix/presale/views/waiting.py:132 msgid "" "No ticket types are available for the waiting list, have a look at the " "ticket shop instead." msgstr "" -#: pretix/presale/views/waiting.py:137 pretix/presale/views/waiting.py:161 +#: pretix/presale/views/waiting.py:142 pretix/presale/views/waiting.py:166 msgid "Waiting lists are disabled for this event." msgstr "قوائم الانتظار معطلة لهذه الفعالية." -#: pretix/presale/views/waiting.py:173 +#: pretix/presale/views/waiting.py:178 msgid "" "You cannot add yourself to the waiting list as this product is currently " "available." msgstr "لا يمكن أن تضيف نفسك إلى قائمة الانتظار حيث أن هذا المنتج متاح حاليا." -#: pretix/presale/views/waiting.py:180 +#: pretix/presale/views/waiting.py:185 #, python-brace-format msgid "" "We've added you to the waiting list. We will send an email to {email} as " @@ -38999,61 +39406,77 @@ msgstr "" "لقد أضفناك إلى قائمة الانتظار. ستتلقى رسالة بريد إلكتروني على مستوى {email} " "بمجرد توفر التذاكر مرة أخرى." -#: pretix/presale/views/waiting.py:208 +#: pretix/presale/views/waiting.py:213 msgid "We could not find you on our waiting list." msgstr "لم نستطع العثور عليك في قائمة الإنتظار الخاصة بنا." -#: pretix/presale/views/waiting.py:212 +#: pretix/presale/views/waiting.py:217 msgid "" "Your waiting list spot is no longer valid or already used. There's nothing " "more to do here." msgstr "" -#: pretix/presale/views/waiting.py:222 +#: pretix/presale/views/waiting.py:227 msgid "" "Thank you very much! We will assign your spot on the waiting list to someone " "else." msgstr "" -#: pretix/presale/views/widget.py:394 +#: pretix/presale/views/widget.py:426 msgid "This ticket shop is currently disabled." msgstr "متجر التذاكر هذا معطل حاليا." -#: pretix/presale/views/widget.py:408 +#: pretix/presale/views/widget.py:440 msgid "The selected date does not exist in this event series." msgstr "التاريخ المحدد غير موجود في سلسلة الفعاليات هذه." -#: pretix/presale/views/widget.py:415 +#: pretix/presale/views/widget.py:447 #, fuzzy #| msgid "The selected seat \"{seat}\" is not available." msgid "The selected date is not available." msgstr "المقعد المحدد \"{seat}\" غير متوفر." -#: pretix/presale/views/widget.py:423 +#: pretix/presale/views/widget.py:455 msgid "This is not an event series." msgstr "هذه ليست سلسلة فعالية." -#: pretix/presale/views/widget.py:479 +#: pretix/presale/views/widget.py:511 #, python-format msgid "from %(start_date)s" msgstr "من %(start_date)s" -#: pretix/settings.py:844 +#: pretix/settings.py:863 msgid "User profile only" msgstr "ملف تعريف المستخدم فقط" -#: pretix/settings.py:845 +#: pretix/settings.py:864 msgid "Read access" msgstr "الوصول إلى القراءة" -#: pretix/settings.py:846 +#: pretix/settings.py:865 msgid "Write access" msgstr "الوصول إلى الكتابة" -#: pretix/settings.py:857 +#: pretix/settings.py:876 msgid "Kosovo" msgstr "كوسوفو" +#, fuzzy +#~| msgid "Please enter a shorter name." +#~ msgid "Please do not use special characters in names." +#~ msgstr "الرجاء إدخال اسم أقصر." + +#~ msgid "State" +#~ msgstr "ولاية" + +#, fuzzy +#~| msgid "Printing date and time" +#~ msgid "Program times: date and time" +#~ msgstr "تاريخ ووقت الطباعة" + +#~ msgid "Your search did not match any quotas." +#~ msgstr "بحثك لم تطابق اي حصص." + #~ msgid "Blackberry (Link via Google)" #~ msgstr "بلاك بيري (لينك عبر جوجل)" @@ -39299,10 +39722,6 @@ msgstr "كوسوفو" #~ msgid "Invoice email text" #~ msgstr "تاريخ الفاتورة" -#, fuzzy -#~ msgid "Invoice recipient email" -#~ msgstr "مستلم الفاتورة:" - #, fuzzy, python-brace-format #~| msgid "" #~| "Hello,\n" diff --git a/src/pretix/locale/ar/LC_MESSAGES/djangojs.po b/src/pretix/locale/ar/LC_MESSAGES/djangojs.po index b18dbf3880..5204cdcb91 100644 --- a/src/pretix/locale/ar/LC_MESSAGES/djangojs.po +++ b/src/pretix/locale/ar/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-17 14:06+0000\n" +"POT-Creation-Date: 2026-06-28 15:49+0000\n" "PO-Revision-Date: 2021-09-15 11:22+0000\n" "Last-Translator: Mohamed Tawfiq \n" "Language-Team: Arabic \n" "Language-Team: Azerbaijani