forked from CGM_Public/pretix_original
Compare commits
53 Commits
pdf-layout
...
raphaelm-p
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a779ba7819 | ||
|
|
ae5111ee7e | ||
|
|
d8bf3065d0 | ||
|
|
54f077665c | ||
|
|
482a66c546 | ||
|
|
e4cef6e46b | ||
|
|
cbee1b71fe | ||
|
|
0cd1290624 | ||
|
|
565f5e2ea7 | ||
|
|
b46c0eba0c | ||
|
|
39c3aef7bc | ||
|
|
cf3087453c | ||
|
|
7a870ee521 | ||
|
|
3922290633 | ||
|
|
8aa13d7e3e | ||
|
|
22e9a6eb92 | ||
|
|
2b6f82502e | ||
|
|
a10bf2a939 | ||
|
|
a80b7087d9 | ||
|
|
4b143e98eb | ||
|
|
bdb8b597d0 | ||
|
|
b1c9f40bc8 | ||
|
|
a3b6a008b5 | ||
|
|
9ce05e5cb9 | ||
|
|
f306527981 | ||
|
|
3e17ff9faa | ||
|
|
2a16cd4655 | ||
|
|
d1078da5bf | ||
|
|
483e7bc4ad | ||
|
|
401218b0a3 | ||
|
|
19175258fd | ||
|
|
22c36b89da | ||
|
|
2697ed0c5d | ||
|
|
f81d820a02 | ||
|
|
f8df66e621 | ||
|
|
2d9bfc80dc | ||
|
|
17b2e95569 | ||
|
|
e49f938eb3 | ||
|
|
8d63906341 | ||
|
|
cfefa1aad0 | ||
|
|
1d16049dc5 | ||
|
|
8452899edd | ||
|
|
d67ebc0f80 | ||
|
|
0e87f03e1e | ||
|
|
868408ea55 | ||
|
|
fc75cd35f8 | ||
|
|
a3e2540331 | ||
|
|
99ce7effde | ||
|
|
0d645fc4c5 | ||
|
|
359df1f51e | ||
|
|
7607cc5d2f | ||
|
|
40c8d014df | ||
|
|
c10efc692d |
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -38,7 +38,7 @@ jobs:
|
|||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pip-
|
${{ runner.os }}-pip-
|
||||||
- name: Install system dependencies
|
- name: Install system dependencies
|
||||||
run: sudo apt update && sudo apt install gettext unzip
|
run: sudo apt update && sudo apt install -y gettext unzip
|
||||||
- name: Install Python dependencies
|
- name: Install Python dependencies
|
||||||
run: pip3 install -U setuptools build pip check-manifest
|
run: pip3 install -U setuptools build pip check-manifest
|
||||||
- name: Run check-manifest
|
- name: Run check-manifest
|
||||||
|
|||||||
2
.github/workflows/docs.yml
vendored
2
.github/workflows/docs.yml
vendored
@@ -37,7 +37,7 @@ jobs:
|
|||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pip-
|
${{ runner.os }}-pip-
|
||||||
- name: Install system packages
|
- name: Install system packages
|
||||||
run: sudo apt update && sudo apt install enchant-2 hunspell aspell-en
|
run: sudo apt update && sudo apt install -y enchant-2 hunspell aspell-en
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: pip3 install -Ur requirements.txt
|
run: pip3 install -Ur requirements.txt
|
||||||
working-directory: ./doc
|
working-directory: ./doc
|
||||||
|
|||||||
6
.github/workflows/strings.yml
vendored
6
.github/workflows/strings.yml
vendored
@@ -35,9 +35,9 @@ jobs:
|
|||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pip-
|
${{ runner.os }}-pip-
|
||||||
- name: Install system packages
|
- name: Install system packages
|
||||||
run: sudo apt update && sudo apt install gettext
|
run: sudo apt update && sudo apt -y install gettext
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: pip3 install -e ".[dev]"
|
run: pip3 install uv && uv pip install --system -e ".[dev]"
|
||||||
- name: Compile messages
|
- name: Compile messages
|
||||||
run: python manage.py compilemessages
|
run: python manage.py compilemessages
|
||||||
working-directory: ./src
|
working-directory: ./src
|
||||||
@@ -62,7 +62,7 @@ jobs:
|
|||||||
- name: Install system packages
|
- name: Install system packages
|
||||||
run: sudo apt update && sudo apt install enchant-2 hunspell hunspell-de-de aspell-en aspell-de
|
run: sudo apt update && sudo apt install enchant-2 hunspell hunspell-de-de aspell-en aspell-de
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: pip3 install -e ".[dev]"
|
run: pip3 install uv && uv pip install --system -e ".[dev]"
|
||||||
- name: Spellcheck translations
|
- name: Spellcheck translations
|
||||||
run: potypo
|
run: potypo
|
||||||
working-directory: ./src
|
working-directory: ./src
|
||||||
|
|||||||
4
.github/workflows/style.yml
vendored
4
.github/workflows/style.yml
vendored
@@ -35,7 +35,7 @@ jobs:
|
|||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pip-
|
${{ runner.os }}-pip-
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: pip3 install -e ".[dev]" psycopg2-binary
|
run: pip3 install uv && uv pip install --system -e ".[dev]" psycopg2-binary
|
||||||
- name: Run isort
|
- name: Run isort
|
||||||
run: isort -c .
|
run: isort -c .
|
||||||
working-directory: ./src
|
working-directory: ./src
|
||||||
@@ -55,7 +55,7 @@ jobs:
|
|||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pip-
|
${{ runner.os }}-pip-
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: pip3 install -e ".[dev]" psycopg2-binary
|
run: pip3 install uv && uv pip install --system -e ".[dev]" psycopg2-binary
|
||||||
- name: Run flake8
|
- name: Run flake8
|
||||||
run: flake8 .
|
run: flake8 .
|
||||||
working-directory: ./src
|
working-directory: ./src
|
||||||
|
|||||||
30
.github/workflows/tests.yml
vendored
30
.github/workflows/tests.yml
vendored
@@ -30,15 +30,21 @@ jobs:
|
|||||||
python-version: "3.9"
|
python-version: "3.9"
|
||||||
- database: sqlite
|
- database: sqlite
|
||||||
python-version: "3.10"
|
python-version: "3.10"
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres:15
|
||||||
|
env:
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
POSTGRES_DB: pretix
|
||||||
|
options: >-
|
||||||
|
--health-cmd pg_isready
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 5
|
||||||
|
ports:
|
||||||
|
- 5432:5432
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: harmon758/postgresql-action@v1
|
|
||||||
with:
|
|
||||||
postgresql version: '15'
|
|
||||||
postgresql db: 'pretix'
|
|
||||||
postgresql user: 'postgres'
|
|
||||||
postgresql password: 'postgres'
|
|
||||||
if: matrix.database == 'postgres'
|
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
@@ -50,9 +56,9 @@ jobs:
|
|||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pip-
|
${{ runner.os }}-pip-
|
||||||
- name: Install system dependencies
|
- name: Install system dependencies
|
||||||
run: sudo apt update && sudo apt install gettext
|
run: sudo apt update && sudo apt install -y gettext
|
||||||
- name: Install Python dependencies
|
- name: Install Python dependencies
|
||||||
run: pip3 install --ignore-requires-python -e ".[dev]" psycopg2-binary # We ignore that flake8 needs newer python as we don't run flake8 during tests
|
run: pip3 install uv && uv pip install --system -e ".[dev]" psycopg2-binary
|
||||||
- name: Run checks
|
- name: Run checks
|
||||||
run: python manage.py check
|
run: python manage.py check
|
||||||
working-directory: ./src
|
working-directory: ./src
|
||||||
@@ -64,15 +70,15 @@ jobs:
|
|||||||
run: make all compress
|
run: make all compress
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
working-directory: ./src
|
working-directory: ./src
|
||||||
run: PRETIX_CONFIG_FILE=tests/travis_${{ matrix.database }}.cfg py.test -n 3 -p no:sugar --cov=./ --cov-report=xml --reruns 3 tests --maxfail=100
|
run: PRETIX_CONFIG_FILE=tests/ci_${{ matrix.database }}.cfg py.test -n 3 -p no:sugar --cov=./ --cov-report=xml --reruns 3 tests --maxfail=100
|
||||||
- name: Run concurrency tests
|
- name: Run concurrency tests
|
||||||
working-directory: ./src
|
working-directory: ./src
|
||||||
run: PRETIX_CONFIG_FILE=tests/travis_${{ matrix.database }}.cfg py.test tests/concurrency_tests/ --reruns 0 --reuse-db
|
run: PRETIX_CONFIG_FILE=tests/ci_${{ matrix.database }}.cfg py.test tests/concurrency_tests/ --reruns 0 --reuse-db
|
||||||
if: matrix.database == 'postgres'
|
if: matrix.database == 'postgres'
|
||||||
- name: Upload coverage
|
- name: Upload coverage
|
||||||
uses: codecov/codecov-action@v1
|
uses: codecov/codecov-action@v1
|
||||||
with:
|
with:
|
||||||
file: src/coverage.xml
|
file: src/coverage.xml
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
fail_ci_if_error: true
|
fail_ci_if_error: false
|
||||||
if: matrix.database == 'postgres' && matrix.python-version == '3.11'
|
if: matrix.database == 'postgres' && matrix.python-version == '3.11'
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ tests:
|
|||||||
- cd src
|
- cd src
|
||||||
- python manage.py check
|
- python manage.py check
|
||||||
- make all compress
|
- make all compress
|
||||||
- PRETIX_CONFIG_FILE=tests/travis_sqlite.cfg py.test --reruns 3 -n 3 tests --maxfail=100
|
- PRETIX_CONFIG_FILE=tests/ci_sqlite.cfg py.test --reruns 3 -n 3 tests --maxfail=100
|
||||||
except:
|
except:
|
||||||
- pypi
|
- pypi
|
||||||
pypi:
|
pypi:
|
||||||
|
|||||||
@@ -23,6 +23,22 @@ position integer An integer, use
|
|||||||
is_addon boolean If ``true``, items within this category are not on sale
|
is_addon boolean If ``true``, items within this category are not on sale
|
||||||
on their own but the category provides a source for
|
on their own but the category provides a source for
|
||||||
defining add-ons for other products.
|
defining add-ons for other products.
|
||||||
|
cross_selling_mode string If ``null``, cross-selling is disabled for this category.
|
||||||
|
If ``"only"``, it is only visible in the cross-selling
|
||||||
|
step.
|
||||||
|
If ``"both"``, it is visible on the normal index page
|
||||||
|
as well.
|
||||||
|
Only available if ``is_addon`` is ``false``.
|
||||||
|
cross_selling_condition string Only relevant if ``cross_selling_mode`` is not ``null``.
|
||||||
|
If ``"always"``, always show in cross-selling step.
|
||||||
|
If ``"products"``, only show if the cart contains one of
|
||||||
|
the products listed in ``cross_selling_match_products``.
|
||||||
|
If ``"discounts"``, only show products that qualify for
|
||||||
|
a discount according to discount rules.
|
||||||
|
cross_selling_match_products list of integer Only relevant if ``cross_selling_condition`` is
|
||||||
|
``"products"``. Internal ID of the items of which at
|
||||||
|
least one needs to be in the cart for this category to
|
||||||
|
be shown.
|
||||||
===================================== ========================== =======================================================
|
===================================== ========================== =======================================================
|
||||||
|
|
||||||
|
|
||||||
@@ -60,7 +76,10 @@ Endpoints
|
|||||||
"internal_name": "",
|
"internal_name": "",
|
||||||
"description": {"en": "Tickets are what you need to get in."},
|
"description": {"en": "Tickets are what you need to get in."},
|
||||||
"position": 1,
|
"position": 1,
|
||||||
"is_addon": false
|
"is_addon": false,
|
||||||
|
"cross_selling_mode": null,
|
||||||
|
"cross_selling_condition": null,
|
||||||
|
"cross_selling_match_products": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -102,7 +121,10 @@ Endpoints
|
|||||||
"internal_name": "",
|
"internal_name": "",
|
||||||
"description": {"en": "Tickets are what you need to get in."},
|
"description": {"en": "Tickets are what you need to get in."},
|
||||||
"position": 1,
|
"position": 1,
|
||||||
"is_addon": false
|
"is_addon": false,
|
||||||
|
"cross_selling_mode": null,
|
||||||
|
"cross_selling_condition": null,
|
||||||
|
"cross_selling_match_products": []
|
||||||
}
|
}
|
||||||
|
|
||||||
:param organizer: The ``slug`` field of the organizer to fetch
|
:param organizer: The ``slug`` field of the organizer to fetch
|
||||||
@@ -130,7 +152,10 @@ Endpoints
|
|||||||
"internal_name": "",
|
"internal_name": "",
|
||||||
"description": {"en": "Tickets are what you need to get in."},
|
"description": {"en": "Tickets are what you need to get in."},
|
||||||
"position": 1,
|
"position": 1,
|
||||||
"is_addon": false
|
"is_addon": false,
|
||||||
|
"cross_selling_mode": null,
|
||||||
|
"cross_selling_condition": null,
|
||||||
|
"cross_selling_match_products": []
|
||||||
}
|
}
|
||||||
|
|
||||||
**Example response**:
|
**Example response**:
|
||||||
@@ -147,7 +172,10 @@ Endpoints
|
|||||||
"internal_name": "",
|
"internal_name": "",
|
||||||
"description": {"en": "Tickets are what you need to get in."},
|
"description": {"en": "Tickets are what you need to get in."},
|
||||||
"position": 1,
|
"position": 1,
|
||||||
"is_addon": false
|
"is_addon": false,
|
||||||
|
"cross_selling_mode": null,
|
||||||
|
"cross_selling_condition": null,
|
||||||
|
"cross_selling_match_products": []
|
||||||
}
|
}
|
||||||
|
|
||||||
:param organizer: The ``slug`` field of the organizer of the event to create a category for
|
:param organizer: The ``slug`` field of the organizer of the event to create a category for
|
||||||
@@ -193,7 +221,10 @@ Endpoints
|
|||||||
"internal_name": "",
|
"internal_name": "",
|
||||||
"description": {"en": "Tickets are what you need to get in."},
|
"description": {"en": "Tickets are what you need to get in."},
|
||||||
"position": 1,
|
"position": 1,
|
||||||
"is_addon": true
|
"is_addon": true,
|
||||||
|
"cross_selling_mode": null,
|
||||||
|
"cross_selling_condition": null,
|
||||||
|
"cross_selling_match_products": []
|
||||||
}
|
}
|
||||||
|
|
||||||
:param organizer: The ``slug`` field of the organizer to modify
|
:param organizer: The ``slug`` field of the organizer to modify
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ Endpoints
|
|||||||
}
|
}
|
||||||
|
|
||||||
:query page: The page number in case of a multi-page result set, default is 1
|
:query page: The page number in case of a multi-page result set, default is 1
|
||||||
|
:query is_public: If set to ``true``/``false``, only subevents with a matching value of ``is_public`` are returned.
|
||||||
:query active: If set to ``true``/``false``, only events with a matching value of ``active`` are returned.
|
:query active: If set to ``true``/``false``, only events with a matching value of ``active`` are returned.
|
||||||
:query is_future: If set to ``true`` (``false``), only events that happen currently or in the future are (not) returned.
|
:query is_future: If set to ``true`` (``false``), only events that happen currently or in the future are (not) returned.
|
||||||
:query is_past: If set to ``true`` (``false``), only events that are over are (not) returned.
|
:query is_past: If set to ``true`` (``false``), only events that are over are (not) returned.
|
||||||
@@ -467,6 +468,7 @@ Endpoints
|
|||||||
}
|
}
|
||||||
|
|
||||||
:query page: The page number in case of a multi-page result set, default is 1
|
:query page: The page number in case of a multi-page result set, default is 1
|
||||||
|
:query is_public: If set to ``true``/``false``, only subevents with a matching value of ``is_public`` are returned.
|
||||||
:query active: If set to ``true``/``false``, only events with a matching value of ``active`` are returned.
|
:query active: If set to ``true``/``false``, only events with a matching value of ``active`` are returned.
|
||||||
:query event__live: If set to ``true``/``false``, only events with a matching value of ``live`` on the parent event are returned.
|
:query event__live: If set to ``true``/``false``, only events with a matching value of ``live`` on the parent event are returned.
|
||||||
:query is_future: If set to ``true`` (``false``), only events that happen currently or in the future are (not) returned.
|
:query is_future: If set to ``true`` (``false``), only events that happen currently or in the future are (not) returned.
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ item_assignments list of objects Products this l
|
|||||||
===================================== ========================== =======================================================
|
===================================== ========================== =======================================================
|
||||||
|
|
||||||
|
|
||||||
Endpoints
|
Layout endpoints
|
||||||
---------
|
----------------
|
||||||
|
|
||||||
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/ticketlayouts/
|
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/ticketlayouts/
|
||||||
|
|
||||||
@@ -268,5 +268,75 @@ Endpoints
|
|||||||
:statuscode 401: Authentication failure
|
:statuscode 401: Authentication failure
|
||||||
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to delete this resource.
|
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to delete this resource.
|
||||||
|
|
||||||
|
Ticket rendering endpoint
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/ticketpdfrenderer/render_batch/
|
||||||
|
|
||||||
|
With this API call, you can instruct the system to render a set of tickets into one combined PDF file. To specify
|
||||||
|
which tickets to render, you need to submit a list of "parts". For every part, the following fields are supported:
|
||||||
|
|
||||||
|
* ``orderposition`` (``integer``, required): The ID of the order position to render.
|
||||||
|
* ``override_channel`` (``string``, optional): The sales channel ID to be used for layout selection instead of the
|
||||||
|
original channel of the order.
|
||||||
|
* ``override_layout`` (``integer``, optional): The ticket layout ID to be used instead of the auto-selected one.
|
||||||
|
|
||||||
|
If your input parameters validate correctly, a ``202 Accepted`` status code is returned.
|
||||||
|
The body points you to the download URL of the result. Running a ``GET`` request on that result URL will
|
||||||
|
yield one of the following status codes:
|
||||||
|
|
||||||
|
* ``200 OK`` – The export succeeded. The body will be your resulting file. Might be large!
|
||||||
|
* ``409 Conflict`` – Your export is still running. The body will be JSON with the structure ``{"status": "running"}``. ``status`` can be ``waiting`` before the task is actually being processed. Please retry, but wait at least one second before you do.
|
||||||
|
* ``410 Gone`` – Running the export has failed permanently. The body will be JSON with the structure ``{"status": "failed", "message": "Error message"}``
|
||||||
|
* ``404 Not Found`` – The export does not exist / is expired.
|
||||||
|
|
||||||
|
.. warning:: This endpoint is considered **experimental**. It might change at any time without prior notice.
|
||||||
|
|
||||||
|
.. note:: To avoid performance issues, a maximum number of 1000 parts is currently allowed.
|
||||||
|
|
||||||
|
**Example request**:
|
||||||
|
|
||||||
|
.. sourcecode:: http
|
||||||
|
|
||||||
|
POST /api/v1/organizers/bigevents/events/sampleconf/ticketpdfrenderer/render_batch/ HTTP/1.1
|
||||||
|
Host: pretix.eu
|
||||||
|
Accept: application/json, text/javascript
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"parts": [
|
||||||
|
{
|
||||||
|
"orderposition": 55412
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"orderposition": 55412,
|
||||||
|
"override_channel": "web"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"orderposition": 55412,
|
||||||
|
"override_layout": 56
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
**Example response**:
|
||||||
|
|
||||||
|
.. sourcecode:: http
|
||||||
|
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Vary: Accept
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"download": "https://pretix.eu/api/v1/organizers/bigevents/events/sampleconf/ticketpdfrenderer/download/29891ede-196f-4942-9e26-d055a36e98b8/3f279f13-c198-4137-b49b-9b360ce9fcce/"
|
||||||
|
}
|
||||||
|
|
||||||
|
:param organizer: The ``slug`` field of the organizer to fetch
|
||||||
|
:param event: The ``slug`` field of the event to fetch
|
||||||
|
:statuscode 202: no error
|
||||||
|
:statuscode 400: Invalid input options
|
||||||
|
:statuscode 401: Authentication failure
|
||||||
|
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
|
||||||
|
|
||||||
|
|
||||||
.. _here: https://github.com/pretix/pretix/blob/master/src/pretix/static/schema/pdf-layout.schema.json
|
.. _here: https://github.com/pretix/pretix/blob/master/src/pretix/static/schema/pdf-layout.schema.json
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ dependencies = [
|
|||||||
"django-scopes==2.0.*",
|
"django-scopes==2.0.*",
|
||||||
"django-statici18n==2.5.*",
|
"django-statici18n==2.5.*",
|
||||||
"djangorestframework==3.15.*",
|
"djangorestframework==3.15.*",
|
||||||
"dnspython==2.6.*",
|
"dnspython==2.7.*",
|
||||||
"drf_ujson2==1.7.*",
|
"drf_ujson2==1.7.*",
|
||||||
"geoip2==4.*",
|
"geoip2==4.*",
|
||||||
"importlib_metadata==8.*", # Polyfill, we can probably drop this once we require Python 3.10+
|
"importlib_metadata==8.*", # Polyfill, we can probably drop this once we require Python 3.10+
|
||||||
@@ -88,10 +88,10 @@ dependencies = [
|
|||||||
"pytz-deprecation-shim==0.1.*",
|
"pytz-deprecation-shim==0.1.*",
|
||||||
"pyuca",
|
"pyuca",
|
||||||
"qrcode==8.0",
|
"qrcode==8.0",
|
||||||
"redis==5.1.*",
|
"redis==5.2.*",
|
||||||
"reportlab==4.2.*",
|
"reportlab==4.2.*",
|
||||||
"requests==2.31.*",
|
"requests==2.31.*",
|
||||||
"sentry-sdk==2.15.*",
|
"sentry-sdk==2.17.*",
|
||||||
"sepaxml==2.6.*",
|
"sepaxml==2.6.*",
|
||||||
"slimit",
|
"slimit",
|
||||||
"stripe==7.9.*",
|
"stripe==7.9.*",
|
||||||
@@ -102,7 +102,7 @@ dependencies = [
|
|||||||
"vat_moss_forked==2020.3.20.0.11.0",
|
"vat_moss_forked==2020.3.20.0.11.0",
|
||||||
"vobject==0.9.*",
|
"vobject==0.9.*",
|
||||||
"webauthn==2.2.*",
|
"webauthn==2.2.*",
|
||||||
"zeep==4.2.*"
|
"zeep==4.3.*"
|
||||||
]
|
]
|
||||||
|
|
||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
@@ -111,7 +111,7 @@ dev = [
|
|||||||
"aiohttp==3.10.*",
|
"aiohttp==3.10.*",
|
||||||
"coverage",
|
"coverage",
|
||||||
"coveralls",
|
"coveralls",
|
||||||
"fakeredis==2.24.*",
|
"fakeredis==2.26.*",
|
||||||
"flake8==7.1.*",
|
"flake8==7.1.*",
|
||||||
"freezegun",
|
"freezegun",
|
||||||
"isort==5.13.*",
|
"isort==5.13.*",
|
||||||
|
|||||||
@@ -110,6 +110,10 @@ class SalesChannelMigrationMixin:
|
|||||||
data["all_sales_channels"] = False
|
data["all_sales_channels"] = False
|
||||||
data["limit_sales_channels"] = data["sales_channels"]
|
data["limit_sales_channels"] = data["sales_channels"]
|
||||||
del data["sales_channels"]
|
del data["sales_channels"]
|
||||||
|
|
||||||
|
if data.get("all_sales_channels"):
|
||||||
|
data["limit_sales_channels"] = []
|
||||||
|
|
||||||
return super().to_internal_value(data)
|
return super().to_internal_value(data)
|
||||||
|
|
||||||
def to_representation(self, value):
|
def to_representation(self, value):
|
||||||
|
|||||||
@@ -772,6 +772,7 @@ class EventSettingsSerializer(SettingsSerializer):
|
|||||||
'invoice_address_company_required',
|
'invoice_address_company_required',
|
||||||
'invoice_address_beneficiary',
|
'invoice_address_beneficiary',
|
||||||
'invoice_address_custom_field',
|
'invoice_address_custom_field',
|
||||||
|
'invoice_address_custom_field_helptext',
|
||||||
'invoice_name_required',
|
'invoice_name_required',
|
||||||
'invoice_address_not_asked_free',
|
'invoice_address_not_asked_free',
|
||||||
'invoice_show_payments',
|
'invoice_show_payments',
|
||||||
@@ -916,6 +917,7 @@ class DeviceEventSettingsSerializer(EventSettingsSerializer):
|
|||||||
'invoice_address_company_required',
|
'invoice_address_company_required',
|
||||||
'invoice_address_beneficiary',
|
'invoice_address_beneficiary',
|
||||||
'invoice_address_custom_field',
|
'invoice_address_custom_field',
|
||||||
|
'invoice_address_custom_field_helptext',
|
||||||
'invoice_name_required',
|
'invoice_name_required',
|
||||||
'invoice_address_not_asked_free',
|
'invoice_address_not_asked_free',
|
||||||
'invoice_address_from_name',
|
'invoice_address_from_name',
|
||||||
|
|||||||
@@ -369,7 +369,7 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
|
|||||||
require_membership_types = validated_data.pop('require_membership_types', [])
|
require_membership_types = validated_data.pop('require_membership_types', [])
|
||||||
limit_sales_channels = validated_data.pop('limit_sales_channels', [])
|
limit_sales_channels = validated_data.pop('limit_sales_channels', [])
|
||||||
item = Item.objects.create(**validated_data)
|
item = Item.objects.create(**validated_data)
|
||||||
if limit_sales_channels:
|
if limit_sales_channels and not validated_data.get('all_sales_channels'):
|
||||||
item.limit_sales_channels.add(*limit_sales_channels)
|
item.limit_sales_channels.add(*limit_sales_channels)
|
||||||
if picture:
|
if picture:
|
||||||
item.picture.save(os.path.basename(picture.name), picture)
|
item.picture.save(os.path.basename(picture.name), picture)
|
||||||
@@ -441,7 +441,22 @@ class ItemCategorySerializer(I18nAwareModelSerializer):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ItemCategory
|
model = ItemCategory
|
||||||
fields = ('id', 'name', 'internal_name', 'description', 'position', 'is_addon')
|
fields = (
|
||||||
|
'id', 'name', 'internal_name', 'description', 'position',
|
||||||
|
'is_addon', 'cross_selling_mode',
|
||||||
|
'cross_selling_condition', 'cross_selling_match_products'
|
||||||
|
)
|
||||||
|
|
||||||
|
def validate(self, data):
|
||||||
|
data = super().validate(data)
|
||||||
|
|
||||||
|
full_data = self.to_internal_value(self.to_representation(self.instance)) if self.instance else {}
|
||||||
|
full_data.update(data)
|
||||||
|
|
||||||
|
if full_data.get('is_addon') and full_data.get('cross_selling_mode'):
|
||||||
|
raise ValidationError('is_addon and cross_selling_mode are mutually exclusive')
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
class QuestionOptionSerializer(I18nAwareModelSerializer):
|
class QuestionOptionSerializer(I18nAwareModelSerializer):
|
||||||
|
|||||||
@@ -297,7 +297,8 @@ class EventViewSet(viewsets.ModelViewSet):
|
|||||||
|
|
||||||
if 'all_sales_channels' in serializer.validated_data and 'sales_channels' in serializer.validated_data:
|
if 'all_sales_channels' in serializer.validated_data and 'sales_channels' in serializer.validated_data:
|
||||||
new_event.all_sales_channels = serializer.validated_data['all_sales_channels']
|
new_event.all_sales_channels = serializer.validated_data['all_sales_channels']
|
||||||
new_event.limit_sales_channels.set(serializer.validated_data['limit_sales_channels'])
|
if not new_event.all_sales_channels:
|
||||||
|
new_event.limit_sales_channels.set(serializer.validated_data['limit_sales_channels'])
|
||||||
else:
|
else:
|
||||||
serializer.instance.set_defaults()
|
serializer.instance.set_defaults()
|
||||||
|
|
||||||
@@ -370,7 +371,7 @@ with scopes_disabled():
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = SubEvent
|
model = SubEvent
|
||||||
fields = ['active', 'event__live']
|
fields = ['is_public', 'active', 'event__live']
|
||||||
|
|
||||||
def ends_after_qs(self, queryset, name, value):
|
def ends_after_qs(self, queryset, name, value):
|
||||||
expr = Q(
|
expr = Q(
|
||||||
|
|||||||
@@ -1122,6 +1122,7 @@ class BaseInvoiceAddressForm(forms.ModelForm):
|
|||||||
|
|
||||||
if event.settings.invoice_address_custom_field:
|
if event.settings.invoice_address_custom_field:
|
||||||
self.fields['custom_field'].label = event.settings.invoice_address_custom_field
|
self.fields['custom_field'].label = event.settings.invoice_address_custom_field
|
||||||
|
self.fields['custom_field'].help_text = event.settings.invoice_address_custom_field_helptext
|
||||||
else:
|
else:
|
||||||
del self.fields['custom_field']
|
del self.fields['custom_field']
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import time
|
|||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.core.cache import cache
|
||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
from django.dispatch.dispatcher import NO_RECEIVERS
|
from django.dispatch.dispatcher import NO_RECEIVERS
|
||||||
|
|
||||||
@@ -57,6 +58,8 @@ class Command(BaseCommand):
|
|||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
verbosity = int(options['verbosity'])
|
verbosity = int(options['verbosity'])
|
||||||
|
|
||||||
|
cache.set("pretix_runperiodic_executed", True, 3600 * 12)
|
||||||
|
|
||||||
if not periodic_task.receivers or periodic_task.sender_receivers_cache.get(self) is NO_RECEIVERS:
|
if not periodic_task.receivers or periodic_task.sender_receivers_cache.get(self) is NO_RECEIVERS:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# Generated by Django 4.2.11 on 2024-05-27 13:19
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
import pretix.base.models.orders
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("pretixbase", "0270_historicpassword"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="itemcategory",
|
||||||
|
name="cross_selling_condition",
|
||||||
|
field=models.CharField(null=True, max_length=10),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="itemcategory",
|
||||||
|
name="cross_selling_mode",
|
||||||
|
field=models.CharField(null=True, max_length=5),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="itemcategory",
|
||||||
|
name="cross_selling_match_products",
|
||||||
|
field=models.ManyToManyField(
|
||||||
|
related_name="matched_by_cross_selling_categories", to="pretixbase.item"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -20,11 +20,11 @@
|
|||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
from collections import defaultdict
|
from collections import defaultdict, namedtuple
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from itertools import groupby
|
from itertools import groupby
|
||||||
from math import ceil
|
from math import ceil, inf
|
||||||
from typing import Dict, Optional, Tuple
|
from typing import Dict
|
||||||
|
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.core.validators import MinValueValidator
|
from django.core.validators import MinValueValidator
|
||||||
@@ -36,6 +36,8 @@ from django_scopes import ScopedManager
|
|||||||
from pretix.base.decimal import round_decimal
|
from pretix.base.decimal import round_decimal
|
||||||
from pretix.base.models.base import LoggedModel
|
from pretix.base.models.base import LoggedModel
|
||||||
|
|
||||||
|
PositionInfo = namedtuple('PositionInfo', ['item_id', 'subevent_id', 'line_price_gross', 'is_addon_to', 'voucher_discount'])
|
||||||
|
|
||||||
|
|
||||||
class Discount(LoggedModel):
|
class Discount(LoggedModel):
|
||||||
SUBEVENT_MODE_MIXED = 'mixed'
|
SUBEVENT_MODE_MIXED = 'mixed'
|
||||||
@@ -245,22 +247,26 @@ class Discount(LoggedModel):
|
|||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _apply_min_value(self, positions, condition_idx_group, benefit_idx_group, result):
|
def _apply_min_value(self, positions, condition_idx_group, benefit_idx_group, result, collect_potential_discounts, subevent_id):
|
||||||
if self.condition_min_value and sum(positions[idx][2] for idx in condition_idx_group) < self.condition_min_value:
|
if self.condition_min_value and sum(positions[idx].line_price_gross for idx in condition_idx_group) < self.condition_min_value:
|
||||||
return
|
return
|
||||||
|
|
||||||
if self.condition_min_count or self.benefit_only_apply_to_cheapest_n_matches:
|
if self.condition_min_count or self.benefit_only_apply_to_cheapest_n_matches:
|
||||||
raise ValueError('Validation invariant violated.')
|
raise ValueError('Validation invariant violated.')
|
||||||
|
|
||||||
for idx in benefit_idx_group:
|
for idx in benefit_idx_group:
|
||||||
previous_price = positions[idx][2]
|
previous_price = positions[idx].line_price_gross
|
||||||
new_price = round_decimal(
|
new_price = round_decimal(
|
||||||
previous_price * (Decimal('100.00') - self.benefit_discount_matching_percent) / Decimal('100.00'),
|
previous_price * (Decimal('100.00') - self.benefit_discount_matching_percent) / Decimal('100.00'),
|
||||||
self.event.currency,
|
self.event.currency,
|
||||||
)
|
)
|
||||||
result[idx] = new_price
|
result[idx] = new_price
|
||||||
|
|
||||||
def _apply_min_count(self, positions, condition_idx_group, benefit_idx_group, result):
|
if collect_potential_discounts is not None:
|
||||||
|
for idx in condition_idx_group:
|
||||||
|
collect_potential_discounts[idx] = [(self, inf, -1, subevent_id)]
|
||||||
|
|
||||||
|
def _apply_min_count(self, positions, condition_idx_group, benefit_idx_group, result, collect_potential_discounts, subevent_id):
|
||||||
if len(condition_idx_group) < self.condition_min_count:
|
if len(condition_idx_group) < self.condition_min_count:
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -268,23 +274,53 @@ class Discount(LoggedModel):
|
|||||||
raise ValueError('Validation invariant violated.')
|
raise ValueError('Validation invariant violated.')
|
||||||
|
|
||||||
if self.benefit_only_apply_to_cheapest_n_matches:
|
if self.benefit_only_apply_to_cheapest_n_matches:
|
||||||
if not self.condition_min_count:
|
# sort by line_price
|
||||||
raise ValueError('Validation invariant violated.')
|
condition_idx_group = sorted(condition_idx_group, key=lambda idx: (positions[idx].line_price_gross, -idx))
|
||||||
|
benefit_idx_group = sorted(benefit_idx_group, key=lambda idx: (positions[idx].line_price_gross, -idx))
|
||||||
condition_idx_group = sorted(condition_idx_group, key=lambda idx: (positions[idx][2], -idx)) # sort by line_price
|
|
||||||
benefit_idx_group = sorted(benefit_idx_group, key=lambda idx: (positions[idx][2], -idx)) # sort by line_price
|
|
||||||
|
|
||||||
# Prevent over-consuming of items, i.e. if our discount is "buy 2, get 1 free", we only
|
# Prevent over-consuming of items, i.e. if our discount is "buy 2, get 1 free", we only
|
||||||
# want to match multiples of 3
|
# want to match multiples of 3
|
||||||
n_groups = min(len(condition_idx_group) // self.condition_min_count, ceil(len(benefit_idx_group) / self.benefit_only_apply_to_cheapest_n_matches))
|
|
||||||
|
# how many discount applications are allowed according to condition products in cart
|
||||||
|
possible_applications_cond = len(condition_idx_group) // self.condition_min_count
|
||||||
|
|
||||||
|
# how many discount applications are possible according to benefitting products in cart
|
||||||
|
possible_applications_benefit = ceil(len(benefit_idx_group) / self.benefit_only_apply_to_cheapest_n_matches)
|
||||||
|
|
||||||
|
n_groups = min(possible_applications_cond, possible_applications_benefit)
|
||||||
consume_idx = condition_idx_group[:n_groups * self.condition_min_count]
|
consume_idx = condition_idx_group[:n_groups * self.condition_min_count]
|
||||||
benefit_idx = benefit_idx_group[:n_groups * self.benefit_only_apply_to_cheapest_n_matches]
|
benefit_idx = benefit_idx_group[:n_groups * self.benefit_only_apply_to_cheapest_n_matches]
|
||||||
|
|
||||||
|
if collect_potential_discounts is not None:
|
||||||
|
if n_groups * self.benefit_only_apply_to_cheapest_n_matches > len(benefit_idx_group):
|
||||||
|
# partially used discount ("for each 1 ticket you buy, get 50% on 2 t-shirts", cart content: 1 ticket
|
||||||
|
# but only 1 t-shirt) -> 1 shirt definitiv potential discount
|
||||||
|
for idx in consume_idx:
|
||||||
|
collect_potential_discounts[idx] = [
|
||||||
|
(self, n_groups * self.benefit_only_apply_to_cheapest_n_matches - len(benefit_idx_group), -1, subevent_id)
|
||||||
|
]
|
||||||
|
|
||||||
|
if possible_applications_cond * self.benefit_only_apply_to_cheapest_n_matches > len(benefit_idx_group):
|
||||||
|
# unused discount ("for each 1 ticket you buy, get 50% on 2 t-shirts", cart content: 1 ticket
|
||||||
|
# but 0 t-shirts) -> 2 shirt maybe potential discount (if the 1 ticket is not consumed by a later discount)
|
||||||
|
for i, idx in enumerate(condition_idx_group[
|
||||||
|
n_groups * self.condition_min_count:
|
||||||
|
possible_applications_cond * self.condition_min_count
|
||||||
|
]):
|
||||||
|
collect_potential_discounts[idx] += [
|
||||||
|
(self, self.benefit_only_apply_to_cheapest_n_matches, i // self.condition_min_count, subevent_id)
|
||||||
|
]
|
||||||
|
|
||||||
else:
|
else:
|
||||||
consume_idx = condition_idx_group
|
consume_idx = condition_idx_group
|
||||||
benefit_idx = benefit_idx_group
|
benefit_idx = benefit_idx_group
|
||||||
|
|
||||||
|
if collect_potential_discounts is not None:
|
||||||
|
for idx in consume_idx:
|
||||||
|
collect_potential_discounts[idx] = [(self, inf, -1, subevent_id)]
|
||||||
|
|
||||||
for idx in benefit_idx:
|
for idx in benefit_idx:
|
||||||
previous_price = positions[idx][2]
|
previous_price = positions[idx].line_price_gross
|
||||||
new_price = round_decimal(
|
new_price = round_decimal(
|
||||||
previous_price * (Decimal('100.00') - self.benefit_discount_matching_percent) / Decimal('100.00'),
|
previous_price * (Decimal('100.00') - self.benefit_discount_matching_percent) / Decimal('100.00'),
|
||||||
self.event.currency,
|
self.event.currency,
|
||||||
@@ -292,15 +328,16 @@ class Discount(LoggedModel):
|
|||||||
result[idx] = new_price
|
result[idx] = new_price
|
||||||
|
|
||||||
for idx in consume_idx:
|
for idx in consume_idx:
|
||||||
result.setdefault(idx, positions[idx][2])
|
result.setdefault(idx, positions[idx].line_price_gross)
|
||||||
|
|
||||||
def apply(self, positions: Dict[int, Tuple[int, Optional[int], Decimal, bool, Decimal]]) -> Dict[int, Decimal]:
|
def apply(self, positions: Dict[int, PositionInfo],
|
||||||
|
collect_potential_discounts=None) -> Dict[int, Decimal]:
|
||||||
"""
|
"""
|
||||||
Tries to apply this discount to a cart
|
Tries to apply this discount to a cart
|
||||||
|
|
||||||
:param positions: Dictionary mapping IDs to tuples of the form
|
:param positions: Dictionary mapping IDs to PositionInfo tuples.
|
||||||
``(item_id, subevent_id, line_price_gross, is_addon_to, voucher_discount)``.
|
|
||||||
Bundled positions may not be included.
|
Bundled positions may not be included.
|
||||||
|
:param collect_potential_discounts: For detailed description, see pretix.base.services.pricing.apply_discounts
|
||||||
|
|
||||||
:return: A dictionary mapping keys from the input dictionary to new prices. All positions
|
:return: A dictionary mapping keys from the input dictionary to new prices. All positions
|
||||||
contained in this dictionary are considered "consumed" and should not be considered
|
contained in this dictionary are considered "consumed" and should not be considered
|
||||||
@@ -342,13 +379,13 @@ class Discount(LoggedModel):
|
|||||||
|
|
||||||
if self.subevent_mode == self.SUBEVENT_MODE_MIXED: # also applies to non-series events
|
if self.subevent_mode == self.SUBEVENT_MODE_MIXED: # also applies to non-series events
|
||||||
if self.condition_min_count:
|
if self.condition_min_count:
|
||||||
self._apply_min_count(positions, condition_candidates, benefit_candidates, result)
|
self._apply_min_count(positions, condition_candidates, benefit_candidates, result, collect_potential_discounts, None)
|
||||||
else:
|
else:
|
||||||
self._apply_min_value(positions, condition_candidates, benefit_candidates, result)
|
self._apply_min_value(positions, condition_candidates, benefit_candidates, result, collect_potential_discounts, None)
|
||||||
|
|
||||||
elif self.subevent_mode == self.SUBEVENT_MODE_SAME:
|
elif self.subevent_mode == self.SUBEVENT_MODE_SAME:
|
||||||
def key(idx):
|
def key(idx):
|
||||||
return positions[idx][1] or 0 # subevent_id
|
return positions[idx].subevent_id or 0
|
||||||
|
|
||||||
# Build groups of candidates with the same subevent, then apply our regular algorithm
|
# Build groups of candidates with the same subevent, then apply our regular algorithm
|
||||||
# to each group
|
# to each group
|
||||||
@@ -357,11 +394,11 @@ class Discount(LoggedModel):
|
|||||||
candidate_groups = [(k, list(g)) for k, g in _groups]
|
candidate_groups = [(k, list(g)) for k, g in _groups]
|
||||||
|
|
||||||
for subevent_id, g in candidate_groups:
|
for subevent_id, g in candidate_groups:
|
||||||
benefit_g = [idx for idx in benefit_candidates if positions[idx][1] == subevent_id]
|
benefit_g = [idx for idx in benefit_candidates if positions[idx].subevent_id == subevent_id]
|
||||||
if self.condition_min_count:
|
if self.condition_min_count:
|
||||||
self._apply_min_count(positions, g, benefit_g, result)
|
self._apply_min_count(positions, g, benefit_g, result, collect_potential_discounts, subevent_id)
|
||||||
else:
|
else:
|
||||||
self._apply_min_value(positions, g, benefit_g, result)
|
self._apply_min_value(positions, g, benefit_g, result, collect_potential_discounts, subevent_id)
|
||||||
|
|
||||||
elif self.subevent_mode == self.SUBEVENT_MODE_DISTINCT:
|
elif self.subevent_mode == self.SUBEVENT_MODE_DISTINCT:
|
||||||
if self.condition_min_value or not self.benefit_same_products:
|
if self.condition_min_value or not self.benefit_same_products:
|
||||||
@@ -377,9 +414,9 @@ class Discount(LoggedModel):
|
|||||||
# Build a list of subevent IDs in descending order of frequency
|
# Build a list of subevent IDs in descending order of frequency
|
||||||
subevent_to_idx = defaultdict(list)
|
subevent_to_idx = defaultdict(list)
|
||||||
for idx, p in positions.items():
|
for idx, p in positions.items():
|
||||||
subevent_to_idx[p[1]].append(idx)
|
subevent_to_idx[p.subevent_id].append(idx)
|
||||||
for v in subevent_to_idx.values():
|
for v in subevent_to_idx.values():
|
||||||
v.sort(key=lambda idx: positions[idx][2])
|
v.sort(key=lambda idx: positions[idx].line_price_gross)
|
||||||
subevent_order = sorted(list(subevent_to_idx.keys()), key=lambda s: len(subevent_to_idx[s]), reverse=True)
|
subevent_order = sorted(list(subevent_to_idx.keys()), key=lambda s: len(subevent_to_idx[s]), reverse=True)
|
||||||
|
|
||||||
# Build groups of exactly condition_min_count distinct subevents
|
# Build groups of exactly condition_min_count distinct subevents
|
||||||
@@ -394,7 +431,7 @@ class Discount(LoggedModel):
|
|||||||
l = [ll for ll in l if ll in condition_candidates and ll not in current_group]
|
l = [ll for ll in l if ll in condition_candidates and ll not in current_group]
|
||||||
if cardinality and len(l) != cardinality:
|
if cardinality and len(l) != cardinality:
|
||||||
continue
|
continue
|
||||||
if se not in {positions[idx][1] for idx in current_group}:
|
if se not in {positions[idx].subevent_id for idx in current_group}:
|
||||||
candidates += l
|
candidates += l
|
||||||
cardinality = len(l)
|
cardinality = len(l)
|
||||||
|
|
||||||
@@ -403,7 +440,7 @@ class Discount(LoggedModel):
|
|||||||
|
|
||||||
# Sort the list by prices, then pick one. For "buy 2 get 1 free" we apply a "pick 1 from the start
|
# Sort the list by prices, then pick one. For "buy 2 get 1 free" we apply a "pick 1 from the start
|
||||||
# and 2 from the end" scheme to optimize price distribution among groups
|
# and 2 from the end" scheme to optimize price distribution among groups
|
||||||
candidates = sorted(candidates, key=lambda idx: positions[idx][2])
|
candidates = sorted(candidates, key=lambda idx: positions[idx].line_price_gross)
|
||||||
if len(current_group) < (self.benefit_only_apply_to_cheapest_n_matches or 0):
|
if len(current_group) < (self.benefit_only_apply_to_cheapest_n_matches or 0):
|
||||||
candidate = candidates[0]
|
candidate = candidates[0]
|
||||||
else:
|
else:
|
||||||
@@ -415,14 +452,14 @@ class Discount(LoggedModel):
|
|||||||
if len(current_group) >= max(self.condition_min_count, 1):
|
if len(current_group) >= max(self.condition_min_count, 1):
|
||||||
candidate_groups.append(current_group)
|
candidate_groups.append(current_group)
|
||||||
for c in current_group:
|
for c in current_group:
|
||||||
subevent_to_idx[positions[c][1]].remove(c)
|
subevent_to_idx[positions[c].subevent_id].remove(c)
|
||||||
current_group = []
|
current_group = []
|
||||||
|
|
||||||
# Distribute "leftovers"
|
# Distribute "leftovers"
|
||||||
for se in subevent_order:
|
for se in subevent_order:
|
||||||
if subevent_to_idx[se]:
|
if subevent_to_idx[se]:
|
||||||
for group in candidate_groups:
|
for group in candidate_groups:
|
||||||
if se not in {positions[idx][1] for idx in group}:
|
if se not in {positions[idx].subevent_id for idx in group}:
|
||||||
group.append(subevent_to_idx[se].pop())
|
group.append(subevent_to_idx[se].pop())
|
||||||
if not subevent_to_idx[se]:
|
if not subevent_to_idx[se]:
|
||||||
break
|
break
|
||||||
@@ -432,6 +469,8 @@ class Discount(LoggedModel):
|
|||||||
positions,
|
positions,
|
||||||
[idx for idx in g if idx in condition_candidates],
|
[idx for idx in g if idx in condition_candidates],
|
||||||
[idx for idx in g if idx in benefit_candidates],
|
[idx for idx in g if idx in benefit_candidates],
|
||||||
result
|
result,
|
||||||
|
None,
|
||||||
|
None
|
||||||
)
|
)
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -870,10 +870,12 @@ class Event(EventMixin, LoggedModel):
|
|||||||
for i in Item.objects.filter(event=other).prefetch_related(
|
for i in Item.objects.filter(event=other).prefetch_related(
|
||||||
'variations', 'limit_sales_channels', 'require_membership_types',
|
'variations', 'limit_sales_channels', 'require_membership_types',
|
||||||
'variations__limit_sales_channels', 'variations__require_membership_types',
|
'variations__limit_sales_channels', 'variations__require_membership_types',
|
||||||
|
'matched_by_cross_selling_categories',
|
||||||
):
|
):
|
||||||
vars = list(i.variations.all())
|
vars = list(i.variations.all())
|
||||||
require_membership_types = list(i.require_membership_types.all())
|
require_membership_types = list(i.require_membership_types.all())
|
||||||
limit_sales_channels = list(i.limit_sales_channels.all())
|
limit_sales_channels = list(i.limit_sales_channels.all())
|
||||||
|
matched_by_cross_selling_categories = list(i.matched_by_cross_selling_categories.all())
|
||||||
item_map[i.pk] = i
|
item_map[i.pk] = i
|
||||||
i.pk = None
|
i.pk = None
|
||||||
i.event = self
|
i.event = self
|
||||||
@@ -911,6 +913,9 @@ class Event(EventMixin, LoggedModel):
|
|||||||
if not v.all_sales_channels:
|
if not v.all_sales_channels:
|
||||||
v.limit_sales_channels.set(self.organizer.sales_channels.filter(identifier__in=[s.identifier for s in limit_sales_channels]))
|
v.limit_sales_channels.set(self.organizer.sales_channels.filter(identifier__in=[s.identifier for s in limit_sales_channels]))
|
||||||
|
|
||||||
|
if matched_by_cross_selling_categories:
|
||||||
|
i.matched_by_cross_selling_categories.set([category_map[c.pk] for c in matched_by_cross_selling_categories])
|
||||||
|
|
||||||
for i in self.items.filter(hidden_if_item_available__isnull=False):
|
for i in self.items.filter(hidden_if_item_available__isnull=False):
|
||||||
i.hidden_if_item_available = item_map[i.hidden_if_item_available_id]
|
i.hidden_if_item_available = item_map[i.hidden_if_item_available_id]
|
||||||
i.save()
|
i.save()
|
||||||
|
|||||||
@@ -63,14 +63,13 @@ from django_countries.fields import Country
|
|||||||
from django_scopes import ScopedManager
|
from django_scopes import ScopedManager
|
||||||
from i18nfield.fields import I18nCharField, I18nTextField
|
from i18nfield.fields import I18nCharField, I18nTextField
|
||||||
|
|
||||||
|
from pretix.base.media import MEDIA_TYPES
|
||||||
|
from pretix.base.models import Event, SubEvent
|
||||||
from pretix.base.models.base import LoggedModel
|
from pretix.base.models.base import LoggedModel
|
||||||
from pretix.base.models.fields import MultiStringField
|
from pretix.base.models.fields import MultiStringField
|
||||||
from pretix.base.models.tax import TaxedPrice
|
from pretix.base.models.tax import TaxedPrice
|
||||||
from pretix.base.timemachine import time_machine_now
|
from pretix.base.timemachine import time_machine_now
|
||||||
|
from pretix.helpers.images import ImageSizeValidator
|
||||||
from ...helpers.images import ImageSizeValidator
|
|
||||||
from ..media import MEDIA_TYPES
|
|
||||||
from .event import Event, SubEvent
|
|
||||||
|
|
||||||
|
|
||||||
class ItemCategory(LoggedModel):
|
class ItemCategory(LoggedModel):
|
||||||
@@ -111,6 +110,33 @@ class ItemCategory(LoggedModel):
|
|||||||
'only be bought in combination with a product that has this category configured as a possible '
|
'only be bought in combination with a product that has this category configured as a possible '
|
||||||
'source for add-ons.')
|
'source for add-ons.')
|
||||||
)
|
)
|
||||||
|
CROSS_SELLING_MODES = (
|
||||||
|
(None, _('Normal category')),
|
||||||
|
('both', _('Normal + cross-selling category')),
|
||||||
|
('only', _('Cross-selling category')),
|
||||||
|
)
|
||||||
|
cross_selling_mode = models.CharField(
|
||||||
|
choices=CROSS_SELLING_MODES,
|
||||||
|
null=True,
|
||||||
|
max_length=5
|
||||||
|
)
|
||||||
|
CROSS_SELLING_CONDITION = (
|
||||||
|
('always', _('Always show in cross-selling step')),
|
||||||
|
('discounts', _('Only show products that qualify for a discount according to discount rules')),
|
||||||
|
('products', _('Only show if the cart contains one of the following products')),
|
||||||
|
)
|
||||||
|
cross_selling_condition = models.CharField(
|
||||||
|
verbose_name=_("Cross-selling condition"),
|
||||||
|
choices=CROSS_SELLING_CONDITION,
|
||||||
|
null=True,
|
||||||
|
max_length=10,
|
||||||
|
)
|
||||||
|
cross_selling_match_products = models.ManyToManyField(
|
||||||
|
'pretixbase.Item',
|
||||||
|
blank=True,
|
||||||
|
verbose_name=_("Cross-selling condition products"),
|
||||||
|
related_name="matched_by_cross_selling_categories",
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _("Product category")
|
verbose_name = _("Product category")
|
||||||
@@ -119,19 +145,31 @@ class ItemCategory(LoggedModel):
|
|||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
name = self.internal_name or self.name
|
name = self.internal_name or self.name
|
||||||
if self.is_addon:
|
if self.category_type != 'normal':
|
||||||
return _('{category} (Add-On products)').format(category=str(name))
|
return _('{category} ({category_type})').format(category=str(name),
|
||||||
|
category_type=self.get_category_type_display())
|
||||||
return str(name)
|
return str(name)
|
||||||
|
|
||||||
def get_category_type_display(self):
|
def get_category_type_display(self):
|
||||||
if self.is_addon:
|
if self.is_addon:
|
||||||
return _('Add-On products')
|
return _('Add-on category')
|
||||||
|
elif self.cross_selling_mode:
|
||||||
|
return self.get_cross_selling_mode_display()
|
||||||
else:
|
else:
|
||||||
return None
|
return _('Normal category')
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def category_type(self):
|
def category_type(self):
|
||||||
return 'addon' if self.is_addon else 'normal'
|
return 'addon' if self.is_addon else self.cross_selling_mode or 'normal'
|
||||||
|
|
||||||
|
@category_type.setter
|
||||||
|
def category_type(self, new_value):
|
||||||
|
if new_value == 'addon':
|
||||||
|
self.is_addon = True
|
||||||
|
self.cross_selling_mode = None
|
||||||
|
else:
|
||||||
|
self.is_addon = False
|
||||||
|
self.cross_selling_mode = None if new_value == 'normal' else new_value
|
||||||
|
|
||||||
def delete(self, *args, **kwargs):
|
def delete(self, *args, **kwargs):
|
||||||
super().delete(*args, **kwargs)
|
super().delete(*args, **kwargs)
|
||||||
@@ -270,7 +308,7 @@ class SubEventItemVariation(models.Model):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def filter_available(qs, channel='web', voucher=None, allow_addons=False):
|
def filter_available(qs, channel='web', voucher=None, allow_addons=False, allow_cross_sell=False):
|
||||||
# Channel can currently be a SalesChannel or a str, since we need that compatibility, but a SalesChannel
|
# Channel can currently be a SalesChannel or a str, since we need that compatibility, but a SalesChannel
|
||||||
# makes the query SIGNIFICANTLY faster
|
# makes the query SIGNIFICANTLY faster
|
||||||
from .organizer import SalesChannel
|
from .organizer import SalesChannel
|
||||||
@@ -291,6 +329,8 @@ def filter_available(qs, channel='web', voucher=None, allow_addons=False):
|
|||||||
|
|
||||||
if not allow_addons:
|
if not allow_addons:
|
||||||
q &= Q(Q(category__isnull=True) | Q(category__is_addon=False))
|
q &= Q(Q(category__isnull=True) | Q(category__is_addon=False))
|
||||||
|
if not allow_cross_sell:
|
||||||
|
q &= Q(Q(category__isnull=True) | ~Q(category__cross_selling_mode='only'))
|
||||||
|
|
||||||
if voucher:
|
if voucher:
|
||||||
if voucher.item_id:
|
if voucher.item_id:
|
||||||
@@ -304,8 +344,8 @@ def filter_available(qs, channel='web', voucher=None, allow_addons=False):
|
|||||||
|
|
||||||
|
|
||||||
class ItemQuerySet(models.QuerySet):
|
class ItemQuerySet(models.QuerySet):
|
||||||
def filter_available(self, channel='web', voucher=None, allow_addons=False):
|
def filter_available(self, channel='web', voucher=None, allow_addons=False, allow_cross_sell=False):
|
||||||
return filter_available(self, channel, voucher, allow_addons)
|
return filter_available(self, channel, voucher, allow_addons, allow_cross_sell)
|
||||||
|
|
||||||
|
|
||||||
class ItemQuerySetManager(ScopedManager(organizer='event__organizer').__class__):
|
class ItemQuerySetManager(ScopedManager(organizer='event__organizer').__class__):
|
||||||
@@ -313,8 +353,8 @@ class ItemQuerySetManager(ScopedManager(organizer='event__organizer').__class__)
|
|||||||
super().__init__()
|
super().__init__()
|
||||||
self._queryset_class = ItemQuerySet
|
self._queryset_class = ItemQuerySet
|
||||||
|
|
||||||
def filter_available(self, channel='web', voucher=None, allow_addons=False):
|
def filter_available(self, channel='web', voucher=None, allow_addons=False, allow_cross_sell=False):
|
||||||
return filter_available(self.get_queryset(), channel, voucher, allow_addons)
|
return filter_available(self.get_queryset(), channel, voucher, allow_addons, allow_cross_sell)
|
||||||
|
|
||||||
|
|
||||||
class Item(LoggedModel):
|
class Item(LoggedModel):
|
||||||
|
|||||||
@@ -1542,10 +1542,9 @@ def add_items_to_cart(self, event: int, items: List[dict], cart_id: str=None, lo
|
|||||||
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
|
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
|
||||||
def apply_voucher(self, event: Event, voucher: str, cart_id: str=None, locale='en', sales_channel='web', override_now_dt: datetime=None) -> None:
|
def apply_voucher(self, event: Event, voucher: str, cart_id: str=None, locale='en', sales_channel='web', override_now_dt: datetime=None) -> None:
|
||||||
"""
|
"""
|
||||||
Removes a list of items from a user's cart.
|
|
||||||
:param event: The event ID in question
|
:param event: The event ID in question
|
||||||
:param voucher: A voucher code
|
:param voucher: A voucher code
|
||||||
:param session: Session ID of a guest
|
:param cart_id: The cart ID of the cart to modify
|
||||||
"""
|
"""
|
||||||
with language(locale), time_machine_now_assigned(override_now_dt):
|
with language(locale), time_machine_now_assigned(override_now_dt):
|
||||||
try:
|
try:
|
||||||
@@ -1566,10 +1565,10 @@ def apply_voucher(self, event: Event, voucher: str, cart_id: str=None, locale='e
|
|||||||
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
|
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
|
||||||
def remove_cart_position(self, event: Event, position: int, cart_id: str=None, locale='en', sales_channel='web', override_now_dt: datetime=None) -> None:
|
def remove_cart_position(self, event: Event, position: int, cart_id: str=None, locale='en', sales_channel='web', override_now_dt: datetime=None) -> None:
|
||||||
"""
|
"""
|
||||||
Removes a list of items from a user's cart.
|
Removes an item specified by its position ID from a user's cart.
|
||||||
:param event: The event ID in question
|
:param event: The event ID in question
|
||||||
:param position: A cart position ID
|
:param position: A cart position ID
|
||||||
:param session: Session ID of a guest
|
:param cart_id: The cart ID of the cart to modify
|
||||||
"""
|
"""
|
||||||
with language(locale), time_machine_now_assigned(override_now_dt):
|
with language(locale), time_machine_now_assigned(override_now_dt):
|
||||||
try:
|
try:
|
||||||
@@ -1590,9 +1589,9 @@ def remove_cart_position(self, event: Event, position: int, cart_id: str=None, l
|
|||||||
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
|
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
|
||||||
def clear_cart(self, event: Event, cart_id: str=None, locale='en', sales_channel='web', override_now_dt: datetime=None) -> None:
|
def clear_cart(self, event: Event, cart_id: str=None, locale='en', sales_channel='web', override_now_dt: datetime=None) -> None:
|
||||||
"""
|
"""
|
||||||
Removes a list of items from a user's cart.
|
Removes all items from a user's cart.
|
||||||
:param event: The event ID in question
|
:param event: The event ID in question
|
||||||
:param session: Session ID of a guest
|
:param cart_id: The cart ID of the cart to modify
|
||||||
"""
|
"""
|
||||||
with language(locale), time_machine_now_assigned(override_now_dt):
|
with language(locale), time_machine_now_assigned(override_now_dt):
|
||||||
try:
|
try:
|
||||||
@@ -1611,13 +1610,15 @@ def clear_cart(self, event: Event, cart_id: str=None, locale='en', sales_channel
|
|||||||
|
|
||||||
|
|
||||||
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
|
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
|
||||||
def set_cart_addons(self, event: Event, addons: List[dict], cart_id: str=None, locale='en',
|
def set_cart_addons(self, event: Event, addons: List[dict], add_to_cart_items: List[dict], cart_id: str=None, locale='en',
|
||||||
invoice_address: int=None, sales_channel='web', override_now_dt: datetime=None) -> None:
|
invoice_address: int=None, sales_channel='web', override_now_dt: datetime=None) -> None:
|
||||||
"""
|
"""
|
||||||
Removes a list of items from a user's cart.
|
Assigns addons to eligible products in a user's cart, adding and removing the addon products as necessary to
|
||||||
|
ensure the requested addon state.
|
||||||
:param event: The event ID in question
|
:param event: The event ID in question
|
||||||
:param addons: A list of dicts with the keys addon_to, item, variation
|
:param addons: A list of dicts with the keys addon_to, item, variation
|
||||||
:param session: Session ID of a guest
|
:param add_to_cart_items: A list of dicts with the keys item, variation, count, custom_price, voucher, seat ID
|
||||||
|
:param cart_id: The cart ID of the cart to modify
|
||||||
"""
|
"""
|
||||||
with language(locale), time_machine_now_assigned(override_now_dt):
|
with language(locale), time_machine_now_assigned(override_now_dt):
|
||||||
ia = False
|
ia = False
|
||||||
@@ -1635,6 +1636,7 @@ def set_cart_addons(self, event: Event, addons: List[dict], cart_id: str=None, l
|
|||||||
try:
|
try:
|
||||||
cm = CartManager(event=event, cart_id=cart_id, invoice_address=ia, sales_channel=sales_channel)
|
cm = CartManager(event=event, cart_id=cart_id, invoice_address=ia, sales_channel=sales_channel)
|
||||||
cm.set_addons(addons)
|
cm.set_addons(addons)
|
||||||
|
cm.add_new_items(add_to_cart_items)
|
||||||
cm.commit()
|
cm.commit()
|
||||||
except LockTimeoutException:
|
except LockTimeoutException:
|
||||||
self.retry()
|
self.retry()
|
||||||
|
|||||||
234
src/pretix/base/services/cross_selling.py
Normal file
234
src/pretix/base/services/cross_selling.py
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
#
|
||||||
|
# This file is part of pretix (Community Edition).
|
||||||
|
#
|
||||||
|
# Copyright (C) 2014-2020 Raphael Michel and contributors
|
||||||
|
# Copyright (C) 2020-2021 rami.io GmbH and contributors
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
|
||||||
|
# Public License as published by the Free Software Foundation in version 3 of the License.
|
||||||
|
#
|
||||||
|
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
|
||||||
|
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
|
||||||
|
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
|
||||||
|
# this file, see <https://pretix.eu/about/en/license>.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
||||||
|
# details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||||
|
# <https://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
from collections import defaultdict
|
||||||
|
from decimal import Decimal
|
||||||
|
from itertools import groupby
|
||||||
|
from math import inf
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
from django.utils.functional import cached_property
|
||||||
|
|
||||||
|
from pretix.base.models import CartPosition, ItemCategory, SalesChannel
|
||||||
|
from pretix.presale.views.event import get_grouped_items
|
||||||
|
|
||||||
|
|
||||||
|
class DummyCategory:
|
||||||
|
"""
|
||||||
|
Used to create fake category objects for displaying the same cross-selling category multiple times,
|
||||||
|
once for each subevent
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, category: ItemCategory, subevent):
|
||||||
|
self.id = category.id
|
||||||
|
self.name = str(category.name)
|
||||||
|
self.subevent_name = str(subevent)
|
||||||
|
self.description = category.description
|
||||||
|
|
||||||
|
|
||||||
|
class CrossSellingService:
|
||||||
|
def __init__(self, event, sales_channel: SalesChannel, cartpositions: List[CartPosition], customer):
|
||||||
|
self.event = event
|
||||||
|
self.sales_channel = sales_channel
|
||||||
|
self.cartpositions = cartpositions
|
||||||
|
self.customer = customer
|
||||||
|
|
||||||
|
def get_data(self):
|
||||||
|
if self.event.has_subevents:
|
||||||
|
subevents = set(pos.subevent for pos in self.cartpositions)
|
||||||
|
result = (
|
||||||
|
(DummyCategory(category, subevent),
|
||||||
|
self._prepare_items(subevent, items_qs, discount_info),
|
||||||
|
f'subevent_{subevent.pk}_')
|
||||||
|
for subevent in subevents
|
||||||
|
for (category, items_qs, discount_info) in self._applicable_categories(subevent.pk)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
result = (
|
||||||
|
(category,
|
||||||
|
self._prepare_items(None, items_qs, discount_info),
|
||||||
|
'')
|
||||||
|
for (category, items_qs, discount_info) in self._applicable_categories(0)
|
||||||
|
)
|
||||||
|
result = [(category, items, form_prefix) for (category, items, form_prefix) in result if len(items) > 0]
|
||||||
|
for category, items, form_prefix in result:
|
||||||
|
category.category_has_discount = any(item.original_price or (
|
||||||
|
item.has_variations and any(var.original_price for var in item.available_variations)
|
||||||
|
) for item in items)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def _applicable_categories(self, subevent_id):
|
||||||
|
return [
|
||||||
|
(c, products_qs, discount_info) for (c, products_qs, discount_info) in
|
||||||
|
(
|
||||||
|
(c, *self._get_visible_items_for_category(subevent_id, c))
|
||||||
|
for c in self.event.categories.filter(cross_selling_mode__isnull=False).prefetch_related('items')
|
||||||
|
)
|
||||||
|
if products_qs is not None
|
||||||
|
]
|
||||||
|
|
||||||
|
def _get_visible_items_for_category(self, filter_subevent_id, category: ItemCategory):
|
||||||
|
"""
|
||||||
|
If this category should be visible in the cross-selling step for a given cart and sales_channel, this method
|
||||||
|
returns a queryset of the items that should be displayed, as well as a dict giving additional information on them.
|
||||||
|
|
||||||
|
:returns: (QuerySet<Item>, dict<(subevent_id, item_pk): (max_count, discount_rule)>)
|
||||||
|
max_count is `inf` if the item should not be limited
|
||||||
|
discount_rule is None if the item will not be discounted
|
||||||
|
"""
|
||||||
|
if category.cross_selling_mode is None:
|
||||||
|
return None, {}
|
||||||
|
if category.cross_selling_condition == 'always':
|
||||||
|
return category.items.all(), {}
|
||||||
|
if category.cross_selling_condition == 'products':
|
||||||
|
match = set(match.pk for match in category.cross_selling_match_products.only('pk')) # TODO prefetch this
|
||||||
|
return (category.items.all(), {}) if any(pos.item.pk in match for pos in self.cartpositions) else (None, {})
|
||||||
|
if category.cross_selling_condition == 'discounts':
|
||||||
|
my_item_pks = [item.id for item in category.items.all()]
|
||||||
|
potential_discount_items = {
|
||||||
|
item.pk: (max_count, discount_rule)
|
||||||
|
for subevent_id, item, max_count, discount_rule in self._potential_discounts_by_subevent_and_item_for_current_cart
|
||||||
|
if max_count > 0 and item.pk in my_item_pks and item.is_available() and (subevent_id == filter_subevent_id or subevent_id is None)
|
||||||
|
}
|
||||||
|
return category.items.filter(pk__in=potential_discount_items), potential_discount_items
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def _potential_discounts_by_subevent_and_item_for_current_cart(self):
|
||||||
|
potential_discounts_by_cartpos = defaultdict(list)
|
||||||
|
|
||||||
|
from ..services.pricing import apply_discounts
|
||||||
|
self._discounted_prices = apply_discounts(
|
||||||
|
self.event,
|
||||||
|
self.sales_channel,
|
||||||
|
[
|
||||||
|
(cp.item_id, cp.subevent_id, cp.line_price_gross, bool(cp.addon_to), cp.is_bundled,
|
||||||
|
cp.listed_price - cp.price_after_voucher)
|
||||||
|
for cp in self.cartpositions
|
||||||
|
],
|
||||||
|
collect_potential_discounts=potential_discounts_by_cartpos
|
||||||
|
)
|
||||||
|
|
||||||
|
# flatten potential_discounts_by_cartpos (a dict of lists of potential discounts) into a set of potential discounts
|
||||||
|
# (which is technically stored as a dict, but we use it as an OrderedSet here)
|
||||||
|
potential_discount_set = dict.fromkeys(
|
||||||
|
info for lst in potential_discounts_by_cartpos.values() for info in lst)
|
||||||
|
|
||||||
|
# sum up the max_counts and pass them on (also pass on the discount_rules so we can calculate actual discounted prices later):
|
||||||
|
# group by benefit product
|
||||||
|
# - max_count for product: sum up max_counts
|
||||||
|
# - discount_rule for product: take first discount_rule
|
||||||
|
|
||||||
|
def discount_info(subevent_id, item, infos_for_item):
|
||||||
|
infos_for_item = list(infos_for_item)
|
||||||
|
return (
|
||||||
|
subevent_id,
|
||||||
|
item,
|
||||||
|
sum(max_count for (subevent_id, item, discount_rule, max_count, i) in infos_for_item),
|
||||||
|
next(discount_rule for (subevent_id, item, discount_rule, max_count, i) in infos_for_item),
|
||||||
|
)
|
||||||
|
|
||||||
|
return [
|
||||||
|
discount_info(subevent_id, item, infos_for_item) for (subevent_id, item), infos_for_item in
|
||||||
|
groupby(
|
||||||
|
sorted(
|
||||||
|
(
|
||||||
|
(subevent_id, item, discount_rule, max_count, i)
|
||||||
|
for (discount_rule, max_count, i, subevent_id) in potential_discount_set.keys()
|
||||||
|
for item in discount_rule.benefit_limit_products.all()
|
||||||
|
),
|
||||||
|
key=lambda tup: (tup[0], tup[1].pk)
|
||||||
|
),
|
||||||
|
lambda tup: (tup[0], tup[1]))
|
||||||
|
]
|
||||||
|
|
||||||
|
def _prepare_items(self, subevent, items_qs, discount_info):
|
||||||
|
items, _btn = get_grouped_items(
|
||||||
|
self.event,
|
||||||
|
subevent=subevent,
|
||||||
|
voucher=None,
|
||||||
|
channel=self.sales_channel,
|
||||||
|
base_qs=items_qs,
|
||||||
|
allow_addons=False,
|
||||||
|
allow_cross_sell=True,
|
||||||
|
memberships=(
|
||||||
|
self.customer.usable_memberships(
|
||||||
|
for_event=subevent or self.event,
|
||||||
|
testmode=self.event.testmode
|
||||||
|
)
|
||||||
|
if self.customer else None
|
||||||
|
),
|
||||||
|
)
|
||||||
|
new_items = list()
|
||||||
|
for item in items:
|
||||||
|
max_count = inf
|
||||||
|
if item.pk in discount_info:
|
||||||
|
(max_count, discount_rule) = discount_info[item.pk]
|
||||||
|
|
||||||
|
# only benefit_only_apply_to_cheapest_n_matches discounted items have a max_count, all others get 'inf'
|
||||||
|
if not max_count:
|
||||||
|
max_count = inf
|
||||||
|
|
||||||
|
# calculate discounted price
|
||||||
|
if discount_rule and discount_rule.benefit_discount_matching_percent > 0:
|
||||||
|
if not item.has_variations:
|
||||||
|
item.original_price = item.original_price or item.display_price
|
||||||
|
previous_price = item.display_price
|
||||||
|
new_price = (
|
||||||
|
previous_price * (
|
||||||
|
(Decimal('100.00') - discount_rule.benefit_discount_matching_percent) / Decimal('100.00'))
|
||||||
|
)
|
||||||
|
item.display_price = new_price
|
||||||
|
else:
|
||||||
|
# discounts always match "whole" items, not specific variations -> we apply the discount to all
|
||||||
|
# available variations of the item
|
||||||
|
for var in item.available_variations:
|
||||||
|
var.original_price = var.original_price or var.display_price
|
||||||
|
previous_price = var.display_price
|
||||||
|
new_price = (
|
||||||
|
previous_price * (
|
||||||
|
(Decimal('100.00') - discount_rule.benefit_discount_matching_percent) / Decimal('100.00'))
|
||||||
|
)
|
||||||
|
var.display_price = new_price
|
||||||
|
|
||||||
|
if not item.has_variations:
|
||||||
|
# reduce order_max by number of items already in cart (prevent recommending a product the user can't add anyway)
|
||||||
|
item.order_max = min(
|
||||||
|
item.order_max - sum(1 for pos in self.cartpositions if pos.item_id == item.pk),
|
||||||
|
max_count
|
||||||
|
)
|
||||||
|
if item.order_max > 0:
|
||||||
|
new_items.append(item)
|
||||||
|
else:
|
||||||
|
new_vars = list()
|
||||||
|
for var in item.available_variations:
|
||||||
|
# reduce order_max by number of items already in cart (prevent recommending a product the user can't add anyway)
|
||||||
|
var.order_max = min(
|
||||||
|
var.order_max - sum(1 for pos in self.cartpositions if pos.item_id == item.pk and pos.variation_id == var.pk),
|
||||||
|
max_count
|
||||||
|
)
|
||||||
|
if var.order_max > 0:
|
||||||
|
new_vars.append(var)
|
||||||
|
if len(new_vars):
|
||||||
|
item.available_variations = new_vars
|
||||||
|
new_items.append(item)
|
||||||
|
|
||||||
|
return new_items
|
||||||
@@ -20,8 +20,9 @@
|
|||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import re
|
import re
|
||||||
|
from collections import defaultdict
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from typing import List, Optional, Tuple
|
from typing import List, Optional, Tuple, Union
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
@@ -31,6 +32,7 @@ from pretix.base.models import (
|
|||||||
AbstractPosition, InvoiceAddress, Item, ItemAddOn, ItemVariation,
|
AbstractPosition, InvoiceAddress, Item, ItemAddOn, ItemVariation,
|
||||||
SalesChannel, Voucher,
|
SalesChannel, Voucher,
|
||||||
)
|
)
|
||||||
|
from pretix.base.models.discount import Discount, PositionInfo
|
||||||
from pretix.base.models.event import Event, SubEvent
|
from pretix.base.models.event import Event, SubEvent
|
||||||
from pretix.base.models.tax import TAXED_ZERO, TaxedPrice, TaxRule
|
from pretix.base.models.tax import TAXED_ZERO, TaxedPrice, TaxRule
|
||||||
from pretix.base.timemachine import time_machine_now
|
from pretix.base.timemachine import time_machine_now
|
||||||
@@ -155,14 +157,22 @@ def get_line_price(price_after_voucher: Decimal, custom_price_input: Decimal, cu
|
|||||||
return price
|
return price
|
||||||
|
|
||||||
|
|
||||||
def apply_discounts(event: Event, sales_channel: str,
|
def apply_discounts(event: Event, sales_channel: Union[str, SalesChannel],
|
||||||
positions: List[Tuple[int, Optional[int], Decimal, bool, bool]]) -> List[Decimal]:
|
positions: List[Tuple[int, Optional[int], Decimal, bool, bool, Decimal]],
|
||||||
|
collect_potential_discounts: Optional[defaultdict]=None) -> List[Tuple[Decimal, Optional[Discount]]]:
|
||||||
"""
|
"""
|
||||||
Applies any dynamic discounts to a cart
|
Applies any dynamic discounts to a cart
|
||||||
|
|
||||||
:param event: Event the cart belongs to
|
:param event: Event the cart belongs to
|
||||||
:param sales_channel: Sales channel the cart was created with
|
:param sales_channel: Sales channel the cart was created with
|
||||||
:param positions: Tuple of the form ``(item_id, subevent_id, line_price_gross, is_addon_to, is_bundled, voucher_discount)``
|
:param positions: Tuple of the form ``(item_id, subevent_id, line_price_gross, is_addon_to, is_bundled, voucher_discount)``
|
||||||
|
:param collect_potential_discounts: If a `defaultdict(list)` is supplied, all discounts that could be applied to the cart
|
||||||
|
based on the "consumed" items, but lack matching "benefitting" items will be collected therein.
|
||||||
|
The dict will contain a mapping from index in the `positions` list of the item that could be consumed, to a list
|
||||||
|
of tuples describing the discounts that could be applied in the form `(discount, max_count, grouping_id)`.
|
||||||
|
`max_count` is either the maximum number of benefitting items that the discount would apply to, or `inf` if that number
|
||||||
|
is not limited. The `grouping_id` can be used to distinguish several occurrences of the same discount.
|
||||||
|
|
||||||
:return: A list of ``(new_gross_price, discount)`` tuples in the same order as the input
|
:return: A list of ``(new_gross_price, discount)`` tuples in the same order as the input
|
||||||
"""
|
"""
|
||||||
if isinstance(sales_channel, SalesChannel):
|
if isinstance(sales_channel, SalesChannel):
|
||||||
@@ -177,10 +187,10 @@ def apply_discounts(event: Event, sales_channel: str,
|
|||||||
).prefetch_related('condition_limit_products', 'benefit_limit_products').order_by('position', 'pk')
|
).prefetch_related('condition_limit_products', 'benefit_limit_products').order_by('position', 'pk')
|
||||||
for discount in discount_qs:
|
for discount in discount_qs:
|
||||||
result = discount.apply({
|
result = discount.apply({
|
||||||
idx: (item_id, subevent_id, line_price_gross, is_addon_to, voucher_discount)
|
idx: PositionInfo(item_id, subevent_id, line_price_gross, is_addon_to, voucher_discount)
|
||||||
for idx, (item_id, subevent_id, line_price_gross, is_addon_to, is_bundled, voucher_discount) in enumerate(positions)
|
for idx, (item_id, subevent_id, line_price_gross, is_addon_to, is_bundled, voucher_discount) in enumerate(positions)
|
||||||
if not is_bundled and idx not in new_prices
|
if not is_bundled and idx not in new_prices
|
||||||
})
|
}, collect_potential_discounts)
|
||||||
for k in result.keys():
|
for k in result.keys():
|
||||||
result[k] = (result[k], discount)
|
result[k] = (result[k], discount)
|
||||||
new_prices.update(result)
|
new_prices.update(result)
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ def vouchers_send(event: Event, vouchers: list, subject: str, message: str, reci
|
|||||||
v.tag = r.get('tag')
|
v.tag = r.get('tag')
|
||||||
if v.comment:
|
if v.comment:
|
||||||
v.comment += '\n\n'
|
v.comment += '\n\n'
|
||||||
v.comment = gettext('The voucher has been sent to {recipient}.').format(recipient=r['email'])
|
v.comment += gettext('The voucher has been sent to {recipient}.').format(recipient=r['email'])
|
||||||
logs.append(v.log_action(
|
logs.append(v.log_action(
|
||||||
'pretix.voucher.sent',
|
'pretix.voucher.sent',
|
||||||
user=user,
|
user=user,
|
||||||
|
|||||||
@@ -571,7 +571,7 @@ DEFAULTS = {
|
|||||||
'form_class': I18nFormField,
|
'form_class': I18nFormField,
|
||||||
'serializer_class': I18nField,
|
'serializer_class': I18nField,
|
||||||
'form_kwargs': dict(
|
'form_kwargs': dict(
|
||||||
label=_("Custom recipient field"),
|
label=_("Custom recipient field label"),
|
||||||
widget=I18nTextInput,
|
widget=I18nTextInput,
|
||||||
help_text=_("If you want to add a custom text field, e.g. for a country-specific registration number, to "
|
help_text=_("If you want to add a custom text field, e.g. for a country-specific registration number, to "
|
||||||
"your invoice address form, please fill in the label here. This label will both be used for "
|
"your invoice address form, please fill in the label here. This label will both be used for "
|
||||||
@@ -580,6 +580,18 @@ DEFAULTS = {
|
|||||||
"The field will not be required.")
|
"The field will not be required.")
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
'invoice_address_custom_field_helptext': {
|
||||||
|
'default': '',
|
||||||
|
'type': LazyI18nString,
|
||||||
|
'form_class': I18nFormField,
|
||||||
|
'serializer_class': I18nField,
|
||||||
|
'form_kwargs': dict(
|
||||||
|
label=_("Custom recipient field help text"),
|
||||||
|
widget=I18nTextInput,
|
||||||
|
help_text=_("If you use the custom recipient field, you can specify a help text which will be displayed "
|
||||||
|
"underneath the field. It will not be displayed on the invoice.")
|
||||||
|
)
|
||||||
|
},
|
||||||
'invoice_address_vatid': {
|
'invoice_address_vatid': {
|
||||||
'default': 'False',
|
'default': 'False',
|
||||||
'type': bool,
|
'type': bool,
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import sys
|
|||||||
from importlib import import_module
|
from importlib import import_module
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.core.cache import cache
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.urls import Resolver404, get_script_prefix, resolve
|
from django.urls import Resolver404, get_script_prefix, resolve
|
||||||
from django.utils.translation import get_language
|
from django.utils.translation import get_language
|
||||||
@@ -152,6 +153,8 @@ def _default_context(request):
|
|||||||
ctx['warning_update_available'] = True
|
ctx['warning_update_available'] = True
|
||||||
if not gs.settings.update_check_ack and 'runserver' not in sys.argv:
|
if not gs.settings.update_check_ack and 'runserver' not in sys.argv:
|
||||||
ctx['warning_update_check_active'] = True
|
ctx['warning_update_check_active'] = True
|
||||||
|
if not cache.get('pretix_runperiodic_executed') and not settings.DEBUG:
|
||||||
|
ctx['warning_cronjob'] = True
|
||||||
|
|
||||||
ctx['ie_deprecation_warning'] = 'MSIE' in request.headers.get('User-Agent', '') or 'Trident/' in request.headers.get('User-Agent', '')
|
ctx['ie_deprecation_warning'] = 'MSIE' in request.headers.get('User-Agent', '') or 'Trident/' in request.headers.get('User-Agent', '')
|
||||||
|
|
||||||
|
|||||||
@@ -844,6 +844,7 @@ class InvoiceSettingsForm(EventSettingsValidationMixin, SettingsForm):
|
|||||||
'invoice_address_company_required',
|
'invoice_address_company_required',
|
||||||
'invoice_address_beneficiary',
|
'invoice_address_beneficiary',
|
||||||
'invoice_address_custom_field',
|
'invoice_address_custom_field',
|
||||||
|
'invoice_address_custom_field_helptext',
|
||||||
'invoice_name_required',
|
'invoice_name_required',
|
||||||
'invoice_address_not_asked_free',
|
'invoice_address_not_asked_free',
|
||||||
'invoice_include_free',
|
'invoice_include_free',
|
||||||
|
|||||||
@@ -40,7 +40,8 @@ from urllib.parse import urlencode
|
|||||||
from django import forms
|
from django import forms
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.db.models import Max
|
from django.db.models import Max, Q
|
||||||
|
from django.forms import ChoiceField, RadioSelect
|
||||||
from django.forms.formsets import DELETION_FIELD_NAME
|
from django.forms.formsets import DELETION_FIELD_NAME
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
@@ -79,11 +80,67 @@ class CategoryForm(I18nModelForm):
|
|||||||
'name',
|
'name',
|
||||||
'internal_name',
|
'internal_name',
|
||||||
'description',
|
'description',
|
||||||
'is_addon'
|
'cross_selling_condition',
|
||||||
|
'cross_selling_match_products',
|
||||||
]
|
]
|
||||||
widgets = {
|
widgets = {
|
||||||
'description': I18nMarkdownTextarea,
|
'description': I18nMarkdownTextarea,
|
||||||
|
'cross_selling_condition': RadioSelect,
|
||||||
}
|
}
|
||||||
|
field_classes = {
|
||||||
|
'cross_selling_match_products': SafeModelMultipleChoiceField,
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
tpl = '{} <span class="text-muted">{}</span>'
|
||||||
|
self.fields['category_type'] = ChoiceField(widget=RadioSelect, choices=(
|
||||||
|
('normal', mark_safe(tpl.format(
|
||||||
|
_('Normal category'),
|
||||||
|
_('Products in this category are regular products displayed on the front page.')
|
||||||
|
)),),
|
||||||
|
('addon', mark_safe(tpl.format(
|
||||||
|
_('Add-on product category'),
|
||||||
|
_('Products in this category are add-on products and can only be bought as add-ons.')
|
||||||
|
)),),
|
||||||
|
('only', mark_safe(tpl.format(
|
||||||
|
_('Cross-selling category'),
|
||||||
|
_('Products in this category are regular products, but are only shown in the cross-selling step, '
|
||||||
|
'according to the configuration below.')
|
||||||
|
)),),
|
||||||
|
('both', mark_safe(tpl.format(
|
||||||
|
_('Normal + cross-selling category'),
|
||||||
|
_('Products in this category are regular products displayed on the front page, but are additionally '
|
||||||
|
'shown in the cross-selling step, according to the configuration below.')
|
||||||
|
)),),
|
||||||
|
))
|
||||||
|
self.fields['category_type'].initial = self.instance.category_type
|
||||||
|
|
||||||
|
self.fields['cross_selling_condition'].widget.attrs['data-display-dependency'] = '#id_category_type_2,#id_category_type_3'
|
||||||
|
self.fields['cross_selling_condition'].widget.attrs['data-disable-dependent'] = 'true'
|
||||||
|
self.fields['cross_selling_condition'].widget.choices = self.fields['cross_selling_condition'].widget.choices[1:]
|
||||||
|
self.fields['cross_selling_condition'].required = False
|
||||||
|
|
||||||
|
self.fields['cross_selling_match_products'].widget = forms.CheckboxSelectMultiple(
|
||||||
|
attrs={
|
||||||
|
'class': 'scrolling-multiple-choice',
|
||||||
|
'data-display-dependency': '#id_cross_selling_condition_2'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
self.fields['cross_selling_match_products'].queryset = self.event.items.filter(
|
||||||
|
# don't show products which are only visible in addon/cross-sell step themselves
|
||||||
|
Q(category__isnull=True) | Q(
|
||||||
|
Q(category__is_addon=False) & Q(Q(category__cross_selling_mode='both') | Q(category__cross_selling_mode__isnull=True))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
d = super().clean()
|
||||||
|
if d.get('category_type') == 'only' or d.get('category_type') == 'both':
|
||||||
|
if not d.get('cross_selling_condition'):
|
||||||
|
raise ValidationError({'cross_selling_condition': [_('This field is required')]})
|
||||||
|
self.instance.category_type = d.get('category_type')
|
||||||
|
return d
|
||||||
|
|
||||||
|
|
||||||
class QuestionForm(I18nModelForm):
|
class QuestionForm(I18nModelForm):
|
||||||
|
|||||||
@@ -421,6 +421,14 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if warning_cronjob %}
|
||||||
|
<div class="alert alert-warning">
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
The cronjob component of pretix was not executed in the last hours. Please check that
|
||||||
|
you have completed all installation steps and your cronjob is executed correctly.
|
||||||
|
{% endblocktrans %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if debug_warning %}
|
{% if debug_warning %}
|
||||||
<div class="alert alert-danger">
|
<div class="alert alert-danger">
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
{% bootstrap_field form.invoice_address_beneficiary layout="control" %}
|
{% bootstrap_field form.invoice_address_beneficiary layout="control" %}
|
||||||
{% bootstrap_field form.invoice_address_not_asked_free layout="control" %}
|
{% bootstrap_field form.invoice_address_not_asked_free layout="control" %}
|
||||||
{% bootstrap_field form.invoice_address_custom_field layout="control" %}
|
{% bootstrap_field form.invoice_address_custom_field layout="control" %}
|
||||||
|
{% bootstrap_field form.invoice_address_custom_field_helptext layout="control" %}
|
||||||
{% bootstrap_field form.invoice_address_explanation_text layout="control" %}
|
{% bootstrap_field form.invoice_address_explanation_text layout="control" %}
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans "Product categories" %}</th>
|
<th>{% trans "Product categories" %}</th>
|
||||||
|
<th>{% trans "Category type" %}</th>
|
||||||
<th class="action-col-2"></th>
|
<th class="action-col-2"></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@@ -40,6 +41,9 @@
|
|||||||
<td>
|
<td>
|
||||||
<strong><a href="{% url "control:event.items.categories.edit" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}">{{ c.internal_name|default:c.name }}</a></strong>
|
<strong><a href="{% url "control:event.items.categories.edit" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}">{{ c.internal_name|default:c.name }}</a></strong>
|
||||||
</td>
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ c.get_category_type_display }}
|
||||||
|
</td>
|
||||||
<td class="text-right flip">
|
<td class="text-right flip">
|
||||||
<button title="{% trans "Move up" %}" formaction="{% url "control:event.items.categories.up" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}" class="btn btn-default btn-sm sortable-up"{% if forloop.counter0 == 0 and not page_obj.has_previous %} disabled{% endif %}><i class="fa fa-arrow-up"></i></button>
|
<button title="{% trans "Move up" %}" formaction="{% url "control:event.items.categories.up" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}" class="btn btn-default btn-sm sortable-up"{% if forloop.counter0 == 0 and not page_obj.has_previous %} disabled{% endif %}><i class="fa fa-arrow-up"></i></button>
|
||||||
<button title="{% trans "Move down" %}" formaction="{% url "control:event.items.categories.down" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}" class="btn btn-default btn-sm sortable-down"{% if forloop.revcounter0 == 0 and not page_obj.has_next %} disabled{% endif %}><i class="fa fa-arrow-down"></i></button>
|
<button title="{% trans "Move down" %}" formaction="{% url "control:event.items.categories.down" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}" class="btn btn-default btn-sm sortable-down"{% if forloop.revcounter0 == 0 and not page_obj.has_next %} disabled{% endif %}><i class="fa fa-arrow-down"></i></button>
|
||||||
|
|||||||
@@ -16,7 +16,9 @@
|
|||||||
{% bootstrap_field form.internal_name layout="control" %}
|
{% bootstrap_field form.internal_name layout="control" %}
|
||||||
</div>
|
</div>
|
||||||
{% bootstrap_field form.description layout="control" %}
|
{% bootstrap_field form.description layout="control" %}
|
||||||
{% bootstrap_field form.is_addon layout="control" %}
|
{% bootstrap_field form.category_type layout="control" horizontal_field_class="big-radio-wrapper col-lg-9" %}
|
||||||
|
{% bootstrap_field form.cross_selling_condition layout="control" horizontal_field_class="col-lg-9" %}
|
||||||
|
{% bootstrap_field form.cross_selling_match_products layout="control" %}
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</div>
|
</div>
|
||||||
{% if category %}
|
{% if category %}
|
||||||
|
|||||||
@@ -13,31 +13,52 @@
|
|||||||
{% trans "Edit question" %}
|
{% trans "Edit question" %}
|
||||||
</a>
|
</a>
|
||||||
</h1>
|
</h1>
|
||||||
<form class="form-inline helper-display-inline" action="" method="get">
|
|
||||||
<p>
|
<div class="panel panel-default">
|
||||||
<select name="status" class="form-control">
|
<div class="panel-heading">
|
||||||
<option value="" {% if request.GET.status == "" %}selected="selected"{% endif %}>{% trans "All orders" %}</option>
|
<h3 class="panel-title">{% trans "Filter" %}</h3>
|
||||||
<option value="p" {% if request.GET.status == "p" %}selected="selected"{% endif %}>{% trans "Paid" %}</option>
|
</div>
|
||||||
<option value="pv" {% if request.GET.status == "pv" %}selected="selected"{% endif %}>{% trans "Paid or confirmed" %}</option>
|
<form class="panel-body filter-form" action="" method="get">
|
||||||
<option value="n" {% if request.GET.status == "n" %}selected="selected"{% endif %}>{% trans "Pending" %}</option>
|
<div class="row">
|
||||||
<option value="np" {% if request.GET.status == "np" or "status" not in request.GET %}selected="selected"{% endif %}>{% trans "Pending or paid" %}</option>
|
<div class="col-lg-2 col-sm-6 col-xs-6">
|
||||||
<option value="o" {% if request.GET.status == "o" %}selected="selected"{% endif %}>{% trans "Pending (overdue)" %}</option>
|
<select name="status" class="form-control">
|
||||||
<option value="e" {% if request.GET.status == "e" %}selected="selected"{% endif %}>{% trans "Expired" %}</option>
|
<option value="" {% if request.GET.status == "" %}selected="selected"{% endif %}>{% trans "All orders" %}</option>
|
||||||
<option value="ne" {% if request.GET.status == "ne" %}selected="selected"{% endif %}>{% trans "Pending or expired" %}</option>
|
<option value="p" {% if request.GET.status == "p" %}selected="selected"{% endif %}>{% trans "Paid" %}</option>
|
||||||
<option value="c" {% if request.GET.status == "c" %}selected="selected"{% endif %}>{% trans "Canceled" %}</option>
|
<option value="pv" {% if request.GET.status == "pv" %}selected="selected"{% endif %}>{% trans "Paid or confirmed" %}</option>
|
||||||
</select>
|
<option value="n" {% if request.GET.status == "n" %}selected="selected"{% endif %}>{% trans "Pending" %}</option>
|
||||||
<select name="item" class="form-control">
|
<option value="np" {% if request.GET.status == "np" or "status" not in request.GET %}selected="selected"{% endif %}>{% trans "Pending or paid" %}</option>
|
||||||
<option value="">{% trans "All products" %}</option>
|
<option value="o" {% if request.GET.status == "o" %}selected="selected"{% endif %}>{% trans "Pending (overdue)" %}</option>
|
||||||
{% for item in items %}
|
<option value="e" {% if request.GET.status == "e" %}selected="selected"{% endif %}>{% trans "Expired" %}</option>
|
||||||
<option value="{{ item.id }}"
|
<option value="ne" {% if request.GET.status == "ne" %}selected="selected"{% endif %}>{% trans "Pending or expired" %}</option>
|
||||||
{% if request.GET.item|add:0 == item.id %}selected="selected"{% endif %}>
|
<option value="c" {% if request.GET.status == "c" %}selected="selected"{% endif %}>{% trans "Canceled" %}</option>
|
||||||
{{ item.name }}
|
</select>
|
||||||
</option>
|
</div>
|
||||||
{% endfor %}
|
<div class="col-lg-5 col-sm-6 col-xs-6">
|
||||||
</select>
|
<select name="item" class="form-control">
|
||||||
<button class="btn btn-primary" type="submit">{% trans "Filter" %}</button>
|
<option value="">{% trans "All products" %}</option>
|
||||||
</p>
|
{% for item in items %}
|
||||||
</form>
|
<option value="{{ item.id }}"
|
||||||
|
{% if request.GET.item|add:0 == item.id %}selected="selected"{% endif %}>
|
||||||
|
{{ item.name }}
|
||||||
|
</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
{% if request.event.has_subevents %}
|
||||||
|
<div class="col-lg-5 col-sm-6 col-xs-6">
|
||||||
|
{% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="text-right">
|
||||||
|
<button class="btn btn-primary btn-lg" type="submit">
|
||||||
|
<span class="fa fa-filter"></span>
|
||||||
|
{% trans "Filter" %}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row" id="question-stats">
|
<div class="row" id="question-stats">
|
||||||
{% if not stats %}
|
{% if not stats %}
|
||||||
<div class="empty-collection col-md-10 col-xs-12">
|
<div class="empty-collection col-md-10 col-xs-12">
|
||||||
@@ -75,7 +96,7 @@
|
|||||||
{% for stat in stats %}
|
{% for stat in stats %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="{% url "control:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}?status={{ request.GET.status|default:"np" }}&item={{ request.GET.item }}&question={{ question.pk }}&answer={{ stat.alink|default:stat.answer|urlencode }}">
|
<a href="{% url "control:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}?status={{ request.GET.status|default:"np" }}&item={{ request.GET.item }}&subevent={{ request.GET.subevent }}&question={{ question.pk }}&answer={{ stat.alink|default:stat.answer|urlencode }}">
|
||||||
{{ stat.answer }}
|
{{ stat.answer }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% if request.event.settings.hide_sold_out %}
|
{% if request.event.settings.hide_sold_out %}
|
||||||
<div class="alert alert-warning">
|
<div class="alert alert-warning">
|
||||||
{% trans "According to your event settings, sold out products are hidden from customers. This way, customers will not be able to discovere the waiting list." %}
|
{% trans "According to your event settings, sold out products are hidden from customers. This way, customers will not be able to discover the waiting list." %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|||||||
@@ -302,6 +302,8 @@ class CategoryCreate(EventPermissionRequiredMixin, CreateView):
|
|||||||
i = modelcopy(self.copy_from)
|
i = modelcopy(self.copy_from)
|
||||||
i.pk = None
|
i.pk = None
|
||||||
kwargs['instance'] = i
|
kwargs['instance'] = i
|
||||||
|
kwargs.setdefault('initial', {})
|
||||||
|
kwargs['initial']['cross_selling_match_products'] = [str(i.pk) for i in self.copy_from.cross_selling_match_products.all()]
|
||||||
else:
|
else:
|
||||||
kwargs['instance'] = ItemCategory(event=self.request.event)
|
kwargs['instance'] = ItemCategory(event=self.request.event)
|
||||||
return kwargs
|
return kwargs
|
||||||
@@ -661,6 +663,10 @@ class QuestionView(EventPermissionRequiredMixin, QuestionMixin, ChartContainingV
|
|||||||
question=self.object, orderposition__isnull=False,
|
question=self.object, orderposition__isnull=False,
|
||||||
orderposition__order__event=self.request.event
|
orderposition__order__event=self.request.event
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if self.request.GET.get("subevent", "") != "":
|
||||||
|
qs = qs.filter(orderposition__subevent=self.request.GET["subevent"])
|
||||||
|
|
||||||
s = self.request.GET.get("status", "np")
|
s = self.request.GET.get("status", "np")
|
||||||
if s != "":
|
if s != "":
|
||||||
if s == 'o':
|
if s == 'o':
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ def event_list(request):
|
|||||||
max_fromto=Greatest(Max('subevents__date_to'), Max('subevents__date_from'))
|
max_fromto=Greatest(Max('subevents__date_to'), Max('subevents__date_from'))
|
||||||
).annotate(
|
).annotate(
|
||||||
order_from=Coalesce('min_from', 'date_from'),
|
order_from=Coalesce('min_from', 'date_from'),
|
||||||
).order_by('-order_from')
|
).order_by('-order_from', 'slug')
|
||||||
|
|
||||||
total = qs.count()
|
total = qs.count()
|
||||||
pagesize = 20
|
pagesize = 20
|
||||||
@@ -318,7 +318,7 @@ def nav_context_list(request):
|
|||||||
max_fromto=Greatest(Max('subevents__date_to'), Max('subevents__date_from'))
|
max_fromto=Greatest(Max('subevents__date_to'), Max('subevents__date_from'))
|
||||||
).annotate(
|
).annotate(
|
||||||
order_from=Coalesce('min_from', 'date_from'),
|
order_from=Coalesce('min_from', 'date_from'),
|
||||||
).order_by('-order_from')
|
).order_by('-order_from', 'slug')
|
||||||
|
|
||||||
if request.user.has_active_staff_session(request.session.session_key):
|
if request.user.has_active_staff_session(request.session.session_key):
|
||||||
qs_orga = Organizer.objects.all()
|
qs_orga = Organizer.objects.all()
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@@ -622,40 +622,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2021-09-15 11:22+0000\n"
|
"PO-Revision-Date: 2021-09-15 11:22+0000\n"
|
||||||
"Last-Translator: Mohamed Tawfiq <mtawfiq@wafyapp.com>\n"
|
"Last-Translator: Mohamed Tawfiq <mtawfiq@wafyapp.com>\n"
|
||||||
"Language-Team: Arabic <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: Arabic <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
@@ -656,40 +656,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr "تباين اللون سيئ للخلفية البيضاء، الرجاء اختيار لون غامق."
|
msgstr "تباين اللون سيئ للخلفية البيضاء، الرجاء اختيار لون غامق."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "البحث في الاستفسارات"
|
msgstr "البحث في الاستفسارات"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "الكل"
|
msgstr "الكل"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "لا شيء"
|
msgstr "لا شيء"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "المختارة فقط"
|
msgstr "المختارة فقط"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "قم باستخدم اسم مختلف داخليا"
|
msgstr "قم باستخدم اسم مختلف داخليا"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "اضغط لاغلاق الصفحة"
|
msgstr "اضغط لاغلاق الصفحة"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "لم تقم بحفظ التعديلات!"
|
msgstr "لم تقم بحفظ التعديلات!"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2020-12-19 07:00+0000\n"
|
"PO-Revision-Date: 2020-12-19 07:00+0000\n"
|
||||||
"Last-Translator: albert <albert.serra.monner@gmail.com>\n"
|
"Last-Translator: albert <albert.serra.monner@gmail.com>\n"
|
||||||
"Language-Team: Catalan <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Catalan <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
@@ -623,40 +623,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2023-09-15 06:00+0000\n"
|
"PO-Revision-Date: 2023-09-15 06:00+0000\n"
|
||||||
"Last-Translator: Michael <michael.happl@gmx.at>\n"
|
"Last-Translator: Michael <michael.happl@gmx.at>\n"
|
||||||
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
@@ -650,40 +650,40 @@ msgstr ""
|
|||||||
"Tato barva je pro text na bílém pozadí špatně kontrastní, zvolte prosím "
|
"Tato barva je pro text na bílém pozadí špatně kontrastní, zvolte prosím "
|
||||||
"tmavší odstín."
|
"tmavší odstín."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Hledaný výraz"
|
msgstr "Hledaný výraz"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Všechny"
|
msgstr "Všechny"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Žádný"
|
msgstr "Žádný"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Pouze vybrané"
|
msgstr "Pouze vybrané"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Interně používat jiný název"
|
msgstr "Interně používat jiný název"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Kliknutím zavřete"
|
msgstr "Kliknutím zavřete"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Máte neuložené změny!"
|
msgstr "Máte neuložené změny!"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@@ -623,40 +623,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2024-07-10 15:00+0000\n"
|
"PO-Revision-Date: 2024-07-10 15:00+0000\n"
|
||||||
"Last-Translator: Nikolai <nikolai@lengefeldt.de>\n"
|
"Last-Translator: Nikolai <nikolai@lengefeldt.de>\n"
|
||||||
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
@@ -670,40 +670,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Ingen"
|
msgstr "Ingen"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Klik for at lukke"
|
msgstr "Klik for at lukke"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Du har ændringer, der ikke er gemt!"
|
msgstr "Du har ændringer, der ikke er gemt!"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2024-09-10 07:17+0000\n"
|
"PO-Revision-Date: 2024-09-10 07:17+0000\n"
|
||||||
"Last-Translator: Raphael Michel <michel@rami.io>\n"
|
"Last-Translator: Raphael Michel <michel@rami.io>\n"
|
||||||
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
@@ -644,40 +644,40 @@ msgstr ""
|
|||||||
"Diese Farbe hat einen schlechten Kontrast für Text auf einem weißen "
|
"Diese Farbe hat einen schlechten Kontrast für Text auf einem weißen "
|
||||||
"Hintergrund. Bitte wählen Sie eine dunklere Farbe."
|
"Hintergrund. Bitte wählen Sie eine dunklere Farbe."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Suchbegriff"
|
msgstr "Suchbegriff"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Keine"
|
msgstr "Keine"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Nur ausgewählte"
|
msgstr "Nur ausgewählte"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr "Geben Sie eine Seitenzahl zwischen 1 und %(max)s ein."
|
msgstr "Geben Sie eine Seitenzahl zwischen 1 und %(max)s ein."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr "Ungültige Seitenzahl."
|
msgstr "Ungültige Seitenzahl."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Intern einen anderen Namen verwenden"
|
msgstr "Intern einen anderen Namen verwenden"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Klicken zum Schließen"
|
msgstr "Klicken zum Schließen"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Sie haben ungespeicherte Änderungen!"
|
msgstr "Sie haben ungespeicherte Änderungen!"
|
||||||
|
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ Connect
|
|||||||
Consent
|
Consent
|
||||||
Copyleft
|
Copyleft
|
||||||
Cronjob
|
Cronjob
|
||||||
|
Cross
|
||||||
csv
|
csv
|
||||||
Customer
|
Customer
|
||||||
CZK
|
CZK
|
||||||
@@ -280,6 +281,7 @@ Scopes
|
|||||||
sechsstelligen
|
sechsstelligen
|
||||||
Secret
|
Secret
|
||||||
Security
|
Security
|
||||||
|
Selling
|
||||||
SEPA
|
SEPA
|
||||||
Shirts
|
Shirts
|
||||||
Signaturverfahren
|
Signaturverfahren
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2024-09-10 07:17+0000\n"
|
"PO-Revision-Date: 2024-09-10 07:17+0000\n"
|
||||||
"Last-Translator: Raphael Michel <michel@rami.io>\n"
|
"Last-Translator: Raphael Michel <michel@rami.io>\n"
|
||||||
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
|
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
|
||||||
@@ -643,40 +643,40 @@ msgstr ""
|
|||||||
"Diese Farbe hat einen schlechten Kontrast für Text auf einem weißen "
|
"Diese Farbe hat einen schlechten Kontrast für Text auf einem weißen "
|
||||||
"Hintergrund. Bitte wähle eine dunklere Farbe."
|
"Hintergrund. Bitte wähle eine dunklere Farbe."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Suchbegriff"
|
msgstr "Suchbegriff"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Keine"
|
msgstr "Keine"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Nur ausgewählte"
|
msgstr "Nur ausgewählte"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr "Gib eine Seitenzahl zwischen 1 und %(max)s ein."
|
msgstr "Gib eine Seitenzahl zwischen 1 und %(max)s ein."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr "Ungültige Seitenzahl."
|
msgstr "Ungültige Seitenzahl."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Intern einen anderen Namen verwenden"
|
msgstr "Intern einen anderen Namen verwenden"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Klicken zum Schließen"
|
msgstr "Klicken zum Schließen"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Du hast ungespeicherte Änderungen!"
|
msgstr "Du hast ungespeicherte Änderungen!"
|
||||||
|
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ Connect
|
|||||||
Consent
|
Consent
|
||||||
Copyleft
|
Copyleft
|
||||||
Cronjob
|
Cronjob
|
||||||
|
Cross
|
||||||
csv
|
csv
|
||||||
Customer
|
Customer
|
||||||
CZK
|
CZK
|
||||||
@@ -280,6 +281,7 @@ Scopes
|
|||||||
sechsstelligen
|
sechsstelligen
|
||||||
Secret
|
Secret
|
||||||
Security
|
Security
|
||||||
|
Selling
|
||||||
SEPA
|
SEPA
|
||||||
Shirts
|
Shirts
|
||||||
Signaturverfahren
|
Signaturverfahren
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-09-26 11:23+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:14+0000\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@@ -622,40 +622,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2019-10-03 19:00+0000\n"
|
"PO-Revision-Date: 2019-10-03 19:00+0000\n"
|
||||||
"Last-Translator: Chris Spy <chrispiropoulou@hotmail.com>\n"
|
"Last-Translator: Chris Spy <chrispiropoulou@hotmail.com>\n"
|
||||||
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
@@ -686,40 +686,40 @@ msgstr ""
|
|||||||
"Το χρώμα σας έχει κακή αντίθεση για κείμενο σε λευκό φόντο, επιλέξτε μια πιο "
|
"Το χρώμα σας έχει κακή αντίθεση για κείμενο σε λευκό φόντο, επιλέξτε μια πιο "
|
||||||
"σκούρα σκιά."
|
"σκούρα σκιά."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Όλα"
|
msgstr "Όλα"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Κανένας"
|
msgstr "Κανένας"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Χρησιμοποιήστε διαφορετικό όνομα εσωτερικά"
|
msgstr "Χρησιμοποιήστε διαφορετικό όνομα εσωτερικά"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Κάντε κλικ για να κλείσετε"
|
msgstr "Κάντε κλικ για να κλείσετε"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@@ -622,40 +622,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,17 +7,17 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2024-07-19 08:56+0000\n"
|
"PO-Revision-Date: 2024-10-22 17:00+0000\n"
|
||||||
"Last-Translator: Reece Needham <nouveaureece@protonmail.com>\n"
|
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
|
||||||
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/"
|
||||||
"js/es/>\n"
|
"pretix-js/es/>\n"
|
||||||
"Language: es\n"
|
"Language: es\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
"X-Generator: Weblate 5.6.2\n"
|
"X-Generator: Weblate 5.7.2\n"
|
||||||
|
|
||||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
#: 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:62
|
||||||
@@ -576,10 +576,8 @@ msgid "Text object (deprecated)"
|
|||||||
msgstr "Objeto de texto"
|
msgstr "Objeto de texto"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js:901
|
#: pretix/static/pretixcontrol/js/ui/editor.js:901
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Text object"
|
|
||||||
msgid "Text box"
|
msgid "Text box"
|
||||||
msgstr "Objeto de texto"
|
msgstr "Campo de texto"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js:903
|
#: pretix/static/pretixcontrol/js/ui/editor.js:903
|
||||||
msgid "Barcode area"
|
msgid "Barcode area"
|
||||||
@@ -646,40 +644,40 @@ msgstr ""
|
|||||||
"Tu color tiene mal contraste para un texto con fondo blanco, por favor, "
|
"Tu color tiene mal contraste para un texto con fondo blanco, por favor, "
|
||||||
"escoge un tono más oscuro."
|
"escoge un tono más oscuro."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Consultar búsqueda"
|
msgstr "Consultar búsqueda"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Todos"
|
msgstr "Todos"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Ninguno"
|
msgstr "Ninguno"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Solamente seleccionados"
|
msgstr "Solamente seleccionados"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr "Introduce un número de página entre 1 y %(max)s."
|
msgstr "Introduce un número de página entre 1 y %(max)s."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr "Número de página inválido."
|
msgstr "Número de página inválido."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Usar un nombre diferente internamente"
|
msgstr "Usar un nombre diferente internamente"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Click para cerrar"
|
msgstr "Click para cerrar"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "¡Tienes cambios sin guardar!"
|
msgstr "¡Tienes cambios sin guardar!"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-09-26 11:23+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@@ -622,40 +622,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-09-26 11:23+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2024-09-06 08:47+0000\n"
|
"PO-Revision-Date: 2024-09-06 08:47+0000\n"
|
||||||
"Last-Translator: Albizuri <oier@puntu.eus>\n"
|
"Last-Translator: Albizuri <oier@puntu.eus>\n"
|
||||||
"Language-Team: Basque <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: Basque <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
@@ -635,40 +635,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Guztiak"
|
msgstr "Guztiak"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2021-11-10 05:00+0000\n"
|
"PO-Revision-Date: 2021-11-10 05:00+0000\n"
|
||||||
"Last-Translator: Jaakko Rinta-Filppula <jaakko@r-f.fi>\n"
|
"Last-Translator: Jaakko Rinta-Filppula <jaakko@r-f.fi>\n"
|
||||||
"Language-Team: Finnish <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Finnish <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
@@ -651,40 +651,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Kaikki"
|
msgstr "Kaikki"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Käytä toista nimeä sisäisesti"
|
msgstr "Käytä toista nimeä sisäisesti"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Sulje klikkaamalla"
|
msgstr "Sulje klikkaamalla"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Sinulla on tallentamattomia muutoksia!"
|
msgstr "Sinulla on tallentamattomia muutoksia!"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: French\n"
|
"Project-Id-Version: French\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2024-06-12 03:00+0000\n"
|
"PO-Revision-Date: 2024-06-12 03:00+0000\n"
|
||||||
"Last-Translator: simonD <simon.dalvy@gmail.com>\n"
|
"Last-Translator: simonD <simon.dalvy@gmail.com>\n"
|
||||||
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
@@ -656,41 +656,41 @@ msgstr ""
|
|||||||
"Votre choix de couleur n'a pas un bon contraste avec du texte sur un fond "
|
"Votre choix de couleur n'a pas un bon contraste avec du texte sur un fond "
|
||||||
"blanc, SVP choisissez un ton plus sombre."
|
"blanc, SVP choisissez un ton plus sombre."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Recherche"
|
msgstr "Recherche"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Tous"
|
msgstr "Tous"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Aucun"
|
msgstr "Aucun"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Seuls les sélectionnés"
|
msgstr "Seuls les sélectionnés"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr "Numéro de page invalide."
|
msgstr "Numéro de page invalide."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Utiliser un nom différent en interne"
|
msgstr "Utiliser un nom différent en interne"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Cliquez pour fermer"
|
msgstr "Cliquez pour fermer"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Vous avez des modifications non sauvegardées !"
|
msgstr "Vous avez des modifications non sauvegardées !"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2022-02-22 22:00+0000\n"
|
"PO-Revision-Date: 2022-02-22 22:00+0000\n"
|
||||||
"Last-Translator: Ismael Menéndez Fernández <ismael.menendez@balidea.com>\n"
|
"Last-Translator: Ismael Menéndez Fernández <ismael.menendez@balidea.com>\n"
|
||||||
"Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
@@ -658,40 +658,40 @@ msgstr ""
|
|||||||
"A túa cor ten mal contraste para un texto con fondo branco. Por favor, "
|
"A túa cor ten mal contraste para un texto con fondo branco. Por favor, "
|
||||||
"escolle un ton máis escuro."
|
"escolle un ton máis escuro."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Consultar unha procura"
|
msgstr "Consultar unha procura"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Todos"
|
msgstr "Todos"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Ningún"
|
msgstr "Ningún"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Soamente seleccionados"
|
msgstr "Soamente seleccionados"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Usar un nome diferente internamente"
|
msgstr "Usar un nome diferente internamente"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Click para cerrar"
|
msgstr "Click para cerrar"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Tes cambios sen gardar!"
|
msgstr "Tes cambios sen gardar!"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2021-09-24 13:54+0000\n"
|
"PO-Revision-Date: 2021-09-24 13:54+0000\n"
|
||||||
"Last-Translator: ofirtro <ofir.tro@gmail.com>\n"
|
"Last-Translator: ofirtro <ofir.tro@gmail.com>\n"
|
||||||
"Language-Team: Hebrew <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: Hebrew <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
@@ -630,40 +630,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2024-01-31 04:00+0000\n"
|
"PO-Revision-Date: 2024-01-31 04:00+0000\n"
|
||||||
"Last-Translator: Pavle Ergović <pavleergovic@gmail.com>\n"
|
"Last-Translator: Pavle Ergović <pavleergovic@gmail.com>\n"
|
||||||
"Language-Team: Croatian <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Croatian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
@@ -624,40 +624,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,11 +7,11 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2024-10-01 22:52+0000\n"
|
"PO-Revision-Date: 2024-10-01 22:52+0000\n"
|
||||||
"Last-Translator: Patrick Chilton <chpatrick@gmail.com>\n"
|
"Last-Translator: Patrick Chilton <chpatrick@gmail.com>\n"
|
||||||
"Language-Team: Hungarian <https://translate.pretix.eu/projects/pretix/"
|
"Language-Team: Hungarian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
"pretix-js/hu/>\n"
|
"js/hu/>\n"
|
||||||
"Language: hu\n"
|
"Language: hu\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
@@ -671,40 +671,40 @@ msgstr ""
|
|||||||
"A választott színek kontrasztja elégtelen, kérjük válassz sötétebb "
|
"A választott színek kontrasztja elégtelen, kérjük válassz sötétebb "
|
||||||
"árnyalatot."
|
"árnyalatot."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Összes"
|
msgstr "Összes"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Semmi"
|
msgstr "Semmi"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Használj másik nevet"
|
msgstr "Használj másik nevet"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Bezárásért kattints"
|
msgstr "Bezárásért kattints"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Mentetlen változtatások!"
|
msgstr "Mentetlen változtatások!"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2023-09-20 14:01+0000\n"
|
"PO-Revision-Date: 2023-09-20 14:01+0000\n"
|
||||||
"Last-Translator: Mahdia Aliyy <mahdlyy.k@gmail.com>\n"
|
"Last-Translator: Mahdia Aliyy <mahdlyy.k@gmail.com>\n"
|
||||||
"Language-Team: Indonesian <https://translate.pretix.eu/projects/pretix/"
|
"Language-Team: Indonesian <https://translate.pretix.eu/projects/pretix/"
|
||||||
@@ -657,40 +657,40 @@ msgstr ""
|
|||||||
"Warna Anda memiliki kontras yang buruk untuk teks dengan latar belakang "
|
"Warna Anda memiliki kontras yang buruk untuk teks dengan latar belakang "
|
||||||
"putih, harap pilih warna yang lebih gelap."
|
"putih, harap pilih warna yang lebih gelap."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Permintaan pencarian"
|
msgstr "Permintaan pencarian"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Semua"
|
msgstr "Semua"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Tidak ada"
|
msgstr "Tidak ada"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Hanya dipilih"
|
msgstr "Hanya dipilih"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Gunakan nama yang berbeda secara internal"
|
msgstr "Gunakan nama yang berbeda secara internal"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Klik untuk menutup"
|
msgstr "Klik untuk menutup"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Anda memiliki perubahan yang belum disimpan!"
|
msgstr "Anda memiliki perubahan yang belum disimpan!"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2023-05-18 01:00+0000\n"
|
"PO-Revision-Date: 2023-05-18 01:00+0000\n"
|
||||||
"Last-Translator: M C <micasadmail@gmail.com>\n"
|
"Last-Translator: M C <micasadmail@gmail.com>\n"
|
||||||
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
@@ -652,40 +652,40 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Il colore scelto non ha un buon contrasto, per favore scegline uno più scuro."
|
"Il colore scelto non ha un buon contrasto, per favore scegline uno più scuro."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Chiave di ricerca"
|
msgstr "Chiave di ricerca"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Tutto"
|
msgstr "Tutto"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Nessuno"
|
msgstr "Nessuno"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Solo i selezionati"
|
msgstr "Solo i selezionati"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Utilizza un nome diverso internamente"
|
msgstr "Utilizza un nome diverso internamente"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Clicca per chiudere"
|
msgstr "Clicca per chiudere"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Hai cambiamenti non salvati!"
|
msgstr "Hai cambiamenti non salvati!"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2022-03-15 00:00+0000\n"
|
"PO-Revision-Date: 2022-03-15 00:00+0000\n"
|
||||||
"Last-Translator: Yuriko Matsunami <y.matsunami@enobyte.com>\n"
|
"Last-Translator: Yuriko Matsunami <y.matsunami@enobyte.com>\n"
|
||||||
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
@@ -654,40 +654,40 @@ msgstr ""
|
|||||||
"このテキストカラーは白い背景とのコントラストがよくありません。暗い色に選び直"
|
"このテキストカラーは白い背景とのコントラストがよくありません。暗い色に選び直"
|
||||||
"してください。"
|
"してください。"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "検索ワード"
|
msgstr "検索ワード"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "全"
|
msgstr "全"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "ない"
|
msgstr "ない"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "選択したもののみ"
|
msgstr "選択したもののみ"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "内部で別の名前を使用してください"
|
msgstr "内部で別の名前を使用してください"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "クリックして閉じる"
|
msgstr "クリックして閉じる"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "保存されていない変更があります!"
|
msgstr "保存されていない変更があります!"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@@ -622,40 +622,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@@ -624,40 +624,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2022-04-06 03:00+0000\n"
|
"PO-Revision-Date: 2022-04-06 03:00+0000\n"
|
||||||
"Last-Translator: Liga V <lerning_by_dreaming@gmx.de>\n"
|
"Last-Translator: Liga V <lerning_by_dreaming@gmx.de>\n"
|
||||||
"Language-Team: Latvian <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Latvian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
@@ -661,40 +661,40 @@ msgstr ""
|
|||||||
"Izvēlētā krāsa tekstam neizceļas uz esošā fona, lūdzu, izvēlieties tumšāku "
|
"Izvēlētā krāsa tekstam neizceļas uz esošā fona, lūdzu, izvēlieties tumšāku "
|
||||||
"krāsu."
|
"krāsu."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Meklēšanas pieprasījums"
|
msgstr "Meklēšanas pieprasījums"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Visi"
|
msgstr "Visi"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Neviens"
|
msgstr "Neviens"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Tikai atzīmētos"
|
msgstr "Tikai atzīmētos"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Izmantojiet citu nosaukumu iekšēji"
|
msgstr "Izmantojiet citu nosaukumu iekšēji"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Noklikšķiniet, lai aizvērtu"
|
msgstr "Noklikšķiniet, lai aizvērtu"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Jums ir nesaglabātas izmaiņas!"
|
msgstr "Jums ir nesaglabātas izmaiņas!"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@@ -622,40 +622,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2024-03-10 03:00+0000\n"
|
"PO-Revision-Date: 2024-03-10 03:00+0000\n"
|
||||||
"Last-Translator: fyksen <fredrik@fyksen.me>\n"
|
"Last-Translator: fyksen <fredrik@fyksen.me>\n"
|
||||||
"Language-Team: Norwegian Bokmål <https://translate.pretix.eu/projects/pretix/"
|
"Language-Team: Norwegian Bokmål <https://translate.pretix.eu/projects/pretix/"
|
||||||
@@ -641,40 +641,40 @@ msgid ""
|
|||||||
"darker shade."
|
"darker shade."
|
||||||
msgstr "Fargen du valgte har dårlig kontrast mot hvit, velg en mørkere farge."
|
msgstr "Fargen du valgte har dårlig kontrast mot hvit, velg en mørkere farge."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Søkeord"
|
msgstr "Søkeord"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Ingen"
|
msgstr "Ingen"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Kun valgte"
|
msgstr "Kun valgte"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Bruk et annet navn internt"
|
msgstr "Bruk et annet navn internt"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Klikk for å lukke"
|
msgstr "Klikk for å lukke"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Du har ikke-lagrede endringer!"
|
msgstr "Du har ikke-lagrede endringer!"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -6,9 +6,9 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: 1\n"
|
"Project-Id-Version: 1\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2023-11-14 23:00+0000\n"
|
"PO-Revision-Date: 2024-10-23 14:30+0000\n"
|
||||||
"Last-Translator: Thomas Vranken <thvranken@gmail.com>\n"
|
"Last-Translator: arjan-s <github@anymore.nl>\n"
|
||||||
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
"nl/>\n"
|
"nl/>\n"
|
||||||
"Language: nl\n"
|
"Language: nl\n"
|
||||||
@@ -16,7 +16,7 @@ msgstr ""
|
|||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
"X-Generator: Weblate 5.1.1\n"
|
"X-Generator: Weblate 5.7.2\n"
|
||||||
|
|
||||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
#: 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:62
|
||||||
@@ -78,10 +78,8 @@ msgid "SOFORT"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:46
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:46
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Yes"
|
|
||||||
msgid "eps"
|
msgid "eps"
|
||||||
msgstr "Ja"
|
msgstr "eps"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:47
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:47
|
||||||
msgid "MyBank"
|
msgid "MyBank"
|
||||||
@@ -315,11 +313,11 @@ msgstr "Bestelling geannuleerd"
|
|||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:66
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:66
|
||||||
msgid "Ticket code is ambiguous on list"
|
msgid "Ticket code is ambiguous on list"
|
||||||
msgstr ""
|
msgstr "Ticket-code op de lijst is niet eenduidig"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:67
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:67
|
||||||
msgid "Order not approved"
|
msgid "Order not approved"
|
||||||
msgstr ""
|
msgstr "Bestelling niet goedgekeurd"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:68
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:68
|
||||||
msgid "Checked-in Tickets"
|
msgid "Checked-in Tickets"
|
||||||
@@ -456,7 +454,7 @@ msgstr "Productvariant"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:107
|
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:107
|
||||||
msgid "Gate"
|
msgid "Gate"
|
||||||
msgstr ""
|
msgstr "Ingang"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:111
|
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:111
|
||||||
msgid "Current date and time"
|
msgid "Current date and time"
|
||||||
@@ -654,40 +652,40 @@ msgstr ""
|
|||||||
"Uw kleur heeft een slecht contrast voor tekst op een witte achtergrond, kies "
|
"Uw kleur heeft een slecht contrast voor tekst op een witte achtergrond, kies "
|
||||||
"een donkerdere kleur."
|
"een donkerdere kleur."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Zoekopdracht"
|
msgstr "Zoekopdracht"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Geen"
|
msgstr "Geen"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Alleen geselecteerde"
|
msgstr "Alleen geselecteerde"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Gebruik intern een andere naam"
|
msgstr "Gebruik intern een andere naam"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Klik om te sluiten"
|
msgstr "Klik om te sluiten"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "U heeft nog niet opgeslagen wijzigingen!"
|
msgstr "U heeft nog niet opgeslagen wijzigingen!"
|
||||||
|
|
||||||
@@ -779,7 +777,7 @@ msgstr ""
|
|||||||
#: pretix/static/pretixpresale/js/widget/widget.js:19
|
#: pretix/static/pretixpresale/js/widget/widget.js:19
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Price"
|
msgid "Price"
|
||||||
msgstr ""
|
msgstr "Prijs"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:20
|
#: pretix/static/pretixpresale/js/widget/widget.js:20
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
@@ -789,19 +787,16 @@ msgid "Select"
|
|||||||
msgstr "Alleen geselecteerde"
|
msgstr "Alleen geselecteerde"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:21
|
#: pretix/static/pretixpresale/js/widget/widget.js:21
|
||||||
#, fuzzy, javascript-format
|
#, javascript-format
|
||||||
#| msgid "Selected only"
|
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Select %s"
|
msgid "Select %s"
|
||||||
msgstr "Alleen geselecteerde"
|
msgstr "Selecteer %s"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:22
|
#: pretix/static/pretixpresale/js/widget/widget.js:22
|
||||||
#, fuzzy, javascript-format
|
#, javascript-format
|
||||||
#| msgctxt "widget"
|
|
||||||
#| msgid "See variations"
|
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Select variant %s"
|
msgid "Select variant %s"
|
||||||
msgstr "Zie variaties"
|
msgstr "Selecteer variant %s"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:23
|
#: pretix/static/pretixpresale/js/widget/widget.js:23
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2021-08-05 04:00+0000\n"
|
"PO-Revision-Date: 2021-08-05 04:00+0000\n"
|
||||||
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
|
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
|
||||||
"Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/"
|
"Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/"
|
||||||
@@ -659,40 +659,40 @@ msgstr ""
|
|||||||
"Je kleur heeft een slecht contrast voor tekst op een witte achtergrond, kies "
|
"Je kleur heeft een slecht contrast voor tekst op een witte achtergrond, kies "
|
||||||
"een donkerdere kleur."
|
"een donkerdere kleur."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Zoekopdracht"
|
msgstr "Zoekopdracht"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Geen"
|
msgstr "Geen"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Alleen geselecteerde"
|
msgstr "Alleen geselecteerde"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Gebruik intern een andere naam"
|
msgstr "Gebruik intern een andere naam"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Klik om te sluiten"
|
msgstr "Klik om te sluiten"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Je hebt nog niet opgeslagen wijzigingen!"
|
msgstr "Je hebt nog niet opgeslagen wijzigingen!"
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2024-08-27 13:34+0000\n"
|
"POT-Creation-Date: 2024-10-15 11:06+0000\n"
|
||||||
"PO-Revision-Date: 2024-08-28 10:03+0000\n"
|
"PO-Revision-Date: 2024-08-28 10:03+0000\n"
|
||||||
"Last-Translator: Anarion Dunedain <anarion80@gmail.com>\n"
|
"Last-Translator: Anarion Dunedain <anarion80@gmail.com>\n"
|
||||||
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
@@ -641,40 +641,40 @@ msgstr ""
|
|||||||
"Wybrany kolor ma za słaby kontrast dla tekstu na białym tle, prosimy wybrać "
|
"Wybrany kolor ma za słaby kontrast dla tekstu na białym tle, prosimy wybrać "
|
||||||
"ciemniejszy odcień."
|
"ciemniejszy odcień."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:491
|
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:511
|
#: pretix/static/pretixcontrol/js/ui/main.js:515
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Wyszukiwana fraza"
|
msgstr "Wyszukiwana fraza"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:509
|
#: pretix/static/pretixcontrol/js/ui/main.js:513
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Zaznacz wszystko"
|
msgstr "Zaznacz wszystko"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:510
|
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Odznacz wszystko"
|
msgstr "Odznacz wszystko"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:514
|
#: pretix/static/pretixcontrol/js/ui/main.js:518
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Tylko wybrane"
|
msgstr "Tylko wybrane"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:847
|
#: pretix/static/pretixcontrol/js/ui/main.js:861
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr "Wprowadź numer strony między 1 a %(max)s."
|
msgstr "Wprowadź numer strony między 1 a %(max)s."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:850
|
#: pretix/static/pretixcontrol/js/ui/main.js:864
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr "Niepoprawny numer strony."
|
msgstr "Niepoprawny numer strony."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1008
|
#: pretix/static/pretixcontrol/js/ui/main.js:1022
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Użyj innej nazwy wewnętrznie"
|
msgstr "Użyj innej nazwy wewnętrznie"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1048
|
#: pretix/static/pretixcontrol/js/ui/main.js:1062
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Zamknij"
|
msgstr "Zamknij"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1137
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Masz niezapisane zmiany!"
|
msgstr "Masz niezapisane zmiany!"
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user