mirror of
https://github.com/pretix/pretix.git
synced 2025-12-06 21:42:49 +00:00
Compare commits
45 Commits
event-titl
...
fix-questi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
211804dde7 | ||
|
|
3f3715f80c | ||
|
|
b5e20df508 | ||
|
|
eba5c1b36d | ||
|
|
7d30ecf527 | ||
|
|
2359307462 | ||
|
|
325f7c565d | ||
|
|
df48adef1b | ||
|
|
74cea09f6c | ||
|
|
e8abe5cad8 | ||
|
|
6c9f66487d | ||
|
|
5f828127bf | ||
|
|
c5b3093f20 | ||
|
|
ae4073b3e4 | ||
|
|
362ac8de6f | ||
|
|
cced9cd768 | ||
|
|
dfb45e13ca | ||
|
|
23489f50f8 | ||
|
|
80148a8435 | ||
|
|
9f49b7747c | ||
|
|
b75f8bf893 | ||
|
|
d53af424cf | ||
|
|
24c02751cc | ||
|
|
2f7a00e660 | ||
|
|
767b01be9a | ||
|
|
f9acefc0f9 | ||
|
|
234a3d0db1 | ||
|
|
b7228ff5b8 | ||
|
|
053c713a2a | ||
|
|
6959dca7c1 | ||
|
|
87312c9d8a | ||
|
|
4b697b9244 | ||
|
|
cc55aba2e6 | ||
|
|
fbbc6502f3 | ||
|
|
62b3af2197 | ||
|
|
177717d594 | ||
|
|
2f2991105a | ||
|
|
d03af3ce06 | ||
|
|
6b95bfbc96 | ||
|
|
0f4d5b639d | ||
|
|
53ebee37fe | ||
|
|
572973b5c0 | ||
|
|
ab72abea0a | ||
|
|
c53fc8df4e | ||
|
|
87fb3d2df8 |
@@ -48,11 +48,6 @@ seat objects The assigned se
|
||||
└ seat_guid string Identifier of the seat within the seating plan
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.14
|
||||
|
||||
This ``is_bundled`` attribute has been added and the cart creation endpoints have been updated.
|
||||
|
||||
|
||||
Cart position endpoints
|
||||
-----------------------
|
||||
|
||||
|
||||
@@ -9,14 +9,6 @@ This page describes special APIs built for ticket scanning apps. For managing ch
|
||||
please also see :ref:`rest-checkinlists`. The check-in list API also contains endpoints to obtain statistics or log
|
||||
failed scans.
|
||||
|
||||
.. versionchanged:: 4.12
|
||||
|
||||
The endpoints listed on this page have been added.
|
||||
|
||||
.. versionchanged:: 4.18
|
||||
|
||||
The ``source_type`` parameter has been added.
|
||||
|
||||
.. _`rest-checkin-redeem`:
|
||||
|
||||
Checking a ticket in
|
||||
|
||||
@@ -40,10 +40,6 @@ ignore_in_statistics boolean If ``true``, ch
|
||||
consider_tickets_used boolean If ``true`` (default), tickets checked in on this list will be considered "used" by other functionality, i.e. when checking if they can still be canceled.
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.12
|
||||
|
||||
The ``addon_match`` attribute has been added.
|
||||
|
||||
.. versionchanged:: 2023.9
|
||||
|
||||
The ``ignore_in_statistics`` and ``consider_tickets_used`` attributes have been added.
|
||||
|
||||
@@ -34,12 +34,6 @@ password string Can only be set
|
||||
not be included in any responses.
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionadded:: 4.0
|
||||
|
||||
.. versionchanged:: 4.3
|
||||
|
||||
Passwords can now be set through the API during customer creation.
|
||||
|
||||
.. versionchanged:: 2024.3
|
||||
|
||||
The attribute ``phone`` has been added.
|
||||
|
||||
@@ -61,25 +61,6 @@ public_url string The public, cus
|
||||
Endpoints
|
||||
---------
|
||||
|
||||
.. versionchanged:: 4.0
|
||||
|
||||
The ``clone_from`` parameter has been added to the event creation endpoint.
|
||||
|
||||
.. versionchanged:: 4.1
|
||||
|
||||
The ``with_availability_for`` parameter has been added.
|
||||
|
||||
The ``search`` query parameter has been added to filter events by their slug, name, or location in any language.
|
||||
|
||||
.. versionchanged:: 4.17
|
||||
|
||||
The ``public_url`` field has been added.
|
||||
|
||||
.. versionchanged:: 5.0
|
||||
|
||||
The ``date_from_before``, ``date_from_after``, ``date_to_before``, and ``date_to_after`` query parameters have been
|
||||
added.
|
||||
|
||||
.. http:get:: /api/v1/organizers/(organizer)/events/
|
||||
|
||||
Returns a list of all events within a given organizer the authenticated user/token has access to.
|
||||
@@ -630,10 +611,6 @@ organizer level.
|
||||
:statuscode 401: Authentication failure
|
||||
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
|
||||
|
||||
.. versionchanged:: 4.18
|
||||
|
||||
The ``readonly`` flag has been added.
|
||||
|
||||
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/settings/
|
||||
|
||||
Updates event settings. Note that ``PUT`` is not allowed here, only ``PATCH``.
|
||||
|
||||
@@ -47,11 +47,6 @@ acceptor string Organizer slug
|
||||
this field was added.)
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.20
|
||||
|
||||
The ``owner_ticket`` and ``issuer`` attributes of the gift card and the ``info`` and ``acceptor`` attributes of the
|
||||
gift card transaction resource have been added.
|
||||
|
||||
Endpoints
|
||||
---------
|
||||
|
||||
|
||||
@@ -111,18 +111,6 @@ internal_reference string Customer's refe
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
|
||||
.. versionchanged:: 4.1
|
||||
|
||||
The attributes ``fee_type`` and ``fee_internal_type`` have been added.
|
||||
|
||||
.. versionchanged:: 4.1
|
||||
|
||||
The attribute ``lines.event_location`` has been added.
|
||||
|
||||
.. versionchanged:: 4.6
|
||||
|
||||
The attribute ``lines.subevent`` has been added.
|
||||
|
||||
.. versionchanged:: 2023.8
|
||||
|
||||
The ``event`` attribute has been added. The organizer-level endpoint has been added.
|
||||
|
||||
@@ -64,10 +64,6 @@ hide_without_voucher boolean If ``true``, th
|
||||
meta_data object Values set for event-specific meta data parameters.
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.16
|
||||
|
||||
The ``meta_data`` and ``checkin_attention`` attributes have been added.
|
||||
|
||||
.. versionchanged:: 2023.10
|
||||
|
||||
The ``free_price_suggestion`` attribute has been added.
|
||||
|
||||
@@ -211,28 +211,6 @@ bundles list of objects Definition of
|
||||
meta_data object Values set for event-specific meta data parameters.
|
||||
======================================= ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.0
|
||||
|
||||
The attributes ``require_membership``, ``require_membership_types``, ``grant_membership_type``, ``grant_membership_duration_like_event``,
|
||||
``grant_membership_duration_days`` and ``grant_membership_duration_months`` have been added.
|
||||
|
||||
.. versionchanged:: 4.4
|
||||
|
||||
The attributes ``require_membership_hidden`` attribute has been added.
|
||||
|
||||
.. versionchanged:: 4.16
|
||||
|
||||
The ``variations[x].meta_data`` and ``variations[x].checkin_attention`` attributes have been added.
|
||||
The ``personalized`` attribute has been added.
|
||||
|
||||
.. versionchanged:: 4.17
|
||||
|
||||
The ``validity_*`` attributes have been added.
|
||||
|
||||
.. versionchanged:: 4.18
|
||||
|
||||
The ``media_policy`` and ``media_type`` attributes have been added.
|
||||
|
||||
.. versionchanged:: 2023.10
|
||||
|
||||
The ``checkin_text`` and ``variations[x].checkin_text`` attributes have been added.
|
||||
|
||||
@@ -114,34 +114,6 @@ plugin_data object Additional data
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
|
||||
.. versionchanged:: 4.0
|
||||
|
||||
The ``customer`` attribute has been added.
|
||||
|
||||
.. versionchanged:: 4.1
|
||||
|
||||
The ``custom_followup_at`` attribute has been added.
|
||||
|
||||
.. versionchanged:: 4.4
|
||||
|
||||
The ``item`` and ``variation`` query parameters have been added.
|
||||
|
||||
.. versionchanged:: 4.6
|
||||
|
||||
The ``subevent`` query parameters has been added.
|
||||
|
||||
.. versionchanged:: 4.8
|
||||
|
||||
The ``order.fees.id`` attribute has been added.
|
||||
|
||||
.. versionchanged:: 4.15
|
||||
|
||||
The ``include`` query parameter has been added.
|
||||
|
||||
.. versionchanged:: 4.16
|
||||
|
||||
The ``valid_if_pending`` attribute has been added.
|
||||
|
||||
.. versionchanged:: 2023.8
|
||||
|
||||
The ``event`` attribute has been added. The organizer-level endpoint has been added.
|
||||
@@ -260,10 +232,6 @@ pdf_data object Data object req
|
||||
plugin_data object Additional data added by plugins.
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.16
|
||||
|
||||
The attributes ``blocked``, ``valid_from`` and ``valid_until`` have been added.
|
||||
|
||||
.. versionchanged:: 2024.9
|
||||
|
||||
The attribute ``print_logs`` has been added.
|
||||
@@ -756,10 +724,6 @@ Fetching individual orders
|
||||
Order ticket download
|
||||
---------------------
|
||||
|
||||
.. versionchanged:: 4.10
|
||||
|
||||
The API now supports ticket downloads for pending orders if allowed by the event settings.
|
||||
|
||||
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/orders/(code)/download/(output)/
|
||||
|
||||
Download tickets for an order, identified by its order code. Depending on the chosen output, the response might
|
||||
@@ -1095,9 +1059,10 @@ Creating orders
|
||||
prices. Note that this will not include other fees and is calculated once during order generation and will not
|
||||
be respected automatically when the order changes later.)
|
||||
* ``_split_taxes_like_products`` (Optional convenience flag. If set to ``true``, your ``tax_rule`` will be ignored
|
||||
and the fee will be taxed like the products in the order. If the products have multiple tax rates, multiple fees
|
||||
will be generated with weights adjusted to the net price of the products. Note that this will be calculated once
|
||||
during order generation and is not respected automatically when the order changes later.)
|
||||
and the fee will be taxed like the products in the order *unless* the total amount of the positions is zero.
|
||||
If the products have multiple tax rates, multiple fees will be generated with weights adjusted to the net price
|
||||
of the products. Note that this will be calculated once during order generation and is not respected automatically
|
||||
when the order changes later.)
|
||||
|
||||
* ``force`` (optional). If set to ``true``, quotas will be ignored.
|
||||
* ``send_email`` (optional). If set to ``true``, the same emails will be sent as for a regular order, regardless of
|
||||
@@ -1832,10 +1797,6 @@ Fetching individual positions
|
||||
Order position ticket download
|
||||
------------------------------
|
||||
|
||||
.. versionchanged:: 4.10
|
||||
|
||||
The API now supports ticket downloads for pending orders if allowed by the event settings.
|
||||
|
||||
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/orderpositions/(id)/download/(output)/
|
||||
|
||||
Download tickets for one order position, identified by its internal ID.
|
||||
@@ -1888,15 +1849,6 @@ Order position ticket download
|
||||
Manipulating individual positions
|
||||
---------------------------------
|
||||
|
||||
.. versionchanged:: 4.8
|
||||
|
||||
The ``PATCH`` method now supports changing items, variations, subevents, seats, prices, and tax rules.
|
||||
The ``POST`` endpoint to add individual positions has been added.
|
||||
|
||||
.. versionadded:: 4.16
|
||||
|
||||
The endpoints to manage blocks have been added.
|
||||
|
||||
.. versionchanged:: 2024.9
|
||||
|
||||
The API now supports logging ticket and badge prints.
|
||||
@@ -2226,10 +2178,6 @@ multiple changes to an order at once within one transaction. This makes it possi
|
||||
attendees in an order without running into conflicts. This interface also offers some possibilities not available
|
||||
otherwise, such as splitting an order or changing fees.
|
||||
|
||||
.. versionchanged:: 4.8
|
||||
|
||||
This endpoint has been added to the system.
|
||||
|
||||
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/orders/(code)/change/
|
||||
|
||||
Performs a change operation on an order. You can supply the following fields:
|
||||
|
||||
@@ -25,10 +25,6 @@ public_url string The public, cus
|
||||
Endpoints
|
||||
---------
|
||||
|
||||
.. versionchanged:: 4.17
|
||||
|
||||
The ``public_url`` field has been added.
|
||||
|
||||
.. http:get:: /api/v1/organizers/
|
||||
|
||||
Returns a list of all organizers the authenticated user/token has access to.
|
||||
|
||||
@@ -36,11 +36,6 @@ available_number integer Number of avail
|
||||
slightly out of date. ``null`` means unlimited.
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.1
|
||||
|
||||
The ``with_availability`` query parameter has been added.
|
||||
|
||||
|
||||
Endpoints
|
||||
---------
|
||||
|
||||
@@ -86,7 +81,8 @@ Endpoints
|
||||
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``id`` and ``position``.
|
||||
Default: ``position``
|
||||
:query integer subevent: Only return quotas of the sub-event with the given ID.
|
||||
:query integer subevent__in: Only return quotas of sub-events with one the given IDs (comma-separated).
|
||||
:query integer subevent__in: Only return quotas of sub-events with one of the given IDs (comma-separated).
|
||||
:query integer items__in: Only return quotas that include a product with one of the given IDs (comma-separated).
|
||||
:query string with_availability: Set to ``true`` to get availability information. Can lead to increased answer times.
|
||||
:param organizer: The ``slug`` field of the organizer to fetch
|
||||
:param event: The ``slug`` field of the event to fetch
|
||||
|
||||
@@ -6,10 +6,6 @@ Data shredders
|
||||
pretix and it's plugins include a number of data shredders that allow you to clear personal information from the system.
|
||||
This page shows you how to use these shredders through the API.
|
||||
|
||||
.. versionchanged:: 4.12
|
||||
|
||||
This feature has been added to the API.
|
||||
|
||||
.. warning::
|
||||
|
||||
Unlike the user interface, the API will not force you to download tax-relevant data before you delete it.
|
||||
|
||||
@@ -59,15 +59,6 @@ seat_category_mapping object An object mappi
|
||||
last_modified datetime Last modification of this object
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.15
|
||||
|
||||
The ``search`` query parameter has been added to filter sub-events by their name or location in any language.
|
||||
|
||||
.. versionchanged:: 5.0
|
||||
|
||||
The ``date_from_before``, ``date_from_after``, ``date_to_before``, and ``date_to_after`` query parameters have been
|
||||
added.
|
||||
|
||||
.. versionchanged:: 2023.8.0
|
||||
|
||||
For the organizer-wide endpoint, the ``search`` query parameter has been modified to filter sub-events by their parent events slug too.
|
||||
@@ -75,10 +66,6 @@ last_modified datetime Last modificati
|
||||
Endpoints
|
||||
---------
|
||||
|
||||
.. versionchanged:: 4.1
|
||||
|
||||
The ``with_availability_for`` parameter has been added.
|
||||
|
||||
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/subevents/
|
||||
|
||||
Returns a list of all sub-events of an event.
|
||||
|
||||
@@ -40,10 +40,6 @@ custom_rules object Dynamic rules s
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
|
||||
.. versionchanged:: 4.6
|
||||
|
||||
The ``internal_name`` and ``keep_gross_if_rate_changes`` attributes have been added.
|
||||
|
||||
.. versionchanged:: 2023.6
|
||||
|
||||
The ``custom_rules`` attribute has been added.
|
||||
|
||||
@@ -39,10 +39,6 @@ can_change_vouchers boolean
|
||||
can_checkin_orders boolean
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.18
|
||||
|
||||
The ``can_manage_reusable_media`` permission has been added.
|
||||
|
||||
Team member resource
|
||||
--------------------
|
||||
|
||||
|
||||
@@ -178,13 +178,6 @@ You can then implement a view as you would normally do. It will be automatically
|
||||
* Your plugin is enabled
|
||||
* The locale is set correctly
|
||||
|
||||
.. versionchanged:: 1.7
|
||||
|
||||
The ``event_url()`` wrapper has been added in 1.7 to replace the former ``@event_view`` decorator. The
|
||||
``event_url()`` wrapper is optional and using ``url()`` still works, but you will not be able to set the
|
||||
``require_live`` setting any more via the decorator. The ``@event_view`` decorator is now deprecated and
|
||||
does nothing.
|
||||
|
||||
REST API viewsets
|
||||
-----------------
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@ Contents:
|
||||
exporter
|
||||
ticketoutput
|
||||
payment
|
||||
payment_2.0
|
||||
email
|
||||
placeholder
|
||||
invoice
|
||||
|
||||
@@ -1,129 +0,0 @@
|
||||
.. highlight:: python
|
||||
:linenothreshold: 5
|
||||
|
||||
.. _`payment2.0`:
|
||||
|
||||
Porting a payment provider from pretix 1.x to pretix 2.x
|
||||
========================================================
|
||||
|
||||
In pretix 2.x, we changed large parts of the payment provider API. This documentation details the changes we made
|
||||
and shows you how you can make an existing pretix 1.x payment provider compatible with pretix 2.x
|
||||
|
||||
Conceptual overview
|
||||
-------------------
|
||||
|
||||
In pretix 1.x, an order was always directly connected to a payment provider for the full life of an order. As long as
|
||||
an order was unpaid, this could still be changed in some cases, but once an order was paid, no changes to the payment
|
||||
provider were possible any more. Additionally, the internal state of orders allowed orders only to be fully paid or
|
||||
not paid at all. This leads to a couple of consequences:
|
||||
|
||||
* Payment-related functions (like "execute payment" or "do a refund") always operated on full orders.
|
||||
|
||||
* Changing the total of an order was basically impossible once an order was paid, since there was no concept of
|
||||
partial payments or partial refunds.
|
||||
|
||||
* Payment provider plugins needed to take complicated steps to detect cases that require human intervention, like e.g.
|
||||
|
||||
* An order has expired, no quota is left to revive it, but a payment has been received
|
||||
|
||||
* A payment has been received for a canceled order
|
||||
|
||||
* A payment has been received for an order that has already been paid with a different payment method
|
||||
|
||||
* An external payment service notified us of a refund/dispute
|
||||
|
||||
We noticed that we copied and repeated large portions of code in all our official payment provider plugins, just
|
||||
to deal with some of these cases.
|
||||
|
||||
* Sometimes, there is the need to mark an order as refunded within pretix, without automatically triggering a refund
|
||||
with an external API. Every payment method needed to implement a user interface for this independently.
|
||||
|
||||
* If a refund was not possible automatically, there was no way user to track which payments actually have been refunded
|
||||
manually and which are still left to do.
|
||||
|
||||
* When the payment with one payment provider failed and the user changed to a different payment provider, all
|
||||
information about the first payment was lost from the order object and could only be retrieved from order log data,
|
||||
which also made it hard to design a data shredder API to get rid of this data.
|
||||
|
||||
In pretix 2.x, we introduced two new models, :py:class:`OrderPayment <pretix.base.models.OrderPayment>` and
|
||||
:py:class:`OrderRefund <pretix.base.models.OrderRefund>`. Each instance of these is connected to an order and
|
||||
represents one single attempt to pay or refund a specific amount of money. Each one of these has an individual state,
|
||||
can individually fail or succeed, and carries an amount variable that can differ from the order total.
|
||||
|
||||
This has the following advantages:
|
||||
|
||||
* The system can now detect orders that are over- or underpaid, independent of the payment providers in use.
|
||||
|
||||
* Therefore, we can now allow partial payments, partial refunds, and changing paid orders, and automatically detect
|
||||
the cases listed above and notify the user.
|
||||
|
||||
Payment providers now interact with those payment and refund objects more than with orders.
|
||||
|
||||
Your to-do list
|
||||
---------------
|
||||
|
||||
Payment processing
|
||||
""""""""""""""""""
|
||||
|
||||
* The method ``BasePaymentProvider.order_pending_render`` has been removed and replaced by a new
|
||||
``BasePaymentProvider.payment_pending_render(request, payment)`` method that is passed an ``OrderPayment``
|
||||
object instead of an ``Order``.
|
||||
|
||||
* The method ``BasePaymentProvider.payment_form_render`` now receives a new ``total`` parameter.
|
||||
|
||||
* The method ``BasePaymentProvider.payment_perform`` has been removed and replaced by a new method
|
||||
``BasePaymentProvider.execute_payment(request, payment)`` that is passed an ``OrderPayment``
|
||||
object instead of an ``Order``.
|
||||
|
||||
* The function ``pretix.base.services.mark_order_paid`` has been removed, instead call ``payment.confirm()``
|
||||
on a pending ``OrderPayment`` object. If no further payments are required for this order, this will also
|
||||
mark the order as paid automatically. Note that ``payment.confirm()`` can still throw a ``QuotaExceededException``,
|
||||
however it will still mark the payment as complete (not the order!), so you should catch this exception and
|
||||
inform the user, but not abort the transaction.
|
||||
|
||||
* A new property ``BasePaymentProvider.abort_pending_allowed`` has been introduced. Only if set, the user will
|
||||
be able to retry a payment or switch the payment method when the order currently has a payment object in
|
||||
state ``"pending"``. This replaces ``BasePaymentProvider.order_can_retry``, which no longer exists.
|
||||
|
||||
* The methods ``BasePaymentProvider.retry_prepare`` and ``BasePaymentProvider.order_prepare`` have both been
|
||||
replaced by a new method ``BasePaymentProvider.payment_prepare(request, payment)`` that is passed an ``OrderPayment``
|
||||
object instead of an ``Order``. **Keep in mind that this payment object might have an amount property that
|
||||
differs from the order total, if the order is already partially paid.**
|
||||
|
||||
* The method ``BasePaymentProvider.order_paid_render`` has been removed.
|
||||
|
||||
* The method ``BasePaymentProvider.order_control_render`` has been removed and replaced by a new method
|
||||
``BasePaymentProvider.payment_control_render(request, payment)`` that is passed an ``OrderPayment``
|
||||
object instead of an ``Order``.
|
||||
|
||||
* There's no need to manually deal with excess payments or duplicate payments anymore, just setting the ``OrderPayment``
|
||||
methods to the correct state will do the job.
|
||||
|
||||
Creating refunds
|
||||
""""""""""""""""
|
||||
|
||||
* The methods ``BasePaymentProvider.order_control_refund_render`` and ``BasePaymentProvider.order_control_refund_perform``
|
||||
have been removed.
|
||||
|
||||
* Two new boolean methods ``BasePaymentProvider.payment_refund_supported(payment)`` and ``BasePaymentProvider.payment_partial_refund_supported(payment)``
|
||||
have been introduced. They should be set to return ``True`` if and only if the payment API allows to *automatically*
|
||||
transfer the money back to the customer.
|
||||
|
||||
* A new method ``BasePaymentProvider.execute_refund(refund)`` has been introduced. This method is called using a
|
||||
``OrderRefund`` object in ``"created"`` state and is expected to transfer the money back and confirm success with
|
||||
calling ``refund.done()``. This will only ever be called if either ``BasePaymentProvider.payment_refund_supported(payment)``
|
||||
or ``BasePaymentProvider.payment_partial_refund_supported(payment)`` return ``True``.
|
||||
|
||||
Processing external refunds
|
||||
"""""""""""""""""""""""""""
|
||||
|
||||
* If e.g. a webhook API notifies you that a payment has been disputed or refunded with the external API, you are
|
||||
expected to call ``OrderPayment.create_external_refund(self, amount, execution_date, info='{}')`` on this payment.
|
||||
This will create and return an appropriate ``OrderRefund`` object and send out a notification. However, it will not
|
||||
mark the order as refunded, but will ask the event organizer for a decision.
|
||||
|
||||
Data shredders
|
||||
""""""""""""""
|
||||
|
||||
* The method ``BasePaymentProvider.shred_payment_info`` is no longer passed an order, but instead **either**
|
||||
an ``OrderPayment`` **or** an ``OrderRefund``.
|
||||
@@ -1,177 +0,0 @@
|
||||
.. spelling:word-list::
|
||||
|
||||
AGPL
|
||||
AGPLv3
|
||||
GPL
|
||||
LGPL
|
||||
Apache
|
||||
BSD
|
||||
MIT
|
||||
CLA
|
||||
django
|
||||
i18nfields
|
||||
hierarkey
|
||||
rami.io
|
||||
rami
|
||||
io
|
||||
GmbH
|
||||
|
||||
License FAQ
|
||||
===========
|
||||
|
||||
.. warning::
|
||||
|
||||
This FAQ tries to explain in simpler terms what the license of the pretix open source project does and does not
|
||||
allow. It is based on our interpretation of the license and is not legal advice. The contents of this page are not
|
||||
legally binding, only the original text of the license in the `license file`_ is legally binding.
|
||||
|
||||
How is pretix licensed?
|
||||
-----------------------
|
||||
|
||||
pretix follows the popular dual licensing model. It is available under the `GNU Affero General Public License 3`_ (AGPL)
|
||||
plus some additional terms, as well as under a proprietary license ("pretix Enterprise license") on request.
|
||||
|
||||
How can it be AGPL if there are additional terms?
|
||||
-------------------------------------------------
|
||||
|
||||
Even though it is fairly unknown, the AGPL's section 7 is titled "Additional Terms" and outlines specific conditions
|
||||
under which additional terms can be imposed on an AGPL-licensed work. In our case, we add three additional terms.
|
||||
|
||||
The first additional term for pretix is an additional **permission**. It allows you to do something that the AGPL would
|
||||
generally not allow. As it doesn't restrict your freedoms granted by AGPL, if you don't like it, you can ignore it, and
|
||||
if you distribute pretix further, you can remove it.
|
||||
|
||||
The second and third additional term for pretix are additional terms that restrict or specify other provisions of the
|
||||
license. AGPL specifically requires that these terms can only restrict or specify very specific things and we believe
|
||||
our additional terms are in compliance with that and are thus valid and may not be removed.
|
||||
|
||||
Why did you choose this license model?
|
||||
--------------------------------------
|
||||
|
||||
pretix was born in the open source community and we're deeply committed to building the best open source ticketing
|
||||
solution in the world. It is important to us that pretix is available with a comprehensive feature set under term that
|
||||
are compatible with the `Open Source Definition`_. This enables event organizers from all industries and regions
|
||||
to have access to a self-hosted, privacy-friendly and secure option to host their events.
|
||||
|
||||
However, developing and maintaining pretix is a lot of work. Between 2014 and 2021, we've received external
|
||||
contributions from more than 150 individuals. Not counting translations over 90 % of the development was
|
||||
done by staff engineers of rami.io GmbH, the company that started pretix. While we're very happy to receive many more
|
||||
contributions in the future, we also want to ensure that we continue to be able to pay people working on pretix
|
||||
full-time.
|
||||
|
||||
We believe our model creates a good balance between ensuring pretix is available freely as well as protecting our
|
||||
business interests. Unlike licenses chosen by other projects recently, such as the Server-Side Public License, our
|
||||
choice does not restrict using pretix for any possible use case, it just sets a few rules that you have to play by
|
||||
if you do.
|
||||
|
||||
What do I need to do if I use pretix unmodified?
|
||||
------------------------------------------------
|
||||
|
||||
If you use pretix without any modifications or plugins, you can use it for whatever you want, as long as you keep
|
||||
all copyright notices (including the link to pretix at the bottom of the site) intact.
|
||||
|
||||
You are also allowed to make copies of the unmodified source code and distribute them to others as long as you keep
|
||||
all copyright and license information intact.
|
||||
|
||||
If you install **plugins**, you must follow the same terms as when using a **modified** version (see below).
|
||||
|
||||
What do I need to do if I modify pretix?
|
||||
----------------------------------------
|
||||
|
||||
If you want to modify pretix, you have the right to do so. However, you need to follow the following rules:
|
||||
|
||||
* If you **run it for your own events** (events run by you or your company as well as companies from the same
|
||||
corporate groups) our additional permission allows you to do so **without needing to share your source code
|
||||
modifications** as long as you keep the link to pretix at the bottom of the site intact.
|
||||
|
||||
* If you **run it for others**, for example as part of a Software-as-a-Service offering or a managed hosting service
|
||||
you **must** make the source code **including all your modifications and all installed plugins** available under the
|
||||
same license as pretix to every visitor of your site. You need to do so in a prominent place such as a link at the bottom of the
|
||||
site. You also **must** keep the existing link intact.
|
||||
You **may not** add additional restrictions on the result as a whole. You **may** add additional permissions, but
|
||||
only on the parts you added. You **must** make clear which changes you made and you must not give the impression that
|
||||
your modified version is an official version of pretix.
|
||||
|
||||
* If you **distribute** the modified version, for example as a source code or software package, you **must** license it
|
||||
under the AGPL license with the same additional terms. You **may not** add additional restrictions on the result as a
|
||||
whole. You **may** add additional permissions, but only on the parts you added. You **must** make clear which changes
|
||||
you made and you must not give the impression that your modified version is an official version of pretix.
|
||||
|
||||
Does the AGPL copyleft mechanism extend to plugins?
|
||||
---------------------------------------------------
|
||||
|
||||
Yes. pretix plugins are tightly integrated with pretix, so when running pretix together with a plugin in the same
|
||||
environment they form a `combined work`_ and the copyleft mechanism of AGPL applies.
|
||||
|
||||
Can I create proprietary or secret plugins?
|
||||
-------------------------------------------
|
||||
|
||||
Yes, you can create a proprietary or secret plugin, but it may only ever be **used** in an environment that is covered
|
||||
by the additional permission from our license. As soon as the plugin is installed in an installation that is not covered
|
||||
by our additional permission (e.g. when it is used in a SaaS environment) or covered by an active pretix Enterprise
|
||||
license it **must** be released to the visitors of the site under the same license as pretix (like a modified version
|
||||
of pretix).
|
||||
|
||||
What licenses can plugins use?
|
||||
------------------------------
|
||||
|
||||
Technically, you can distribute a plugin under any free or proprietary license as long as it is distributed separately.
|
||||
However, once it is either **distributed together with pretix or used in an environment not covered by our
|
||||
additional permission** or an active pretix Enterprise license, you **must** release it to all recipients of the
|
||||
distribution or all visitors of your site under the same license as pretix (like a modified version of pretix).
|
||||
|
||||
If you release a plugin publicly, it is therefore most practical to use a license that is `compatible to AGPL`_.
|
||||
This includes most open source licenses such as AGPL, GPL, Apache, 3-clause BSD or MIT.
|
||||
|
||||
Note however that when you license a plugin with pure AGPL, it will be incompatible with our additional permission.
|
||||
Therefore, if you want to use an AGPL-licensed plugin, you'll need to publish the source code of **all** your plugins
|
||||
under AGPL terms **even if you only use it for your own events**. A plugin would add its `own additional permission`_
|
||||
to its license to allow combining it with pretix for this use case.
|
||||
|
||||
To make things less complicated, if you want to distribute a plugin freely, we therefore recommend distributing the
|
||||
plugin under **Apache License 2.0**, like we do for most plugins we distribute as open source.
|
||||
|
||||
What do I need to do if I want to contribute my changes back?
|
||||
-------------------------------------------------------------
|
||||
|
||||
In order to retain the possibility for us to offer pretix in a dual licensing model, we unfortunately need you to sign
|
||||
a Contributor License Agreement (CLA) that gives us permission to use your contribution in all present and future
|
||||
distributions of pretix. We know the bureaucracy sucks. Sorry.
|
||||
|
||||
What if I want to re-use a minor part of pretix in my project?
|
||||
--------------------------------------------------------------
|
||||
|
||||
This is the main part we dislike about AGPL: If you see a specific thing in pretix that you'd like to use in another
|
||||
project, you'll need to distribute your other project under AGPL terms as well which is often not practical.
|
||||
|
||||
In this case, feel free to get in touch with us! We're happy to grant you special permission or pull the component
|
||||
out into a separately, permissively licensed repository. We already did that with `django-hierarkey`_ and
|
||||
`django-i18nfield`_ which have previously been parts of pretix.
|
||||
|
||||
What can I use the name "pretix" for?
|
||||
-------------------------------------
|
||||
|
||||
The name pretix is a registered trademark by rami.io GmbH.
|
||||
|
||||
* You **may** use it to **indicate copyright**, such as in the "powered by pretix" or "based on pretix" line, or when
|
||||
indicating that a distribution is based on pretix.
|
||||
|
||||
* You **may** use it to **indicate compatibility**, for example you are allowed to name your plugin "<name> for pretix"
|
||||
or you may state that an external service is compatible with pretix.
|
||||
|
||||
* You **may not** give the impression that your modified version, plugin or compatible service is official or authorized
|
||||
by rami.io GmbH or pretix unless we specifically allowed you to do so.
|
||||
|
||||
* You **may not** use it to name your modified version of pretix. End-users must be able to easily identify whether
|
||||
a version of pretix is distributed by us.
|
||||
|
||||
* You **may not** use any variations of the name, such as "MyPretix".
|
||||
|
||||
.. _license file: https://github.com/pretix/pretix/blob/master/LICENSE
|
||||
.. _GNU Affero General Public License 3: https://www.gnu.org/licenses/agpl-3.0.en.html
|
||||
.. _compatible to AGPL: https://www.gnu.org/licenses/license-list.en.html#GPLCompatibleLicenses
|
||||
.. _Open Source Definition: https://opensource.org/osd
|
||||
.. _combined work: https://www.gnu.org/licenses/gpl-faq.html#GPLPlugins
|
||||
.. _own additional permission: https://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs
|
||||
.. _django-hierarkey: https://github.com/raphaelm/django-hierarkey
|
||||
.. _django-i18nfield: https://github.com/raphaelm/django-i18nfield
|
||||
@@ -46,7 +46,7 @@ dependencies = [
|
||||
"django-hijack==3.7.*",
|
||||
"django-i18nfield==1.10.*",
|
||||
"django-libsass==0.9",
|
||||
"django-localflavor==4.0",
|
||||
"django-localflavor==5.0",
|
||||
"django-markup",
|
||||
"django-oauth-toolkit==2.3.*",
|
||||
"django-otp==1.6.*",
|
||||
@@ -76,12 +76,12 @@ dependencies = [
|
||||
"phonenumberslite==9.0.*",
|
||||
"Pillow==11.2.*",
|
||||
"pretix-plugin-build",
|
||||
"protobuf==6.30.*",
|
||||
"protobuf==6.31.*",
|
||||
"psycopg2-binary",
|
||||
"pycountry",
|
||||
"pycparser==2.22",
|
||||
"pycryptodome==3.23.*",
|
||||
"pypdf==5.4.*",
|
||||
"pypdf==5.6.*",
|
||||
"python-bidi==0.6.*", # Support for Arabic in reportlab
|
||||
"python-dateutil==2.9.*",
|
||||
"pytz",
|
||||
@@ -123,7 +123,7 @@ dev = [
|
||||
"pytest-mock==3.14.*",
|
||||
"pytest-sugar",
|
||||
"pytest-xdist==3.7.*",
|
||||
"pytest==8.3.*",
|
||||
"pytest==8.4.*",
|
||||
"responses",
|
||||
]
|
||||
|
||||
|
||||
@@ -1600,7 +1600,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
|
||||
self.context['event'].currency)
|
||||
is_split_taxes = fee_data.pop('_split_taxes_like_products', False)
|
||||
|
||||
if is_split_taxes:
|
||||
if is_split_taxes and order.total:
|
||||
d = defaultdict(lambda: Decimal('0.00'))
|
||||
trz = TaxRule.zero()
|
||||
for p in pos_map.values():
|
||||
|
||||
@@ -485,8 +485,17 @@ class QuestionOptionViewSet(viewsets.ModelViewSet):
|
||||
super().perform_destroy(instance)
|
||||
|
||||
|
||||
class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter):
|
||||
pass
|
||||
|
||||
|
||||
with scopes_disabled():
|
||||
class QuotaFilter(FilterSet):
|
||||
items__in = NumberInFilter(
|
||||
field_name='items__id',
|
||||
lookup_expr='in',
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = Quota
|
||||
fields = {
|
||||
@@ -508,7 +517,7 @@ class QuotaViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
return self.request.event.quotas.all()
|
||||
|
||||
def list(self, request, *args, **kwargs):
|
||||
queryset = self.filter_queryset(self.get_queryset())
|
||||
queryset = self.filter_queryset(self.get_queryset()).distinct()
|
||||
|
||||
page = self.paginate_queryset(queryset)
|
||||
|
||||
|
||||
@@ -308,7 +308,10 @@ class WrappedPhonePrefixSelect(Select):
|
||||
self.initial = "+%d" % prefix
|
||||
break
|
||||
choices += get_phone_prefixes_sorted_and_localized()
|
||||
super().__init__(choices=choices, attrs={'aria-label': pgettext_lazy('phonenumber', 'International area code')})
|
||||
super().__init__(choices=choices, attrs={
|
||||
'aria-label': pgettext_lazy('phonenumber', 'International area code'),
|
||||
'autocomplete': 'tel-country-code',
|
||||
})
|
||||
|
||||
def render(self, name, value, *args, **kwargs):
|
||||
return super().render(name, value or self.initial, *args, **kwargs)
|
||||
@@ -331,11 +334,11 @@ class WrappedPhonePrefixSelect(Select):
|
||||
class WrappedPhoneNumberPrefixWidget(PhoneNumberPrefixWidget):
|
||||
|
||||
def __init__(self, attrs=None, initial=None):
|
||||
attrs = {
|
||||
'aria-label': pgettext_lazy('phonenumber', 'Phone number (without international area code)')
|
||||
}
|
||||
widgets = (WrappedPhonePrefixSelect(initial), forms.TextInput(attrs=attrs))
|
||||
super(PhoneNumberPrefixWidget, self).__init__(widgets, attrs)
|
||||
widgets = (WrappedPhonePrefixSelect(initial), forms.TextInput(attrs={
|
||||
'aria-label': pgettext_lazy('phonenumber', 'Phone number (without international area code)'),
|
||||
'autocomplete': 'tel-national',
|
||||
}))
|
||||
super(PhoneNumberPrefixWidget, self).__init__(widgets)
|
||||
|
||||
def render(self, name, value, attrs=None, renderer=None):
|
||||
output = super().render(name, value, attrs, renderer)
|
||||
@@ -992,6 +995,13 @@ class BaseQuestionsForm(forms.Form):
|
||||
value.initial = data.get('question_form_data', {}).get(key)
|
||||
|
||||
for k, v in self.fields.items():
|
||||
if isinstance(v.widget, forms.MultiWidget):
|
||||
for w in v.widget.widgets:
|
||||
autocomplete = w.attrs.get('autocomplete', '')
|
||||
if autocomplete.strip() == "off":
|
||||
w.attrs['autocomplete'] = 'off'
|
||||
else:
|
||||
w.attrs['autocomplete'] = 'section-{} '.format(self.prefix) + autocomplete
|
||||
if v.widget.attrs.get('autocomplete') or k == 'attendee_name_parts':
|
||||
autocomplete = v.widget.attrs.get('autocomplete', '')
|
||||
if autocomplete.strip() == "off":
|
||||
|
||||
@@ -26,7 +26,7 @@ from django.utils.translation import gettext_lazy as _, pgettext_lazy
|
||||
|
||||
from pretix.base.models import (
|
||||
Discount, Item, ItemCategory, Order, Question, Quota, SubEvent, TaxRule,
|
||||
Voucher,
|
||||
Voucher, WaitingListEntry,
|
||||
)
|
||||
|
||||
from .logentrytype_registry import ( # noqa
|
||||
@@ -145,3 +145,15 @@ class TaxRuleLogEntryType(EventLogEntryType):
|
||||
object_link_viewname = 'control:event.settings.tax.edit'
|
||||
object_link_argname = 'rule'
|
||||
content_type = TaxRule
|
||||
|
||||
|
||||
class WaitingListEntryLogEntryType(EventLogEntryType):
|
||||
object_link_wrapper = _('{val}')
|
||||
object_link_viewname = 'control:event.orders.waitinglist'
|
||||
content_type = WaitingListEntry
|
||||
|
||||
def get_object_link_info(self, logentry) -> Optional[dict]:
|
||||
info = super().get_object_link_info(logentry)
|
||||
if info and 'href' in info:
|
||||
info['href'] += '?status=a&entry=' + str(logentry.content_object.pk)
|
||||
return info
|
||||
|
||||
@@ -1084,6 +1084,7 @@ class Event(EventMixin, LoggedModel):
|
||||
s.product = item_map[s.product_id]
|
||||
s.save(force_insert=True)
|
||||
|
||||
valid_sales_channel_identifers = set(self.organizer.sales_channels.values_list("identifier", flat=True))
|
||||
skip_settings = (
|
||||
'ticket_secrets_pretix_sig1_pubkey',
|
||||
'ticket_secrets_pretix_sig1_privkey',
|
||||
@@ -1119,6 +1120,11 @@ class Event(EventMixin, LoggedModel):
|
||||
settings_to_save.append(s)
|
||||
except ValueError:
|
||||
pass
|
||||
elif s.key.startswith('payment_') and s.key.endswith('__restrict_to_sales_channels'):
|
||||
data = other.settings._unserialize(s.value, as_type=list)
|
||||
data = [ident for ident in data if ident in valid_sales_channel_identifers]
|
||||
s.value = other.settings._serialize(data)
|
||||
settings_to_save.append(s)
|
||||
else:
|
||||
settings_to_save.append(s)
|
||||
other.settings._objects.bulk_create(settings_to_save)
|
||||
|
||||
@@ -218,7 +218,6 @@ class WaitingListEntry(LoggedModel):
|
||||
'waitinglistentry': self.pk,
|
||||
'subevent': self.subevent.pk if self.subevent else None,
|
||||
}, user=user, auth=auth)
|
||||
self.log_action('pretix.event.orders.waitinglist.voucher_assigned', user=user, auth=auth)
|
||||
self.voucher = v
|
||||
self.save()
|
||||
|
||||
@@ -234,6 +233,7 @@ class WaitingListEntry(LoggedModel):
|
||||
),
|
||||
user=user,
|
||||
auth=auth,
|
||||
log_entry_type='pretix.event.orders.waitinglist.voucher_assigned',
|
||||
)
|
||||
|
||||
def send_mail(self, subject: Union[str, LazyI18nString], template: Union[str, LazyI18nString],
|
||||
|
||||
@@ -689,11 +689,6 @@ class BasePaymentProvider:
|
||||
the ``_restrict_countries`` and ``_restrict_to_sales_channels`` setting.
|
||||
|
||||
:param total: The total value without the payment method fee, after taxes.
|
||||
|
||||
.. versionchanged:: 1.17.0
|
||||
|
||||
The ``total`` parameter has been added. For backwards compatibility, this method is called again
|
||||
without this parameter if it raises a ``TypeError`` on first try.
|
||||
"""
|
||||
timing = self._is_available_by_time(cart_id=get_or_create_cart_id(request))
|
||||
pricing = True
|
||||
|
||||
@@ -58,7 +58,7 @@ def timeline_for_event(event, subevent=None):
|
||||
event=event, subevent=subevent,
|
||||
datetime=ev.date_from,
|
||||
description=pgettext_lazy('timeline', 'Your event starts'),
|
||||
edit_url=ev_edit_url
|
||||
edit_url=ev_edit_url + '#id_date_from_0'
|
||||
))
|
||||
|
||||
if ev.date_to:
|
||||
@@ -66,7 +66,7 @@ def timeline_for_event(event, subevent=None):
|
||||
event=event, subevent=subevent,
|
||||
datetime=ev.date_to,
|
||||
description=pgettext_lazy('timeline', 'Your event ends'),
|
||||
edit_url=ev_edit_url
|
||||
edit_url=ev_edit_url + '#id_date_to_0'
|
||||
))
|
||||
|
||||
if ev.date_admission:
|
||||
@@ -74,7 +74,7 @@ def timeline_for_event(event, subevent=None):
|
||||
event=event, subevent=subevent,
|
||||
datetime=ev.date_admission,
|
||||
description=pgettext_lazy('timeline', 'Admissions for your event start'),
|
||||
edit_url=ev_edit_url
|
||||
edit_url=ev_edit_url + '#id_date_admission_0'
|
||||
))
|
||||
|
||||
if ev.presale_start:
|
||||
@@ -82,7 +82,7 @@ def timeline_for_event(event, subevent=None):
|
||||
event=event, subevent=subevent,
|
||||
datetime=ev.presale_start,
|
||||
description=pgettext_lazy('timeline', 'Start of ticket sales'),
|
||||
edit_url=ev_edit_url
|
||||
edit_url=ev_edit_url + '#id_presale_start_0'
|
||||
))
|
||||
|
||||
tl.append(TimelineEvent(
|
||||
@@ -95,7 +95,7 @@ def timeline_for_event(event, subevent=None):
|
||||
pgettext_lazy('timeline', 'End of ticket sales'),
|
||||
pgettext_lazy('timeline', 'automatically because the event is over and no end of presale has been configured') if not ev.presale_end else ""
|
||||
),
|
||||
edit_url=ev_edit_url
|
||||
edit_url=ev_edit_url + '#id_presale_end_0'
|
||||
))
|
||||
|
||||
rd = event.settings.get('last_order_modification_date', as_type=RelativeDateWrapper)
|
||||
@@ -104,7 +104,7 @@ def timeline_for_event(event, subevent=None):
|
||||
event=event, subevent=subevent,
|
||||
datetime=rd.datetime(ev),
|
||||
description=pgettext_lazy('timeline', 'Customers can no longer modify their order information'),
|
||||
edit_url=ev_edit_url
|
||||
edit_url=ev_edit_url + '#id_settings-last_order_modification_date_0_0'
|
||||
))
|
||||
|
||||
rd = event.settings.get('payment_term_last', as_type=RelativeDateWrapper)
|
||||
@@ -281,7 +281,7 @@ def timeline_for_event(event, subevent=None):
|
||||
'event': event.slug,
|
||||
'organizer': event.organizer.slug,
|
||||
'item': p.pk,
|
||||
})
|
||||
}) + '#id_available_from_0'
|
||||
))
|
||||
if p.available_until:
|
||||
tl.append(TimelineEvent(
|
||||
@@ -292,7 +292,7 @@ def timeline_for_event(event, subevent=None):
|
||||
'event': event.slug,
|
||||
'organizer': event.organizer.slug,
|
||||
'item': p.pk,
|
||||
})
|
||||
}) + '#id_available_until_0'
|
||||
))
|
||||
|
||||
for v in ItemVariation.objects.filter(
|
||||
@@ -311,7 +311,7 @@ def timeline_for_event(event, subevent=None):
|
||||
'event': event.slug,
|
||||
'organizer': event.organizer.slug,
|
||||
'item': v.item.pk,
|
||||
})
|
||||
}) + '#tab-0-3-open'
|
||||
))
|
||||
if v.available_until:
|
||||
tl.append(TimelineEvent(
|
||||
@@ -325,7 +325,7 @@ def timeline_for_event(event, subevent=None):
|
||||
'event': event.slug,
|
||||
'organizer': event.organizer.slug,
|
||||
'item': v.item.pk,
|
||||
})
|
||||
}) + '#tab-0-3-open'
|
||||
))
|
||||
|
||||
pprovs = event.get_payment_providers()
|
||||
@@ -339,6 +339,24 @@ def timeline_for_event(event, subevent=None):
|
||||
continue
|
||||
except:
|
||||
pass
|
||||
availability_start = pprov.settings.get('_availability_start', as_type=RelativeDateWrapper)
|
||||
if availability_start:
|
||||
d = make_aware(datetime.combine(
|
||||
availability_start.date(ev),
|
||||
time(hour=0, minute=0, second=0)
|
||||
), event.timezone)
|
||||
tl.append(TimelineEvent(
|
||||
event=event, subevent=subevent,
|
||||
datetime=d,
|
||||
description=pgettext_lazy('timeline', 'Payment provider "{name}" becomes active').format(
|
||||
name=str(pprov.verbose_name)
|
||||
),
|
||||
edit_url=reverse('control:event.settings.payment.provider', kwargs={
|
||||
'event': event.slug,
|
||||
'organizer': event.organizer.slug,
|
||||
'provider': pprov.identifier,
|
||||
})
|
||||
))
|
||||
availability_date = pprov.settings.get('_availability_date', as_type=RelativeDateWrapper)
|
||||
if availability_date:
|
||||
d = make_aware(datetime.combine(
|
||||
|
||||
@@ -50,7 +50,7 @@ from pretix.base.logentrytypes import (
|
||||
DiscountLogEntryType, EventLogEntryType, ItemCategoryLogEntryType,
|
||||
ItemLogEntryType, LogEntryType, OrderLogEntryType, QuestionLogEntryType,
|
||||
QuotaLogEntryType, TaxRuleLogEntryType, VoucherLogEntryType,
|
||||
log_entry_types,
|
||||
WaitingListEntryLogEntryType, log_entry_types,
|
||||
)
|
||||
from pretix.base.models import (
|
||||
Checkin, CheckinList, Event, ItemVariation, LogEntry, OrderPosition,
|
||||
@@ -697,11 +697,7 @@ class CoreUserImpersonatedLogEntryType(UserImpersonatedLogEntryType):
|
||||
'the last request was less than 24 hours ago.'),
|
||||
'pretix.organizer.deleted': _('The organizer "{name}" has been deleted.'),
|
||||
'pretix.waitinglist.voucher': _('A voucher has been sent to a person on the waiting list.'), # legacy
|
||||
'pretix.event.orders.waitinglist.voucher_assigned': _('A voucher has been sent to a person on the waiting list.'),
|
||||
'pretix.event.orders.waitinglist.deleted': _('An entry has been removed from the waiting list.'),
|
||||
'pretix.event.order.waitinglist.transferred': _('An entry has been transferred to another waiting list.'), # legacy
|
||||
'pretix.event.orders.waitinglist.changed': _('An entry has been changed on the waiting list.'),
|
||||
'pretix.event.orders.waitinglist.added': _('An entry has been added to the waiting list.'),
|
||||
'pretix.team.created': _('The team has been created.'),
|
||||
'pretix.team.changed': _('The team settings have been changed.'),
|
||||
'pretix.team.deleted': _('The team has been deleted.'),
|
||||
@@ -903,3 +899,13 @@ class LegacyCheckinLogEntryType(OrderLogEntryType):
|
||||
datetime=dt_formatted,
|
||||
list=checkin_list
|
||||
)
|
||||
|
||||
|
||||
@log_entry_types.new_from_dict({
|
||||
'pretix.event.orders.waitinglist.voucher_assigned': _('A voucher has been sent to a person on the waiting list.'),
|
||||
'pretix.event.orders.waitinglist.deleted': _('An entry has been removed from the waiting list.'),
|
||||
'pretix.event.orders.waitinglist.changed': _('An entry has been changed on the waiting list.'),
|
||||
'pretix.event.orders.waitinglist.added': _('An entry has been added to the waiting list.'),
|
||||
})
|
||||
class CoreWaitingListEntryLogEntryType(WaitingListEntryLogEntryType):
|
||||
pass
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
|
||||
"PO-Revision-Date: 2025-05-28 08:00+0000\n"
|
||||
"PO-Revision-Date: 2025-06-04 06:32+0000\n"
|
||||
"Last-Translator: 조정화 <junghwa.jo@om.org>\n"
|
||||
"Language-Team: Korean <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
"ko/>\n"
|
||||
@@ -733,7 +733,7 @@ msgstr "카트가 만료되었습니다"
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:59
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:87
|
||||
msgid "Your cart is about to expire."
|
||||
msgstr ""
|
||||
msgstr "카트가 곧 만료됩니다."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:64
|
||||
msgid "The items in your cart are reserved for you for one minute."
|
||||
@@ -764,11 +764,11 @@ msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:90
|
||||
msgid "Do you want to renew the reservation period?"
|
||||
msgstr ""
|
||||
msgstr "예약 기간을 갱신하시겠습니까?"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:93
|
||||
msgid "Renew reservation"
|
||||
msgstr ""
|
||||
msgstr "예약 갱신"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:194
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
@@ -811,12 +811,13 @@ msgstr "수량 증가"
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:19
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr ""
|
||||
msgstr "이벤트를 걸러내다(이벤트 중에서 특정 조건에 맞는 것만 골라서 보여주거나, "
|
||||
"나머지를 숨기는 것을 의미)"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:20
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "걸러내다(데이터나 목록, 정보에서 조건에 맞는 것만 보여주기라는 의미)"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:21
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
|
||||
@@ -1075,7 +1076,7 @@ msgstr "체크아웃 재개"
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:63
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
msgstr "이 작업은 취소할 수 없습니다. 로딩이 끝날 때까지 기다려 주세요"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:64
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60
|
||||
|
||||
@@ -7,16 +7,16 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
|
||||
"PO-Revision-Date: 2025-05-01 02:00+0000\n"
|
||||
"Last-Translator: Foxy Hunter <matthias.vancoillie@outlook.com>\n"
|
||||
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/"
|
||||
">\n"
|
||||
"PO-Revision-Date: 2025-06-10 04:00+0000\n"
|
||||
"Last-Translator: Tim Maurizio Dullaart <Tim.maurizio@gmail.com>\n"
|
||||
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/>"
|
||||
"\n"
|
||||
"Language: nl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.11.1\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
#: pretix/_base_settings.py:87
|
||||
msgid "English"
|
||||
@@ -88,7 +88,7 @@ msgstr "Grieks"
|
||||
|
||||
#: pretix/_base_settings.py:104
|
||||
msgid "Hebrew"
|
||||
msgstr ""
|
||||
msgstr "Hebreeuws"
|
||||
|
||||
#: pretix/_base_settings.py:105
|
||||
msgid "Indonesian"
|
||||
@@ -694,16 +694,16 @@ msgstr ""
|
||||
"gebruikt worden door integraties."
|
||||
|
||||
#: pretix/base/context.py:38
|
||||
#, fuzzy, python-brace-format
|
||||
#| msgid "powered by {name} based on <a {a_attr}>pretix</a>"
|
||||
#, python-brace-format
|
||||
msgid "<a {a_name_attr}>powered by {name}</a> <a {a_attr}>based on pretix</a>"
|
||||
msgstr "mogelijk gemaakt door {name}, gebaseerd op <a {a_attr}>pretix</a>"
|
||||
msgstr ""
|
||||
"<a {a_name_attr}>mogelijk gemaakt door {name}</a> <a {a_attr}> gebaseerd op "
|
||||
"pretix</a>"
|
||||
|
||||
#: pretix/base/context.py:48
|
||||
#, fuzzy, python-brace-format
|
||||
#| msgid "powered by {name} based on <a {a_attr}>pretix</a>"
|
||||
#, python-brace-format
|
||||
msgid "<a {a_attr}>powered by {name} based on pretix</a>"
|
||||
msgstr "mogelijk gemaakt door {name}, gebaseerd op <a {a_attr}>pretix</a>"
|
||||
msgstr "<a {a_attr}>medemogelijk gemaakt door {name} gebasseerd op pretix</a>"
|
||||
|
||||
#: pretix/base/context.py:55
|
||||
#, python-format
|
||||
@@ -4362,13 +4362,15 @@ msgstr "Optioneel. Er worden geen producten verkocht vóór deze datum."
|
||||
|
||||
#: pretix/base/models/event.py:621
|
||||
msgid "This event is remote or partially remote."
|
||||
msgstr ""
|
||||
msgstr "Dit evenement is afgelegen of gedeeltelijk afgelegen."
|
||||
|
||||
#: pretix/base/models/event.py:622
|
||||
msgid ""
|
||||
"This will be used to let users know if the event is in a different timezone "
|
||||
"and let’s us calculate users’ local times."
|
||||
msgstr ""
|
||||
"Dit wordt gebruikt om gebruikers te laten weten of het evenement in een "
|
||||
"andere tijdzone is en laat het ons de gebruikers lokale tijdzone berekenen."
|
||||
|
||||
#: pretix/base/models/event.py:642 pretix/control/navigation.py:65
|
||||
msgid "Plugins"
|
||||
@@ -6064,10 +6066,8 @@ msgid "Cart ID (e.g. session key)"
|
||||
msgstr "Winkelwagen-ID (bijv. sessiesleutel)"
|
||||
|
||||
#: pretix/base/models/orders.py:3102
|
||||
#, fuzzy
|
||||
#| msgid "Gift card: Expiration date"
|
||||
msgid "Limit for extending expiration date"
|
||||
msgstr "Cadeaubon: Verloopdatum"
|
||||
msgstr "Limiet voor het uitstellen van de vervaldatum"
|
||||
|
||||
#: pretix/base/models/orders.py:3131
|
||||
msgid "Cart position"
|
||||
@@ -7262,10 +7262,8 @@ msgid "You cannot pay with gift cards when buying a gift card."
|
||||
msgstr "U kunt niet met cadeaubonnen betalen wanneer u een cadeaubon koopt."
|
||||
|
||||
#: pretix/base/payment.py:1467
|
||||
#, fuzzy
|
||||
#| msgid "Please enter the correct result."
|
||||
msgid "Please enter the code of your gift card."
|
||||
msgstr "Vul alstublieft het correcte resultaat in."
|
||||
msgstr "Vul alstublieft de code van jouw cadeaukaart in."
|
||||
|
||||
#: pretix/base/payment.py:1483 pretix/base/payment.py:1526
|
||||
msgid ""
|
||||
@@ -10658,22 +10656,16 @@ msgstr ""
|
||||
"hoe uw de in uw ticketwinkel verzamelde gegevens gebruikt."
|
||||
|
||||
#: pretix/base/settings.py:2071
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information URL"
|
||||
msgstr "Accountinformatie"
|
||||
msgstr "Toegankelijkheids informatie URL"
|
||||
|
||||
#: pretix/base/settings.py:2072
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "This should point e.g. to a part of your website that explains how you "
|
||||
#| "use data gathered in your ticket shop."
|
||||
msgid ""
|
||||
"This should point e.g. to a part of your website that explains how your "
|
||||
"ticket shop complies with accessibility regulation."
|
||||
msgstr ""
|
||||
"Dit zou bijvoorbeeld naar een deel van uw website moeten wijzen dat uitlegt "
|
||||
"hoe uw de in uw ticketwinkel verzamelde gegevens gebruikt."
|
||||
"hoe uw ticketwinkel omgaat met de toegankelijkheids wetgevingen."
|
||||
|
||||
#: pretix/base/settings.py:2079
|
||||
#: pretix/presale/templates/pretixpresale/event/base.html:228
|
||||
@@ -10681,22 +10673,16 @@ msgstr ""
|
||||
#: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6
|
||||
#: pretix/presale/templates/pretixpresale/organizers/base.html:106
|
||||
#: pretix/presale/templates/pretixpresale/organizers/base.html:111
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information"
|
||||
msgstr "Accountinformatie"
|
||||
msgstr "Toegankelijkheids informatie"
|
||||
|
||||
#: pretix/base/settings.py:2083
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information title"
|
||||
msgstr "Accountinformatie"
|
||||
msgstr "Toegankelijkheids informatie titel"
|
||||
|
||||
#: pretix/base/settings.py:2093
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information text"
|
||||
msgstr "Accountinformatie"
|
||||
msgstr "Toegankelijkheids informatie tekst"
|
||||
|
||||
#: pretix/base/settings.py:2114
|
||||
msgid "Attach ticket files"
|
||||
@@ -17767,7 +17753,9 @@ msgstr "draaiend in ontwikkelmodus"
|
||||
#: pretix/presale/templates/pretixpresale/postmessage.html:27
|
||||
#: pretix/presale/templates/pretixpresale/waiting.html:42
|
||||
msgid "If this takes longer than a few minutes, please contact us."
|
||||
msgstr "Neem contact met ons op als dit langer dan een aantal minuten duurt."
|
||||
msgstr ""
|
||||
"Als dit langer dan een paar minuten duurt, neem dan alstublieft contact met "
|
||||
"ons op."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:4
|
||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html:71
|
||||
@@ -21253,13 +21241,11 @@ msgstr "Product met varianten"
|
||||
#: pretix/control/templates/pretixcontrol/items/index.html:118
|
||||
msgctxt "subevent"
|
||||
msgid "Product assigned to seating plan for one or more dates"
|
||||
msgstr ""
|
||||
msgstr "Product toegewezen tot een zittingsschema voor een of meerdere data"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/index.html:118
|
||||
#, fuzzy
|
||||
#| msgid "Product settings"
|
||||
msgid "Product assigned to seating plan"
|
||||
msgstr "Productinstellingen"
|
||||
msgstr "Product toegewezen tot een zittingsplan"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/index.html:126
|
||||
msgid "Only available as an add-on product"
|
||||
@@ -23786,10 +23772,8 @@ msgstr ""
|
||||
"trackingaanbieders niet kennen."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:204
|
||||
#, fuzzy
|
||||
#| msgid "Availability"
|
||||
msgid "Accessibility"
|
||||
msgstr "Beschikbaarheid"
|
||||
msgstr "Toegankelijkheid"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:206
|
||||
msgid ""
|
||||
@@ -23798,12 +23782,19 @@ msgid ""
|
||||
"template in <a href=\"https://docs.pretix.eu/trust/accessibility/\" "
|
||||
"target=\"_blank\">our documentation</a>."
|
||||
msgstr ""
|
||||
"Sommige rechtsgebieden, waaronder de Europeese Unie, vereist jou om "
|
||||
"informatie te publiceren over de toegankelijkheid van je ticket winkel. Je "
|
||||
"kan een template vinden in <a href="
|
||||
"\"https://docs.pretix.eu/trust/accessibility/\" target=\"_blank\">onze "
|
||||
"documentatie</a>."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:216
|
||||
msgid ""
|
||||
"Instead of an URL, you can also configure a text that will be shown within "
|
||||
"pretix. This will be ignored if a URL is configured."
|
||||
msgstr ""
|
||||
"In plaats van een URL, kan je ook een tekst instellen, dat wordt laten zien "
|
||||
"binnen pretix. Dit wordt genegeerd als een URL is ingesteld."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:228
|
||||
msgid "Barcode media"
|
||||
@@ -29091,10 +29082,8 @@ msgid "Open BezahlCode in your banking app to start the payment process."
|
||||
msgstr "Open BezahlCode in uw bank-app om het betalingsproces te starten."
|
||||
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:129
|
||||
#, fuzzy
|
||||
#| msgid "Scan the qr-code with your banking app"
|
||||
msgid "Scan the QR code with your banking app"
|
||||
msgstr "Scan de qr-code met uw bankapplicatie"
|
||||
msgstr "Scan de QR-code met uw bankapplicatie"
|
||||
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:141
|
||||
#, python-format
|
||||
@@ -32272,17 +32261,12 @@ msgid "You need to fill out all fields."
|
||||
msgstr "Vul alle velden in."
|
||||
|
||||
#: pretix/presale/forms/customer.py:69
|
||||
#, fuzzy
|
||||
#| msgid "Please enter a valid email address."
|
||||
msgid "You need to enter an email address."
|
||||
msgstr "Vul alstublieft een geldig e-mailadres in."
|
||||
msgstr "U moet een e-mailadres invullen."
|
||||
|
||||
#: pretix/presale/forms/customer.py:70
|
||||
#, fuzzy
|
||||
#| msgctxt "subevent"
|
||||
#| msgid "You need to select a date."
|
||||
msgid "You need to enter a password."
|
||||
msgstr "U moet een datum selecteren."
|
||||
msgstr "U moet een wachtwoord invullen."
|
||||
|
||||
#: pretix/presale/forms/customer.py:72
|
||||
msgid "We have not found an account with this email address and password."
|
||||
@@ -32291,27 +32275,18 @@ msgstr ""
|
||||
"wachtwoord vinden."
|
||||
|
||||
#: pretix/presale/forms/customer.py:74
|
||||
#, fuzzy
|
||||
#| msgid "Please enter the same email address twice."
|
||||
msgid "Please verify that you entered the correct email address."
|
||||
msgstr "Voer twee keer hetzelfde e-mailadres in."
|
||||
msgstr "Alstublieft controleer of u het juiste emailadress heeft ingevuld."
|
||||
|
||||
#: pretix/presale/forms/customer.py:75
|
||||
#, fuzzy
|
||||
#| msgid "Please enter the correct result."
|
||||
msgid "Please enter the correct password."
|
||||
msgstr "Vul alstublieft het correcte resultaat in."
|
||||
msgstr "Vul alstublieft het correcte wachtwoord in."
|
||||
|
||||
#: pretix/presale/forms/customer.py:76
|
||||
msgid "This account is disabled."
|
||||
msgstr "Dit account is uitgeschakeld."
|
||||
|
||||
#: pretix/presale/forms/customer.py:77
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "You have not yet activated your account and set a password. Please click "
|
||||
#| "the link in the email we sent you. Click \"Reset password\" to receive a "
|
||||
#| "new email in case you cannot find it again."
|
||||
msgid ""
|
||||
"You have not yet activated your account and set a password. Please click the "
|
||||
"link in the email we sent you. In case you cannot find it, click \"Forgot "
|
||||
@@ -32323,10 +32298,8 @@ msgstr ""
|
||||
"te klikken."
|
||||
|
||||
#: pretix/presale/forms/customer.py:90
|
||||
#, fuzzy
|
||||
#| msgid "Your password"
|
||||
msgid "Forgot your password?"
|
||||
msgstr "Uw wachtwoord"
|
||||
msgstr "Wachtwoord vergeten?"
|
||||
|
||||
#: pretix/presale/forms/customer.py:146
|
||||
msgid ""
|
||||
@@ -32431,17 +32404,13 @@ msgid "Organizer: {organizer}"
|
||||
msgstr "Organisator: {organizer}"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/base.html:47
|
||||
#, fuzzy
|
||||
#| msgid "Send links"
|
||||
msgctxt "skip-to-main-nav"
|
||||
msgid "Skip link"
|
||||
msgstr "Verstuur links"
|
||||
msgstr "Sla over link"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/base.html:48
|
||||
#, fuzzy
|
||||
#| msgid "Email content"
|
||||
msgid "Skip to main content"
|
||||
msgstr "E-mailinhoud"
|
||||
msgstr "Overslaan naar de hoofd-inhoud"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/base.html:76
|
||||
msgid "Footer Navigation"
|
||||
@@ -33286,10 +33255,8 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:509
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
|
||||
#, fuzzy
|
||||
#| msgid "Event description"
|
||||
msgid "Renew reservation"
|
||||
msgstr "Evenementomschrijving"
|
||||
msgstr "Vernieuw reservering"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514
|
||||
msgid "Overview of your ordered products."
|
||||
@@ -33643,8 +33610,6 @@ msgstr "Toon vorige maand, %(month)s"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar.html:24
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar.html:52
|
||||
#, fuzzy
|
||||
#| msgid "Select month to show"
|
||||
msgid "Select a month to display"
|
||||
msgstr "Kies maand om te tonen"
|
||||
|
||||
@@ -33656,11 +33621,8 @@ msgstr "Maand"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar.html:39
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar.html:67
|
||||
#, fuzzy
|
||||
#| msgctxt "reporting_timeframe"
|
||||
#| msgid "by month"
|
||||
msgid "Show month"
|
||||
msgstr "per maand"
|
||||
msgstr "Weergeven per maand"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar.html:50
|
||||
#, python-format
|
||||
@@ -33675,10 +33637,8 @@ msgstr "Toon vorige week, %(week)s"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:24
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar_week.html:52
|
||||
#, fuzzy
|
||||
#| msgid "Select week to show"
|
||||
msgid "Select a week to display"
|
||||
msgstr "Kies week om te tonen"
|
||||
msgstr "Kies een week om te weer te geven"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:26
|
||||
#: pretix/presale/templates/pretixpresale/fragment_calendar_nav.html:12
|
||||
@@ -33692,11 +33652,8 @@ msgstr "Kies week om te tonen"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:43
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar_week.html:71
|
||||
#, fuzzy
|
||||
#| msgctxt "reporting_timeframe"
|
||||
#| msgid "by week"
|
||||
msgid "Show week"
|
||||
msgstr "per week"
|
||||
msgstr "Weergeef per week"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:54
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:73
|
||||
@@ -34622,8 +34579,6 @@ msgstr ""
|
||||
"gaan."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:58
|
||||
#, fuzzy
|
||||
#| msgid "Closed"
|
||||
msgid "Close"
|
||||
msgstr "Gesloten"
|
||||
|
||||
@@ -34668,8 +34623,6 @@ msgid "Save selection"
|
||||
msgstr "Selectie opslaan"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:141
|
||||
#, fuzzy
|
||||
#| msgid "You did not select any products."
|
||||
msgid "You didn't select any ticket."
|
||||
msgstr "U heeft geen producten geselecteerd."
|
||||
|
||||
@@ -34678,6 +34631,8 @@ msgid ""
|
||||
"Please tick a checkbox or enter a quantity for one of the ticket types to "
|
||||
"add to the cart."
|
||||
msgstr ""
|
||||
"Alstublieft klik op een selectievak of voeg een quantiteit toe voor een van "
|
||||
"de ticket types in de winkelwagen."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:82
|
||||
#, python-format
|
||||
@@ -34729,10 +34684,9 @@ msgid "Event overview"
|
||||
msgstr "Evenementenoverzicht"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar.html:21
|
||||
#, fuzzy, python-format
|
||||
#| msgid "Show next month, %(month)s"
|
||||
#, python-format
|
||||
msgid "Events in %(month)s"
|
||||
msgstr "Toon volgende maand, %(month)s"
|
||||
msgstr "Evenementen in %(month)s"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar.html:91
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:104
|
||||
@@ -34742,28 +34696,22 @@ msgstr ""
|
||||
"Merk op dat de evenementen in dit overzicht in verschillende tijdzones zijn."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:21
|
||||
#, fuzzy, python-format
|
||||
#| msgid "Entry scan: %(date)s"
|
||||
#, python-format
|
||||
msgid "Events on %(day)s"
|
||||
msgstr "Ingangsscan: %(date)s"
|
||||
msgstr "Evenementen op %(day)s"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:52
|
||||
#, fuzzy
|
||||
#| msgctxt "subevents"
|
||||
#| msgid "Select date"
|
||||
msgid "Select a date to display"
|
||||
msgstr "Kies een datum"
|
||||
msgstr "Kies een datum om weer te geven"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:59
|
||||
#, fuzzy
|
||||
#| msgid "Show start date"
|
||||
msgid "Show date"
|
||||
msgstr "Toon startdatum"
|
||||
msgstr "Weergeef startdatum"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar_week.html:21
|
||||
#, python-format
|
||||
msgid "Events in %(week)s (%(week_day_from)s – %(week_day_to)s)"
|
||||
msgstr ""
|
||||
msgstr "Evenementen in %(week)s (%(week_day_from)s – %(week_day_to)s)"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/customer_address_delete.html:5
|
||||
#: pretix/presale/templates/pretixpresale/organizers/customer_address_delete.html:10
|
||||
@@ -34997,10 +34945,8 @@ msgid "Your cart is now empty."
|
||||
msgstr "Uw winkelwagen is nu leeg."
|
||||
|
||||
#: pretix/presale/views/cart.py:553
|
||||
#, fuzzy
|
||||
#| msgid "Your cart has been updated."
|
||||
msgid "Your cart timeout was extended."
|
||||
msgstr "Uw winkelwagen is bijgewerkt."
|
||||
msgstr "Uw winkelwagens tijdslimiet is verlengt."
|
||||
|
||||
#: pretix/presale/views/cart.py:568
|
||||
msgid "The products have been successfully added to your cart."
|
||||
|
||||
@@ -7,8 +7,8 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
|
||||
"PO-Revision-Date: 2025-05-01 02:00+0000\n"
|
||||
"Last-Translator: Foxy Hunter <matthias.vancoillie@outlook.com>\n"
|
||||
"PO-Revision-Date: 2025-06-10 04:00+0000\n"
|
||||
"Last-Translator: Tim Maurizio Dullaart <Tim.maurizio@gmail.com>\n"
|
||||
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
"nl/>\n"
|
||||
"Language: nl\n"
|
||||
@@ -16,7 +16,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.11.1\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
|
||||
@@ -415,6 +415,8 @@ msgstr ""
|
||||
#: pretix/static/pretixbase/js/asynctask.js:270
|
||||
msgid "If this takes longer than a few minutes, please contact us."
|
||||
msgstr ""
|
||||
"Als dit langer dan een paar minuten duurt, neem dan alstublieft contact met "
|
||||
"ons op."
|
||||
|
||||
#: pretix/static/pretixbase/js/asynctask.js:325
|
||||
msgid "Close message"
|
||||
@@ -626,25 +628,26 @@ msgid "Unknown error."
|
||||
msgstr "Onbekende fout."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:292
|
||||
#, fuzzy
|
||||
#| msgid "Your color has great contrast and is very easy to read!"
|
||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||
msgstr "Uw kleur heeft een goed contrast, en is gemakkelijk te lezen!"
|
||||
msgstr ""
|
||||
"Uw kleur heeft een goed contrast, en zal zorgen voor een uitstekende "
|
||||
"toegankelijkheid."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:296
|
||||
#, fuzzy
|
||||
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
||||
msgid ""
|
||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||
"requirements."
|
||||
msgstr ""
|
||||
"Uw kleur heeft een redelijk contrast, en is waarschijnlijk goed te lezen!"
|
||||
"Uw kleur heeft een redelijk contrast, en is voldoende voor de minimale "
|
||||
"toegankelijkheids eisen."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:300
|
||||
msgid ""
|
||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||
"will be impacted."
|
||||
msgstr ""
|
||||
"Uw kleur heeft een te weinig contrast met wit. De toegankelijkheid van jouw "
|
||||
"site wordt beïnvloed."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:416
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:436
|
||||
@@ -720,7 +723,7 @@ msgstr "Winkelwagen is verlopen"
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:59
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:87
|
||||
msgid "Your cart is about to expire."
|
||||
msgstr ""
|
||||
msgstr "Uw winkelwagen staat op het punt om te verlopen."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:64
|
||||
msgid "The items in your cart are reserved for you for one minute."
|
||||
@@ -730,16 +733,10 @@ msgstr[1] ""
|
||||
"De items in uw winkelwagen zijn nog {num} minuten voor u gereserveerd."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:86
|
||||
#, fuzzy
|
||||
#| msgid "Cart expired"
|
||||
msgid "Your cart has expired."
|
||||
msgstr "Winkelwagen is verlopen"
|
||||
msgstr "Uw winkelwagen is verlopen."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:89
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "The items in your cart are no longer reserved for you. You can still "
|
||||
#| "complete your order as long as they’re available."
|
||||
msgid ""
|
||||
"The items in your cart are no longer reserved for you. You can still "
|
||||
"complete your order as long as they're available."
|
||||
@@ -749,11 +746,11 @@ msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:90
|
||||
msgid "Do you want to renew the reservation period?"
|
||||
msgstr ""
|
||||
msgstr "Wilt u de reservererings periode vernieuwen?"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:93
|
||||
msgid "Renew reservation"
|
||||
msgstr ""
|
||||
msgstr "Vernieuw reservering"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:194
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
@@ -796,12 +793,12 @@ msgstr "Verhoog aantal"
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:19
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr ""
|
||||
msgstr "Filter evenementen op"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:20
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filter"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:21
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
|
||||
@@ -1050,17 +1047,15 @@ msgid "Close"
|
||||
msgstr "Sluiten"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:62
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "Resume checkout"
|
||||
msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr "Doorgaan met afrekenen"
|
||||
msgstr "Stoppen met afrekenen"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:63
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
"U kan niet deze actie annuleren. Alstublieft wacht tot het laden is voltooid."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:64
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
|
||||
"PO-Revision-Date: 2025-04-28 01:00+0000\n"
|
||||
"PO-Revision-Date: 2025-06-02 23:00+0000\n"
|
||||
"Last-Translator: Anarion Dunedain <anarion80@gmail.com>\n"
|
||||
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix/pl/"
|
||||
">\n"
|
||||
@@ -18,7 +18,7 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
|
||||
"|| n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.11\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
#: pretix/_base_settings.py:87
|
||||
msgid "English"
|
||||
@@ -11070,7 +11070,7 @@ msgstr ""
|
||||
#: pretix/base/settings.py:2434
|
||||
#, python-brace-format
|
||||
msgid "Your order is about to expire: {code}"
|
||||
msgstr "Twoje zamówienie ma wygasa: {code}"
|
||||
msgstr "Twoje zamówienie wkrótce wygaśnie: {code}"
|
||||
|
||||
#: pretix/base/settings.py:2438
|
||||
#, python-brace-format
|
||||
@@ -11090,7 +11090,7 @@ msgstr ""
|
||||
"Witaj,\n"
|
||||
"\n"
|
||||
"Nie otrzymaliśmy jeszcze pełnej płatności za zamówienie na {event}.\n"
|
||||
"Pamiętaj, że Twoje zamówienie będzi pewne tylko wtedy, jeżeli otrzymamy\n"
|
||||
"Pamiętaj, że Twoje zamówienie będzie pewne tylko wtedy, jeżeli otrzymamy\n"
|
||||
"Twoją płatność przed {expire_date}.\n"
|
||||
"\n"
|
||||
"Możesz wyświetlić informacje o płatności i status Twojego zamówienia pod "
|
||||
|
||||
@@ -8,8 +8,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
|
||||
"PO-Revision-Date: 2025-02-03 16:07+0000\n"
|
||||
"Last-Translator: Cornelius Kibelka <ckibelka-ctr@wikimedia.org>\n"
|
||||
"PO-Revision-Date: 2025-06-05 04:00+0000\n"
|
||||
"Last-Translator: Francisco Rosa <francisco@comm7.net>\n"
|
||||
"Language-Team: Portuguese <https://translate.pretix.eu/projects/pretix/"
|
||||
"pretix/pt/>\n"
|
||||
"Language: pt\n"
|
||||
@@ -17,59 +17,59 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Weblate 5.9.2\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
#: pretix/_base_settings.py:87
|
||||
msgid "English"
|
||||
msgstr ""
|
||||
msgstr "Inglês"
|
||||
|
||||
#: pretix/_base_settings.py:88
|
||||
msgid "German"
|
||||
msgstr ""
|
||||
msgstr "Alemão"
|
||||
|
||||
#: pretix/_base_settings.py:89
|
||||
msgid "German (informal)"
|
||||
msgstr ""
|
||||
msgstr "Alemão (informal)"
|
||||
|
||||
#: pretix/_base_settings.py:90
|
||||
msgid "Arabic"
|
||||
msgstr ""
|
||||
msgstr "Arabe"
|
||||
|
||||
#: pretix/_base_settings.py:91
|
||||
msgid "Basque"
|
||||
msgstr ""
|
||||
msgstr "Basco"
|
||||
|
||||
#: pretix/_base_settings.py:92
|
||||
msgid "Catalan"
|
||||
msgstr ""
|
||||
msgstr "Catalão"
|
||||
|
||||
#: pretix/_base_settings.py:93
|
||||
msgid "Chinese (simplified)"
|
||||
msgstr ""
|
||||
msgstr "Chinês (simplificado)"
|
||||
|
||||
#: pretix/_base_settings.py:94
|
||||
msgid "Chinese (traditional)"
|
||||
msgstr ""
|
||||
msgstr "chinês (tradicional)"
|
||||
|
||||
#: pretix/_base_settings.py:95
|
||||
msgid "Czech"
|
||||
msgstr ""
|
||||
msgstr "Tcheco"
|
||||
|
||||
#: pretix/_base_settings.py:96
|
||||
msgid "Croatian"
|
||||
msgstr ""
|
||||
msgstr "Croata"
|
||||
|
||||
#: pretix/_base_settings.py:97
|
||||
msgid "Danish"
|
||||
msgstr ""
|
||||
msgstr "Dinamarquês"
|
||||
|
||||
#: pretix/_base_settings.py:98
|
||||
msgid "Dutch"
|
||||
msgstr "Alemão"
|
||||
msgstr "Holandês"
|
||||
|
||||
#: pretix/_base_settings.py:99
|
||||
msgid "Dutch (informal)"
|
||||
msgstr "Alemão (informal)"
|
||||
msgstr "Holandês (informal)"
|
||||
|
||||
#: pretix/_base_settings.py:100
|
||||
msgid "French"
|
||||
@@ -81,7 +81,7 @@ msgstr "Finlandês"
|
||||
|
||||
#: pretix/_base_settings.py:102
|
||||
msgid "Galician"
|
||||
msgstr ""
|
||||
msgstr "Galego"
|
||||
|
||||
#: pretix/_base_settings.py:103
|
||||
msgid "Greek"
|
||||
@@ -89,11 +89,11 @@ msgstr "Grego"
|
||||
|
||||
#: pretix/_base_settings.py:104
|
||||
msgid "Hebrew"
|
||||
msgstr ""
|
||||
msgstr "Hebraico"
|
||||
|
||||
#: pretix/_base_settings.py:105
|
||||
msgid "Indonesian"
|
||||
msgstr ""
|
||||
msgstr "Indonésio"
|
||||
|
||||
#: pretix/_base_settings.py:106
|
||||
msgid "Italian"
|
||||
@@ -101,15 +101,15 @@ msgstr "Italiano"
|
||||
|
||||
#: pretix/_base_settings.py:107
|
||||
msgid "Japanese"
|
||||
msgstr ""
|
||||
msgstr "Japonês"
|
||||
|
||||
#: pretix/_base_settings.py:108
|
||||
msgid "Latvian"
|
||||
msgstr ""
|
||||
msgstr "Letão"
|
||||
|
||||
#: pretix/_base_settings.py:109
|
||||
msgid "Norwegian Bokmål"
|
||||
msgstr ""
|
||||
msgstr "Bokmål norueguês"
|
||||
|
||||
#: pretix/_base_settings.py:110
|
||||
msgid "Polish"
|
||||
@@ -125,7 +125,7 @@ msgstr "Português (Brasil)"
|
||||
|
||||
#: pretix/_base_settings.py:113
|
||||
msgid "Romanian"
|
||||
msgstr ""
|
||||
msgstr "Romano"
|
||||
|
||||
#: pretix/_base_settings.py:114
|
||||
msgid "Russian"
|
||||
@@ -133,11 +133,11 @@ msgstr "Russo"
|
||||
|
||||
#: pretix/_base_settings.py:115
|
||||
msgid "Slovak"
|
||||
msgstr ""
|
||||
msgstr "Eslovaco"
|
||||
|
||||
#: pretix/_base_settings.py:116
|
||||
msgid "Swedish"
|
||||
msgstr ""
|
||||
msgstr "Suéco"
|
||||
|
||||
#: pretix/_base_settings.py:117
|
||||
msgid "Spanish"
|
||||
@@ -149,7 +149,7 @@ msgstr "Turco"
|
||||
|
||||
#: pretix/_base_settings.py:119
|
||||
msgid "Ukrainian"
|
||||
msgstr ""
|
||||
msgstr "Ucraniano"
|
||||
|
||||
#: pretix/api/auth/devicesecurity.py:58
|
||||
msgid ""
|
||||
@@ -184,10 +184,8 @@ msgid "Allowed URIs list, space separated"
|
||||
msgstr "Lista de URIs permitidos, separados por espaço"
|
||||
|
||||
#: pretix/api/models.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Allowed URIs list, space separated"
|
||||
msgid "Allowed Post Logout URIs list, space separated"
|
||||
msgstr "Lista de URIs permitidos, separados por espaço"
|
||||
msgstr "Lista de URIs de saída de postagem permitidas, separadas por espaços"
|
||||
|
||||
#: pretix/api/models.py:51 pretix/base/models/customers.py:406
|
||||
#: pretix/plugins/paypal/payment.py:113 pretix/plugins/paypal2/payment.py:110
|
||||
@@ -233,7 +231,7 @@ msgstr "Comentário"
|
||||
|
||||
#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1414
|
||||
msgid "The product \"{}\" is not assigned to a quota."
|
||||
msgstr ""
|
||||
msgstr "O produto \"{}\" não está atribuído a uma cota."
|
||||
|
||||
#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1685
|
||||
#: pretix/base/models/items.py:1917 pretix/base/models/items.py:2184
|
||||
@@ -251,6 +249,8 @@ msgid ""
|
||||
"Events cannot be created as 'live'. Quotas and payment must be added to the "
|
||||
"event before sales can go live."
|
||||
msgstr ""
|
||||
"Eventos não podem ser criados como \"ao vivo\". Cotas e pagamentos devem ser "
|
||||
"adicionados ao evento antes que as vendas sejam publicadas."
|
||||
|
||||
#: pretix/api/serializers/event.py:246 pretix/api/serializers/event.py:555
|
||||
#, python-brace-format
|
||||
@@ -281,21 +281,23 @@ msgstr "A propriedade de metadados do item '{name}' não existe."
|
||||
|
||||
#: pretix/api/serializers/item.py:207 pretix/control/forms/item.py:1267
|
||||
msgid "The bundled item must not be the same item as the bundling one."
|
||||
msgstr ""
|
||||
msgstr "O item agrupado não deve ser o mesmo item que o do pacote."
|
||||
|
||||
#: pretix/api/serializers/item.py:210 pretix/control/forms/item.py:1269
|
||||
msgid "The bundled item must not have bundles on its own."
|
||||
msgstr ""
|
||||
msgstr "O item agrupado não deve ter pacotes próprios."
|
||||
|
||||
#: pretix/api/serializers/item.py:298
|
||||
msgid ""
|
||||
"Updating add-ons, bundles, or variations via PATCH/PUT is not supported. "
|
||||
"Please use the dedicated nested endpoint."
|
||||
msgstr ""
|
||||
"Não há suporte para atualização de complementos, pacotes ou variações via "
|
||||
"PATCH/PUT. Use o endpoint aninhado dedicado."
|
||||
|
||||
#: pretix/api/serializers/item.py:306
|
||||
msgid "Only admission products can currently be personalized."
|
||||
msgstr ""
|
||||
msgstr "Atualmente, somente produtos de admissão podem ser personalizados."
|
||||
|
||||
#: pretix/api/serializers/item.py:317
|
||||
msgid ""
|
||||
@@ -317,6 +319,8 @@ msgid ""
|
||||
"Updating options via PATCH/PUT is not supported. Please use the dedicated "
|
||||
"nested endpoint."
|
||||
msgstr ""
|
||||
"A atualização de opções via PATCH/PUT não é suportada. Use o endpoint "
|
||||
"aninhado dedicado."
|
||||
|
||||
#: pretix/api/serializers/item.py:533 pretix/control/forms/item.py:178
|
||||
msgid "Question cannot depend on a question asked during check-in."
|
||||
@@ -351,7 +355,7 @@ msgstr ""
|
||||
#: pretix/api/serializers/order.py:79
|
||||
#, python-brace-format
|
||||
msgid "\"{input}\" is not a valid choice."
|
||||
msgstr ""
|
||||
msgstr "\"{input}\" não é uma escolha válida."
|
||||
|
||||
#: pretix/api/serializers/order.py:1375 pretix/api/views/cart.py:224
|
||||
#: pretix/base/services/orders.py:1533
|
||||
@@ -367,11 +371,12 @@ msgstr "O produto \"{}\" não está disponível nesta data."
|
||||
msgid ""
|
||||
"There is not enough quota available on quota \"{}\" to perform the operation."
|
||||
msgstr ""
|
||||
"Não há cota suficiente disponível na cota \"{}\" para executar a operação."
|
||||
|
||||
#: pretix/api/serializers/organizer.py:105
|
||||
#: pretix/control/forms/organizer.py:892 pretix/presale/forms/customer.py:456
|
||||
msgid "An account with this email address is already registered."
|
||||
msgstr ""
|
||||
msgstr "Uma conta com este endereço de e-mail já está registrada."
|
||||
|
||||
#: pretix/api/serializers/organizer.py:238
|
||||
#: pretix/control/forms/organizer.py:741
|
||||
@@ -400,11 +405,11 @@ msgstr "Este usuário já tem permissões para esta equipe."
|
||||
#: pretix/api/views/cart.py:209
|
||||
msgid ""
|
||||
"The specified voucher has already been used the maximum number of times."
|
||||
msgstr ""
|
||||
msgstr "O voucher especificado já foi utilizado o número máximo de vezes."
|
||||
|
||||
#: pretix/api/views/checkin.py:611 pretix/api/views/checkin.py:618
|
||||
msgid "Medium connected to other event"
|
||||
msgstr ""
|
||||
msgstr "Meio conectado a outro evento"
|
||||
|
||||
#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:692
|
||||
#, python-brace-format
|
||||
@@ -462,9 +467,8 @@ msgid "Order expired"
|
||||
msgstr "Pedido expirado"
|
||||
|
||||
#: pretix/api/webhooks.py:261
|
||||
#, fuzzy
|
||||
msgid "Order expiry date changed"
|
||||
msgstr "Informações de pedido alteradas"
|
||||
msgstr "Data de validade do pedido alterada"
|
||||
|
||||
#: pretix/api/webhooks.py:265 pretix/base/notifications.py:269
|
||||
msgid "Order information changed"
|
||||
@@ -480,9 +484,8 @@ msgid "Order changed"
|
||||
msgstr "Pedido alterado"
|
||||
|
||||
#: pretix/api/webhooks.py:277
|
||||
#, fuzzy
|
||||
msgid "Refund of payment created"
|
||||
msgstr "Reembolso externo de pagamento"
|
||||
msgstr "Reembolso de pagamento criado"
|
||||
|
||||
#: pretix/api/webhooks.py:281 pretix/base/notifications.py:293
|
||||
msgid "External refund of payment"
|
||||
@@ -490,28 +493,23 @@ msgstr "Reembolso externo de pagamento"
|
||||
|
||||
#: pretix/api/webhooks.py:285
|
||||
msgid "Refund of payment requested by customer"
|
||||
msgstr ""
|
||||
msgstr "Reembolso do pagamento solicitado pelo cliente"
|
||||
|
||||
#: pretix/api/webhooks.py:289
|
||||
#, fuzzy
|
||||
msgid "Refund of payment completed"
|
||||
msgstr "Reembolso externo de pagamento"
|
||||
msgstr "Reembolso de pagamento concluído"
|
||||
|
||||
#: pretix/api/webhooks.py:293
|
||||
#, fuzzy
|
||||
msgid "Refund of payment canceled"
|
||||
msgstr "Reembolso externo de pagamento"
|
||||
msgstr "Reembolso de pagamento cancelado"
|
||||
|
||||
#: pretix/api/webhooks.py:297
|
||||
#, fuzzy
|
||||
msgid "Refund of payment failed"
|
||||
msgstr "Reembolso externo de pagamento"
|
||||
msgstr "Falha no reembolso do pagamento"
|
||||
|
||||
#: pretix/api/webhooks.py:301
|
||||
#, fuzzy
|
||||
#| msgid "Payment provider"
|
||||
msgid "Payment confirmed"
|
||||
msgstr "Provedor de pagamento"
|
||||
msgstr "Pagamento confirmado"
|
||||
|
||||
#: pretix/api/webhooks.py:305
|
||||
msgid "Order approved"
|
||||
@@ -522,18 +520,16 @@ msgid "Order denied"
|
||||
msgstr "Pedido negado"
|
||||
|
||||
#: pretix/api/webhooks.py:313
|
||||
#, fuzzy
|
||||
#| msgid "Order denied"
|
||||
msgid "Order deleted"
|
||||
msgstr "Pedido negado"
|
||||
msgstr "Pedido excluído"
|
||||
|
||||
#: pretix/api/webhooks.py:317
|
||||
msgid "Ticket checked in"
|
||||
msgstr "Ingresso registrado"
|
||||
msgstr "Check-in do bilhete"
|
||||
|
||||
#: pretix/api/webhooks.py:321
|
||||
msgid "Ticket check-in reverted"
|
||||
msgstr "Ingresso revertido"
|
||||
msgstr "O check-in do bilhete foi revertido"
|
||||
|
||||
#: pretix/api/webhooks.py:325
|
||||
msgid "Event created"
|
||||
@@ -544,14 +540,13 @@ msgid "Event details changed"
|
||||
msgstr "Detalhes do evento alterados"
|
||||
|
||||
#: pretix/api/webhooks.py:333
|
||||
#, fuzzy
|
||||
msgid "Event deleted"
|
||||
msgstr "Evento criado"
|
||||
msgstr "Evento excluído"
|
||||
|
||||
#: pretix/api/webhooks.py:337
|
||||
msgctxt "subevent"
|
||||
msgid "Event series date added"
|
||||
msgstr "Data da série de eventos adicionada"
|
||||
msgstr "Data de adição da série de eventos"
|
||||
|
||||
#: pretix/api/webhooks.py:341
|
||||
msgctxt "subevent"
|
||||
@@ -561,64 +556,59 @@ msgstr "Data da série de eventos alterada"
|
||||
#: pretix/api/webhooks.py:345
|
||||
msgctxt "subevent"
|
||||
msgid "Event series date deleted"
|
||||
msgstr "Data da série de eventos apagada"
|
||||
msgstr "Data da série de eventos excluída"
|
||||
|
||||
#: pretix/api/webhooks.py:349
|
||||
msgid ""
|
||||
"Product changed (including product added or deleted and including changes to "
|
||||
"nested objects like variations or bundles)"
|
||||
msgstr ""
|
||||
"Produto alterado (incluindo produtos adicionados ou excluídos e incluindo "
|
||||
"alterações em objetos aninhados, como variações ou pacotes)"
|
||||
|
||||
#: pretix/api/webhooks.py:354
|
||||
msgid "Shop taken live"
|
||||
msgstr ""
|
||||
msgstr "Loja ao vivo"
|
||||
|
||||
#: pretix/api/webhooks.py:358
|
||||
msgid "Shop taken offline"
|
||||
msgstr ""
|
||||
msgstr "Loja offline"
|
||||
|
||||
#: pretix/api/webhooks.py:362
|
||||
#, fuzzy
|
||||
msgid "Test-Mode of shop has been activated"
|
||||
msgstr "A equipe selecionada não pode ser deletada."
|
||||
msgstr "O modo de teste da loja foi ativado"
|
||||
|
||||
#: pretix/api/webhooks.py:366
|
||||
#, fuzzy
|
||||
msgid "Test-Mode of shop has been deactivated"
|
||||
msgstr "A equipe selecionada não pode ser deletada."
|
||||
msgstr "O modo de teste da loja foi desativado"
|
||||
|
||||
#: pretix/api/webhooks.py:370
|
||||
msgid "Waiting list entry added"
|
||||
msgstr ""
|
||||
msgstr "Adicionado em aguardando na lista de espera"
|
||||
|
||||
#: pretix/api/webhooks.py:374
|
||||
#, fuzzy
|
||||
msgid "Waiting list entry changed"
|
||||
msgstr "O valor foi creditado no seu cartão."
|
||||
msgstr "Entrada na lista de espera alterada"
|
||||
|
||||
#: pretix/api/webhooks.py:378
|
||||
#, fuzzy
|
||||
msgid "Waiting list entry deleted"
|
||||
msgstr "O valor foi creditado no seu cartão."
|
||||
msgstr "Entrada na lista de espera excluída"
|
||||
|
||||
#: pretix/api/webhooks.py:382
|
||||
msgid "Waiting list entry received voucher"
|
||||
msgstr ""
|
||||
msgstr "Inscrição na lista de espera recebeu voucher"
|
||||
|
||||
#: pretix/api/webhooks.py:386
|
||||
#, fuzzy
|
||||
msgid "Customer account created"
|
||||
msgstr "País"
|
||||
msgstr "Conta de cliente criada"
|
||||
|
||||
#: pretix/api/webhooks.py:390
|
||||
#, fuzzy
|
||||
msgid "Customer account changed"
|
||||
msgstr "País"
|
||||
msgstr "Conta do cliente alterada"
|
||||
|
||||
#: pretix/api/webhooks.py:394
|
||||
#, fuzzy
|
||||
msgid "Customer account anonymized"
|
||||
msgstr "País"
|
||||
msgstr "Conta de cliente anonimizada"
|
||||
|
||||
#: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103
|
||||
#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:1004
|
||||
@@ -631,15 +621,15 @@ msgstr "País"
|
||||
#: pretix/plugins/banktransfer/payment.py:679
|
||||
#: pretix/presale/forms/customer.py:151
|
||||
msgid "This field is required."
|
||||
msgstr ""
|
||||
msgstr "Este campo é obrigatório."
|
||||
|
||||
#: pretix/base/addressvalidation.py:213
|
||||
msgid "Enter a postal code in the format XXX."
|
||||
msgstr ""
|
||||
msgstr "Digite um código postal no formato XXX."
|
||||
|
||||
#: pretix/base/addressvalidation.py:222 pretix/base/addressvalidation.py:224
|
||||
msgid "Enter a postal code in the format XXXX."
|
||||
msgstr ""
|
||||
msgstr "Digite um código postal no formato XXXX."
|
||||
|
||||
#: pretix/base/auth.py:146
|
||||
#, python-brace-format
|
||||
@@ -680,7 +670,7 @@ msgstr "Senha"
|
||||
|
||||
#: pretix/base/auth.py:176 pretix/base/auth.py:183
|
||||
msgid "Your password must contain both numeric and alphabetic characters."
|
||||
msgstr ""
|
||||
msgstr "Sua senha deve conter caracteres numéricos e alfabéticos."
|
||||
|
||||
#: pretix/base/auth.py:202 pretix/base/auth.py:212
|
||||
#, python-format
|
||||
@@ -688,8 +678,10 @@ msgid "Your password may not be the same as your previous password."
|
||||
msgid_plural ""
|
||||
"Your password may not be the same as one of your %(history_length)s previous "
|
||||
"passwords."
|
||||
msgstr[0] ""
|
||||
msgstr[0] "Sua senha pode não ser a mesma que sua senha anterior."
|
||||
msgstr[1] ""
|
||||
"Sua senha pode não ser a mesma que uma das suas senhas anteriores de "
|
||||
"%(history_length)s."
|
||||
|
||||
#: pretix/base/channels.py:168
|
||||
msgid "Online shop"
|
||||
@@ -697,13 +689,15 @@ msgstr "Loja online"
|
||||
|
||||
#: pretix/base/channels.py:174
|
||||
msgid "API"
|
||||
msgstr ""
|
||||
msgstr "API"
|
||||
|
||||
#: pretix/base/channels.py:175
|
||||
msgid ""
|
||||
"API sales channels come with no built-in functionality, but may be used for "
|
||||
"custom integrations."
|
||||
msgstr ""
|
||||
"API de canais de vendas de não vêm com nenhuma funcionalidade integrada, "
|
||||
"mas podem ser usados para integrações personalizadas."
|
||||
|
||||
#: pretix/base/context.py:38
|
||||
#, fuzzy, python-brace-format
|
||||
@@ -729,25 +723,27 @@ msgstr "código-fonte"
|
||||
#: pretix/base/customersso/oidc.py:61
|
||||
#, python-brace-format
|
||||
msgid "Configuration option \"{name}\" is missing."
|
||||
msgstr ""
|
||||
msgstr "A opção de configuração \"{name}\" está ausente."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:69 pretix/base/customersso/oidc.py:74
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Unable to retrieve configuration from \"{url}\". Error message: \"{error}\"."
|
||||
msgstr ""
|
||||
"Não foi possível recuperar a configuração de \"{url}\". Mensagem de erro: "
|
||||
"\"{error}\"."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:80 pretix/base/customersso/oidc.py:85
|
||||
#: pretix/base/customersso/oidc.py:90 pretix/base/customersso/oidc.py:95
|
||||
#: pretix/base/customersso/oidc.py:100 pretix/base/customersso/oidc.py:105
|
||||
#, python-brace-format
|
||||
msgid "Incompatible SSO provider: \"{error}\"."
|
||||
msgstr ""
|
||||
msgstr "Provedor SSO incompatível: \"{error}\"."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:111
|
||||
#, python-brace-format
|
||||
msgid "You are not requesting \"{scope}\"."
|
||||
msgstr ""
|
||||
msgstr "Você não está solicitando \"{scope}\"."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:117
|
||||
#, python-brace-format
|
||||
@@ -755,6 +751,8 @@ msgid ""
|
||||
"You are requesting scope \"{scope}\" but provider only supports these: "
|
||||
"{scopes}."
|
||||
msgstr ""
|
||||
"Você está solicitando o escopo \"{scope}\", mas o provedor só oferece "
|
||||
"suporte a estes: {scopes}."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:127
|
||||
#, python-brace-format
|
||||
@@ -762,6 +760,8 @@ msgid ""
|
||||
"You are requesting field \"{field}\" but provider only supports these: "
|
||||
"{fields}."
|
||||
msgstr ""
|
||||
"Você está solicitando o campo \"{field}\", mas o provedor suporta somente "
|
||||
"estes: {fields}."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:219 pretix/base/customersso/oidc.py:226
|
||||
#: pretix/base/customersso/oidc.py:245 pretix/base/customersso/oidc.py:262
|
||||
@@ -770,13 +770,15 @@ msgstr ""
|
||||
#: pretix/presale/views/customer.py:866
|
||||
#, python-brace-format
|
||||
msgid "Login was not successful. Error message: \"{error}\"."
|
||||
msgstr ""
|
||||
msgstr "O login não foi bem-sucedido. Mensagem de erro: \"{error}\"."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:252
|
||||
msgid ""
|
||||
"The email address on this account is not yet verified. Please first confirm "
|
||||
"the email address in your customer account."
|
||||
msgstr ""
|
||||
"O endereço de e-mail desta conta ainda não foi verificado. Primeiro, "
|
||||
"confirme o endereço de e-mail na sua conta de cliente."
|
||||
|
||||
#: pretix/base/email.py:203 pretix/base/exporters/items.py:157
|
||||
#: pretix/base/exporters/items.py:205 pretix/control/views/main.py:322
|
||||
@@ -830,17 +832,17 @@ msgstr "Respostas para perguntas sobre o upload de arquivos"
|
||||
#: pretix/base/exporters/orderlist.py:1241
|
||||
#: pretix/plugins/reports/exporters.py:478
|
||||
#: pretix/plugins/reports/exporters.py:651
|
||||
#, fuzzy
|
||||
#| msgid "Order data"
|
||||
msgctxt "export_category"
|
||||
msgid "Order data"
|
||||
msgstr "Dia do pedido"
|
||||
msgstr "Data do pedido"
|
||||
|
||||
#: pretix/base/exporters/answers.py:56
|
||||
msgid ""
|
||||
"Download a ZIP file including all files that have been uploaded by your "
|
||||
"customers while creating an order."
|
||||
msgstr ""
|
||||
"Baixe um arquivo ZIP incluindo todos os arquivos que foram enviados pelos "
|
||||
"seus clientes ao criar um pedido."
|
||||
|
||||
#: pretix/base/exporters/answers.py:66 pretix/base/models/items.py:1767
|
||||
#: pretix/control/navigation.py:172
|
||||
@@ -881,7 +883,7 @@ msgstr "Perguntas"
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_change_form.html:20
|
||||
msgctxt "subevent"
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
msgstr "Data"
|
||||
|
||||
#: pretix/base/exporters/answers.py:79 pretix/base/exporters/answers.py:88
|
||||
#: pretix/control/forms/checkin.py:83 pretix/control/forms/event.py:1611
|
||||
@@ -899,22 +901,22 @@ msgstr ""
|
||||
#: pretix/plugins/sendmail/forms.py:351
|
||||
msgctxt "subevent"
|
||||
msgid "All dates"
|
||||
msgstr ""
|
||||
msgstr "Todas as datas"
|
||||
|
||||
#: pretix/base/exporters/customers.py:49 pretix/control/navigation.py:606
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:132
|
||||
msgid "Customer accounts"
|
||||
msgstr ""
|
||||
msgstr "Contas de clientes"
|
||||
|
||||
#: pretix/base/exporters/customers.py:51
|
||||
#, fuzzy
|
||||
msgctxt "export_category"
|
||||
msgid "Customer accounts"
|
||||
msgstr "País"
|
||||
msgstr "Contas de clientes"
|
||||
|
||||
#: pretix/base/exporters/customers.py:52
|
||||
msgid "Download a spreadsheet of all currently registered customer accounts."
|
||||
msgstr ""
|
||||
"Baixe uma planilha de todas as contas de clientes registradas atualmente."
|
||||
|
||||
#: pretix/base/exporters/customers.py:64 pretix/base/models/customers.py:82
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:29
|
||||
@@ -922,20 +924,19 @@ msgstr ""
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_customer.html:36
|
||||
#: pretix/presale/templates/pretixpresale/organizers/customer_base.html:37
|
||||
msgid "Customer ID"
|
||||
msgstr ""
|
||||
msgstr "ID do cliente"
|
||||
|
||||
#: pretix/base/exporters/customers.py:65
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:32
|
||||
#, fuzzy
|
||||
msgid "SSO provider"
|
||||
msgstr "Provedor de pagamento"
|
||||
msgstr "Provedor de SSO"
|
||||
|
||||
#: pretix/base/exporters/customers.py:66 pretix/base/models/customers.py:108
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:36
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html:65
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html:49
|
||||
msgid "External identifier"
|
||||
msgstr ""
|
||||
msgstr "Identificador externo"
|
||||
|
||||
#: pretix/base/exporters/customers.py:68 pretix/base/exporters/orderlist.py:262
|
||||
#: pretix/base/exporters/orderlist.py:445
|
||||
@@ -960,7 +961,7 @@ msgstr "Número de telefone"
|
||||
#: pretix/base/settings.py:3640 pretix/base/settings.py:3652
|
||||
#: pretix/control/templates/pretixcontrol/users/index.html:47
|
||||
msgid "Full name"
|
||||
msgstr ""
|
||||
msgstr "Nome Completo"
|
||||
|
||||
#: pretix/base/exporters/customers.py:74 pretix/base/exporters/invoices.py:206
|
||||
#: pretix/base/exporters/invoices.py:214 pretix/base/exporters/invoices.py:332
|
||||
@@ -1008,21 +1009,21 @@ msgstr "Nome"
|
||||
|
||||
#: pretix/base/exporters/customers.py:77 pretix/base/models/customers.py:99
|
||||
msgid "Account active"
|
||||
msgstr ""
|
||||
msgstr "Conta ativa"
|
||||
|
||||
#: pretix/base/exporters/customers.py:78 pretix/base/models/customers.py:100
|
||||
msgid "Verified email address"
|
||||
msgstr ""
|
||||
msgstr "Endereço de e-mail verificado"
|
||||
|
||||
#: pretix/base/exporters/customers.py:79 pretix/base/models/customers.py:101
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:68
|
||||
msgid "Last login"
|
||||
msgstr ""
|
||||
msgstr "Último login"
|
||||
|
||||
#: pretix/base/exporters/customers.py:80 pretix/base/models/customers.py:102
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:66
|
||||
msgid "Registration date"
|
||||
msgstr ""
|
||||
msgstr "Data de inscrição"
|
||||
|
||||
#: pretix/base/exporters/customers.py:81 pretix/base/exporters/invoices.py:205
|
||||
#: pretix/base/exporters/waitinglist.py:120 pretix/base/models/auth.py:258
|
||||
@@ -1038,7 +1039,7 @@ msgstr "Idioma"
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:72
|
||||
#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:68
|
||||
msgid "Notes"
|
||||
msgstr ""
|
||||
msgstr "Notas"
|
||||
|
||||
#: pretix/base/exporters/customers.py:100
|
||||
#: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83
|
||||
@@ -1115,6 +1116,8 @@ msgid ""
|
||||
"Download invoices in a format that can be used by the dekodi NREI conversion "
|
||||
"software."
|
||||
msgstr ""
|
||||
"Baixe faturas em um formato que possa ser usado pelo software de conversão "
|
||||
"de NREI dekodi."
|
||||
|
||||
#: pretix/base/exporters/dekodi.py:105
|
||||
#, python-brace-format
|
||||
@@ -1132,7 +1135,7 @@ msgstr "Ingresso do evento {event}-{code}"
|
||||
#: pretix/plugins/reports/exporters.py:698
|
||||
#: pretix/plugins/ticketoutputpdf/exporters.py:85
|
||||
msgid "Date range"
|
||||
msgstr ""
|
||||
msgstr "Intervalo de datas"
|
||||
|
||||
#: pretix/base/exporters/dekodi.py:237 pretix/base/exporters/invoices.py:77
|
||||
#, fuzzy
|
||||
@@ -1147,21 +1150,21 @@ msgstr ""
|
||||
"fatura nem sempre corresponde à data do pedido ou do pagamento."
|
||||
|
||||
#: pretix/base/exporters/events.py:47
|
||||
#, fuzzy
|
||||
msgid "Event data"
|
||||
msgstr "Data final do evento"
|
||||
msgstr "Dados do evento"
|
||||
|
||||
#: pretix/base/exporters/events.py:48
|
||||
#, fuzzy
|
||||
msgctxt "export_category"
|
||||
msgid "Event data"
|
||||
msgstr "Data final do evento"
|
||||
msgstr "Dados do evento"
|
||||
|
||||
#: pretix/base/exporters/events.py:49
|
||||
msgid ""
|
||||
"Download a spreadsheet with information on all events in this organizer "
|
||||
"account."
|
||||
msgstr ""
|
||||
"Baixe uma planilha com informações sobre todos os eventos nesta conta do "
|
||||
"organizador."
|
||||
|
||||
#: pretix/base/exporters/events.py:57 pretix/base/exporters/orderlist.py:261
|
||||
#: pretix/base/exporters/orderlist.py:441
|
||||
@@ -1173,17 +1176,17 @@ msgstr ""
|
||||
#: pretix/control/templates/pretixcontrol/events/index.html:68
|
||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html:64
|
||||
msgid "Event name"
|
||||
msgstr ""
|
||||
msgstr "Nome do evento"
|
||||
|
||||
#: pretix/base/exporters/events.py:58 pretix/base/models/event.py:588
|
||||
#: pretix/base/models/organizer.py:91
|
||||
#: pretix/control/templates/pretixcontrol/organizers/index.html:47
|
||||
msgid "Short form"
|
||||
msgstr ""
|
||||
msgstr "Forma abreviada"
|
||||
|
||||
#: pretix/base/exporters/events.py:59 pretix/base/models/event.py:590
|
||||
msgid "Shop is live"
|
||||
msgstr ""
|
||||
msgstr "A loja está no ar"
|
||||
|
||||
#: pretix/base/exporters/events.py:60 pretix/base/models/event.py:592
|
||||
msgid "Event currency"
|
||||
@@ -1192,59 +1195,59 @@ msgstr "Moeda do evento"
|
||||
#: pretix/base/exporters/events.py:61 pretix/base/models/auth.py:261
|
||||
#: pretix/base/models/exports.py:133 pretix/control/forms/exports.py:93
|
||||
msgid "Timezone"
|
||||
msgstr ""
|
||||
msgstr "Fuso horário"
|
||||
|
||||
#: pretix/base/exporters/events.py:62 pretix/base/models/event.py:595
|
||||
#: pretix/base/models/event.py:1489 pretix/base/settings.py:3263
|
||||
#: pretix/base/settings.py:3273 pretix/control/forms/subevents.py:480
|
||||
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:268
|
||||
msgid "Event start time"
|
||||
msgstr ""
|
||||
msgstr "Hora de início do evento"
|
||||
|
||||
#: pretix/base/exporters/events.py:63 pretix/base/models/event.py:597
|
||||
#: pretix/base/models/event.py:1491 pretix/base/pdf.py:286
|
||||
#: pretix/control/forms/subevents.py:485
|
||||
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:270
|
||||
msgid "Event end time"
|
||||
msgstr ""
|
||||
msgstr "Horário de término do evento"
|
||||
|
||||
#: pretix/base/exporters/events.py:64 pretix/base/models/event.py:599
|
||||
#: pretix/base/models/event.py:1493 pretix/control/forms/subevents.py:490
|
||||
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:274
|
||||
msgid "Admission time"
|
||||
msgstr ""
|
||||
msgstr "Horário de entrada"
|
||||
|
||||
#: pretix/base/exporters/events.py:65 pretix/base/models/event.py:611
|
||||
#: pretix/base/models/event.py:1502 pretix/control/forms/subevents.py:93
|
||||
msgid "Start of presale"
|
||||
msgstr ""
|
||||
msgstr "Início da pré-venda"
|
||||
|
||||
#: pretix/base/exporters/events.py:66 pretix/base/models/event.py:605
|
||||
#: pretix/base/models/event.py:1496 pretix/control/forms/subevents.py:99
|
||||
msgid "End of presale"
|
||||
msgstr ""
|
||||
msgstr "Fim da pré-venda"
|
||||
|
||||
#: pretix/base/exporters/events.py:67 pretix/base/exporters/invoices.py:351
|
||||
#: pretix/base/models/event.py:617 pretix/base/models/event.py:1508
|
||||
msgid "Location"
|
||||
msgstr ""
|
||||
msgstr "Localização"
|
||||
|
||||
#: pretix/base/exporters/events.py:68 pretix/base/models/event.py:625
|
||||
#: pretix/base/models/event.py:1511
|
||||
msgid "Latitude"
|
||||
msgstr ""
|
||||
msgstr "Latitude"
|
||||
|
||||
#: pretix/base/exporters/events.py:69 pretix/base/models/event.py:633
|
||||
#: pretix/base/models/event.py:1519
|
||||
msgid "Longitude"
|
||||
msgstr ""
|
||||
msgstr "Longitude"
|
||||
|
||||
#: pretix/base/exporters/events.py:70 pretix/base/models/event.py:645
|
||||
#: pretix/base/models/event.py:1534
|
||||
#: pretix/control/templates/pretixcontrol/event/index.html:128
|
||||
#: pretix/control/templates/pretixcontrol/order/index.html:991
|
||||
msgid "Internal comment"
|
||||
msgstr ""
|
||||
msgstr "Comentário interno"
|
||||
|
||||
#: pretix/base/exporters/invoices.py:82 pretix/base/models/orders.py:1753
|
||||
#: pretix/base/models/orders.py:2162 pretix/control/forms/filter.py:204
|
||||
@@ -1284,7 +1287,7 @@ msgstr "Todas faturas"
|
||||
|
||||
#: pretix/base/exporters/invoices.py:127
|
||||
msgid "Download all invoices created by the system as a ZIP file of PDF files."
|
||||
msgstr ""
|
||||
msgstr "Baixe todas as faturas criadas pelo sistema como um arquivo ZIP ou PDF."
|
||||
|
||||
#: pretix/base/exporters/invoices.py:178
|
||||
msgid "Invoice data"
|
||||
@@ -1296,6 +1299,9 @@ msgid ""
|
||||
"The spreadsheet includes two sheets, one with a line for every invoice, and "
|
||||
"one with a line for every position of every invoice."
|
||||
msgstr ""
|
||||
"Baixe uma planilha com os dados de todas as faturas criadas pelo sistema. A "
|
||||
"planilha inclui duas folhas, uma com uma linha para cada fatura e outra com "
|
||||
"uma linha para cada posição de cada fatura."
|
||||
|
||||
#: pretix/base/exporters/invoices.py:191 pretix/base/shredder.py:576
|
||||
#: pretix/control/templates/pretixcontrol/order/index.html:268
|
||||
@@ -1355,7 +1361,7 @@ msgstr "Data"
|
||||
#: pretix/plugins/reports/exporters.py:884
|
||||
#: pretix/plugins/ticketoutputpdf/exporters.py:96
|
||||
msgid "Order code"
|
||||
msgstr "Código de pedido"
|
||||
msgstr "Código do pedido"
|
||||
|
||||
#: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:329
|
||||
#: pretix/base/forms/auth.py:160 pretix/base/modelimport_orders.py:59
|
||||
@@ -26318,7 +26324,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:80
|
||||
msgid "Comment:"
|
||||
msgstr ""
|
||||
msgstr "Comentário:"
|
||||
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:98
|
||||
msgid "No order code detected"
|
||||
@@ -26591,7 +26597,7 @@ msgstr ""
|
||||
#: pretix/plugins/paypal2/payment.py:1096
|
||||
#: pretix/plugins/paypal2/payment.py:1097 pretix/plugins/stripe/payment.py:1816
|
||||
msgid "PayPal"
|
||||
msgstr ""
|
||||
msgstr "PayPal"
|
||||
|
||||
#: pretix/plugins/paypal/apps.py:53
|
||||
msgid ""
|
||||
@@ -28075,7 +28081,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:342 pretix/plugins/stripe/payment.py:1527
|
||||
msgid "iDEAL"
|
||||
msgstr ""
|
||||
msgstr "iDEAL"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:344 pretix/plugins/stripe/payment.py:352
|
||||
#: pretix/plugins/stripe/payment.py:360 pretix/plugins/stripe/payment.py:395
|
||||
@@ -28095,11 +28101,11 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:358 pretix/plugins/stripe/payment.py:1564
|
||||
msgid "Bancontact"
|
||||
msgstr ""
|
||||
msgstr "Contato bancário"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:366
|
||||
msgid "SEPA Direct Debit"
|
||||
msgstr ""
|
||||
msgstr "Débito Direto SEPA"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:369
|
||||
msgid ""
|
||||
@@ -28135,7 +28141,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:409 pretix/plugins/stripe/payment.py:1730
|
||||
msgid "Przelewy24"
|
||||
msgstr ""
|
||||
msgstr "Przelewy24"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:417 pretix/plugins/stripe/payment.py:1769
|
||||
msgid "WeChat Pay"
|
||||
@@ -28284,7 +28290,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1480
|
||||
msgid "giropay"
|
||||
msgstr ""
|
||||
msgstr "giropay"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1483
|
||||
msgid ""
|
||||
@@ -31717,14 +31723,17 @@ msgid ""
|
||||
"while we are processing your current payment. Please check back after your "
|
||||
"current payment has been accepted."
|
||||
msgstr ""
|
||||
"Você não pode alterar seu pedido de forma que exija pagamento adicional "
|
||||
"enquanto estivermos processando seu pagamento atual. Verifique novamente "
|
||||
"após a aceitação do seu pagamento atual."
|
||||
|
||||
#: pretix/presale/views/order.py:1662 pretix/presale/views/order.py:1693
|
||||
msgid "You cannot change this order."
|
||||
msgstr ""
|
||||
msgstr "Você não pode alterar este pedido."
|
||||
|
||||
#: pretix/presale/views/user.py:61
|
||||
msgid "We had difficulties processing your input."
|
||||
msgstr ""
|
||||
msgstr "Tivemos dificuldades em processar sua entrada."
|
||||
|
||||
#: pretix/presale/views/user.py:70
|
||||
#, python-brace-format
|
||||
@@ -31734,32 +31743,43 @@ msgid ""
|
||||
"{number} hours. If the email did not arrive, please check your spam folder "
|
||||
"and also double check that you used the correct email address."
|
||||
msgstr ""
|
||||
"Se o endereço de e-mail informado for válido e estiver associado a um "
|
||||
"ingresso, já enviamos um e-mail com um link para o seu ingresso nas últimas "
|
||||
"{number} horas. Se o e-mail não chegou, verifique sua caixa de spam e "
|
||||
"verifique se você usou o endereço de e-mail correto."
|
||||
|
||||
#: pretix/presale/views/user.py:91
|
||||
msgid "We have trouble sending emails right now, please check back later."
|
||||
msgstr ""
|
||||
"Estamos com problemas para enviar e-mails neste momento. Volte mais tarde."
|
||||
|
||||
#: pretix/presale/views/user.py:94
|
||||
msgid ""
|
||||
"If there were any orders by this user, they will receive an email with their "
|
||||
"order codes."
|
||||
msgstr ""
|
||||
"Se houver algum pedido deste usuário, ele receberá um e-mail com seus "
|
||||
"códigos de pedido."
|
||||
|
||||
#: pretix/presale/views/waiting.py:127
|
||||
msgid ""
|
||||
"No ticket types are available for the waiting list, have a look at the "
|
||||
"ticket shop instead."
|
||||
msgstr ""
|
||||
"Não há tipos de ingressos disponíveis para a lista de espera; em vez disso, "
|
||||
"dê uma olhada na loja de ingressos."
|
||||
|
||||
#: pretix/presale/views/waiting.py:137 pretix/presale/views/waiting.py:161
|
||||
msgid "Waiting lists are disabled for this event."
|
||||
msgstr ""
|
||||
msgstr "As listas de espera estão desativadas para este evento."
|
||||
|
||||
#: pretix/presale/views/waiting.py:173
|
||||
msgid ""
|
||||
"You cannot add yourself to the waiting list as this product is currently "
|
||||
"available."
|
||||
msgstr ""
|
||||
"Você não pode se adicionar à lista de espera, pois este produto ainda não "
|
||||
"está disponível."
|
||||
|
||||
#: pretix/presale/views/waiting.py:180
|
||||
#, python-brace-format
|
||||
@@ -31767,35 +31787,40 @@ 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 ""
|
||||
"Adicionamos você à lista de espera. Enviaremos um e-mail para {email} assim "
|
||||
"que este produto estiver disponível novamente."
|
||||
|
||||
#: pretix/presale/views/waiting.py:208
|
||||
msgid "We could not find you on our waiting list."
|
||||
msgstr ""
|
||||
msgstr "Não conseguimos encontrá-lo em nossa lista de espera."
|
||||
|
||||
#: pretix/presale/views/waiting.py:212
|
||||
msgid ""
|
||||
"Your waiting list spot is no longer valid or already used. There's nothing "
|
||||
"more to do here."
|
||||
msgstr ""
|
||||
"Sua vaga na lista de espera não é mais válida ou já foi usada. Não há mais "
|
||||
"nada a fazer aqui."
|
||||
|
||||
#: pretix/presale/views/waiting.py:222
|
||||
msgid ""
|
||||
"Thank you very much! We will assign your spot on the waiting list to someone "
|
||||
"else."
|
||||
msgstr ""
|
||||
"Muito obrigado! Vamos atribuir a sua vaga na lista de espera a outra pessoa."
|
||||
|
||||
#: pretix/presale/views/widget.py:397
|
||||
msgid "This ticket shop is currently disabled."
|
||||
msgstr ""
|
||||
msgstr "Esta bilheteria está desativada no momento."
|
||||
|
||||
#: pretix/presale/views/widget.py:411
|
||||
msgid "The selected date does not exist in this event series."
|
||||
msgstr ""
|
||||
msgstr "A data selecionada não existe nesta série de eventos."
|
||||
|
||||
#: pretix/presale/views/widget.py:474
|
||||
#, python-format
|
||||
msgid "from %(start_date)s"
|
||||
msgstr ""
|
||||
msgstr "a partir de %(start_date)s"
|
||||
|
||||
#: pretix/settings.py:789
|
||||
msgid "User profile only"
|
||||
@@ -31803,15 +31828,15 @@ msgstr "Somente perfil de usuário"
|
||||
|
||||
#: pretix/settings.py:790
|
||||
msgid "Read access"
|
||||
msgstr ""
|
||||
msgstr "Acesso de leitura"
|
||||
|
||||
#: pretix/settings.py:791
|
||||
msgid "Write access"
|
||||
msgstr ""
|
||||
msgstr "Acesso de escrita"
|
||||
|
||||
#: pretix/settings.py:802
|
||||
msgid "Kosovo"
|
||||
msgstr ""
|
||||
msgstr "Kosovo"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Email"
|
||||
|
||||
@@ -3,79 +3,80 @@
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"PO-Revision-Date: 2025-06-05 04:00+0000\n"
|
||||
"Last-Translator: Francisco Rosa <francisco@comm7.net>\n"
|
||||
"Language-Team: Portuguese <https://translate.pretix.eu/projects/pretix/"
|
||||
"pretix-js/pt/>\n"
|
||||
"Language: pt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:68
|
||||
msgid "Marked as paid"
|
||||
msgstr ""
|
||||
msgstr "Marcado como pago"
|
||||
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:76
|
||||
msgid "Comment:"
|
||||
msgstr ""
|
||||
msgstr "Comentário:"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:34
|
||||
msgid "PayPal"
|
||||
msgstr ""
|
||||
msgstr "PayPal"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:35
|
||||
msgid "Venmo"
|
||||
msgstr ""
|
||||
msgstr "Venmo"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:36
|
||||
#: pretix/static/pretixpresale/js/walletdetection.js:38
|
||||
msgid "Apple Pay"
|
||||
msgstr ""
|
||||
msgstr "Apple Pay"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:37
|
||||
msgid "Itaú"
|
||||
msgstr ""
|
||||
msgstr "Itaú"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:38
|
||||
msgid "PayPal Credit"
|
||||
msgstr ""
|
||||
msgstr "Crédito PayPal"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:39
|
||||
msgid "Credit Card"
|
||||
msgstr ""
|
||||
msgstr "Cartão de crédito"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:40
|
||||
msgid "PayPal Pay Later"
|
||||
msgstr ""
|
||||
msgstr "PayPal Pagar Depois"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:41
|
||||
msgid "iDEAL"
|
||||
msgstr ""
|
||||
msgstr "iDEAL"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:42
|
||||
msgid "SEPA Direct Debit"
|
||||
msgstr ""
|
||||
msgstr "Débito Direto SEPA"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:43
|
||||
msgid "Bancontact"
|
||||
msgstr ""
|
||||
msgstr "Contato bancário"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:44
|
||||
msgid "giropay"
|
||||
msgstr ""
|
||||
msgstr "giropay"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:45
|
||||
msgid "SOFORT"
|
||||
msgstr ""
|
||||
msgstr "SOFORT"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:46
|
||||
msgid "eps"
|
||||
@@ -83,15 +84,15 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:47
|
||||
msgid "MyBank"
|
||||
msgstr ""
|
||||
msgstr "MyBank"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:48
|
||||
msgid "Przelewy24"
|
||||
msgstr ""
|
||||
msgstr "Przelewy24"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:49
|
||||
msgid "Verkkopankki"
|
||||
msgstr ""
|
||||
msgstr "Verkkopankki"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:50
|
||||
msgid "PayU"
|
||||
@@ -127,7 +128,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:58
|
||||
msgid "Mercado Pago"
|
||||
msgstr ""
|
||||
msgstr "Mercado Pago"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:50
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
|
||||
"PO-Revision-Date: 2025-05-28 08:00+0000\n"
|
||||
"PO-Revision-Date: 2025-06-04 06:32+0000\n"
|
||||
"Last-Translator: Renne Rocha <renne@rocha.dev.br>\n"
|
||||
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
|
||||
"pretix/pretix/pt_BR/>\n"
|
||||
@@ -10604,10 +10604,8 @@ msgstr ""
|
||||
"você usa os dados coletados em sua loja de ingressos."
|
||||
|
||||
#: pretix/base/settings.py:2071
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information URL"
|
||||
msgstr "Informações da conta"
|
||||
msgstr "URL de informação de acessibilidade"
|
||||
|
||||
#: pretix/base/settings.py:2072
|
||||
#, fuzzy
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,8 +8,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
|
||||
"PO-Revision-Date: 2024-05-30 17:00+0000\n"
|
||||
"Last-Translator: Luan Thien <vanthienluan@gmail.com>\n"
|
||||
"PO-Revision-Date: 2025-06-06 06:09+0000\n"
|
||||
"Last-Translator: Michael Dao <garudong89@gmail.com>\n"
|
||||
"Language-Team: Vietnamese <https://translate.pretix.eu/projects/pretix/"
|
||||
"pretix-js/vi/>\n"
|
||||
"Language: vi\n"
|
||||
@@ -17,7 +17,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.5.5\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
|
||||
@@ -35,16 +35,16 @@ msgstr "PayPal"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:35
|
||||
msgid "Venmo"
|
||||
msgstr "Venmo"
|
||||
msgstr "Nền tảng Venmo"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:36
|
||||
#: pretix/static/pretixpresale/js/walletdetection.js:38
|
||||
msgid "Apple Pay"
|
||||
msgstr "Apple Pay"
|
||||
msgstr "Nền tảng Apple Pay"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:37
|
||||
msgid "Itaú"
|
||||
msgstr "Itaú"
|
||||
msgstr "Nền tảng Itaú"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:38
|
||||
msgid "PayPal Credit"
|
||||
@@ -56,11 +56,11 @@ msgstr "Thẻ tín dụng"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:40
|
||||
msgid "PayPal Pay Later"
|
||||
msgstr "PayPal Pay Later"
|
||||
msgstr "Nền tảng PayPal Pay Later"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:41
|
||||
msgid "iDEAL"
|
||||
msgstr "iDEAL"
|
||||
msgstr "Nền tảng iDEAL"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:42
|
||||
msgid "SEPA Direct Debit"
|
||||
@@ -68,11 +68,11 @@ msgstr "Ghi nợ trực tiếp SEPA"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:43
|
||||
msgid "Bancontact"
|
||||
msgstr "Bancontact"
|
||||
msgstr "Nền tảng Bancontact"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:44
|
||||
msgid "giropay"
|
||||
msgstr "giropay"
|
||||
msgstr "Nền tảng giropay"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:45
|
||||
msgid "SOFORT"
|
||||
@@ -80,55 +80,55 @@ msgstr "SOFORT"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:46
|
||||
msgid "eps"
|
||||
msgstr "eps"
|
||||
msgstr "Nền tảng eps"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:47
|
||||
msgid "MyBank"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng MyBank"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:48
|
||||
msgid "Przelewy24"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Przelewy24"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:49
|
||||
msgid "Verkkopankki"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Verkkopankki"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:50
|
||||
msgid "PayU"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng PayU"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:51
|
||||
msgid "BLIK"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng BLIK"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:52
|
||||
msgid "Trustly"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Trustly"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:53
|
||||
msgid "Zimpler"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Zimpler"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:54
|
||||
msgid "Maxima"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Maxima"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:55
|
||||
msgid "OXXO"
|
||||
msgstr ""
|
||||
msgstr "?? OXXO"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:56
|
||||
msgid "Boleto"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Boleto"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:57
|
||||
msgid "WeChat Pay"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng WeChat Pay"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:58
|
||||
msgid "Mercado Pago"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Mercado Pago"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:50
|
||||
@@ -238,11 +238,11 @@ msgstr "Đã huỷ"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:46
|
||||
msgid "Confirmed"
|
||||
msgstr ""
|
||||
msgstr "Đã Xác Nhận"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:47
|
||||
msgid "Approval pending"
|
||||
msgstr ""
|
||||
msgstr "Đang chờ phê duyệt"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:48
|
||||
msgid "Redeemed"
|
||||
@@ -307,7 +307,7 @@ msgstr "Vé không hợp lệ tại thời điểm này"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:65
|
||||
msgid "Order canceled"
|
||||
msgstr "Đã huỷ đơn hàng"
|
||||
msgstr "Đơn hàng đã bị hủy"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:66
|
||||
msgid "Ticket code is ambiguous on list"
|
||||
@@ -348,7 +348,7 @@ msgstr "đóng"
|
||||
#: pretix/static/pretixbase/js/addressform.js:59
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:513
|
||||
msgid "required"
|
||||
msgstr ""
|
||||
msgstr "bắt buộc"
|
||||
|
||||
#: pretix/static/pretixbase/js/asynctask.js:12
|
||||
msgid ""
|
||||
@@ -411,6 +411,8 @@ msgstr ""
|
||||
#: pretix/static/pretixbase/js/asynctask.js:270
|
||||
msgid "If this takes longer than a few minutes, please contact us."
|
||||
msgstr ""
|
||||
"Yêu cầu của bạn hiện đang được xử lý. Tùy theo quy mô sự kiện, quá trình này "
|
||||
"có thể mất đến vài phút."
|
||||
|
||||
#: pretix/static/pretixbase/js/asynctask.js:325
|
||||
msgid "Close message"
|
||||
@@ -480,27 +482,27 @@ msgstr "Số mục trước từ khi"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:135
|
||||
msgid "Number of previous entries before"
|
||||
msgstr "Số mục trước trước lúc"
|
||||
msgstr "Số lượt nhập trước đó"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:139
|
||||
msgid "Number of days with a previous entry"
|
||||
msgstr ""
|
||||
msgstr "Số ngày có lượt nhập trước đó"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:143
|
||||
msgid "Number of days with a previous entry since"
|
||||
msgstr ""
|
||||
msgstr "Số ngày có lượt nhập trước đó kể từ khi"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:147
|
||||
msgid "Number of days with a previous entry before"
|
||||
msgstr ""
|
||||
msgstr "Số ngày có lượt nhập trước đó trước"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:151
|
||||
msgid "Minutes since last entry (-1 on first entry)"
|
||||
msgstr ""
|
||||
msgstr "Số phút kể từ lượt nhập cuối cùng (-1 đối với lượt nhập đầu tiên)"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:155
|
||||
msgid "Minutes since first entry (-1 on first entry)"
|
||||
msgstr ""
|
||||
msgstr "Số phút kể từ lượt nhập đầu tiên (-1 đối với lượt nhập đầu tiên)"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:182
|
||||
msgid "All of the conditions below (AND)"
|
||||
@@ -569,16 +571,12 @@ msgid "Group of objects"
|
||||
msgstr "Nhóm các đối tượng"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/editor.js:908
|
||||
#, fuzzy
|
||||
#| msgid "Text object"
|
||||
msgid "Text object (deprecated)"
|
||||
msgstr "Văn bản"
|
||||
msgstr "Đối tượng văn bản (đã lỗi thời)"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/editor.js:910
|
||||
#, fuzzy
|
||||
#| msgid "Text object"
|
||||
msgid "Text box"
|
||||
msgstr "Văn bản"
|
||||
msgstr "Văn bản chữ"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/editor.js:912
|
||||
msgid "Barcode area"
|
||||
@@ -626,24 +624,26 @@ msgid "Unknown error."
|
||||
msgstr "Lỗi không xác định."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:292
|
||||
#, fuzzy
|
||||
#| msgid "Your color has great contrast and is very easy to read!"
|
||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||
msgstr "Bạn đã chọn màu có độ tương phản tốt và dễ đọc!"
|
||||
msgstr ""
|
||||
"Màu sắc của bạn có độ tương phản cao và sẽ mang lại khả năng tiếp cận tuyệt "
|
||||
"vời."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:296
|
||||
#, fuzzy
|
||||
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
||||
msgid ""
|
||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||
"requirements."
|
||||
msgstr "Bạn đã giảm độ tương phản và có lẽ khá tốt để đọc!"
|
||||
msgstr ""
|
||||
"Màu sắc của bạn có độ tương phản khá và đủ đáp ứng yêu cầu tối thiểu về khả "
|
||||
"năng tiếp cận."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:300
|
||||
msgid ""
|
||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||
"will be impacted."
|
||||
msgstr ""
|
||||
"Màu sắc của bạn có độ tương phản không đủ so với màu trắng. Khả năng tiếp "
|
||||
"cận của trang web bạn sẽ bị ảnh hưởng."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:416
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:436
|
||||
@@ -672,246 +672,246 @@ msgstr "Số trang không hợp lệ."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:943
|
||||
msgid "Use a different name internally"
|
||||
msgstr ""
|
||||
msgstr "Sử dụng tên khác ở bên trong"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:983
|
||||
msgid "Click to close"
|
||||
msgstr ""
|
||||
msgstr "Nhấn để đóng"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:1064
|
||||
msgid "You have unsaved changes!"
|
||||
msgstr ""
|
||||
msgstr "Bạn có những thay đổi chưa được lưu!"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/orderchange.js:25
|
||||
msgid "Calculating default price…"
|
||||
msgstr ""
|
||||
msgstr "Đang tính giá mặc định…"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/plugins.js:69
|
||||
#, fuzzy
|
||||
#| msgid "Search results"
|
||||
msgid "No results"
|
||||
msgstr "Kết quả tìm kiếm"
|
||||
msgstr "Không có kết quả"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/question.js:42
|
||||
msgid "Others"
|
||||
msgstr ""
|
||||
msgstr "Khác"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/question.js:82
|
||||
msgid "Count"
|
||||
msgstr ""
|
||||
msgstr "Số lượng"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/subevent.js:111
|
||||
msgid "(one more date)"
|
||||
msgid_plural "({num} more dates)"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[0] "{num} ngày còn lại"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:48
|
||||
msgid ""
|
||||
"The items in your cart are no longer reserved for you. You can still "
|
||||
"complete your order as long as they’re available."
|
||||
msgstr ""
|
||||
"Các mặt hàng trong giỏ của bạn không còn được giữ chỗ nữa. Bạn vẫn có thể "
|
||||
"hoàn tất đơn hàng miễn là chúng còn hàng."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:50
|
||||
msgid "Cart expired"
|
||||
msgstr ""
|
||||
msgstr "Giỏ hàng đã hết hạn"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:59
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:87
|
||||
msgid "Your cart is about to expire."
|
||||
msgstr ""
|
||||
msgstr "Giỏ hàng của bạn sắp hết hạn."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:64
|
||||
msgid "The items in your cart are reserved for you for one minute."
|
||||
msgid_plural "The items in your cart are reserved for you for {num} minutes."
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[0] "Các mặt hàng trong giỏ của bạn được giữ trong vòng {num} phút."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:86
|
||||
msgid "Your cart has expired."
|
||||
msgstr ""
|
||||
msgstr "Giỏ hàng của bạn đã hết hạn."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:89
|
||||
msgid ""
|
||||
"The items in your cart are no longer reserved for you. You can still "
|
||||
"complete your order as long as they're available."
|
||||
msgstr ""
|
||||
"Các mặt hàng trong giỏ của bạn không còn được giữ chỗ nữa. Bạn vẫn có thể "
|
||||
"hoàn tất đơn hàng miễn là chúng còn hàng."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:90
|
||||
msgid "Do you want to renew the reservation period?"
|
||||
msgstr ""
|
||||
msgstr "Bạn có muốn gia hạn thời gian giữ chỗ không?"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:93
|
||||
msgid "Renew reservation"
|
||||
msgstr ""
|
||||
msgstr "Gia hạn giữ chỗ"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:194
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr ""
|
||||
msgstr "Người tổ chức giữ lại %(currency)s %(amount)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:202
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr ""
|
||||
msgstr "Bạn nhận lại %(currency)s %(amount)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:218
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
msgstr "Vui lòng nhập số tiền người tổ chức được giữ lại."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:558
|
||||
msgid "Your local time:"
|
||||
msgstr ""
|
||||
msgstr "Thời gian địa phương của bạn:"
|
||||
|
||||
#: pretix/static/pretixpresale/js/walletdetection.js:39
|
||||
msgid "Google Pay"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Google Pay"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:16
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:16
|
||||
msgctxt "widget"
|
||||
msgid "Quantity"
|
||||
msgstr ""
|
||||
msgstr "Số lượng"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:17
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:17
|
||||
msgctxt "widget"
|
||||
msgid "Decrease quantity"
|
||||
msgstr ""
|
||||
msgstr "Giảm số lượng"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:18
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:18
|
||||
msgctxt "widget"
|
||||
msgid "Increase quantity"
|
||||
msgstr ""
|
||||
msgstr "Tăng số lượng"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:19
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr ""
|
||||
msgstr "Lọc sự kiện bởi"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:20
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Lọc"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:21
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
|
||||
msgctxt "widget"
|
||||
msgid "Price"
|
||||
msgstr ""
|
||||
msgstr "Giá"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:22
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:20
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Original price: %s"
|
||||
msgstr ""
|
||||
msgstr "Giá gốc: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:23
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:21
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "New price: %s"
|
||||
msgstr ""
|
||||
msgstr "Giá mới: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:24
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:22
|
||||
msgctxt "widget"
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
msgstr "Chọn"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:25
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:23
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select %s"
|
||||
msgstr ""
|
||||
msgstr "Chọn %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:26
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:24
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select variant %s"
|
||||
msgstr ""
|
||||
msgstr "Chọn biến thể %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:27
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:25
|
||||
msgctxt "widget"
|
||||
msgid "Sold out"
|
||||
msgstr ""
|
||||
msgstr "Bán hết"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:28
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:26
|
||||
msgctxt "widget"
|
||||
msgid "Buy"
|
||||
msgstr ""
|
||||
msgstr "Mua"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:29
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:27
|
||||
msgctxt "widget"
|
||||
msgid "Register"
|
||||
msgstr ""
|
||||
msgstr "Đăng ký"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:30
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:28
|
||||
msgctxt "widget"
|
||||
msgid "Reserved"
|
||||
msgstr ""
|
||||
msgstr "Đã đặt"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:31
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:29
|
||||
msgctxt "widget"
|
||||
msgid "FREE"
|
||||
msgstr ""
|
||||
msgstr "MIỄN PHÍ"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:32
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:30
|
||||
msgctxt "widget"
|
||||
msgid "from %(currency)s %(price)s"
|
||||
msgstr ""
|
||||
msgstr "từ %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:33
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:31
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Image of %s"
|
||||
msgstr ""
|
||||
msgstr "Hình của %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:34
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:32
|
||||
msgctxt "widget"
|
||||
msgid "incl. %(rate)s% %(taxname)s"
|
||||
msgstr ""
|
||||
msgstr "đã bao gồm %(rate)s% %(taxname)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:35
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:33
|
||||
msgctxt "widget"
|
||||
msgid "plus %(rate)s% %(taxname)s"
|
||||
msgstr ""
|
||||
msgstr "cộng thêm %(rate)s% %(taxname)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:36
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:34
|
||||
msgctxt "widget"
|
||||
msgid "incl. taxes"
|
||||
msgstr ""
|
||||
msgstr "đã bao gồm thuế"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:37
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:35
|
||||
msgctxt "widget"
|
||||
msgid "plus taxes"
|
||||
msgstr ""
|
||||
msgstr "cộng thêm thuế"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:38
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:36
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "currently available: %s"
|
||||
msgstr ""
|
||||
msgstr "hiện có sẵn: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:39
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:37
|
||||
msgctxt "widget"
|
||||
msgid "Only available with a voucher"
|
||||
msgstr ""
|
||||
msgstr "Chỉ áp dụng với phiếu giảm giá"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:40
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:43
|
||||
@@ -919,38 +919,38 @@ msgstr ""
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:41
|
||||
msgctxt "widget"
|
||||
msgid "Not yet available"
|
||||
msgstr ""
|
||||
msgstr "Chưa có sẵn"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:41
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:39
|
||||
msgctxt "widget"
|
||||
msgid "Not available anymore"
|
||||
msgstr ""
|
||||
msgstr "Không có nữa"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:42
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:40
|
||||
msgctxt "widget"
|
||||
msgid "Currently not available"
|
||||
msgstr ""
|
||||
msgstr "Hiện tại không có sẵn"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:44
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:42
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "minimum amount to order: %s"
|
||||
msgstr ""
|
||||
msgstr "Số lượng đặt hàng tối thiểu: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:45
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:43
|
||||
msgctxt "widget"
|
||||
msgid "Close ticket shop"
|
||||
msgstr ""
|
||||
msgstr "Đóng cửa hàng vé"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:46
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:44
|
||||
msgctxt "widget"
|
||||
msgid "The ticket shop could not be loaded."
|
||||
msgstr ""
|
||||
msgstr "Không thể tải cửa hàng vé."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:47
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:45
|
||||
@@ -959,24 +959,26 @@ msgid ""
|
||||
"There are currently a lot of users in this ticket shop. Please open the shop "
|
||||
"in a new tab to continue."
|
||||
msgstr ""
|
||||
"Hiện có rất nhiều người dùng trong cửa hàng vé này. Vui lòng mở cửa hàng ở "
|
||||
"tab mới để tiếp tục."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:49
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:47
|
||||
msgctxt "widget"
|
||||
msgid "Open ticket shop"
|
||||
msgstr ""
|
||||
msgstr "Mở cửa hàng vé"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:50
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:48
|
||||
msgctxt "widget"
|
||||
msgid "Checkout"
|
||||
msgstr ""
|
||||
msgstr "Thanh toán"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:51
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:49
|
||||
msgctxt "widget"
|
||||
msgid "The cart could not be created. Please try again later"
|
||||
msgstr ""
|
||||
msgstr "Không thể tạo giỏ hàng. Vui lòng thử lại sau"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:52
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:50
|
||||
@@ -985,12 +987,14 @@ msgid ""
|
||||
"We could not create your cart, since there are currently too many users in "
|
||||
"this ticket shop. Please click \"Continue\" to retry in a new tab."
|
||||
msgstr ""
|
||||
"Chúng tôi không thể tạo giỏ hàng của bạn do hiện có quá nhiều người dùng "
|
||||
"trong cửa hàng vé này. Vui lòng nhấn \"Tiếp tục\" để thử lại trong tab mới."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:54
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:52
|
||||
msgctxt "widget"
|
||||
msgid "Waiting list"
|
||||
msgstr ""
|
||||
msgstr "Danh sách chờ"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:55
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:53
|
||||
@@ -999,112 +1003,114 @@ msgid ""
|
||||
"You currently have an active cart for this event. If you select more "
|
||||
"products, they will be added to your existing cart."
|
||||
msgstr ""
|
||||
"Hiện bạn đang có một giỏ hàng còn hiệu lực cho sự kiện này. Nếu bạn chọn "
|
||||
"thêm sản phẩm, chúng sẽ được thêm vào giỏ hàng hiện tại của bạn."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:57
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:55
|
||||
msgctxt "widget"
|
||||
msgid "Resume checkout"
|
||||
msgstr ""
|
||||
msgstr "Tiếp tục thanh toán"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:58
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:56
|
||||
msgctxt "widget"
|
||||
msgid "Redeem a voucher"
|
||||
msgstr ""
|
||||
msgstr "Sử dụng phiếu giảm giá"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:59
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:57
|
||||
msgctxt "widget"
|
||||
msgid "Redeem"
|
||||
msgstr ""
|
||||
msgstr "Đổi mã"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:60
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:58
|
||||
msgctxt "widget"
|
||||
msgid "Voucher code"
|
||||
msgstr ""
|
||||
msgstr "Mã giảm giá"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:61
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:59
|
||||
msgctxt "widget"
|
||||
msgid "Close"
|
||||
msgstr ""
|
||||
msgstr "Đóng"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:62
|
||||
msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr ""
|
||||
msgstr "Đóng trang thanh toán"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:63
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
msgstr "Bạn không thể hủy thao tác này. Vui lòng chờ quá trình tải hoàn tất."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:64
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60
|
||||
msgctxt "widget"
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
msgstr "Tiếp tục"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:65
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:61
|
||||
msgctxt "widget"
|
||||
msgid "Show variants"
|
||||
msgstr ""
|
||||
msgstr "Hiển thị các biến thể"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:66
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:62
|
||||
msgctxt "widget"
|
||||
msgid "Hide variants"
|
||||
msgstr ""
|
||||
msgstr "Ẩn các biến thể"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:67
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:63
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different event"
|
||||
msgstr ""
|
||||
msgstr "Chọn sự kiện khác"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:68
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:64
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different date"
|
||||
msgstr ""
|
||||
msgstr "Chọn ngày khác"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:69
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:65
|
||||
msgctxt "widget"
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
msgstr "Quay về"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:70
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:66
|
||||
msgctxt "widget"
|
||||
msgid "Next month"
|
||||
msgstr ""
|
||||
msgstr "Tháng sau"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:71
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:67
|
||||
msgctxt "widget"
|
||||
msgid "Previous month"
|
||||
msgstr ""
|
||||
msgstr "Tháng trước"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:72
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:68
|
||||
msgctxt "widget"
|
||||
msgid "Next week"
|
||||
msgstr ""
|
||||
msgstr "Tuần sau"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:73
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:69
|
||||
msgctxt "widget"
|
||||
msgid "Previous week"
|
||||
msgstr ""
|
||||
msgstr "Tuần trước"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:74
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:70
|
||||
msgctxt "widget"
|
||||
msgid "Open seat selection"
|
||||
msgstr ""
|
||||
msgstr "Mở chọn chỗ ngồi"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:75
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:71
|
||||
@@ -1114,142 +1120,144 @@ msgid ""
|
||||
"add yourself to the waiting list. We will then notify if seats are available "
|
||||
"again."
|
||||
msgstr ""
|
||||
"Một số hoặc tất cả các loại vé hiện đã bán hết. Nếu bạn muốn, bạn có thể "
|
||||
"thêm tên vào danh sách chờ. Chúng tôi sẽ thông báo khi có chỗ ngồi lại."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:76
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:72
|
||||
msgctxt "widget"
|
||||
msgid "Load more"
|
||||
msgstr ""
|
||||
msgstr "Tải thêm"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:78
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:74
|
||||
msgid "Mo"
|
||||
msgstr ""
|
||||
msgstr "T2"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:79
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:75
|
||||
msgid "Tu"
|
||||
msgstr ""
|
||||
msgstr "T3"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:80
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:76
|
||||
msgid "We"
|
||||
msgstr ""
|
||||
msgstr "T4"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:81
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:77
|
||||
msgid "Th"
|
||||
msgstr ""
|
||||
msgstr "T5"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:82
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:78
|
||||
msgid "Fr"
|
||||
msgstr ""
|
||||
msgstr "T6"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:83
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:79
|
||||
msgid "Sa"
|
||||
msgstr ""
|
||||
msgstr "T7"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:84
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:80
|
||||
msgid "Su"
|
||||
msgstr ""
|
||||
msgstr "CN"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:85
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:81
|
||||
msgid "Monday"
|
||||
msgstr ""
|
||||
msgstr "Thứ Hai"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:86
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:82
|
||||
msgid "Tuesday"
|
||||
msgstr ""
|
||||
msgstr "Thứ Ba"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:87
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:83
|
||||
msgid "Wednesday"
|
||||
msgstr ""
|
||||
msgstr "Thứ Tư"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:88
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:84
|
||||
msgid "Thursday"
|
||||
msgstr ""
|
||||
msgstr "Thứ Năm"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:89
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:85
|
||||
msgid "Friday"
|
||||
msgstr ""
|
||||
msgstr "Thứ Sáu"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:90
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:86
|
||||
msgid "Saturday"
|
||||
msgstr ""
|
||||
msgstr "Thứ Bảy"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:91
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:87
|
||||
msgid "Sunday"
|
||||
msgstr ""
|
||||
msgstr "Chủ Nhật"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:94
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:90
|
||||
msgid "January"
|
||||
msgstr ""
|
||||
msgstr "Tháng 1"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:95
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:91
|
||||
msgid "February"
|
||||
msgstr ""
|
||||
msgstr "Tháng 2"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:96
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:92
|
||||
msgid "March"
|
||||
msgstr ""
|
||||
msgstr "Tháng 3"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:97
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:93
|
||||
msgid "April"
|
||||
msgstr ""
|
||||
msgstr "Tháng 4"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:98
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:94
|
||||
msgid "May"
|
||||
msgstr ""
|
||||
msgstr "Tháng 5"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:99
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:95
|
||||
msgid "June"
|
||||
msgstr ""
|
||||
msgstr "Tháng 6"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:100
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:96
|
||||
msgid "July"
|
||||
msgstr ""
|
||||
msgstr "Tháng 7"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:101
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:97
|
||||
msgid "August"
|
||||
msgstr ""
|
||||
msgstr "Tháng 8"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:102
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:98
|
||||
msgid "September"
|
||||
msgstr ""
|
||||
msgstr "Tháng 9"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:103
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:99
|
||||
msgid "October"
|
||||
msgstr ""
|
||||
msgstr "Tháng 10"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:104
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:100
|
||||
msgid "November"
|
||||
msgstr ""
|
||||
msgstr "Tháng 11"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:105
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:101
|
||||
msgid "December"
|
||||
msgstr ""
|
||||
msgstr "Tháng 12"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Your color has bad contrast for text on white background, please choose a "
|
||||
|
||||
@@ -47,7 +47,8 @@ from django.utils.translation import gettext_lazy as _
|
||||
from django_scopes import scope, scopes_disabled
|
||||
|
||||
from pretix.base.logentrytypes import (
|
||||
EventLogEntryType, OrderLogEntryType, log_entry_types,
|
||||
EventLogEntryType, OrderLogEntryType, WaitingListEntryLogEntryType,
|
||||
log_entry_types,
|
||||
)
|
||||
from pretix.base.models import SubEvent
|
||||
from pretix.base.signals import (
|
||||
@@ -130,6 +131,11 @@ class SendmailPluginOrderLogEntryType(OrderLogEntryType):
|
||||
pass
|
||||
|
||||
|
||||
@log_entry_types.new('pretix.plugins.sendmail.waitinglist.email.sent', _('The person on the waiting list received a mass email.'))
|
||||
class SendmailPluginWaitingListLogEntryType(WaitingListEntryLogEntryType):
|
||||
pass
|
||||
|
||||
|
||||
@log_entry_types.new('pretix.plugins.sendmail.rule.added', _('An email rule was created'))
|
||||
@log_entry_types.new('pretix.plugins.sendmail.rule.changed', _('An email rule was updated'))
|
||||
@log_entry_types.new('pretix.plugins.sendmail.rule.order.email.sent', _('A scheduled email was sent to the order'))
|
||||
|
||||
@@ -201,4 +201,5 @@ def send_mails_to_waitinglist(event: Event, user: int, subject: dict, message: d
|
||||
),
|
||||
user=user,
|
||||
attach_cached_files=attachments,
|
||||
log_entry_type='pretix.plugins.sendmail.waitinglist.email.sent',
|
||||
)
|
||||
|
||||
@@ -55,7 +55,7 @@ class AuthenticationForm(forms.Form):
|
||||
required_css_class = 'required'
|
||||
email = forms.EmailField(
|
||||
label=_("Email"),
|
||||
widget=forms.EmailInput()
|
||||
widget=forms.EmailInput(attrs={'autocomplete': 'email'})
|
||||
)
|
||||
password = forms.CharField(
|
||||
label=_("Password"),
|
||||
@@ -140,6 +140,7 @@ class RegistrationForm(forms.Form):
|
||||
name_parts = forms.CharField()
|
||||
email = forms.EmailField(
|
||||
label=_("Email"),
|
||||
widget=forms.EmailInput(attrs={'autocomplete': 'email'})
|
||||
)
|
||||
|
||||
error_messages = {
|
||||
@@ -341,6 +342,7 @@ class ResetPasswordForm(forms.Form):
|
||||
}
|
||||
email = forms.EmailField(
|
||||
label=_('Email'),
|
||||
widget=forms.EmailInput(attrs={'autocomplete': 'email'}),
|
||||
)
|
||||
|
||||
def __init__(self, request=None, *args, **kwargs):
|
||||
@@ -388,12 +390,12 @@ class ChangePasswordForm(forms.Form):
|
||||
)
|
||||
password_current = forms.CharField(
|
||||
label=_('Your current password'),
|
||||
widget=forms.PasswordInput,
|
||||
widget=forms.PasswordInput(attrs={'autocomplete': 'current-password'}),
|
||||
required=True
|
||||
)
|
||||
password = forms.CharField(
|
||||
label=_('New password'),
|
||||
widget=forms.PasswordInput,
|
||||
widget=forms.PasswordInput(attrs={'minlength': '8', 'autocomplete': 'new-password'}),
|
||||
max_length=4096,
|
||||
required=True
|
||||
)
|
||||
@@ -457,7 +459,7 @@ class ChangeInfoForm(forms.ModelForm):
|
||||
}
|
||||
password_current = forms.CharField(
|
||||
label=_('Your current password'),
|
||||
widget=forms.PasswordInput,
|
||||
widget=forms.PasswordInput(attrs={'autocomplete': 'current-password'}),
|
||||
help_text=_('Only required if you change your email address'),
|
||||
max_length=4096,
|
||||
required=False
|
||||
@@ -471,6 +473,8 @@ class ChangeInfoForm(forms.ModelForm):
|
||||
self.request = request
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self.fields['email'].widget.attrs['autocomplete'] = 'email'
|
||||
|
||||
self.fields['name_parts'] = NamePartsFormField(
|
||||
max_length=255,
|
||||
required=True,
|
||||
|
||||
@@ -57,6 +57,8 @@ class WaitingListForm(forms.ModelForm):
|
||||
|
||||
event = self.event
|
||||
|
||||
self.fields['email'].widget.attrs['autocomplete'] = 'email'
|
||||
|
||||
if event.settings.waiting_list_names_asked:
|
||||
self.fields['name_parts'] = NamePartsFormField(
|
||||
max_length=255,
|
||||
|
||||
@@ -19,9 +19,9 @@
|
||||
<div class="panel-body questions-form">
|
||||
{% if form.position.seat %}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">
|
||||
{% trans "Seat" %}
|
||||
</label>
|
||||
<div class="col-md-3 control-label">
|
||||
<strong role="heading" aria-level="5">{% trans "Seat" %}</strong>
|
||||
</div>
|
||||
<div class="col-md-9 form-control-text">
|
||||
{% include "icons/seat.svg" with cls="svg-icon" %}
|
||||
{{ form.position.seat }}
|
||||
@@ -30,9 +30,9 @@
|
||||
{% endif %}
|
||||
{% if form.position.addons.all %}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">
|
||||
{% trans "Selected add-ons" %}
|
||||
</label>
|
||||
<div class="col-md-3 control-label">
|
||||
<strong role="heading" aria-level="5">{% trans "Selected add-ons" %}</strong>
|
||||
</div>
|
||||
<div class="col-md-9 form-control-text">
|
||||
<ul class="addon-list">
|
||||
{% for a in form.position.addons.all %}
|
||||
@@ -44,13 +44,13 @@
|
||||
{% endif %}
|
||||
{% if form.position.subevent %}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">
|
||||
{% trans "Date" context "subevent" %}
|
||||
</label>
|
||||
<div class="col-md-3 control-label">
|
||||
<strong role="heading" aria-level="5">{% trans "Date" context "subevent" %}</strong>
|
||||
</div>
|
||||
<div class="col-md-9 form-control-text">
|
||||
<ul class="addon-list">
|
||||
<p class="addon-list">
|
||||
{{ form.position.subevent.name }} · {{ form.position.subevent.get_date_range_display_with_times_as_html }}
|
||||
</ul>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -95,9 +95,9 @@
|
||||
{% endif %}
|
||||
{% if pos.seat %}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">
|
||||
{% trans "Seat" %}
|
||||
</label>
|
||||
<div class="col-md-3 control-label">
|
||||
<strong role="heading" aria-level="4">{% trans "Seat" %}</strong>
|
||||
</div>
|
||||
<div class="col-md-9 form-control-text">
|
||||
{% include "icons/seat.svg" with cls="svg-icon" %}
|
||||
{{ pos.seat }}
|
||||
@@ -106,9 +106,9 @@
|
||||
{% endif %}
|
||||
{% if pos.addons_without_bundled %}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">
|
||||
{% trans "Selected add-ons" %}
|
||||
</label>
|
||||
<div class="col-md-3 control-label">
|
||||
<strong role="heading" aria-level="4">{% trans "Selected add-ons" %}</strong>
|
||||
</div>
|
||||
<div class="col-md-9 form-control-text">
|
||||
<ul class="addon-list">
|
||||
{% regroup pos.addons_without_bundled by item_and_variation as addons_by_itemvar %}
|
||||
@@ -121,13 +121,13 @@
|
||||
{% endif %}
|
||||
{% if pos.subevent %}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">
|
||||
{% trans "Date" context "subevent" %}
|
||||
</label>
|
||||
<div class="col-md-3 control-label">
|
||||
<strong role="heading" aria-level="4">{% trans "Date" context "subevent" %}</strong>
|
||||
</div>
|
||||
<div class="col-md-9 form-control-text">
|
||||
<ul class="addon-list">
|
||||
<p class="addon-list">
|
||||
{{ pos.subevent.name }} · {{ pos.subevent.get_date_range_display_with_times_as_html }}
|
||||
</ul>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -96,8 +96,8 @@
|
||||
{% if not event.settings.show_variations_expanded %}
|
||||
<button type="button" data-toggle="variations" class="btn btn-default btn-block js-only"
|
||||
data-label-alt="{% trans "Hide variants" %}"
|
||||
aria-expanded="false"
|
||||
aria-label="{% blocktrans trimmed with item=item.name count=item.available_variations|length %}Show {{count}} variants of {{item}}{% endblocktrans %}">
|
||||
aria-expanded="false" aria-controls="cp-{{ form.pos.pk }}-item-{{ item.pk }}-variations"
|
||||
aria-describedby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-legend">
|
||||
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
|
||||
<span>{% trans "Show variants" %}</span>
|
||||
</button>
|
||||
@@ -105,7 +105,7 @@
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}">
|
||||
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}" id="cp-{{ form.pos.pk }}-item-{{ item.pk }}-variations">
|
||||
{% for var in item.available_variations %}
|
||||
<article aria-labelledby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-{{ var.pk }}-legend"{% if var.description %} aria-describedby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-{{ var.pk }}-description"{% endif %} class="row-fluid product-row variation"
|
||||
{% if not item.free_price %}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{% load i18n %}
|
||||
{% load icon %}
|
||||
{% load eventurl %}
|
||||
{% load daterange %}
|
||||
{% load safelink %}
|
||||
@@ -506,10 +507,23 @@
|
||||
</p>
|
||||
<p>
|
||||
<button class="btn btn-default" type="submit" id="cart-extend-button" aria-describedby="cart-deadline">
|
||||
<i class="fa fa-refresh" aria-hidden="true"></i> {% trans "Renew reservation" %}
|
||||
{% icon "refresh" %} {% trans "Renew reservation" %}
|
||||
</button>
|
||||
</p>
|
||||
</form>
|
||||
|
||||
<dialog role="alertdialog" id="cart-extend-confirmation-dialog" class="inline-dialog" aria-labelledby="cart-deadline">
|
||||
<form method="dialog">
|
||||
<p>
|
||||
<button class="btn btn-success" autofocus value="OK">
|
||||
<span role="img" aria-label="{% trans "OK" %}.">
|
||||
{% icon "check" %}
|
||||
</span>
|
||||
{% trans "Reservation renewed" %}
|
||||
</button>
|
||||
</p>
|
||||
</form>
|
||||
</dialog>
|
||||
{% else %}
|
||||
<p class="sr-only" id="cart-description">{% trans "Overview of your ordered products." %}</p>
|
||||
{% endif %}
|
||||
|
||||
@@ -16,13 +16,13 @@
|
||||
<div class="form-order-change-main">
|
||||
{% if position.subevent %}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">
|
||||
{% trans "Date" context "subevent" %}
|
||||
</label>
|
||||
<div class="col-md-3 control-label">
|
||||
<strong role="heading" aria-level="4">{% trans "Date" context "subevent" %}</strong>
|
||||
</div>
|
||||
<div class="col-md-9 form-control-text">
|
||||
<ul class="addon-list">
|
||||
<p class="addon-list">
|
||||
{{ position.subevent.name }} · {{ position.subevent.get_date_range_display_with_times_as_html }}
|
||||
</ul>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -101,8 +101,8 @@
|
||||
{% endif %}
|
||||
<button type="button" data-toggle="variations" class="btn btn-default btn-block js-only"
|
||||
data-label-alt="{% trans "Hide variants" %}"
|
||||
aria-expanded="false"
|
||||
aria-label="{% blocktrans trimmed with item=item.name count=item.available_variations|length %}Show {{count}} variants of {{ item }}{% endblocktrans %}">
|
||||
aria-expanded="false" aria-controls="{{ form_prefix }}item-{{ item.pk }}-variations"
|
||||
aria-describedby="{{ form_prefix }}item-{{ item.pk }}-legend">
|
||||
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
|
||||
<span>{% trans "Show variants" %}</span>
|
||||
</button>
|
||||
@@ -110,7 +110,7 @@
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}">
|
||||
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}" id="{{ form_prefix }}item-{{ item.pk }}-variations">
|
||||
{% for var in item.available_variations %}
|
||||
<article aria-labelledby="{{ form_prefix }}item-{{ item.pk }}-{{ var.pk }}-legend"{% if var.description %} aria-describedby="{{ form_prefix }}item-{{ item.pk }}-{{ var.pk }}-description"{% endif %} class="row product-row variation" id="{{ form_prefix }}item-{{ item.pk }}-{{ var.pk }}"
|
||||
{% if not item.free_price %}
|
||||
|
||||
@@ -15,8 +15,9 @@
|
||||
<div class="input-group{% if "voucher_invalid" in request.GET %} has-error{% endif %}">
|
||||
<span class="input-group-addon"><i class="fa fa-ticket fa-fw" aria-hidden="true"></i></span>
|
||||
<input type="text" class="form-control{% if "voucher_invalid" in request.GET %} has-error{% endif %}" name="voucher" id="voucher"
|
||||
{% if "voucher_invalid" in request.GET %} aria-describedby="error-message"{% endif %}
|
||||
placeholder="{% trans "Voucher code" %}" required="required">
|
||||
{% if "voucher_invalid" in request.GET %} aria-describedby="error-message"{% endif %}
|
||||
autocomplete="off"
|
||||
placeholder="{% trans "Voucher code" %}" required="required">
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" name="subevent" value="{{ subevent.id|default_if_none:"" }}" />
|
||||
|
||||
@@ -34,13 +34,13 @@
|
||||
{% endblocktrans %}
|
||||
{% endif %}
|
||||
</p>
|
||||
<p class="help-block">
|
||||
<p class="help-block" id="add-to-list-description">
|
||||
{% blocktrans trimmed %}
|
||||
You will <strong>not</strong> receive a confirmation email after you have been added to the waiting list. We will only contact you once a spot opens up.
|
||||
{% endblocktrans %}
|
||||
</p>
|
||||
<p>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<button type="submit" class="btn btn-primary" aria-describedby="add-to-list-description">
|
||||
{% trans "Add me to the list" %}
|
||||
</button>
|
||||
</p>
|
||||
|
||||
@@ -48,6 +48,10 @@
|
||||
<p class="modal-card-confirm"><button class="btn btn-lg btn-primary">{% trans "Renew reservation" %}</button></p>
|
||||
{% enddialog %}
|
||||
|
||||
{% dialog "dialog-cart-extended" "" "" icon="clock-o" alert=true %}
|
||||
<p class="modal-card-confirm"><button class="btn btn-lg btn-primary">{% trans "OK" %}</button></p>
|
||||
{% enddialog %}
|
||||
|
||||
<dialog id="lightbox-dialog" class="modal-card" role="alertdialog" aria-labelledby="lightbox-label">
|
||||
<form method="dialog" class="modal-card-inner form-horizontal">
|
||||
<div class="modal-card-content">
|
||||
|
||||
@@ -117,7 +117,7 @@ setup_collapsible_details = function (el) {
|
||||
el.find("article button[data-toggle=variations]").click(function (e) {
|
||||
var $button = $(this);
|
||||
var $details = $button.closest("article");
|
||||
var $detailsNotSummary = $(".variations", $details);
|
||||
var $detailsNotSummary = $button.attr("aria-controls") ? $('#' + $button.attr("aria-controls")) : $(".variations", $details);
|
||||
var isOpen = !$detailsNotSummary.prop("hidden");
|
||||
if ($detailsNotSummary.is(':animated')) {
|
||||
e.preventDefault();
|
||||
@@ -125,7 +125,7 @@ setup_collapsible_details = function (el) {
|
||||
}
|
||||
|
||||
var altLabel = $button.attr("data-label-alt");
|
||||
$button.attr("data-label-alt", $button.text());
|
||||
$button.attr("data-label-alt", $button.text().trim());
|
||||
$button.find("span").text(altLabel);
|
||||
$button.attr("aria-expanded", !isOpen);
|
||||
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
dialog.inline-dialog {
|
||||
position: static;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: none;
|
||||
}
|
||||
|
||||
/* Modal dialogs using HTML5 dialog tags for accessibility */
|
||||
dialog.modal-card {
|
||||
border: none;
|
||||
@@ -8,9 +15,6 @@ dialog.modal-card {
|
||||
box-shadow: 0 7px 14px 0 rgba(78, 50, 92, 0.1),0 3px 6px 0 rgba(0,0,0,.07);
|
||||
background: white;
|
||||
border-radius: $border-radius-large;
|
||||
|
||||
opacity: 0;
|
||||
transition: opacity .5s allow-discrete;
|
||||
}
|
||||
.modal-card-inner {
|
||||
display: flex;
|
||||
@@ -52,18 +56,8 @@ dialog.modal-card .modal-card-content {
|
||||
|
||||
dialog::backdrop {
|
||||
background-color: rgba(255, 255, 255, .5);
|
||||
opacity: 0;
|
||||
transition: opacity .5s allow-discrete;
|
||||
backdrop-filter: blur(2px);
|
||||
}
|
||||
dialog[open], dialog[open]::backdrop {
|
||||
opacity: 1;
|
||||
}
|
||||
@starting-style {
|
||||
dialog[open], dialog[open]::backdrop {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: $screen-sm-min) {
|
||||
dialog.modal-card:has(.modal-card-icon) .modal-card-inner {
|
||||
|
||||
@@ -7,17 +7,16 @@ $(function () {
|
||||
|
||||
$(".chart").css("height", "250px");
|
||||
var data_type = $("#question_chart").attr("data-type"),
|
||||
data = JSON.parse($("#question-chart-data").html()),
|
||||
data = JSON.parse($("#question-chart-data").text() || "[]"),
|
||||
others_sum = 0,
|
||||
max_num = 8;
|
||||
|
||||
for (var i in data) {
|
||||
data[i].value = data[i].count;
|
||||
data[i].label = data[i].answer;
|
||||
if (data[i].label.length > 20) {
|
||||
data[i].label = data[i].label.substring(0, 20) + '…';
|
||||
data = data[0]?.map(function (d) {
|
||||
return {
|
||||
'value': d.count,
|
||||
'label': d.answer.length > 20 ? d.answer.substring(0, 20) + '…' : d.answer,
|
||||
}
|
||||
}
|
||||
}) || [];
|
||||
|
||||
if (data_type == 'N') {
|
||||
// Sort
|
||||
@@ -36,7 +35,7 @@ $(function () {
|
||||
// Limit shown options
|
||||
if (data.length > max_num) {
|
||||
for (var i = max_num; i < data.length; i++) {
|
||||
others_sum += data[i].count;
|
||||
others_sum += data[i].value;
|
||||
}
|
||||
data = data.slice(0, max_num);
|
||||
data.push({'value': others_sum, 'label': gettext('Others')});
|
||||
@@ -78,7 +77,7 @@ $(function () {
|
||||
data: data,
|
||||
resize: true,
|
||||
xkey: 'label',
|
||||
ykeys: ['count'],
|
||||
ykeys: ['value'],
|
||||
labels: [gettext('Count')]
|
||||
});
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ var cart = {
|
||||
_deadline_call: 0,
|
||||
_time_offset: 0,
|
||||
_prev_diff_minutes: 0,
|
||||
_renewed_message: "",
|
||||
|
||||
_get_now: function () {
|
||||
return moment().add(cart._time_offset, 'ms');
|
||||
@@ -59,7 +58,6 @@ var cart = {
|
||||
$("#cart-deadline").text(gettext("Your cart is about to expire."))
|
||||
} else {
|
||||
$("#cart-deadline").text(
|
||||
cart._renewed_message + " " +
|
||||
ngettext(
|
||||
"The items in your cart are reserved for you for one minute.",
|
||||
"The items in your cart are reserved for you for {num} minutes.",
|
||||
@@ -74,7 +72,6 @@ var cart = {
|
||||
pad(diff_minutes.toString(), 2) + ':' + pad(diff_seconds.toString(), 2)
|
||||
);
|
||||
|
||||
cart._renewed_message = "";
|
||||
cart._deadline_timeout = window.setTimeout(cart.draw_deadline, 500);
|
||||
}
|
||||
var already_expired = diff_total_seconds <= 0;
|
||||
@@ -112,7 +109,6 @@ var cart = {
|
||||
}
|
||||
cart._deadline_timeout = null;
|
||||
cart._max_extend = moment(max_extend);
|
||||
cart._renewed_message = renewed_message || "";
|
||||
cart.draw_deadline();
|
||||
}
|
||||
};
|
||||
@@ -122,22 +118,41 @@ $(function () {
|
||||
|
||||
if ($("#cart-deadline").length) {
|
||||
cart.init();
|
||||
$("#cart-extend-confirmation-button").hide().on("blur", function() {
|
||||
$(this).hide();
|
||||
});
|
||||
}
|
||||
|
||||
$("#cart-extend-form").on("pretix:async-task-success", function(e, data) {
|
||||
if (data.success) {
|
||||
cart.set_deadline(data.expiry, data.max_expiry_extend, data.message);
|
||||
var cart_panel_heading = $(this).closest(".panel").find(".panel-heading").get(0);
|
||||
if (cart_panel_heading) {
|
||||
cart_panel_heading.focus();
|
||||
}
|
||||
cart.set_deadline(data.expiry, data.max_expiry_extend);
|
||||
} else {
|
||||
alert(data.message);
|
||||
}
|
||||
});
|
||||
// renew-button in cart-panel is clicked, show inline dialog
|
||||
$("#cart-extend-button").on("click", function() {
|
||||
$("#cart-extend-form").one("pretix:async-task-success", function(e, data) {
|
||||
if (data.success) {
|
||||
document.getElementById("cart-extend-confirmation-dialog").show();
|
||||
}
|
||||
});
|
||||
});
|
||||
$("#cart-extend-confirmation-dialog").on("keydown", function (e) {
|
||||
if(e.key === "Escape") {
|
||||
this.close();
|
||||
}
|
||||
});
|
||||
|
||||
// renew-button in modal dialog is clicked, show modal dialog
|
||||
$("#dialog-cart-extend form").submit(function() {
|
||||
$("#cart-extend-form").submit();
|
||||
$("#cart-extend-form").one("pretix:async-task-success", function(e, data) {
|
||||
if (data.success) {
|
||||
$("#dialog-cart-extended-title").text(data.message);
|
||||
$("#dialog-cart-extended-description").text($("#cart-deadline").text());
|
||||
document.getElementById("dialog-cart-extended").showModal();
|
||||
}
|
||||
}).submit();
|
||||
});
|
||||
|
||||
$(".toggle-container").each(function() {
|
||||
|
||||
@@ -7,4 +7,12 @@ var inIframe = function () {
|
||||
};
|
||||
if (inIframe()) {
|
||||
document.documentElement.classList.add('in-iframe');
|
||||
try {
|
||||
window.parent.postMessage({
|
||||
type: "pretix:widget:title",
|
||||
title: document.title,
|
||||
}, "*");
|
||||
} catch (e) {
|
||||
console.error("Could not post message to parent.", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,7 +252,7 @@ Vue.component('availbox', {
|
||||
variation: Object
|
||||
},
|
||||
mounted: function() {
|
||||
if (this.$root.itemnum === 1 && !this.$root.has_seating_plan ? 1 : 0) {
|
||||
if (this.$root.itemnum === 1 && (!this.$root.categories[0].items[0].has_variations || this.$root.categories[0].items[0].variations.length < 2) && !this.$root.has_seating_plan ? 1 : 0) {
|
||||
this.$refs.quantity.value = 1;
|
||||
if (this.order_max === 1) {
|
||||
this.$refs.quantity.checked = true;
|
||||
@@ -823,7 +823,7 @@ var shared_loading_fragment = (
|
||||
);
|
||||
|
||||
var shared_iframe_fragment = (
|
||||
'<dialog :class="frameClasses" role="alertdialog" aria-label="'+strings.checkout+'" @close="close" @cancel="cancel">'
|
||||
'<dialog :class="frameClasses" aria-label="'+strings.checkout+'" @close="close" @cancel="cancel">'
|
||||
+ '<div class="pretix-widget-frame-loading" v-show="$root.frame_loading">'
|
||||
+ '<svg width="256" height="256" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path class="pretix-widget-primary-color" d="M1152 896q0-106-75-181t-181-75-181 75-75 181 75 181 181 75 181-75 75-181zm512-109v222q0 12-8 23t-20 13l-185 28q-19 54-39 91 35 50 107 138 10 12 10 25t-9 23q-27 37-99 108t-94 71q-12 0-26-9l-138-108q-44 23-91 38-16 136-29 186-7 28-36 28h-222q-14 0-24.5-8.5t-11.5-21.5l-28-184q-49-16-90-37l-141 107q-10 9-25 9-14 0-25-11-126-114-165-168-7-10-7-23 0-12 8-23 15-21 51-66.5t54-70.5q-27-50-41-99l-183-27q-13-2-21-12.5t-8-23.5v-222q0-12 8-23t19-13l186-28q14-46 39-92-40-57-107-138-10-12-10-24 0-10 9-23 26-36 98.5-107.5t94.5-71.5q13 0 26 10l138 107q44-23 91-38 16-136 29-186 7-28 36-28h222q14 0 24.5 8.5t11.5 21.5l28 184q49 16 90 37l142-107q9-9 24-9 13 0 25 10 129 119 165 170 7 8 7 22 0 12-8 23-15 21-51 66.5t-54 70.5q26 50 41 98l183 28q13 2 21 12.5t8 23.5z"/></svg>'
|
||||
+ '<p :class="cancelBlockedClasses"><strong>'+strings.cancel_blocked+'</strong></p>'
|
||||
@@ -903,6 +903,14 @@ Vue.component('pretix-overlay', {
|
||||
}
|
||||
}
|
||||
},
|
||||
'$root.frame_shown': function (newValue) {
|
||||
if (newValue) {
|
||||
var btn = this.$el?.querySelector('.pretix-widget-frame-close button');
|
||||
this.$nextTick(function() {
|
||||
btn.focus();
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
frameClasses: function () {
|
||||
@@ -931,7 +939,18 @@ Vue.component('pretix-overlay', {
|
||||
}
|
||||
},
|
||||
},
|
||||
mounted () {
|
||||
window.addEventListener('message', this.onMessage, false);
|
||||
},
|
||||
unmounted () {
|
||||
window.removeEventListener('message', this.onMessage, false);
|
||||
},
|
||||
methods: {
|
||||
onMessage: function(e) {
|
||||
if (e.data.type && e.data.type == "pretix:widget:title") {
|
||||
this.$el.querySelector("iframe").title = e.data.title;
|
||||
}
|
||||
},
|
||||
lightboxClose: function () {
|
||||
this.$root.lightbox = null;
|
||||
},
|
||||
@@ -1563,14 +1582,14 @@ Vue.component('pretix-widget-event-calendar', {
|
||||
+ '<a class="pretix-widget-event-calendar-previous-month" href="#" @click.prevent.stop="prevmonth">« '
|
||||
+ strings['previous_month']
|
||||
+ '</a> '
|
||||
+ '<strong>{{ monthname }}</strong> '
|
||||
+ '<strong :id="aria_labelledby">{{ monthname }}</strong> '
|
||||
+ '<a class="pretix-widget-event-calendar-next-month" href="#" @click.prevent.stop="nextmonth">'
|
||||
+ strings['next_month']
|
||||
+ ' »</a>'
|
||||
+ '</div>'
|
||||
|
||||
// Calendar
|
||||
+ '<table class="pretix-widget-event-calendar-table" :id="id" tabindex="0" v-bind:aria-label="monthname">'
|
||||
+ '<table class="pretix-widget-event-calendar-table" :id="id" tabindex="0" v-bind:aria-labelledby="aria_labelledby">'
|
||||
+ '<thead>'
|
||||
+ '<tr>'
|
||||
+ '<th aria-label="' + strings['days']['MONDAY'] + '">' + strings['days']['MO'] + '</th>'
|
||||
@@ -1597,6 +1616,9 @@ Vue.component('pretix-widget-event-calendar', {
|
||||
id: function () {
|
||||
return this.$root.html_id + "-event-calendar-table";
|
||||
},
|
||||
aria_labelledby: function () {
|
||||
return this.$root.html_id + "-event-calendar-table-label";
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
back_to_list: function () {
|
||||
@@ -2182,11 +2204,22 @@ var create_overlay = function (app) {
|
||||
// show loading spinner only when previously no frame_src was set
|
||||
if (newValue && !oldValue) {
|
||||
this.frame_loading = true;
|
||||
this.$el?.querySelector('dialog.pretix-widget-frame-holder').showModal();
|
||||
}
|
||||
// to close and unload the iframe, frame_src can be empty -> make it valid HTML with about:blank
|
||||
this.$el.querySelector("iframe").src = newValue || "about:blank";
|
||||
},
|
||||
frame_loading: function (newValue) {
|
||||
var dialog = this.$el?.querySelector('dialog.pretix-widget-frame-holder');
|
||||
if (newValue) {
|
||||
if (!dialog.open) {
|
||||
dialog.showModal();
|
||||
}
|
||||
} else {
|
||||
if (!this.frame_src && dialog.open) {// finished loading, but no iframe to display => close
|
||||
dialog.close();
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
});
|
||||
app.$root.overlay = framechild;
|
||||
|
||||
@@ -113,7 +113,7 @@
|
||||
line-height: normal;
|
||||
border: 1px solid $input-border;
|
||||
border-radius: $input-border-radius;
|
||||
height: $input-height-base;
|
||||
min-height: $input-height-base;
|
||||
padding: $padding-base-vertical $padding-base-horizontal;
|
||||
color: $input-color;
|
||||
background-color: $input-bg;
|
||||
|
||||
@@ -1901,10 +1901,11 @@ TEST_QUOTA_RES = {
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_quota_list(token_client, organizer, event, quota, item, subevent):
|
||||
def test_quota_list(token_client, organizer, event, quota, item, item3, subevent):
|
||||
quota.items.add(item3)
|
||||
res = dict(TEST_QUOTA_RES)
|
||||
res["id"] = quota.pk
|
||||
res["items"] = [item.pk]
|
||||
res["items"] = [item.pk, item3.pk]
|
||||
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/{}/quotas/'.format(organizer.slug, event.slug))
|
||||
assert resp.status_code == 200
|
||||
@@ -1922,6 +1923,13 @@ def test_quota_list(token_client, organizer, event, quota, item, subevent):
|
||||
'/api/v1/organizers/{}/events/{}/quotas/?subevent={}'.format(organizer.slug, event.slug, se2.pk))
|
||||
assert [] == resp.data['results']
|
||||
|
||||
resp = token_client.get(
|
||||
'/api/v1/organizers/{}/events/{}/quotas/?items__in={},{},0'.format(organizer.slug, event.slug, item.pk, item3.pk))
|
||||
assert [res] == resp.data['results']
|
||||
resp = token_client.get(
|
||||
'/api/v1/organizers/{}/events/{}/quotas/?items__in=0'.format(organizer.slug, event.slug))
|
||||
assert [] == resp.data['results']
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_quota_detail(token_client, organizer, event, quota, item):
|
||||
|
||||
@@ -961,6 +961,42 @@ def test_order_create_fee_as_percentage(token_client, organizer, event, item, qu
|
||||
assert o.total == Decimal('25.30')
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_create_fee_as_percentage_with_zero(token_client, organizer, event, item, quota, question):
|
||||
with scopes_disabled():
|
||||
voucher = event.vouchers.create(price_mode="set", value=Decimal("0.00"))
|
||||
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
|
||||
res['fees'][0]['_treat_value_as_percentage'] = True
|
||||
res['fees'][0]['_split_taxes_like_products'] = True
|
||||
res['fees'][0]['value'] = '10.00'
|
||||
res['positions'][0]['item'] = item.pk
|
||||
res['positions'][0]['answers'][0]['question'] = question.pk
|
||||
res['positions'][0]['voucher'] = voucher.code
|
||||
del res['positions'][0]['price']
|
||||
|
||||
res['simulate'] = True
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/orders/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
assert resp.data["total"] == "0.00"
|
||||
|
||||
res['simulate'] = False
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/orders/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
with scopes_disabled():
|
||||
o = Order.objects.get(code=resp.data['code'])
|
||||
fee = o.fees.first()
|
||||
assert fee.value == Decimal('0.00')
|
||||
assert o.total == Decimal('0.00')
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_create_fee_with_auto_tax(token_client, organizer, event, item, quota, question, taxrule):
|
||||
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
|
||||
|
||||
@@ -225,8 +225,11 @@ def test_full_clone_cross_organizer_differences():
|
||||
organizer2 = Organizer.objects.create(name='Dummy2', slug='dummy2')
|
||||
membership_type = organizer.membership_types.create(name="Membership")
|
||||
plan = SeatingPlan.objects.create(name="Plan", organizer=organizer, layout="{}")
|
||||
sc = organizer.sales_channels.get(identifier="web")
|
||||
sc2 = organizer2.sales_channels.get(identifier="web")
|
||||
sc1_a = organizer.sales_channels.get(identifier="web")
|
||||
sc1_b = organizer.sales_channels.create(identifier="b")
|
||||
sc1_c = organizer.sales_channels.create(identifier="c")
|
||||
sc2_a = organizer2.sales_channels.get(identifier="web")
|
||||
sc2_c = organizer2.sales_channels.create(identifier="c")
|
||||
|
||||
event = Event.objects.create(
|
||||
organizer=organizer, name='Dummy', slug='dummy',
|
||||
@@ -237,15 +240,20 @@ def test_full_clone_cross_organizer_differences():
|
||||
seating_plan=plan,
|
||||
all_sales_channels=False,
|
||||
)
|
||||
event.limit_sales_channels.add(sc)
|
||||
event.limit_sales_channels.add(sc1_a)
|
||||
event.limit_sales_channels.add(sc1_b)
|
||||
event.limit_sales_channels.add(sc1_c)
|
||||
|
||||
item1 = event.items.create(name="Ticket", default_price=23,
|
||||
grant_membership_type=membership_type,
|
||||
all_sales_channels=False)
|
||||
item1.limit_sales_channels.add(sc)
|
||||
item1.limit_sales_channels.add(sc1_a)
|
||||
item2 = event.items.create(name="T-shirt", default_price=15)
|
||||
item2.require_membership_types.add(membership_type)
|
||||
|
||||
event.settings.payment_giftcard__enabled = True
|
||||
event.settings.payment_giftcard__restrict_to_sales_channels = ['web', 'b', 'c']
|
||||
|
||||
copied_event = Event.objects.create(
|
||||
organizer=organizer2, name='Dummy2', slug='dummy2',
|
||||
date_from=datetime.datetime(2022, 4, 15, 9, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
@@ -257,11 +265,14 @@ def test_full_clone_cross_organizer_differences():
|
||||
assert organizer2.seating_plans.count() == 1
|
||||
assert organizer2.seating_plans.get().layout == plan.layout
|
||||
assert copied_event.seating_plan.organizer == organizer2
|
||||
assert copied_event.limit_sales_channels.get() == sc2
|
||||
assert set(copied_event.limit_sales_channels.all()) == {sc2_a, sc2_c}
|
||||
assert event.seating_plan.organizer == organizer
|
||||
|
||||
copied_item1 = copied_event.items.get(name=item1.name)
|
||||
copied_item2 = copied_event.items.get(name=item2.name)
|
||||
assert copied_item1.grant_membership_type is None
|
||||
assert copied_item2.require_membership_types.count() == 0
|
||||
assert copied_item1.limit_sales_channels.get() == sc2
|
||||
assert copied_item1.limit_sales_channels.get() == sc2_a
|
||||
|
||||
assert event.settings.get('payment_giftcard__restrict_to_sales_channels', as_type=list) == ['web', 'b', 'c']
|
||||
assert copied_event.settings.get('payment_giftcard__restrict_to_sales_channels', as_type=list) == ['web', 'c']
|
||||
|
||||
Reference in New Issue
Block a user