mirror of
https://github.com/pretix/pretix.git
synced 2026-08-20 12:26:27 +00:00
Compare commits
86
Commits
fix_expand
...
v2026.4.5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2b0fa713b8 | ||
|
|
01cb860a75 | ||
|
|
53f98d9704 | ||
|
|
9515b4614e | ||
|
|
50709c1efe | ||
|
|
2923799b0a | ||
|
|
690c462d95 | ||
|
|
fb15d5d61d | ||
|
|
721ad93edd | ||
|
|
c96240834b | ||
|
|
393fc2b73b | ||
|
|
39ee4f0663 | ||
|
|
49452db739 | ||
|
|
327d69f6d3 | ||
|
|
d5fa817623 | ||
|
|
a5f1296934 | ||
|
|
866a5cde42 | ||
|
|
f88a560d5f | ||
|
|
4019f956a8 | ||
|
|
c75c847393 | ||
|
|
4e3d3b1f22 | ||
|
|
75c8f97080 | ||
|
|
10789f097d | ||
|
|
1adec102e6 | ||
|
|
921fd801e5 | ||
|
|
448d2e70d5 | ||
|
|
49f692c666 | ||
|
|
2d31c62812 | ||
|
|
08df3d828d | ||
|
|
96e10bcd71 | ||
|
|
ff434f4384 | ||
|
|
653f83fc90 | ||
|
|
d6fe29210a | ||
|
|
a13bb630d5 | ||
|
|
fd0b3bac3c | ||
|
|
7f6b5d7331 | ||
|
|
27398c08c7 | ||
|
|
c061179f37 | ||
|
|
bd90badc54 | ||
|
|
90800f219b | ||
|
|
4767cb38fc | ||
|
|
8fd366be76 | ||
|
|
75660600f4 | ||
|
|
217744a9f2 | ||
|
|
1c7ce4b1ca | ||
|
|
8426a68760 | ||
|
|
1157e2aeed | ||
|
|
771f4f5d1e | ||
|
|
496591bb3b | ||
|
|
88165c098e | ||
|
|
82a14a4f83 | ||
|
|
ff77a2125a | ||
|
|
97904d8567 | ||
|
|
a6a9eb6a6a | ||
|
|
b000dff134 | ||
|
|
ba75de7e7d | ||
|
|
35e1df28d9 | ||
|
|
7e457f7430 | ||
|
|
5faa85ed40 | ||
|
|
1b88a84a83 | ||
|
|
447cffa7a8 | ||
|
|
6d255bb9cc | ||
|
|
4fe405886e | ||
|
|
b7d3e8a80a | ||
|
|
d0d76ffddc | ||
|
|
c04be5c0d9 | ||
|
|
ee1a8420a5 | ||
|
|
d9000c2a66 | ||
|
|
4530d864d3 | ||
|
|
b968266611 | ||
|
|
640518c1b3 | ||
|
|
0715144a31 | ||
|
|
58ea7c8656 | ||
|
|
a8fe6f505e | ||
|
|
baeec92203 | ||
|
|
2f9ac05184 | ||
|
|
4beea63b49 | ||
|
|
5e49df0ef6 | ||
|
|
b3bb9fccb5 | ||
|
|
e3ffd66691 | ||
|
|
0f2ebb8687 | ||
|
|
efd887b439 | ||
|
|
8690d65e99 | ||
|
|
5682d3ed56 | ||
|
|
059ff6c99b | ||
|
|
f46fc7fa69 |
+3
-2
@@ -10,9 +10,10 @@ tests:
|
|||||||
- cd src
|
- cd src
|
||||||
- python manage.py check
|
- python manage.py check
|
||||||
- make all compress
|
- make all compress
|
||||||
|
- playwright install
|
||||||
- PRETIX_CONFIG_FILE=tests/ci_sqlite.cfg py.test -n 3 tests --maxfail=100
|
- PRETIX_CONFIG_FILE=tests/ci_sqlite.cfg py.test -n 3 tests --maxfail=100
|
||||||
except:
|
except:
|
||||||
- pypi
|
- '/^v.*$/'
|
||||||
pypi:
|
pypi:
|
||||||
stage: release
|
stage: release
|
||||||
image:
|
image:
|
||||||
@@ -35,7 +36,7 @@ pypi:
|
|||||||
- twine check dist/*
|
- twine check dist/*
|
||||||
- twine upload dist/*
|
- twine upload dist/*
|
||||||
only:
|
only:
|
||||||
- pypi
|
- '/^v.*$/'
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- src/dist/
|
- src/dist/
|
||||||
|
|||||||
+10
-5
@@ -1,11 +1,16 @@
|
|||||||
Contributing to pretix
|
Contributing to pretix
|
||||||
======================
|
======================
|
||||||
|
|
||||||
Hey there and welcome to pretix!
|
Welcome to pretix, we are happy that you would like to contribute.
|
||||||
|
Before you do so, please make sure to read the following documents:
|
||||||
|
|
||||||
* We've got a contributors guide in [our documentation](https://docs.pretix.eu/dev/development/contribution/) together with notes on the [development setup](https://docs.pretix.eu/dev/development/setup.html).
|
- [Contribution workflow](https://docs.pretix.eu/dev/development/contribution/general.html)
|
||||||
|
- [AI-assisted contribution policy](https://docs.pretix.eu/dev/development/contribution/ai.html)
|
||||||
|
- [Coding style and quality](https://docs.pretix.eu/dev/development/contribution/style.html)
|
||||||
|
- [Development setup](https://docs.pretix.eu/dev/development/setup.html)
|
||||||
|
- [Code of Conduct](https://docs.pretix.eu/dev/development/contribution/codeofconduct.html)
|
||||||
|
|
||||||
* Please note that we have a [Code of Conduct](https://docs.pretix.eu/dev/development/contribution/codeofconduct.html) in place that applies to all project contributions, including issues, pull requests, etc.
|
Before we can accept your first PR we'll need you to sign [our **Contributor License Agreement** (CLA)](https://pretix.eu/about/en/cla).
|
||||||
|
You can find more information about the how and why in our [License FAQ](https://docs.pretix.eu/trust/licensing/faq/) and in our [license change blog post](https://pretix.eu/about/en/blog/20210412-license/).
|
||||||
* Before we can accept a PR from you we'll need you to sign [our CLA](https://pretix.eu/about/en/cla). You can find more information about the how and why in our [License FAQ](https://docs.pretix.eu/trust/licensing/faq/) and in our [license change blog post](https://pretix.eu/about/en/blog/20210412-license/).
|
|
||||||
|
|
||||||
|
**Before contributing new functionality, always open a discussion first.**
|
||||||
@@ -31,6 +31,7 @@ RUN apt-get update && \
|
|||||||
mkdir /etc/pretix && \
|
mkdir /etc/pretix && \
|
||||||
mkdir /data && \
|
mkdir /data && \
|
||||||
useradd -ms /bin/bash -d /pretix -u 15371 pretixuser && \
|
useradd -ms /bin/bash -d /pretix -u 15371 pretixuser && \
|
||||||
|
chmod 0755 /pretix && \
|
||||||
echo 'pretixuser ALL=(ALL) NOPASSWD:SETENV: /usr/bin/supervisord' >> /etc/sudoers && \
|
echo 'pretixuser ALL=(ALL) NOPASSWD:SETENV: /usr/bin/supervisord' >> /etc/sudoers && \
|
||||||
mkdir /static && \
|
mkdir /static && \
|
||||||
mkdir /etc/supervisord
|
mkdir /etc/supervisord
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
.. _`aipolicy`:
|
||||||
|
|
||||||
|
AI-assisted contribution policy
|
||||||
|
===============================
|
||||||
|
|
||||||
|
pretix is maintained by humans.
|
||||||
|
Every discussion, issue, and pull request is read and reviewed by humans (and sometimes machines, too).
|
||||||
|
We ask you to respect the time and effort put in by these humans by not sending low-effort, unqualified work, since it puts the burden of validation on the maintainer.
|
||||||
|
|
||||||
|
Therefore, the pretix project has strict rules for AI usage:
|
||||||
|
|
||||||
|
- **All AI usage in any form must be disclosed.** You must state the tool you used (e.g. Claude Code, Cursor, Amp) along with the extent that the work was AI-assisted.
|
||||||
|
|
||||||
|
- **The human-in-the-loop must fully understand all code.** If you can't explain what your changes do and how they interact with the greater system without the aid of AI tools, do not contribute to this project.
|
||||||
|
|
||||||
|
- **Issues and discussions can use AI assistance but must have a full human-in-the-loop.** This means that any content generated with AI must have been reviewed and edited by a human before submission. AI is very good at being overly verbose and including noise that distracts from the main point. Humans must do their research and trim this down.
|
||||||
|
|
||||||
|
- **No AI-generated media is allowed (art, images, videos, audio, etc.).** Text and code are the only acceptable AI-generated content, per the other rules in this policy.
|
||||||
|
|
||||||
|
- **Bad AI drivers will be excluded from the project.** People who produce bad contributions that are clearly AI (slop) will be blocked from our organization without warning.
|
||||||
|
|
||||||
|
This policy was inspired by the `ghostty project`_.
|
||||||
|
|
||||||
|
.. _ghostty project: https://github.com/ghostty-org/ghostty/blob/main/AI_POLICY.md
|
||||||
@@ -1,23 +1,39 @@
|
|||||||
General remarks
|
Contribution workflow
|
||||||
===============
|
=====================
|
||||||
|
|
||||||
You are interested in contributing to pretix? That is awesome!
|
You are interested in contributing to pretix? That is awesome!
|
||||||
|
|
||||||
If you’re new to contributing to open source software, don’t be afraid. We’ll happily review your code and give you
|
If you’re new to contributing to open source software, don’t be afraid. We’ll happily review your code and give you
|
||||||
constructive and friendly feedback on your changes.
|
constructive and friendly feedback on your changes. Every contribution should go through the following steps.
|
||||||
|
|
||||||
First of all, you'll need pretix running locally on your machine. Head over to :ref:`devsetup` to learn how to do this.
|
Discussion & Design
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
pretix is a large and mature project with more of a decade of history and hopefully many more decades to come.
|
||||||
|
Keeping pretix in good shape over long timeframes is first and foremost a fight against complexity.
|
||||||
|
With every additional feature, complexity grows, and both features and complexity are hard to remove.
|
||||||
|
|
||||||
|
Even if you are doing the initial work of the contribution, accepting the contribution is not free for us.
|
||||||
|
Not only will we need to maintain the feature, but every feature adds cost to the maintenance of every other feature it interacts with, and every feature adds effort for users to understand how pretix works.
|
||||||
|
Therefore, we must carefully select what features we add, based on how well they fit the system in general and of how much use they will be to our larger user base.
|
||||||
|
|
||||||
|
We strongly ask you to **create a discussion on GitHub for every new feature idea** outlining the use case and the proposed implementation design.
|
||||||
|
Pull requests without prior discussion will likely just be closed.
|
||||||
|
|
||||||
|
For bug fixes and very minor changes, you can skip this step and open a PR right away.
|
||||||
|
|
||||||
|
Development
|
||||||
|
-----------
|
||||||
|
|
||||||
|
To develop your contribution, you'll need pretix running locally on your machine. Head over to :ref:`devsetup` to learn how to do this.
|
||||||
If you run into any problems on your way, please do not hesitate to ask us anytime!
|
If you run into any problems on your way, please do not hesitate to ask us anytime!
|
||||||
|
|
||||||
Please note that we bound ourselves to a :ref:`coc` that applies to all communication around the project. You can be
|
While developing, please have a look at our :ref:`aipolicy` and our guidelines on :ref:`codestyle`.
|
||||||
assured that we will not tolerate any form of harassment.
|
|
||||||
|
|
||||||
Sending a patch
|
Sending a patch
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
If you improved pretix in any way, we'd be very happy if you contribute it
|
Once you have a first draft of your changes, please `create a pull request`_ on our `GitHub repository`_.
|
||||||
back to the main code base! The easiest way to do so is to `create a pull request`_
|
|
||||||
on our `GitHub repository`_.
|
|
||||||
|
|
||||||
We recommend that you create a feature branch for every issue you work on so the changes can
|
We recommend that you create a feature branch for every issue you work on so the changes can
|
||||||
be reviewed individually.
|
be reviewed individually.
|
||||||
@@ -25,14 +41,17 @@ Please use the test suite to check whether your changes break any existing featu
|
|||||||
the code style checks to confirm you are consistent with pretix's coding style. You'll
|
the code style checks to confirm you are consistent with pretix's coding style. You'll
|
||||||
find instructions on this in the :ref:`checksandtests` section of the development setup guide.
|
find instructions on this in the :ref:`checksandtests` section of the development setup guide.
|
||||||
|
|
||||||
We automatically run the tests and the code style check on every pull request on Travis CI and we won’t
|
We automatically run the tests and the code style check on every pull request through GitHub Actions and we won’t
|
||||||
accept any pull requests without all tests passing. However, if you don't find out *why* they are not passing,
|
accept any pull requests without all tests passing. However, if you don't find out *why* they are not passing,
|
||||||
just send the pull request and tell us – we'll be glad to help.
|
just send the pull request and tell us – we'll be glad to help.
|
||||||
|
|
||||||
If you add a new feature, please include appropriate documentation into your patch. If you fix a bug,
|
If you add a new feature, please include appropriate documentation into your patch. If you fix a bug,
|
||||||
please include a regression test, i.e. a test that fails without your changes and passes after applying your changes.
|
please include a regression test, i.e. a test that fails without your changes and passes after applying your changes.
|
||||||
|
|
||||||
Again: If you get stuck, do not hesitate to contact any of us, or Raphael personally at mail@raphaelmichel.de.
|
Again: If you get stuck, do not hesitate to contact us through GitHub discussions.
|
||||||
|
|
||||||
|
Please note that we bound ourselves to a :ref:`coc` that applies to all communication around the project. You can be
|
||||||
|
assured that we will not tolerate any form of harassment.
|
||||||
|
|
||||||
.. _create a pull request: https://help.github.com/articles/creating-a-pull-request/
|
.. _create a pull request: https://help.github.com/articles/creating-a-pull-request/
|
||||||
.. _GitHub repository: https://github.com/pretix/pretix
|
.. _GitHub repository: https://github.com/pretix/pretix
|
||||||
|
|||||||
@@ -6,4 +6,5 @@ Contributing to pretix
|
|||||||
|
|
||||||
general
|
general
|
||||||
style
|
style
|
||||||
|
ai
|
||||||
codeofconduct
|
codeofconduct
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
.. spelling:word-list:: Rebase rebasing
|
.. spelling:word-list:: Rebase rebasing
|
||||||
|
|
||||||
|
.. _`codestyle`:
|
||||||
|
|
||||||
Coding style and quality
|
Coding style and quality
|
||||||
========================
|
========================
|
||||||
|
|
||||||
@@ -28,8 +30,6 @@ Code
|
|||||||
Commits and Pull Requests
|
Commits and Pull Requests
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Most commits should start as pull requests, therefore this applies to the titles of pull requests as well since
|
Most commits should start as pull requests, therefore this applies to the titles of pull requests as well since
|
||||||
the pull request title will become the commit message on merge. We prefer merging with GitHub's "Squash and merge"
|
the pull request title will become the commit message on merge. We prefer merging with GitHub's "Squash and merge"
|
||||||
feature if the PR contains multiple commits that do not carry value to keep. If there is value in keeping the
|
feature if the PR contains multiple commits that do not carry value to keep. If there is value in keeping the
|
||||||
|
|||||||
+5
-5
@@ -33,9 +33,9 @@ dependencies = [
|
|||||||
"bleach==6.3.*",
|
"bleach==6.3.*",
|
||||||
"celery==5.6.*",
|
"celery==5.6.*",
|
||||||
"chardet==5.2.*",
|
"chardet==5.2.*",
|
||||||
"cryptography>=44.0.0",
|
"cryptography>=47.0.0",
|
||||||
"css-inline==0.20.*",
|
"css-inline==0.20.*",
|
||||||
"defusedcsv>=1.1.0",
|
"defusedcsv>=3.0.0",
|
||||||
"dnspython==2.*",
|
"dnspython==2.*",
|
||||||
"Django[argon2]==5.2.*",
|
"Django[argon2]==5.2.*",
|
||||||
"django-bootstrap3==26.1",
|
"django-bootstrap3==26.1",
|
||||||
@@ -93,11 +93,11 @@ dependencies = [
|
|||||||
"redis==7.4.*",
|
"redis==7.4.*",
|
||||||
"reportlab==4.4.*",
|
"reportlab==4.4.*",
|
||||||
"requests==2.32.*",
|
"requests==2.32.*",
|
||||||
"sentry-sdk==2.57.*",
|
"sentry-sdk==2.58.*",
|
||||||
"sepaxml==2.7.*",
|
"sepaxml==2.7.*",
|
||||||
"stripe==7.9.*",
|
"stripe==7.9.*",
|
||||||
"text-unidecode==1.*",
|
"text-unidecode==1.*",
|
||||||
"tlds>=2020041600",
|
"tlds>=2026041800",
|
||||||
"tqdm==4.*",
|
"tqdm==4.*",
|
||||||
"ua-parser==1.0.*",
|
"ua-parser==1.0.*",
|
||||||
"vobject==0.9.*",
|
"vobject==0.9.*",
|
||||||
@@ -117,7 +117,7 @@ dev = [
|
|||||||
"isort==8.0.*",
|
"isort==8.0.*",
|
||||||
"pep8-naming==0.15.*",
|
"pep8-naming==0.15.*",
|
||||||
"potypo",
|
"potypo",
|
||||||
"pytest-asyncio>=0.24",
|
"pytest-asyncio>=1.3.0",
|
||||||
"pytest-cache",
|
"pytest-cache",
|
||||||
"pytest-cov",
|
"pytest-cov",
|
||||||
"pytest-django==4.*",
|
"pytest-django==4.*",
|
||||||
|
|||||||
@@ -19,4 +19,4 @@
|
|||||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
# 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/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
__version__ = "2026.4.0.dev0"
|
__version__ = "2026.4.5"
|
||||||
|
|||||||
@@ -31,7 +31,9 @@ from pretix.api.serializers.order import OrderPositionSerializer
|
|||||||
from pretix.api.serializers.organizer import (
|
from pretix.api.serializers.organizer import (
|
||||||
CustomerSerializer, GiftCardSerializer,
|
CustomerSerializer, GiftCardSerializer,
|
||||||
)
|
)
|
||||||
from pretix.base.models import Order, OrderPosition, ReusableMedium
|
from pretix.base.models import (
|
||||||
|
Device, Order, OrderPosition, ReusableMedium, TeamAPIToken,
|
||||||
|
)
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -80,8 +82,7 @@ class ReusableMediaSerializer(I18nAwareModelSerializer):
|
|||||||
)
|
)
|
||||||
|
|
||||||
if 'linked_orderposition' in self.context['request'].query_params.getlist('expand'):
|
if 'linked_orderposition' in self.context['request'].query_params.getlist('expand'):
|
||||||
# No additional permission check performed, documented limitation of the permission system
|
# Permission Check performed in to_representation
|
||||||
# Would get to complex/unusable otherwise since the permission depends on the event
|
|
||||||
self.fields['linked_orderposition'] = NestedOrderPositionSerializer(read_only=True)
|
self.fields['linked_orderposition'] = NestedOrderPositionSerializer(read_only=True)
|
||||||
else:
|
else:
|
||||||
self.fields['linked_orderposition'] = serializers.PrimaryKeyRelatedField(
|
self.fields['linked_orderposition'] = serializers.PrimaryKeyRelatedField(
|
||||||
@@ -117,6 +118,27 @@ class ReusableMediaSerializer(I18nAwareModelSerializer):
|
|||||||
)
|
)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
def to_representation(self, instance):
|
||||||
|
r = super().to_representation(instance)
|
||||||
|
request = self.context.get('request')
|
||||||
|
# late permission evaluations for checks that depend on the actual linked events
|
||||||
|
expand_nested = self.context['request'].query_params.getlist('expand')
|
||||||
|
perm_holder = request.auth if isinstance(request.auth, (Device, TeamAPIToken)) else request.user
|
||||||
|
if 'linked_orderposition' in expand_nested:
|
||||||
|
if instance.linked_orderposition is not None:
|
||||||
|
event = instance.linked_orderposition.order.event
|
||||||
|
if not perm_holder.has_event_permission(event.organizer, event, 'event.orders:read', request):
|
||||||
|
r['linked_orderposition'] = {'id': instance.linked_orderposition.id}
|
||||||
|
|
||||||
|
if 'linked_giftcard.owner_ticket' in expand_nested:
|
||||||
|
gc = instance.linked_giftcard
|
||||||
|
if gc is not None and gc.owner_ticket is not None:
|
||||||
|
event = gc.owner_ticket.order.event
|
||||||
|
if not perm_holder.has_event_permission(event.organizer, event, 'event.orders:read', request):
|
||||||
|
r['linked_giftcard']['owner_ticket'] = {'id': instance.linked_giftcard.owner_ticket.id}
|
||||||
|
|
||||||
|
return r
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ReusableMedium
|
model = ReusableMedium
|
||||||
fields = (
|
fields = (
|
||||||
|
|||||||
@@ -286,6 +286,19 @@ class GiftCardSerializer(I18nAwareModelSerializer):
|
|||||||
)
|
)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
def to_representation(self, instance):
|
||||||
|
r = super().to_representation(instance)
|
||||||
|
request = self.context.get('request')
|
||||||
|
# late permission evaluations for checks that depend on the actual linked events
|
||||||
|
if 'owner_ticket' in self.context['request'].query_params.getlist('expand'):
|
||||||
|
owner_ticket = instance.owner_ticket
|
||||||
|
if owner_ticket:
|
||||||
|
event = owner_ticket.order.event
|
||||||
|
perm_holder = request.auth if isinstance(request.auth, (Device, TeamAPIToken)) else request.user
|
||||||
|
if not perm_holder.has_event_permission(event.organizer, event, 'event.orders:read', request):
|
||||||
|
r['owner_ticket'] = {'id': instance.owner_ticket.id}
|
||||||
|
return r
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = GiftCard
|
model = GiftCard
|
||||||
fields = ('id', 'secret', 'issuance', 'value', 'currency', 'testmode', 'expires', 'conditions', 'owner_ticket',
|
fields = ('id', 'secret', 'issuance', 'value', 'currency', 'testmode', 'expires', 'conditions', 'owner_ticket',
|
||||||
|
|||||||
@@ -381,12 +381,15 @@ class EventOrderViewSet(OrderViewSetMixin, viewsets.ModelViewSet):
|
|||||||
resp = HttpResponse(ct.file.file.read(), content_type='text/uri-list')
|
resp = HttpResponse(ct.file.file.read(), content_type='text/uri-list')
|
||||||
return resp
|
return resp
|
||||||
else:
|
else:
|
||||||
resp = FileResponse(ct.file.file, content_type=ct.type)
|
return FileResponse(
|
||||||
resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}{}"'.format(
|
ct.file.file,
|
||||||
self.request.event.slug.upper(), order.code,
|
filename='{}-{}-{}{}'.format(
|
||||||
provider.identifier, ct.extension
|
self.request.event.slug.upper(), order.code,
|
||||||
|
provider.identifier, ct.extension
|
||||||
|
),
|
||||||
|
as_attachment=True,
|
||||||
|
content_type=ct.type
|
||||||
)
|
)
|
||||||
return resp
|
|
||||||
|
|
||||||
@action(detail=True, methods=['POST'])
|
@action(detail=True, methods=['POST'])
|
||||||
def mark_paid(self, request, **kwargs):
|
def mark_paid(self, request, **kwargs):
|
||||||
@@ -1303,14 +1306,17 @@ class EventOrderPositionViewSet(OrderPositionViewSetMixin, viewsets.ModelViewSet
|
|||||||
raise NotFound()
|
raise NotFound()
|
||||||
|
|
||||||
ftype, ignored = mimetypes.guess_type(answer.file.name)
|
ftype, ignored = mimetypes.guess_type(answer.file.name)
|
||||||
resp = FileResponse(answer.file, content_type=ftype or 'application/binary')
|
return FileResponse(
|
||||||
resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}-{}"'.format(
|
answer.file,
|
||||||
self.request.event.slug.upper(),
|
filename='{}-{}-{}-{}'.format(
|
||||||
pos.order.code,
|
self.request.event.slug.upper(),
|
||||||
pos.positionid,
|
pos.order.code,
|
||||||
os.path.basename(answer.file.name).split('.', 1)[1]
|
pos.positionid,
|
||||||
|
os.path.basename(answer.file.name).split('.', 1)[1]
|
||||||
|
),
|
||||||
|
as_attachment=True,
|
||||||
|
content_type=ftype or 'application/binary'
|
||||||
)
|
)
|
||||||
return resp
|
|
||||||
|
|
||||||
@action(detail=True, url_name="printlog", url_path="printlog", methods=["POST"])
|
@action(detail=True, url_name="printlog", url_path="printlog", methods=["POST"])
|
||||||
def printlog(self, request, **kwargs):
|
def printlog(self, request, **kwargs):
|
||||||
@@ -1365,15 +1371,18 @@ class EventOrderPositionViewSet(OrderPositionViewSetMixin, viewsets.ModelViewSet
|
|||||||
if hasattr(image_file, 'seek'):
|
if hasattr(image_file, 'seek'):
|
||||||
image_file.seek(0)
|
image_file.seek(0)
|
||||||
|
|
||||||
resp = FileResponse(image_file, content_type=ftype or 'application/binary')
|
return FileResponse(
|
||||||
resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}-{}.{}"'.format(
|
image_file,
|
||||||
self.request.event.slug.upper(),
|
filename='{}-{}-{}-{}.{}'.format(
|
||||||
pos.order.code,
|
self.request.event.slug.upper(),
|
||||||
pos.positionid,
|
pos.order.code,
|
||||||
key,
|
pos.positionid,
|
||||||
extension,
|
key,
|
||||||
|
extension,
|
||||||
|
),
|
||||||
|
as_attachment=True,
|
||||||
|
content_type=ftype or 'application/binary'
|
||||||
)
|
)
|
||||||
return resp
|
|
||||||
|
|
||||||
@action(detail=True, url_name='download', url_path='download/(?P<output>[^/]+)')
|
@action(detail=True, url_name='download', url_path='download/(?P<output>[^/]+)')
|
||||||
def download(self, request, output, **kwargs):
|
def download(self, request, output, **kwargs):
|
||||||
@@ -1399,12 +1408,15 @@ class EventOrderPositionViewSet(OrderPositionViewSetMixin, viewsets.ModelViewSet
|
|||||||
resp = HttpResponse(ct.file.file.read(), content_type='text/uri-list')
|
resp = HttpResponse(ct.file.file.read(), content_type='text/uri-list')
|
||||||
return resp
|
return resp
|
||||||
else:
|
else:
|
||||||
resp = FileResponse(ct.file.file, content_type=ct.type)
|
return FileResponse(
|
||||||
resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}-{}{}"'.format(
|
ct.file.file,
|
||||||
self.request.event.slug.upper(), pos.order.code, pos.positionid,
|
filename='{}-{}-{}-{}{}'.format(
|
||||||
provider.identifier, ct.extension
|
self.request.event.slug.upper(), pos.order.code, pos.positionid,
|
||||||
|
provider.identifier, ct.extension
|
||||||
|
),
|
||||||
|
as_attachment=True,
|
||||||
|
content_type=ct.type
|
||||||
)
|
)
|
||||||
return resp
|
|
||||||
|
|
||||||
@action(detail=True, methods=['POST'])
|
@action(detail=True, methods=['POST'])
|
||||||
def regenerate_secrets(self, request, **kwargs):
|
def regenerate_secrets(self, request, **kwargs):
|
||||||
@@ -1986,9 +1998,12 @@ class InvoiceViewSet(viewsets.ReadOnlyModelViewSet):
|
|||||||
if not invoice.file:
|
if not invoice.file:
|
||||||
raise RetryException()
|
raise RetryException()
|
||||||
|
|
||||||
resp = FileResponse(invoice.file.file, content_type='application/pdf')
|
return FileResponse(
|
||||||
resp['Content-Disposition'] = 'attachment; filename="{}.pdf"'.format(invoice.number)
|
invoice.file.file,
|
||||||
return resp
|
filename='{}.pdf'.format(invoice.number),
|
||||||
|
as_attachment=True,
|
||||||
|
content_type='application/pdf'
|
||||||
|
)
|
||||||
|
|
||||||
@action(detail=True, methods=['POST'])
|
@action(detail=True, methods=['POST'])
|
||||||
def transmit(self, request, **kwargs):
|
def transmit(self, request, **kwargs):
|
||||||
|
|||||||
@@ -1103,13 +1103,25 @@ class PaymentListExporter(ListExporter):
|
|||||||
def iterate_list(self, form_data):
|
def iterate_list(self, form_data):
|
||||||
provider_names = dict(get_all_payment_providers())
|
provider_names = dict(get_all_payment_providers())
|
||||||
|
|
||||||
|
i_numbers = Invoice.objects.filter(
|
||||||
|
order=OuterRef('order_id'),
|
||||||
|
).values('order').annotate(
|
||||||
|
m=GroupConcat('full_invoice_no', delimiter=', ')
|
||||||
|
).values(
|
||||||
|
'm'
|
||||||
|
).order_by()
|
||||||
|
|
||||||
payments = OrderPayment.objects.filter(
|
payments = OrderPayment.objects.filter(
|
||||||
order__event__in=self.events,
|
order__event__in=self.events,
|
||||||
state__in=form_data.get('payment_states', [])
|
state__in=form_data.get('payment_states', [])
|
||||||
|
).annotate(
|
||||||
|
order_invoice_numbers=Subquery(i_numbers, output_field=CharField()),
|
||||||
).select_related('order').prefetch_related('order__event').order_by('created')
|
).select_related('order').prefetch_related('order__event').order_by('created')
|
||||||
refunds = OrderRefund.objects.filter(
|
refunds = OrderRefund.objects.filter(
|
||||||
order__event__in=self.events,
|
order__event__in=self.events,
|
||||||
state__in=form_data.get('refund_states', [])
|
state__in=form_data.get('refund_states', [])
|
||||||
|
).annotate(
|
||||||
|
order_invoice_numbers=Subquery(i_numbers, output_field=CharField()),
|
||||||
).select_related('order').prefetch_related('order__event').order_by('created')
|
).select_related('order').prefetch_related('order__event').order_by('created')
|
||||||
|
|
||||||
if form_data.get('end_date_range'):
|
if form_data.get('end_date_range'):
|
||||||
@@ -1135,6 +1147,7 @@ class PaymentListExporter(ListExporter):
|
|||||||
headers = [
|
headers = [
|
||||||
_('Event slug'), _('Order'), _('Payment ID'), _('Creation date'), _('Completion date'), _('Status'),
|
_('Event slug'), _('Order'), _('Payment ID'), _('Creation date'), _('Completion date'), _('Status'),
|
||||||
_('Status code'), _('Amount'), _('Payment method'), _('Comment'), _('Matching ID'), _('Payment details'),
|
_('Status code'), _('Amount'), _('Payment method'), _('Comment'), _('Matching ID'), _('Payment details'),
|
||||||
|
_('Invoice numbers'),
|
||||||
]
|
]
|
||||||
yield headers
|
yield headers
|
||||||
|
|
||||||
@@ -1172,6 +1185,7 @@ class PaymentListExporter(ListExporter):
|
|||||||
obj.comment if isinstance(obj, OrderRefund) else "",
|
obj.comment if isinstance(obj, OrderRefund) else "",
|
||||||
matching_id,
|
matching_id,
|
||||||
payment_details,
|
payment_details,
|
||||||
|
obj.order_invoice_numbers,
|
||||||
]
|
]
|
||||||
yield row
|
yield row
|
||||||
|
|
||||||
|
|||||||
@@ -61,18 +61,23 @@ class ReusableMediaExporter(OrganizerLevelExportMixin, ListExporter):
|
|||||||
yield headers
|
yield headers
|
||||||
yield self.ProgressSetTotal(total=media.count())
|
yield self.ProgressSetTotal(total=media.count())
|
||||||
|
|
||||||
|
can_read_giftcards = self.permission_holder.has_organizer_permission(self.organizer, 'organizer.giftcards:read')
|
||||||
|
|
||||||
for medium in media.iterator(chunk_size=1000):
|
for medium in media.iterator(chunk_size=1000):
|
||||||
row = [
|
giftcard_secret = medium.linked_giftcard.secret if medium.linked_giftcard_id else ''
|
||||||
|
if giftcard_secret and not can_read_giftcards:
|
||||||
|
giftcard_secret = giftcard_secret[:3] + "…"
|
||||||
|
|
||||||
|
yield [
|
||||||
medium.type,
|
medium.type,
|
||||||
medium.identifier,
|
medium.identifier,
|
||||||
_('Yes') if medium.active else _('No'),
|
_('Yes') if medium.active else _('No'),
|
||||||
date_format(medium.expires, 'SHORT_DATETIME_FORMAT') if medium.expires else '',
|
date_format(medium.expires, 'SHORT_DATETIME_FORMAT') if medium.expires else '',
|
||||||
medium.customer.identifier if medium.customer_id else '',
|
medium.customer.identifier if medium.customer_id else '',
|
||||||
f"{medium.linked_orderposition.order.code}-{medium.linked_orderposition.positionid}" if medium.linked_orderposition_id else '',
|
f"{medium.linked_orderposition.order.code}-{medium.linked_orderposition.positionid}" if medium.linked_orderposition_id else '',
|
||||||
medium.linked_giftcard.secret if medium.linked_giftcard_id else '',
|
giftcard_secret,
|
||||||
medium.notes,
|
medium.notes,
|
||||||
]
|
]
|
||||||
yield row
|
|
||||||
|
|
||||||
def get_filename(self):
|
def get_filename(self):
|
||||||
return f'{self.organizer.slug}_media'
|
return f'{self.organizer.slug}_media'
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ from pretix.base.settings import (
|
|||||||
COUNTRIES_WITH_STATE_IN_ADDRESS, COUNTRY_STATE_LABEL,
|
COUNTRIES_WITH_STATE_IN_ADDRESS, COUNTRY_STATE_LABEL,
|
||||||
PERSON_NAME_SALUTATIONS, PERSON_NAME_SCHEMES, PERSON_NAME_TITLE_GROUPS,
|
PERSON_NAME_SALUTATIONS, PERSON_NAME_SCHEMES, PERSON_NAME_TITLE_GROUPS,
|
||||||
)
|
)
|
||||||
from pretix.base.templatetags.rich_text import rich_text
|
from pretix.base.templatetags.rich_text import URL_RE, rich_text
|
||||||
from pretix.base.timemachine import time_machine_now
|
from pretix.base.timemachine import time_machine_now
|
||||||
from pretix.control.forms import (
|
from pretix.control.forms import (
|
||||||
ExtFileField, ExtValidationMixin, SizeValidationMixin, SplitDateTimeField,
|
ExtFileField, ExtValidationMixin, SizeValidationMixin, SplitDateTimeField,
|
||||||
@@ -227,9 +227,15 @@ class NamePartsFormField(forms.MultiValueField):
|
|||||||
# bots.
|
# bots.
|
||||||
r'^[^$€/%§{}<>~]*$',
|
r'^[^$€/%§{}<>~]*$',
|
||||||
message=_('Please do not use special characters in names.')
|
message=_('Please do not use special characters in names.')
|
||||||
|
),
|
||||||
|
RegexValidator(
|
||||||
|
URL_RE,
|
||||||
|
inverse_match=True,
|
||||||
|
message=_('Please do not use special characters in names.')
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
self.max_length = defaults['max_length']
|
||||||
self.scheme_name = kwargs.pop('scheme')
|
self.scheme_name = kwargs.pop('scheme')
|
||||||
self.titles = kwargs.pop('titles')
|
self.titles = kwargs.pop('titles')
|
||||||
self.scheme = PERSON_NAME_SCHEMES.get(self.scheme_name)
|
self.scheme = PERSON_NAME_SCHEMES.get(self.scheme_name)
|
||||||
@@ -287,7 +293,7 @@ class NamePartsFormField(forms.MultiValueField):
|
|||||||
if self.require_all_fields and not all(v for v in value):
|
if self.require_all_fields and not all(v for v in value):
|
||||||
raise forms.ValidationError(self.error_messages['incomplete'], code='required')
|
raise forms.ValidationError(self.error_messages['incomplete'], code='required')
|
||||||
|
|
||||||
if sum(len(v) for v in value.values() if v) > 250:
|
if sum(len(v) for v in value.values() if v) > (self.max_length or 250):
|
||||||
raise forms.ValidationError(_('Please enter a shorter name.'), code='max_length')
|
raise forms.ValidationError(_('Please enter a shorter name.'), code='max_length')
|
||||||
|
|
||||||
if value.get("salutation") == "empty":
|
if value.get("salutation") == "empty":
|
||||||
|
|||||||
@@ -22,9 +22,7 @@
|
|||||||
import datetime
|
import datetime
|
||||||
import logging
|
import logging
|
||||||
import math
|
import math
|
||||||
import re
|
|
||||||
import textwrap
|
import textwrap
|
||||||
import unicodedata
|
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
@@ -58,8 +56,8 @@ from pretix.base.services.currencies import SOURCE_NAMES
|
|||||||
from pretix.base.signals import register_invoice_renderers
|
from pretix.base.signals import register_invoice_renderers
|
||||||
from pretix.base.templatetags.money import money_filter
|
from pretix.base.templatetags.money import money_filter
|
||||||
from pretix.helpers.reportlab import (
|
from pretix.helpers.reportlab import (
|
||||||
FontFallbackParagraph, ThumbnailingImageReader, register_ttf_font_if_new,
|
FontFallbackParagraph, PlainTextParagraph, ThumbnailingImageReader,
|
||||||
reshaper,
|
normalize_text, register_ttf_font_if_new, reshaper,
|
||||||
)
|
)
|
||||||
from pretix.presale.style import get_fonts
|
from pretix.presale.style import get_fonts
|
||||||
|
|
||||||
@@ -259,18 +257,8 @@ class BaseReportlabInvoiceRenderer(BaseInvoiceRenderer):
|
|||||||
register_ttf_font_if_new(family + ' B I', finders.find(styles['bolditalic']['truetype']))
|
register_ttf_font_if_new(family + ' B I', finders.find(styles['bolditalic']['truetype']))
|
||||||
|
|
||||||
def _normalize(self, text):
|
def _normalize(self, text):
|
||||||
# reportlab does not support unicode combination characters
|
# alias kept for plugin compatibility
|
||||||
# It's important we do this before we use ArabicReshaper
|
return normalize_text(text)
|
||||||
text = unicodedata.normalize("NFKC", text)
|
|
||||||
|
|
||||||
# reportlab does not support RTL, ligature-heavy scripts like Arabic. Therefore, we use ArabicReshaper
|
|
||||||
# to resolve all ligatures and python-bidi to switch RTL texts.
|
|
||||||
try:
|
|
||||||
text = "<br />".join(get_display(reshaper.reshape(l)) for l in re.split("<br ?/>", text))
|
|
||||||
except:
|
|
||||||
logger.exception('Reshaping/Bidi fixes failed on string {}'.format(repr(text)))
|
|
||||||
|
|
||||||
return text
|
|
||||||
|
|
||||||
def _upper(self, val):
|
def _upper(self, val):
|
||||||
# We uppercase labels, but not in every language
|
# We uppercase labels, but not in every language
|
||||||
@@ -351,10 +339,15 @@ class BaseReportlabInvoiceRenderer(BaseInvoiceRenderer):
|
|||||||
return 'invoice.pdf', 'application/pdf', buffer.read()
|
return 'invoice.pdf', 'application/pdf', buffer.read()
|
||||||
|
|
||||||
def _clean_text(self, text, tags=None):
|
def _clean_text(self, text, tags=None):
|
||||||
return self._normalize(bleach.clean(
|
# For backwards compatibility with customer content, we need to support tags like <br> and <b> in a few text
|
||||||
text,
|
# fields. Therefore, we can't use PlainTextParagraph for these, but run bleach instead to limit the allowed
|
||||||
tags=set(tags) if tags else set()
|
# tags.
|
||||||
).strip().replace('<br>', '<br />').replace('\n', '<br />\n'))
|
return self._normalize(
|
||||||
|
bleach.clean(
|
||||||
|
text,
|
||||||
|
tags=set(tags) if tags else set()
|
||||||
|
).strip().replace('<br>', '<br />').replace('\n', '<br />\n')
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class PaidMarker(Flowable):
|
class PaidMarker(Flowable):
|
||||||
@@ -405,8 +398,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
invoice_to_top = 52 * mm
|
invoice_to_top = 52 * mm
|
||||||
|
|
||||||
def _draw_invoice_to(self, canvas):
|
def _draw_invoice_to(self, canvas):
|
||||||
p = FontFallbackParagraph(self._clean_text(self.invoice.address_invoice_to),
|
p = PlainTextParagraph(self.invoice.address_invoice_to, style=self.stylesheet['Normal'])
|
||||||
style=self.stylesheet['Normal'])
|
|
||||||
p.wrapOn(canvas, self.invoice_to_width, self.invoice_to_height)
|
p.wrapOn(canvas, self.invoice_to_width, self.invoice_to_height)
|
||||||
p_size = p.wrap(self.invoice_to_width, self.invoice_to_height)
|
p_size = p.wrap(self.invoice_to_width, self.invoice_to_height)
|
||||||
p.drawOn(canvas, self.invoice_to_left, self.pagesize[1] - p_size[1] - self.invoice_to_top)
|
p.drawOn(canvas, self.invoice_to_left, self.pagesize[1] - p_size[1] - self.invoice_to_top)
|
||||||
@@ -417,8 +409,8 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
invoice_from_top = 17 * mm
|
invoice_from_top = 17 * mm
|
||||||
|
|
||||||
def _draw_invoice_from(self, canvas):
|
def _draw_invoice_from(self, canvas):
|
||||||
p = FontFallbackParagraph(
|
p = PlainTextParagraph(
|
||||||
self._clean_text(self.invoice.full_invoice_from),
|
self.invoice.full_invoice_from,
|
||||||
style=self.stylesheet['InvoiceFrom']
|
style=self.stylesheet['InvoiceFrom']
|
||||||
)
|
)
|
||||||
p.wrapOn(canvas, self.invoice_from_width, self.invoice_from_height)
|
p.wrapOn(canvas, self.invoice_from_width, self.invoice_from_height)
|
||||||
@@ -548,13 +540,12 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
def _draw_event(self, canvas):
|
def _draw_event(self, canvas):
|
||||||
def shorten(txt):
|
def shorten(txt):
|
||||||
txt = str(txt)
|
txt = str(txt)
|
||||||
txt = bleach.clean(txt, tags=set()).strip()
|
p = PlainTextParagraph(txt, style=self.stylesheet['Normal'])
|
||||||
p = FontFallbackParagraph(self._normalize(txt.strip().replace('\n', '<br />\n')), style=self.stylesheet['Normal'])
|
|
||||||
p_size = p.wrap(self.event_width, self.event_height)
|
p_size = p.wrap(self.event_width, self.event_height)
|
||||||
|
|
||||||
while p_size[1] > 2 * self.stylesheet['Normal'].leading:
|
while p_size[1] > 2 * self.stylesheet['Normal'].leading:
|
||||||
txt = ' '.join(txt.replace('…', '').split()[:-1]) + '…'
|
txt = ' '.join(txt.replace('…', '').split()[:-1]) + '…'
|
||||||
p = FontFallbackParagraph(self._normalize(txt.strip().replace('\n', '<br />\n')), style=self.stylesheet['Normal'])
|
p = PlainTextParagraph(txt, style=self.stylesheet['Normal'])
|
||||||
p_size = p.wrap(self.event_width, self.event_height)
|
p_size = p.wrap(self.event_width, self.event_height)
|
||||||
return txt
|
return txt
|
||||||
|
|
||||||
@@ -572,7 +563,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
else:
|
else:
|
||||||
p_str = shorten(self.invoice.event.name)
|
p_str = shorten(self.invoice.event.name)
|
||||||
|
|
||||||
p = FontFallbackParagraph(self._normalize(p_str.strip().replace('\n', '<br />\n')), style=self.stylesheet['Normal'])
|
p = PlainTextParagraph(p_str, style=self.stylesheet['Normal'])
|
||||||
p.wrapOn(canvas, self.event_width, self.event_height)
|
p.wrapOn(canvas, self.event_width, self.event_height)
|
||||||
p_size = p.wrap(self.event_width, self.event_height)
|
p_size = p.wrap(self.event_width, self.event_height)
|
||||||
p.drawOn(canvas, self.event_left, self.pagesize[1] - self.event_top - p_size[1])
|
p.drawOn(canvas, self.event_left, self.pagesize[1] - self.event_top - p_size[1])
|
||||||
@@ -645,39 +636,37 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
|
|
||||||
type_info_text = self.invoice.transmission_type_instance.pdf_info_text()
|
type_info_text = self.invoice.transmission_type_instance.pdf_info_text()
|
||||||
if type_info_text:
|
if type_info_text:
|
||||||
story.append(FontFallbackParagraph(
|
story.append(PlainTextParagraph(
|
||||||
type_info_text,
|
type_info_text,
|
||||||
self.stylesheet['WarningBlock']
|
self.stylesheet['WarningBlock']
|
||||||
))
|
))
|
||||||
|
|
||||||
if self.invoice.custom_field:
|
if self.invoice.custom_field:
|
||||||
story.append(FontFallbackParagraph(
|
story.append(PlainTextParagraph(
|
||||||
'{}: {}'.format(
|
'{}: {}'.format(
|
||||||
self._clean_text(str(self.invoice.event.settings.invoice_address_custom_field)),
|
str(self.invoice.event.settings.invoice_address_custom_field),
|
||||||
self._clean_text(self.invoice.custom_field),
|
self.invoice.custom_field,
|
||||||
),
|
),
|
||||||
self.stylesheet['Normal']
|
self.stylesheet['Normal']
|
||||||
))
|
))
|
||||||
|
|
||||||
if self.invoice.internal_reference:
|
if self.invoice.internal_reference:
|
||||||
story.append(FontFallbackParagraph(
|
story.append(PlainTextParagraph(
|
||||||
self._normalize(pgettext('invoice', 'Customer reference: {reference}').format(
|
pgettext('invoice', 'Customer reference: {reference}').format(
|
||||||
reference=self._clean_text(self.invoice.internal_reference),
|
reference=self.invoice.internal_reference,
|
||||||
)),
|
),
|
||||||
self.stylesheet['Normal']
|
self.stylesheet['Normal']
|
||||||
))
|
))
|
||||||
|
|
||||||
if self.invoice.invoice_to_vat_id:
|
if self.invoice.invoice_to_vat_id:
|
||||||
story.append(FontFallbackParagraph(
|
story.append(PlainTextParagraph(
|
||||||
self._normalize(pgettext('invoice', 'Customer VAT ID')) + ': ' +
|
pgettext('invoice', 'Customer VAT ID') + ': ' + self.invoice.invoice_to_vat_id,
|
||||||
self._clean_text(self.invoice.invoice_to_vat_id),
|
|
||||||
self.stylesheet['Normal']
|
self.stylesheet['Normal']
|
||||||
))
|
))
|
||||||
|
|
||||||
if self.invoice.invoice_to_beneficiary:
|
if self.invoice.invoice_to_beneficiary:
|
||||||
story.append(FontFallbackParagraph(
|
story.append(PlainTextParagraph(
|
||||||
self._normalize(pgettext('invoice', 'Beneficiary')) + ':<br />' +
|
pgettext('invoice', 'Beneficiary') + ':\n' + self.invoice.invoice_to_beneficiary,
|
||||||
self._clean_text(self.invoice.invoice_to_beneficiary),
|
|
||||||
self.stylesheet['Normal']
|
self.stylesheet['Normal']
|
||||||
))
|
))
|
||||||
|
|
||||||
@@ -707,11 +696,11 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
|
|
||||||
story = [
|
story = [
|
||||||
NextPageTemplate('FirstPage'),
|
NextPageTemplate('FirstPage'),
|
||||||
FontFallbackParagraph(
|
PlainTextParagraph(
|
||||||
self._normalize(
|
(
|
||||||
pgettext('invoice', 'Tax Invoice') if str(self.invoice.invoice_from_country) == 'AU'
|
pgettext('invoice', 'Tax Invoice') if str(self.invoice.invoice_from_country) == 'AU'
|
||||||
else pgettext('invoice', 'Invoice')
|
else pgettext('invoice', 'Invoice')
|
||||||
) if not self.invoice.is_cancellation else self._normalize(pgettext('invoice', 'Cancellation')),
|
) if not self.invoice.is_cancellation else pgettext('invoice', 'Cancellation'),
|
||||||
self.stylesheet['Heading1']
|
self.stylesheet['Heading1']
|
||||||
),
|
),
|
||||||
Spacer(1, 5 * mm),
|
Spacer(1, 5 * mm),
|
||||||
@@ -733,17 +722,17 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
]
|
]
|
||||||
if has_taxes:
|
if has_taxes:
|
||||||
tdata = [(
|
tdata = [(
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Description')), self.stylesheet['Bold']),
|
PlainTextParagraph(pgettext('invoice', 'Description'), self.stylesheet['Bold']),
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Qty')), self.stylesheet['BoldRightNoSplit']),
|
PlainTextParagraph(pgettext('invoice', 'Qty'), self.stylesheet['BoldRightNoSplit']),
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Tax rate')), self.stylesheet['BoldRightNoSplit']),
|
PlainTextParagraph(pgettext('invoice', 'Tax rate'), self.stylesheet['BoldRightNoSplit']),
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Net')), self.stylesheet['BoldRightNoSplit']),
|
PlainTextParagraph(pgettext('invoice', 'Net'), self.stylesheet['BoldRightNoSplit']),
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Gross')), self.stylesheet['BoldRightNoSplit']),
|
PlainTextParagraph(pgettext('invoice', 'Gross'), self.stylesheet['BoldRightNoSplit']),
|
||||||
)]
|
)]
|
||||||
else:
|
else:
|
||||||
tdata = [(
|
tdata = [(
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Description')), self.stylesheet['Bold']),
|
PlainTextParagraph(pgettext('invoice', 'Description'), self.stylesheet['Bold']),
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Qty')), self.stylesheet['BoldRightNoSplit']),
|
PlainTextParagraph(pgettext('invoice', 'Qty'), self.stylesheet['BoldRightNoSplit']),
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Amount')), self.stylesheet['BoldRightNoSplit']),
|
PlainTextParagraph(pgettext('invoice', 'Amount'), self.stylesheet['BoldRightNoSplit']),
|
||||||
)]
|
)]
|
||||||
|
|
||||||
def _group_key(line):
|
def _group_key(line):
|
||||||
@@ -780,8 +769,8 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
max_height = self.stylesheet['Normal'].leading * 5
|
max_height = self.stylesheet['Normal'].leading * 5
|
||||||
p_style = self.stylesheet['Normal']
|
p_style = self.stylesheet['Normal']
|
||||||
for __ in range(1000):
|
for __ in range(1000):
|
||||||
p = FontFallbackParagraph(
|
p = PlainTextParagraph(
|
||||||
self._clean_text(curr_description, tags=['br']),
|
curr_description,
|
||||||
p_style
|
p_style
|
||||||
)
|
)
|
||||||
h = p.wrap(max_width, doc.height)[1]
|
h = p.wrap(max_width, doc.height)[1]
|
||||||
@@ -862,7 +851,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
# Group together at the end of the invoice
|
# Group together at the end of the invoice
|
||||||
request_show_service_date = period_line
|
request_show_service_date = period_line
|
||||||
elif period_line:
|
elif period_line:
|
||||||
description_p_list.append(FontFallbackParagraph(
|
description_p_list.append(PlainTextParagraph(
|
||||||
period_line,
|
period_line,
|
||||||
self.stylesheet['Fineprint']
|
self.stylesheet['Fineprint']
|
||||||
))
|
))
|
||||||
@@ -874,7 +863,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
net_price=money_filter(net_value, self.invoice.event.currency),
|
net_price=money_filter(net_value, self.invoice.event.currency),
|
||||||
gross_price=money_filter(gross_value, self.invoice.event.currency),
|
gross_price=money_filter(gross_value, self.invoice.event.currency),
|
||||||
)
|
)
|
||||||
description_p_list.append(FontFallbackParagraph(
|
description_p_list.append(PlainTextParagraph(
|
||||||
single_price_line,
|
single_price_line,
|
||||||
self.stylesheet['Fineprint']
|
self.stylesheet['Fineprint']
|
||||||
))
|
))
|
||||||
@@ -883,11 +872,11 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
description_p_list.pop(0),
|
description_p_list.pop(0),
|
||||||
str(len(lines)),
|
str(len(lines)),
|
||||||
localize(tax_rate) + " %",
|
localize(tax_rate) + " %",
|
||||||
FontFallbackParagraph(
|
PlainTextParagraph(
|
||||||
money_filter(net_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '),
|
money_filter(net_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '),
|
||||||
self.stylesheet['NormalRight']
|
self.stylesheet['NormalRight']
|
||||||
),
|
),
|
||||||
FontFallbackParagraph(
|
PlainTextParagraph(
|
||||||
money_filter(gross_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '),
|
money_filter(gross_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '),
|
||||||
self.stylesheet['NormalRight']
|
self.stylesheet['NormalRight']
|
||||||
),
|
),
|
||||||
@@ -904,14 +893,14 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
single_price_line = pgettext('invoice', 'Single price: {price}').format(
|
single_price_line = pgettext('invoice', 'Single price: {price}').format(
|
||||||
price=money_filter(gross_value, self.invoice.event.currency),
|
price=money_filter(gross_value, self.invoice.event.currency),
|
||||||
)
|
)
|
||||||
description_p_list.append(FontFallbackParagraph(
|
description_p_list.append(PlainTextParagraph(
|
||||||
single_price_line,
|
single_price_line,
|
||||||
self.stylesheet['Fineprint']
|
self.stylesheet['Fineprint']
|
||||||
))
|
))
|
||||||
tdata.append((
|
tdata.append((
|
||||||
description_p_list.pop(0),
|
description_p_list.pop(0),
|
||||||
str(len(lines)),
|
str(len(lines)),
|
||||||
FontFallbackParagraph(
|
PlainTextParagraph(
|
||||||
money_filter(gross_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '),
|
money_filter(gross_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '),
|
||||||
self.stylesheet['NormalRight']
|
self.stylesheet['NormalRight']
|
||||||
),
|
),
|
||||||
@@ -944,12 +933,12 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
|
|
||||||
if has_taxes:
|
if has_taxes:
|
||||||
tdata.append([
|
tdata.append([
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Invoice total')), self.stylesheet['Bold']), '', '', '',
|
PlainTextParagraph(pgettext('invoice', 'Invoice total'), self.stylesheet['Bold']), '', '', '',
|
||||||
money_filter(total, self.invoice.event.currency)
|
money_filter(total, self.invoice.event.currency)
|
||||||
])
|
])
|
||||||
else:
|
else:
|
||||||
tdata.append([
|
tdata.append([
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Invoice total')), self.stylesheet['Bold']), '',
|
PlainTextParagraph(pgettext('invoice', 'Invoice total'), self.stylesheet['Bold']), '',
|
||||||
money_filter(total, self.invoice.event.currency)
|
money_filter(total, self.invoice.event.currency)
|
||||||
])
|
])
|
||||||
|
|
||||||
@@ -958,12 +947,12 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
pending_sum = self.invoice.order.pending_sum
|
pending_sum = self.invoice.order.pending_sum
|
||||||
if pending_sum != total:
|
if pending_sum != total:
|
||||||
tdata.append(
|
tdata.append(
|
||||||
[FontFallbackParagraph(self._normalize(pgettext('invoice', 'Received payments')), self.stylesheet['Normal'])] +
|
[PlainTextParagraph(pgettext('invoice', 'Received payments'), self.stylesheet['Normal'])] +
|
||||||
(['', '', ''] if has_taxes else ['']) +
|
(['', '', ''] if has_taxes else ['']) +
|
||||||
[money_filter(pending_sum - total, self.invoice.event.currency)]
|
[money_filter(pending_sum - total, self.invoice.event.currency)]
|
||||||
)
|
)
|
||||||
tdata.append(
|
tdata.append(
|
||||||
[FontFallbackParagraph(self._normalize(pgettext('invoice', 'Outstanding payments')), self.stylesheet['Bold'])] +
|
[PlainTextParagraph(pgettext('invoice', 'Outstanding payments'), self.stylesheet['Bold'])] +
|
||||||
(['', '', ''] if has_taxes else ['']) +
|
(['', '', ''] if has_taxes else ['']) +
|
||||||
[money_filter(pending_sum, self.invoice.event.currency)]
|
[money_filter(pending_sum, self.invoice.event.currency)]
|
||||||
)
|
)
|
||||||
@@ -980,12 +969,12 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
s=Sum('amount')
|
s=Sum('amount')
|
||||||
)['s'] or Decimal('0.00')
|
)['s'] or Decimal('0.00')
|
||||||
tdata.append(
|
tdata.append(
|
||||||
[FontFallbackParagraph(self._normalize(pgettext('invoice', 'Paid by gift card')), self.stylesheet['Normal'])] +
|
[PlainTextParagraph(pgettext('invoice', 'Paid by gift card'), self.stylesheet['Normal'])] +
|
||||||
(['', '', ''] if has_taxes else ['']) +
|
(['', '', ''] if has_taxes else ['']) +
|
||||||
[money_filter(giftcard_sum, self.invoice.event.currency)]
|
[money_filter(giftcard_sum, self.invoice.event.currency)]
|
||||||
)
|
)
|
||||||
tdata.append(
|
tdata.append(
|
||||||
[FontFallbackParagraph(self._normalize(pgettext('invoice', 'Remaining amount')), self.stylesheet['Bold'])] +
|
[PlainTextParagraph(pgettext('invoice', 'Remaining amount'), self.stylesheet['Bold'])] +
|
||||||
(['', '', ''] if has_taxes else ['']) +
|
(['', '', ''] if has_taxes else ['']) +
|
||||||
[money_filter(total - giftcard_sum, self.invoice.event.currency)]
|
[money_filter(total - giftcard_sum, self.invoice.event.currency)]
|
||||||
)
|
)
|
||||||
@@ -1008,14 +997,14 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
story.append(Spacer(1, 10 * mm))
|
story.append(Spacer(1, 10 * mm))
|
||||||
|
|
||||||
if request_show_service_date:
|
if request_show_service_date:
|
||||||
story.append(FontFallbackParagraph(
|
story.append(PlainTextParagraph(
|
||||||
self._normalize(pgettext('invoice', 'Invoice period: {daterange}').format(daterange=request_show_service_date)),
|
pgettext('invoice', 'Invoice period: {daterange}').format(daterange=request_show_service_date),
|
||||||
self.stylesheet['Normal']
|
self.stylesheet['Normal']
|
||||||
))
|
))
|
||||||
|
|
||||||
if self.invoice.payment_provider_text:
|
if self.invoice.payment_provider_text:
|
||||||
story.append(FontFallbackParagraph(
|
story.append(FontFallbackParagraph(
|
||||||
self._normalize(self.invoice.payment_provider_text),
|
self._clean_text(self.invoice.payment_provider_text, tags=['br', 'b']),
|
||||||
self.stylesheet['Normal']
|
self.stylesheet['Normal']
|
||||||
))
|
))
|
||||||
|
|
||||||
@@ -1039,10 +1028,10 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
('FONTNAME', (0, 0), (-1, -1), self.font_regular),
|
('FONTNAME', (0, 0), (-1, -1), self.font_regular),
|
||||||
]
|
]
|
||||||
thead = [
|
thead = [
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Tax rate')), self.stylesheet['Fineprint']),
|
PlainTextParagraph(pgettext('invoice', 'Tax rate'), self.stylesheet['Fineprint']),
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Net value')), self.stylesheet['FineprintRight']),
|
PlainTextParagraph(pgettext('invoice', 'Net value'), self.stylesheet['FineprintRight']),
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Gross value')), self.stylesheet['FineprintRight']),
|
PlainTextParagraph(pgettext('invoice', 'Gross value'), self.stylesheet['FineprintRight']),
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Tax')), self.stylesheet['FineprintRight']),
|
PlainTextParagraph(pgettext('invoice', 'Tax'), self.stylesheet['FineprintRight']),
|
||||||
''
|
''
|
||||||
]
|
]
|
||||||
tdata = [thead]
|
tdata = [thead]
|
||||||
@@ -1053,7 +1042,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
continue
|
continue
|
||||||
tax = taxvalue_map[idx]
|
tax = taxvalue_map[idx]
|
||||||
tdata.append([
|
tdata.append([
|
||||||
FontFallbackParagraph(self._normalize(localize(rate) + " % " + name), self.stylesheet['Fineprint']),
|
PlainTextParagraph(localize(rate) + " % " + name, self.stylesheet['Fineprint']),
|
||||||
money_filter(gross - tax, self.invoice.event.currency),
|
money_filter(gross - tax, self.invoice.event.currency),
|
||||||
money_filter(gross, self.invoice.event.currency),
|
money_filter(gross, self.invoice.event.currency),
|
||||||
money_filter(tax, self.invoice.event.currency),
|
money_filter(tax, self.invoice.event.currency),
|
||||||
@@ -1072,7 +1061,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
table.setStyle(TableStyle(tstyledata))
|
table.setStyle(TableStyle(tstyledata))
|
||||||
story.append(Spacer(5 * mm, 5 * mm))
|
story.append(Spacer(5 * mm, 5 * mm))
|
||||||
story.append(KeepTogether([
|
story.append(KeepTogether([
|
||||||
FontFallbackParagraph(self._normalize(pgettext('invoice', 'Included taxes')), self.stylesheet['FineprintHeading']),
|
PlainTextParagraph(pgettext('invoice', 'Included taxes'), self.stylesheet['FineprintHeading']),
|
||||||
table
|
table
|
||||||
]))
|
]))
|
||||||
|
|
||||||
@@ -1089,7 +1078,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
net = gross - tax
|
net = gross - tax
|
||||||
|
|
||||||
tdata.append([
|
tdata.append([
|
||||||
FontFallbackParagraph(self._normalize(localize(rate) + " % " + name), self.stylesheet['Fineprint']),
|
PlainTextParagraph(localize(rate) + " % " + name, self.stylesheet['Fineprint']),
|
||||||
fmt(net), fmt(gross), fmt(tax), ''
|
fmt(net), fmt(gross), fmt(tax), ''
|
||||||
])
|
])
|
||||||
|
|
||||||
@@ -1098,13 +1087,13 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
|
|
||||||
story.append(KeepTogether([
|
story.append(KeepTogether([
|
||||||
Spacer(1, height=2 * mm),
|
Spacer(1, height=2 * mm),
|
||||||
FontFallbackParagraph(
|
PlainTextParagraph(
|
||||||
self._normalize(pgettext(
|
pgettext(
|
||||||
'invoice', 'Using the conversion rate of 1:{rate} as published by the {authority} on '
|
'invoice', 'Using the conversion rate of 1:{rate} as published by the {authority} on '
|
||||||
'{date}, this corresponds to:'
|
'{date}, this corresponds to:'
|
||||||
).format(rate=localize(self.invoice.foreign_currency_rate),
|
).format(rate=localize(self.invoice.foreign_currency_rate),
|
||||||
authority=SOURCE_NAMES.get(self.invoice.foreign_currency_source, "?"),
|
authority=SOURCE_NAMES.get(self.invoice.foreign_currency_source, "?"),
|
||||||
date=date_format(self.invoice.foreign_currency_rate_date, "SHORT_DATE_FORMAT"))),
|
date=date_format(self.invoice.foreign_currency_rate_date, "SHORT_DATE_FORMAT")),
|
||||||
self.stylesheet['Fineprint']
|
self.stylesheet['Fineprint']
|
||||||
),
|
),
|
||||||
Spacer(1, height=3 * mm),
|
Spacer(1, height=3 * mm),
|
||||||
@@ -1113,14 +1102,14 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
|
|||||||
elif self.invoice.foreign_currency_display and self.invoice.foreign_currency_rate:
|
elif self.invoice.foreign_currency_display and self.invoice.foreign_currency_rate:
|
||||||
foreign_total = round_decimal(total * self.invoice.foreign_currency_rate)
|
foreign_total = round_decimal(total * self.invoice.foreign_currency_rate)
|
||||||
story.append(Spacer(1, 5 * mm))
|
story.append(Spacer(1, 5 * mm))
|
||||||
story.append(FontFallbackParagraph(self._normalize(
|
story.append(PlainTextParagraph(
|
||||||
pgettext(
|
pgettext(
|
||||||
'invoice', 'Using the conversion rate of 1:{rate} as published by the {authority} on '
|
'invoice', 'Using the conversion rate of 1:{rate} as published by the {authority} on '
|
||||||
'{date}, the invoice total corresponds to {total}.'
|
'{date}, the invoice total corresponds to {total}.'
|
||||||
).format(rate=localize(self.invoice.foreign_currency_rate),
|
).format(rate=localize(self.invoice.foreign_currency_rate),
|
||||||
date=date_format(self.invoice.foreign_currency_rate_date, "SHORT_DATE_FORMAT"),
|
date=date_format(self.invoice.foreign_currency_rate_date, "SHORT_DATE_FORMAT"),
|
||||||
authority=SOURCE_NAMES.get(self.invoice.foreign_currency_source, "?"),
|
authority=SOURCE_NAMES.get(self.invoice.foreign_currency_source, "?"),
|
||||||
total=fmt(foreign_total))),
|
total=fmt(foreign_total)),
|
||||||
self.stylesheet['Fineprint']
|
self.stylesheet['Fineprint']
|
||||||
))
|
))
|
||||||
|
|
||||||
@@ -1162,11 +1151,8 @@ class Modern1Renderer(ClassicInvoiceRenderer):
|
|||||||
def _draw_invoice_from(self, canvas):
|
def _draw_invoice_from(self, canvas):
|
||||||
if not self.invoice.invoice_from:
|
if not self.invoice.invoice_from:
|
||||||
return
|
return
|
||||||
c = [
|
c = self.invoice.address_invoice_from.strip().split('\n')
|
||||||
self._clean_text(l)
|
p = PlainTextParagraph(' · '.join(c), style=self.stylesheet['Sender'])
|
||||||
for l in self.invoice.address_invoice_from.strip().split('\n')
|
|
||||||
]
|
|
||||||
p = FontFallbackParagraph(self._normalize(' · '.join(c)), style=self.stylesheet['Sender'])
|
|
||||||
p.wrapOn(canvas, self.invoice_to_width, 15.7 * mm)
|
p.wrapOn(canvas, self.invoice_to_width, 15.7 * mm)
|
||||||
p.drawOn(canvas, self.invoice_to_left, self.pagesize[1] - self.invoice_to_top + 2 * mm)
|
p.drawOn(canvas, self.invoice_to_left, self.pagesize[1] - self.invoice_to_top + 2 * mm)
|
||||||
super()._draw_invoice_from(canvas)
|
super()._draw_invoice_from(canvas)
|
||||||
@@ -1225,8 +1211,8 @@ class Modern1Renderer(ClassicInvoiceRenderer):
|
|||||||
_draw(pgettext('invoice', 'Order code'), self.invoice.order.full_code, value_size, self.left_margin, 45 * mm, **kwargs)
|
_draw(pgettext('invoice', 'Order code'), self.invoice.order.full_code, value_size, self.left_margin, 45 * mm, **kwargs)
|
||||||
]
|
]
|
||||||
|
|
||||||
p = FontFallbackParagraph(
|
p = PlainTextParagraph(
|
||||||
self._normalize(date_format(self.invoice.date, "DATE_FORMAT")),
|
date_format(self.invoice.date, "DATE_FORMAT"),
|
||||||
style=ParagraphStyle(name=f'Normal{value_size}', fontName=self.font_regular, fontSize=value_size, leading=value_size * 1.2)
|
style=ParagraphStyle(name=f'Normal{value_size}', fontName=self.font_regular, fontSize=value_size, leading=value_size * 1.2)
|
||||||
)
|
)
|
||||||
w = stringWidth(p.text, p.frags[0].fontName, p.frags[0].fontSize)
|
w = stringWidth(p.text, p.frags[0].fontName, p.frags[0].fontSize)
|
||||||
@@ -1283,7 +1269,7 @@ class Modern1SimplifiedRenderer(Modern1Renderer):
|
|||||||
i = []
|
i = []
|
||||||
|
|
||||||
if not self.invoice.event.has_subevents and self.invoice.event.settings.show_dates_on_frontpage:
|
if not self.invoice.event.has_subevents and self.invoice.event.settings.show_dates_on_frontpage:
|
||||||
i.append(FontFallbackParagraph(
|
i.append(PlainTextParagraph(
|
||||||
pgettext('invoice', 'Event date: {date_range}').format(
|
pgettext('invoice', 'Event date: {date_range}').format(
|
||||||
date_range=self.invoice.event.get_date_range_display(),
|
date_range=self.invoice.event.get_date_range_display(),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ from urllib.parse import urlparse, urlsplit
|
|||||||
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
|
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.core.exceptions import BadRequest
|
||||||
from django.http import Http404, HttpRequest, HttpResponse
|
from django.http import Http404, HttpRequest, HttpResponse
|
||||||
from django.middleware.common import CommonMiddleware
|
from django.middleware.common import CommonMiddleware
|
||||||
from django.urls import get_script_prefix, resolve
|
from django.urls import get_script_prefix, resolve
|
||||||
@@ -347,6 +348,18 @@ class SecurityMiddleware(MiddlewareMixin):
|
|||||||
return resp
|
return resp
|
||||||
|
|
||||||
|
|
||||||
|
class RejectInvalidInputMiddleware(MiddlewareMixin):
|
||||||
|
|
||||||
|
def process_request(self, request):
|
||||||
|
# Nullbytes in GET/POST parameters are mostly harmless, as they will later fail on database insertion, but it
|
||||||
|
# keeps spamming our error logs whenever someone tries to run a vulnerability scanner.
|
||||||
|
if "\x00" in request.META['QUERY_STRING'] or "%00" in request.META['QUERY_STRING']:
|
||||||
|
raise BadRequest("Invalid characters in input.")
|
||||||
|
if request.method in ('POST', 'PUT', 'PATCH') and request.content_type == "application/x-www-form-urlencoded":
|
||||||
|
if any("\x00" in value for key, value_list in request.POST.lists() for value in value_list):
|
||||||
|
raise BadRequest("Invalid characters in input.")
|
||||||
|
|
||||||
|
|
||||||
class CustomCommonMiddleware(CommonMiddleware):
|
class CustomCommonMiddleware(CommonMiddleware):
|
||||||
|
|
||||||
def get_full_path_with_slash(self, request):
|
def get_full_path_with_slash(self, request):
|
||||||
|
|||||||
@@ -715,6 +715,12 @@ class Event(EventMixin, LoggedModel):
|
|||||||
self.settings.name_scheme = 'given_family'
|
self.settings.name_scheme = 'given_family'
|
||||||
self.settings.payment_banktransfer_invoice_immediately = True
|
self.settings.payment_banktransfer_invoice_immediately = True
|
||||||
self.settings.low_availability_percentage = 10
|
self.settings.low_availability_percentage = 10
|
||||||
|
self.settings.mail_send_order_free_attendee = True
|
||||||
|
self.settings.mail_send_order_placed_attendee = True
|
||||||
|
self.settings.mail_send_order_paid_attendee = True
|
||||||
|
self.settings.mail_send_order_approved_attendee = True
|
||||||
|
self.settings.mail_send_order_approved_free_attendee = True
|
||||||
|
self.settings.mail_text_download_reminder_attendee = True
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def social_image(self):
|
def social_image(self):
|
||||||
|
|||||||
@@ -923,7 +923,7 @@ class Renderer:
|
|||||||
|
|
||||||
# We do not use str.format like in emails so we (a) can evaluate lazily and (b) can re-implement this
|
# We do not use str.format like in emails so we (a) can evaluate lazily and (b) can re-implement this
|
||||||
# 1:1 on other platforms that render PDFs through our API (libpretixprint)
|
# 1:1 on other platforms that render PDFs through our API (libpretixprint)
|
||||||
return re.sub(r'\{([a-zA-Z0-9:_]+)\}', replace, text)
|
return re.sub(r'\{([-a-zA-Z0-9:_]+)\}', replace, text)
|
||||||
|
|
||||||
elif o['content'].startswith('itemmeta:'):
|
elif o['content'].startswith('itemmeta:'):
|
||||||
if op.variation_id:
|
if op.variation_id:
|
||||||
@@ -1056,7 +1056,7 @@ class Renderer:
|
|||||||
except:
|
except:
|
||||||
logger.exception('Reshaping/Bidi fixes failed on string {}'.format(repr(text)))
|
logger.exception('Reshaping/Bidi fixes failed on string {}'.format(repr(text)))
|
||||||
|
|
||||||
p = Paragraph(text, style=style)
|
p = Paragraph(text, style=style) # not using AutoEscapeParagraph is safe as we escape above
|
||||||
return p, ad, lineheight
|
return p, ad, lineheight
|
||||||
|
|
||||||
def _draw_textcontainer(self, canvas: Canvas, op: OrderPosition, order: Order, o: dict):
|
def _draw_textcontainer(self, canvas: Canvas, op: OrderPosition, order: Order, o: dict):
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ SOURCE_NAMES = {
|
|||||||
None: _('European Central Bank'), # backwards-compatibility
|
None: _('European Central Bank'), # backwards-compatibility
|
||||||
'eu:ecb:eurofxref-daily': _('European Central Bank'),
|
'eu:ecb:eurofxref-daily': _('European Central Bank'),
|
||||||
'cz:cnb:rate-fixing-daily': _('Czech National Bank'),
|
'cz:cnb:rate-fixing-daily': _('Czech National Bank'),
|
||||||
|
'pl:nbp:table-a': _('National Bank of Poland'),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -49,6 +50,7 @@ def fetch_rates(sender, **kwargs):
|
|||||||
source_tasks = {
|
source_tasks = {
|
||||||
'eu:ecb:eurofxref-daily': fetch_ecb_rates,
|
'eu:ecb:eurofxref-daily': fetch_ecb_rates,
|
||||||
'cz:cnb:rate-fixing-daily': fetch_cnb_cz_rates,
|
'cz:cnb:rate-fixing-daily': fetch_cnb_cz_rates,
|
||||||
|
'pl:nbp:table-a': fetch_nbp_pl_rates,
|
||||||
}
|
}
|
||||||
|
|
||||||
for source_name, task in source_tasks.items():
|
for source_name, task in source_tasks.items():
|
||||||
@@ -144,3 +146,29 @@ def fetch_cnb_cz_rates():
|
|||||||
rate=rate,
|
rate=rate,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@app.task()
|
||||||
|
def fetch_nbp_pl_rates():
|
||||||
|
"""
|
||||||
|
Fetches currency rates from the Polish National Bank.
|
||||||
|
"""
|
||||||
|
r = requests.get("https://api.nbp.pl/api/exchangerates/tables/A/", headers={
|
||||||
|
"Accept": "application/json",
|
||||||
|
})
|
||||||
|
r.raise_for_status()
|
||||||
|
data = r.json()[0]
|
||||||
|
|
||||||
|
source_date = datetime.strptime(data["effectiveDate"], "%Y-%m-%d").date()
|
||||||
|
|
||||||
|
for r in data["rates"]:
|
||||||
|
rate = Decimal(r["mid"]).quantize(Decimal('0.000001'))
|
||||||
|
ExchangeRate.objects.update_or_create(
|
||||||
|
source='pl:nbp:table-a',
|
||||||
|
source_currency=r["code"],
|
||||||
|
other_currency='PLN',
|
||||||
|
defaults=dict(
|
||||||
|
source_date=source_date,
|
||||||
|
rate=rate,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ from pretix.base.invoicing.transmission import (
|
|||||||
from pretix.base.models import (
|
from pretix.base.models import (
|
||||||
ExchangeRate, Invoice, InvoiceAddress, InvoiceLine, Order, OrderFee,
|
ExchangeRate, Invoice, InvoiceAddress, InvoiceLine, Order, OrderFee,
|
||||||
)
|
)
|
||||||
|
from pretix.base.models.orders import OrderPayment
|
||||||
from pretix.base.models.tax import EU_CURRENCIES
|
from pretix.base.models.tax import EU_CURRENCIES
|
||||||
from pretix.base.services.tasks import (
|
from pretix.base.services.tasks import (
|
||||||
TransactionAwareProfiledEventTask, TransactionAwareTask,
|
TransactionAwareProfiledEventTask, TransactionAwareTask,
|
||||||
@@ -102,7 +103,7 @@ def build_invoice(invoice: Invoice) -> Invoice:
|
|||||||
introductory = invoice.event.settings.get('invoice_introductory_text', as_type=LazyI18nString)
|
introductory = invoice.event.settings.get('invoice_introductory_text', as_type=LazyI18nString)
|
||||||
additional = invoice.event.settings.get('invoice_additional_text', as_type=LazyI18nString)
|
additional = invoice.event.settings.get('invoice_additional_text', as_type=LazyI18nString)
|
||||||
footer = invoice.event.settings.get('invoice_footer_text', as_type=LazyI18nString)
|
footer = invoice.event.settings.get('invoice_footer_text', as_type=LazyI18nString)
|
||||||
if lp and lp.payment_provider:
|
if lp and lp.payment_provider and lp.state not in (OrderPayment.PAYMENT_STATE_FAILED, OrderPayment.PAYMENT_STATE_CANCELED):
|
||||||
if 'payment' in inspect.signature(lp.payment_provider.render_invoice_text).parameters:
|
if 'payment' in inspect.signature(lp.payment_provider.render_invoice_text).parameters:
|
||||||
payment = str(lp.payment_provider.render_invoice_text(invoice.order, lp))
|
payment = str(lp.payment_provider.render_invoice_text(invoice.order, lp))
|
||||||
else:
|
else:
|
||||||
@@ -204,6 +205,19 @@ def build_invoice(invoice: Invoice) -> Invoice:
|
|||||||
invoice.foreign_currency_rate = rate.rate.quantize(Decimal('0.0001'), ROUND_HALF_UP)
|
invoice.foreign_currency_rate = rate.rate.quantize(Decimal('0.0001'), ROUND_HALF_UP)
|
||||||
invoice.foreign_currency_rate_date = rate.source_date
|
invoice.foreign_currency_rate_date = rate.source_date
|
||||||
invoice.foreign_currency_source = 'cz:cnb:rate-fixing-daily'
|
invoice.foreign_currency_source = 'cz:cnb:rate-fixing-daily'
|
||||||
|
elif invoice.event.settings.invoice_eu_currencies == 'PLN' and invoice.event.currency != 'PLN':
|
||||||
|
invoice.foreign_currency_display = 'PLN'
|
||||||
|
if settings.FETCH_ECB_RATES:
|
||||||
|
rate = ExchangeRate.objects.filter(
|
||||||
|
source='pl:nbp:table-a',
|
||||||
|
source_currency=invoice.event.currency,
|
||||||
|
other_currency=invoice.foreign_currency_display,
|
||||||
|
source_date__gt=now().date() - timedelta(days=7)
|
||||||
|
).first()
|
||||||
|
if rate:
|
||||||
|
invoice.foreign_currency_rate = rate.rate.quantize(Decimal('0.0001'), ROUND_HALF_UP)
|
||||||
|
invoice.foreign_currency_rate_date = rate.source_date
|
||||||
|
invoice.foreign_currency_source = 'pl:nbp:table-a'
|
||||||
|
|
||||||
except InvoiceAddress.DoesNotExist:
|
except InvoiceAddress.DoesNotExist:
|
||||||
ia = None
|
ia = None
|
||||||
|
|||||||
@@ -574,6 +574,7 @@ DEFAULTS = {
|
|||||||
('True', _('Based on European Central Bank daily rates, whenever the invoice recipient is in an EU '
|
('True', _('Based on European Central Bank daily rates, whenever the invoice recipient is in an EU '
|
||||||
'country that uses a different currency.')),
|
'country that uses a different currency.')),
|
||||||
('CZK', _('Based on Czech National Bank daily rates, whenever the invoice amount is not in CZK.')),
|
('CZK', _('Based on Czech National Bank daily rates, whenever the invoice amount is not in CZK.')),
|
||||||
|
('PLN', _('Based on National Bank of Poland daily rates, whenever the invoice amount is not in PLN.')),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
'serializer_kwargs': dict(
|
'serializer_kwargs': dict(
|
||||||
@@ -582,6 +583,7 @@ DEFAULTS = {
|
|||||||
('True', _('Based on European Central Bank daily rates, whenever the invoice recipient is in an EU '
|
('True', _('Based on European Central Bank daily rates, whenever the invoice recipient is in an EU '
|
||||||
'country that uses a different currency.')),
|
'country that uses a different currency.')),
|
||||||
('CZK', _('Based on Czech National Bank daily rates, whenever the invoice amount is not in CZK.')),
|
('CZK', _('Based on Czech National Bank daily rates, whenever the invoice amount is not in CZK.')),
|
||||||
|
('PLN', _('Based on National Bank of Poland daily rates, whenever the invoice amount is not in PLN.')),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
{% extends "error.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% load eventurl %}
|
||||||
|
{% load urlreplace %}
|
||||||
|
{% load static %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1>{% trans "Please continue in a new tab" %}</h1>
|
||||||
|
<p class="larger">
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
For security reasons, the following step is only possible in a new tab.
|
||||||
|
{% endblocktrans %}
|
||||||
|
</p>
|
||||||
|
<p class="larger">
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
If the new tab did not open automatically, please click the following button:
|
||||||
|
{% endblocktrans %}
|
||||||
|
</p>
|
||||||
|
<div class="text-center">
|
||||||
|
<a href="{{ url }}"
|
||||||
|
class="btn btn-primary btn-lg" target="_blank">
|
||||||
|
<span class="fa fa-external-link-square"></span>
|
||||||
|
{% trans "Continue in new tab" %}
|
||||||
|
</a>
|
||||||
|
{{ url|json_script:"framebreak-url" }}
|
||||||
|
<script type="text/javascript" src="{% static "pretixbase/js/framebreak.js" %}"></script>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -2,13 +2,14 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load rich_text %}
|
{% load rich_text %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
{% load wrap_in %}
|
||||||
{% block title %}{% trans "Redirect" %}{% endblock %}
|
{% block title %}{% trans "Redirect" %}{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<i class="fa fa-link fa-fw big-icon"></i>
|
<i class="fa fa-link fa-fw big-icon"></i>
|
||||||
<div class="error-details">
|
<div class="error-details">
|
||||||
<h1>{% trans "Redirect" %}</h1>
|
<h1>{% trans "Redirect" %}</h1>
|
||||||
<h3>
|
<h3>
|
||||||
{% blocktrans trimmed with host="<strong>"|add:hostname|add:"</strong>"|safe %}
|
{% blocktrans trimmed with host=hostname|wrap_in:'strong' %}
|
||||||
The link you clicked on wants to redirect you to a destination on the website {{ host }}.
|
The link you clicked on wants to redirect you to a destination on the website {{ host }}.
|
||||||
{% endblocktrans %}
|
{% endblocktrans %}
|
||||||
{% blocktrans trimmed %}
|
{% blocktrans trimmed %}
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ from markdown.postprocessors import Postprocessor
|
|||||||
from markdown.treeprocessors import UnescapeTreeprocessor
|
from markdown.treeprocessors import UnescapeTreeprocessor
|
||||||
from tlds import tld_set
|
from tlds import tld_set
|
||||||
|
|
||||||
|
from pretix.base.views.redirect import safelink
|
||||||
from pretix.helpers.format import SafeFormatter, format_map
|
from pretix.helpers.format import SafeFormatter, format_map
|
||||||
|
|
||||||
register = template.Library()
|
register = template.Library()
|
||||||
@@ -158,8 +159,7 @@ def safelink_callback(attrs, new=False):
|
|||||||
"""
|
"""
|
||||||
url = html.unescape(attrs.get((None, 'href'), '/'))
|
url = html.unescape(attrs.get((None, 'href'), '/'))
|
||||||
if not url_has_allowed_host_and_scheme(url, allowed_hosts=None) and not url.startswith('mailto:') and not url.startswith('tel:'):
|
if not url_has_allowed_host_and_scheme(url, allowed_hosts=None) and not url.startswith('mailto:') and not url.startswith('tel:'):
|
||||||
signer = signing.Signer(salt='safe-redirect')
|
attrs[None, 'href'] = safelink(url)
|
||||||
attrs[None, 'href'] = reverse('redirect') + '?url=' + urllib.parse.quote(signer.sign(url))
|
|
||||||
attrs[None, 'target'] = '_blank'
|
attrs[None, 'target'] = '_blank'
|
||||||
attrs[None, 'rel'] = 'noopener'
|
attrs[None, 'rel'] = 'noopener'
|
||||||
return attrs
|
return attrs
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
# 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/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
import logging
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
|
|
||||||
from django.core import signing
|
from django.core import signing
|
||||||
@@ -26,6 +27,8 @@ from django.http import HttpResponseBadRequest, HttpResponseRedirect
|
|||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def _is_samesite_referer(request):
|
def _is_samesite_referer(request):
|
||||||
referer = request.headers.get('referer')
|
referer = request.headers.get('referer')
|
||||||
@@ -42,11 +45,16 @@ def _is_samesite_referer(request):
|
|||||||
|
|
||||||
|
|
||||||
def redir_view(request):
|
def redir_view(request):
|
||||||
signer = signing.Signer(salt='safe-redirect')
|
framebreak = "framebreak" in request.GET
|
||||||
|
salt = 'framebreak-safelink-url' if framebreak else 'safelink-url'
|
||||||
try:
|
try:
|
||||||
url = signer.unsign(request.GET.get('url', ''))
|
url = signing.Signer(salt=salt).unsign(request.GET.get('url', ''))
|
||||||
except signing.BadSignature:
|
except signing.BadSignature:
|
||||||
return HttpResponseBadRequest('Invalid parameter')
|
try:
|
||||||
|
# Backwards-compatibility for a change in 2026-06, remove after a while
|
||||||
|
url = signing.Signer(salt='safe-redirect').unsign(request.GET.get('url', ''))
|
||||||
|
except signing.BadSignature:
|
||||||
|
return HttpResponseBadRequest('Invalid parameter')
|
||||||
|
|
||||||
if not _is_samesite_referer(request):
|
if not _is_samesite_referer(request):
|
||||||
u = urllib.parse.urlparse(url)
|
u = urllib.parse.urlparse(url)
|
||||||
@@ -55,11 +63,26 @@ def redir_view(request):
|
|||||||
'url': url,
|
'url': url,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if framebreak:
|
||||||
|
r = render(request, 'pretixbase/framebreak.html', {
|
||||||
|
'url': url,
|
||||||
|
})
|
||||||
|
r.xframe_options_exempt = True
|
||||||
|
return r
|
||||||
|
|
||||||
r = HttpResponseRedirect(url)
|
r = HttpResponseRedirect(url)
|
||||||
r['X-Robots-Tag'] = 'noindex'
|
r['X-Robots-Tag'] = 'noindex'
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
||||||
def safelink(url):
|
def safelink(url, framebreak=False):
|
||||||
signer = signing.Signer(salt='safe-redirect')
|
url = str(url)
|
||||||
return reverse('redirect') + '?url=' + urllib.parse.quote(signer.sign(url))
|
if not (url.startswith('https://') or url.startswith('http://') or url.startswith("/")):
|
||||||
|
logger.warning('Invalid URL passed to safelink: %r', url)
|
||||||
|
return '#invalid-url'
|
||||||
|
salt = 'framebreak-safelink-url' if framebreak else 'safelink-url'
|
||||||
|
signer = signing.Signer(salt=salt)
|
||||||
|
u = reverse('redirect') + '?url=' + urllib.parse.quote(signer.sign(url))
|
||||||
|
if framebreak:
|
||||||
|
u += "&framebreak=true"
|
||||||
|
return u
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import logging
|
import logging
|
||||||
|
import re
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from importlib import import_module
|
from importlib import import_module
|
||||||
@@ -52,6 +53,7 @@ from pretix.celery_app import app
|
|||||||
from pretix.helpers.http import redirect_to_url
|
from pretix.helpers.http import redirect_to_url
|
||||||
|
|
||||||
logger = logging.getLogger('pretix.base.tasks')
|
logger = logging.getLogger('pretix.base.tasks')
|
||||||
|
RE_ASYNC_ID = re.compile(r"^[a-zA-Z0-9\-]+$")
|
||||||
|
|
||||||
|
|
||||||
class AsyncMixin:
|
class AsyncMixin:
|
||||||
@@ -133,6 +135,8 @@ class AsyncMixin:
|
|||||||
def get_result(self, request):
|
def get_result(self, request):
|
||||||
if not request.GET.get('async_id'):
|
if not request.GET.get('async_id'):
|
||||||
raise BadRequest("No async_id given")
|
raise BadRequest("No async_id given")
|
||||||
|
if not RE_ASYNC_ID.match(request.GET.get('async_id')):
|
||||||
|
raise BadRequest("Invalid async_id given")
|
||||||
res = AsyncResult(request.GET.get('async_id'))
|
res = AsyncResult(request.GET.get('async_id'))
|
||||||
if 'ajax' in self.request.GET:
|
if 'ajax' in self.request.GET:
|
||||||
return JsonResponse(self._return_ajax_result(res, timeout=0.25))
|
return JsonResponse(self._return_ajax_result(res, timeout=0.25))
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ from django.forms import formset_factory
|
|||||||
from django.forms.utils import ErrorDict
|
from django.forms.utils import ErrorDict
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _, pgettext_lazy
|
||||||
from i18nfield.forms import I18nInlineFormSet
|
from i18nfield.forms import I18nInlineFormSet
|
||||||
|
|
||||||
from pretix.base.forms import I18nModelForm
|
from pretix.base.forms import I18nModelForm
|
||||||
@@ -102,6 +102,16 @@ class SubEventBulkForm(SubEventForm):
|
|||||||
required=False,
|
required=False,
|
||||||
limit_choices=('date_from', 'date_to'),
|
limit_choices=('date_from', 'date_to'),
|
||||||
)
|
)
|
||||||
|
skip_if_overlap = forms.BooleanField(
|
||||||
|
label=pgettext_lazy('subevent', 'Skip dates that overlap with any existing date'),
|
||||||
|
help_text=pgettext_lazy(
|
||||||
|
'subevent',
|
||||||
|
'This can be useful if all your dates happen in the same location and no repeated dates should '
|
||||||
|
'be created in conflict with existing special events. This respects even inactive dates and works best if '
|
||||||
|
'all dates have both a start and end time.'
|
||||||
|
),
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.event = kwargs['event']
|
self.event = kwargs['event']
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ class AuditLogMiddleware:
|
|||||||
if request.path.startswith(get_script_prefix() + 'control') and request.user.is_authenticated:
|
if request.path.startswith(get_script_prefix() + 'control') and request.user.is_authenticated:
|
||||||
if getattr(request.user, "is_hijacked", False):
|
if getattr(request.user, "is_hijacked", False):
|
||||||
hijack_history = request.session.get('hijack_history', False)
|
hijack_history = request.session.get('hijack_history', False)
|
||||||
hijacker = get_object_or_404(User, pk=hijack_history[0])
|
hijacker = get_object_or_404(User, pk=hijack_history[0]["user"])
|
||||||
ss = hijacker.get_active_staff_session(request.session.get('hijacker_session'))
|
ss = hijacker.get_active_staff_session(request.session.get('hijacker_session'))
|
||||||
if ss:
|
if ss:
|
||||||
ss.logs.create(
|
ss.logs.create(
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ from pretix import __version__
|
|||||||
from pretix.base.models import Order, OrderPayment, Transaction
|
from pretix.base.models import Order, OrderPayment, Transaction
|
||||||
from pretix.base.plugins import get_all_plugins
|
from pretix.base.plugins import get_all_plugins
|
||||||
from pretix.base.templatetags.money import money_filter
|
from pretix.base.templatetags.money import money_filter
|
||||||
|
from pretix.helpers.reportlab import PlainTextParagraph
|
||||||
from pretix.plugins.reports.exporters import ReportlabExportMixin
|
from pretix.plugins.reports.exporters import ReportlabExportMixin
|
||||||
from pretix.settings import DATA_DIR
|
from pretix.settings import DATA_DIR
|
||||||
|
|
||||||
@@ -79,23 +80,23 @@ class SysReport(ReportlabExportMixin):
|
|||||||
style_small.fontSize = 6
|
style_small.fontSize = 6
|
||||||
|
|
||||||
story = [
|
story = [
|
||||||
Paragraph("System report", headlinestyle),
|
PlainTextParagraph("System report", headlinestyle),
|
||||||
Spacer(1, 5 * mm),
|
Spacer(1, 5 * mm),
|
||||||
Paragraph("Usage", subheadlinestyle),
|
PlainTextParagraph("Usage", subheadlinestyle),
|
||||||
Spacer(1, 5 * mm),
|
Spacer(1, 5 * mm),
|
||||||
self._usage_table(),
|
self._usage_table(),
|
||||||
Spacer(1, 5 * mm),
|
Spacer(1, 5 * mm),
|
||||||
Paragraph("Installed versions", subheadlinestyle),
|
PlainTextParagraph("Installed versions", subheadlinestyle),
|
||||||
Spacer(1, 5 * mm),
|
Spacer(1, 5 * mm),
|
||||||
self._tech_table(),
|
self._tech_table(),
|
||||||
Spacer(1, 5 * mm),
|
Spacer(1, 5 * mm),
|
||||||
Paragraph("Plugins", subheadlinestyle),
|
PlainTextParagraph("Plugins", subheadlinestyle),
|
||||||
Spacer(1, 5 * mm),
|
Spacer(1, 5 * mm),
|
||||||
Paragraph(self._get_plugin_versions(), style_small),
|
PlainTextParagraph(self._get_plugin_versions(), style_small),
|
||||||
Spacer(1, 5 * mm),
|
Spacer(1, 5 * mm),
|
||||||
Paragraph("Custom templates", subheadlinestyle),
|
PlainTextParagraph("Custom templates", subheadlinestyle),
|
||||||
Spacer(1, 5 * mm),
|
Spacer(1, 5 * mm),
|
||||||
Paragraph(self._get_custom_templates(), style_small),
|
PlainTextParagraph(self._get_custom_templates(), style_small),
|
||||||
Spacer(1, 5 * mm),
|
Spacer(1, 5 * mm),
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -121,13 +122,13 @@ class SysReport(ReportlabExportMixin):
|
|||||||
("RIGHTPADDING", (-1, 0), (-1, -1), 0),
|
("RIGHTPADDING", (-1, 0), (-1, -1), 0),
|
||||||
]
|
]
|
||||||
tdata = [
|
tdata = [
|
||||||
[Paragraph("Site URL:", style), Paragraph(settings.SITE_URL, style)],
|
[PlainTextParagraph("Site URL:", style), Paragraph(settings.SITE_URL, style)],
|
||||||
[Paragraph("pretix version:", style), Paragraph(__version__, style)],
|
[PlainTextParagraph("pretix version:", style), Paragraph(__version__, style)],
|
||||||
[Paragraph("Python version:", style), Paragraph(sys.version, style)],
|
[PlainTextParagraph("Python version:", style), Paragraph(sys.version, style)],
|
||||||
[Paragraph("Platform:", style), Paragraph(platform.platform(), style)],
|
[PlainTextParagraph("Platform:", style), Paragraph(platform.platform(), style)],
|
||||||
[
|
[
|
||||||
Paragraph("Database engine:", style),
|
PlainTextParagraph("Database engine:", style),
|
||||||
Paragraph(settings.DATABASES["default"]["ENGINE"], style),
|
PlainTextParagraph(settings.DATABASES["default"]["ENGINE"], style),
|
||||||
],
|
],
|
||||||
]
|
]
|
||||||
table = Table(tdata, colWidths=colwidths, repeatRows=0)
|
table = Table(tdata, colWidths=colwidths, repeatRows=0)
|
||||||
@@ -206,7 +207,7 @@ class SysReport(ReportlabExportMixin):
|
|||||||
year_last = now().year
|
year_last = now().year
|
||||||
tdata = [
|
tdata = [
|
||||||
[
|
[
|
||||||
Paragraph(l, style_small_head)
|
PlainTextParagraph(l, style_small_head)
|
||||||
for l in (
|
for l in (
|
||||||
"Time frame",
|
"Time frame",
|
||||||
"Currency",
|
"Currency",
|
||||||
@@ -257,19 +258,19 @@ class SysReport(ReportlabExportMixin):
|
|||||||
|
|
||||||
tdata.append(
|
tdata.append(
|
||||||
(
|
(
|
||||||
Paragraph(
|
PlainTextParagraph(
|
||||||
date_format(first_day, "M Y")
|
date_format(first_day, "M Y")
|
||||||
+ " – "
|
+ " – "
|
||||||
+ date_format(after_day - timedelta(days=1), "M Y"),
|
+ date_format(after_day - timedelta(days=1), "M Y"),
|
||||||
style_small,
|
style_small,
|
||||||
),
|
),
|
||||||
Paragraph(c, style_small),
|
PlainTextParagraph(c, style_small),
|
||||||
Paragraph(str(orders_count), style_small) if i == 0 else "",
|
PlainTextParagraph(str(orders_count), style_small) if i == 0 else "",
|
||||||
Paragraph(money_filter(revenue_data.get("s_net") or 0, c), style_small),
|
PlainTextParagraph(money_filter(revenue_data.get("s_net") or 0, c), style_small),
|
||||||
Paragraph(str(testmode_count), style_small) if i == 0 else "",
|
PlainTextParagraph(str(testmode_count), style_small) if i == 0 else "",
|
||||||
Paragraph(str(unconfirmed_count), style_small) if i == 0 else "",
|
PlainTextParagraph(str(unconfirmed_count), style_small) if i == 0 else "",
|
||||||
Paragraph(str(revenue_data.get("c") or 0), style_small),
|
PlainTextParagraph(str(revenue_data.get("c") or 0), style_small),
|
||||||
Paragraph(money_filter(revenue_data.get("s_gross") or 0, c), style_small),
|
PlainTextParagraph(money_filter(revenue_data.get("s_gross") or 0, c), style_small),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -19,9 +19,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<script type="application/json" id="editor-data">
|
{{ layout|json_script:"editor-data" }}
|
||||||
{{ layout|safe }}
|
|
||||||
</script>
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-9">
|
<div class="col-md-9">
|
||||||
<div class="panel panel-default panel-pdf-editor">
|
<div class="panel panel-default panel-pdf-editor">
|
||||||
|
|||||||
@@ -379,6 +379,8 @@
|
|||||||
<i class="fa fa-calendar"></i> {% trans "Add many time slots" %}</button>
|
<i class="fa fa-calendar"></i> {% trans "Add many time slots" %}</button>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
<hr />
|
||||||
|
{% bootstrap_field form.skip_if_overlap layout="control" horizontal_label_class='sr-only' horizontal_field_class='col-md-12' %}
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>{% trans "General information" %}</legend>
|
<legend>{% trans "General information" %}</legend>
|
||||||
|
|||||||
@@ -234,13 +234,21 @@ class EventUpdate(DecoupleMixin, EventSettingsViewMixin, EventPermissionRequired
|
|||||||
self.request.event.log_action('pretix.event.footerlinks.changed', user=self.request.user, data={
|
self.request.event.log_action('pretix.event.footerlinks.changed', user=self.request.user, data={
|
||||||
'data': self.footer_links_formset.cleaned_data
|
'data': self.footer_links_formset.cleaned_data
|
||||||
})
|
})
|
||||||
if form.has_changed():
|
|
||||||
self.request.event.log_action('pretix.event.changed', user=self.request.user, data={
|
change_data = {
|
||||||
k: (form.cleaned_data.get(k).name
|
k: (form.cleaned_data.get(k).name
|
||||||
if isinstance(form.cleaned_data.get(k), File)
|
if isinstance(form.cleaned_data.get(k), File)
|
||||||
else form.cleaned_data.get(k))
|
else form.cleaned_data.get(k))
|
||||||
for k in form.changed_data
|
for k in form.changed_data
|
||||||
})
|
}
|
||||||
|
meta_changed = {}
|
||||||
|
for f in self.meta_forms:
|
||||||
|
if f.has_changed():
|
||||||
|
meta_changed[f.property.name] = f.cleaned_data["value"]
|
||||||
|
if meta_changed:
|
||||||
|
change_data['meta_data'] = meta_changed
|
||||||
|
if change_data:
|
||||||
|
self.request.event.log_action('pretix.event.changed', user=self.request.user, data=change_data)
|
||||||
|
|
||||||
tickets.invalidate_cache.apply_async(kwargs={'event': self.request.event.pk})
|
tickets.invalidate_cache.apply_async(kwargs={'event': self.request.event.pk})
|
||||||
messages.success(self.request, _('Your changes have been saved.'))
|
messages.success(self.request, _('Your changes have been saved.'))
|
||||||
@@ -763,12 +771,7 @@ class InvoicePreview(EventPermissionRequiredMixin, View):
|
|||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
fname, ftype, fcontent = build_preview_invoice_pdf(request.event)
|
fname, ftype, fcontent = build_preview_invoice_pdf(request.event)
|
||||||
resp = HttpResponse(fcontent, content_type=ftype)
|
resp = HttpResponse(fcontent, content_type=ftype)
|
||||||
if settings.DEBUG:
|
resp['Content-Disposition'] = 'inline; filename="{}"'.format(fname)
|
||||||
# attachment is more secure as we're dealing with user-generated stuff here, but inline is much more convenient during debugging
|
|
||||||
resp['Content-Disposition'] = 'inline; filename="{}"'.format(fname)
|
|
||||||
resp._csp_ignore = True
|
|
||||||
else:
|
|
||||||
resp['Content-Disposition'] = 'attachment; filename="{}"'.format(fname)
|
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -300,5 +300,4 @@ class SysReportView(AdministratorPermissionRequiredMixin, TemplateView):
|
|||||||
resp = HttpResponse(data)
|
resp = HttpResponse(data)
|
||||||
resp['Content-Type'] = mime
|
resp['Content-Type'] = mime
|
||||||
resp['Content-Disposition'] = 'inline; filename="{}"'.format(name)
|
resp['Content-Disposition'] = 'inline; filename="{}"'.format(name)
|
||||||
resp._csp_ignore = True
|
|
||||||
return resp
|
return resp
|
||||||
|
|||||||
@@ -1447,12 +1447,8 @@ class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, MetaDataE
|
|||||||
|
|
||||||
meta_changed = {}
|
meta_changed = {}
|
||||||
for f in self.meta_forms:
|
for f in self.meta_forms:
|
||||||
meta_changed.update({
|
if f.has_changed():
|
||||||
k: (f.cleaned_data.get(k).name
|
meta_changed[f.property.name] = f.cleaned_data["value"]
|
||||||
if isinstance(f.cleaned_data.get(k), File)
|
|
||||||
else f.cleaned_data.get(k))
|
|
||||||
for k in f.changed_data
|
|
||||||
})
|
|
||||||
if meta_changed:
|
if meta_changed:
|
||||||
change_data['meta_data'] = meta_changed
|
change_data['meta_data'] = meta_changed
|
||||||
|
|
||||||
|
|||||||
@@ -79,9 +79,9 @@ from pretix.base.email import get_email_context
|
|||||||
from pretix.base.exporter import MultiSheetListExporter
|
from pretix.base.exporter import MultiSheetListExporter
|
||||||
from pretix.base.i18n import language
|
from pretix.base.i18n import language
|
||||||
from pretix.base.models import (
|
from pretix.base.models import (
|
||||||
CachedCombinedTicket, CachedFile, CachedTicket, Checkin, Invoice,
|
CachedFile, CachedTicket, Checkin, Invoice, InvoiceAddress, Item,
|
||||||
InvoiceAddress, Item, ItemVariation, LogEntry, Order, QuestionAnswer,
|
ItemVariation, LogEntry, Order, QuestionAnswer, Quota,
|
||||||
Quota, ScheduledEventExport, generate_secret,
|
ScheduledEventExport, generate_secret,
|
||||||
)
|
)
|
||||||
from pretix.base.models.orders import (
|
from pretix.base.models.orders import (
|
||||||
CancellationRequest, OrderFee, OrderPayment, OrderPosition, OrderRefund,
|
CancellationRequest, OrderFee, OrderPayment, OrderPosition, OrderRefund,
|
||||||
@@ -710,34 +710,21 @@ class OrderDownload(AsyncAction, OrderView):
|
|||||||
resp = HttpResponseRedirect(value.file.file.read())
|
resp = HttpResponseRedirect(value.file.file.read())
|
||||||
return resp
|
return resp
|
||||||
else:
|
else:
|
||||||
resp = FileResponse(value.file.file, content_type=value.type)
|
return FileResponse(
|
||||||
resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}-{}{}"'.format(
|
value.file.file,
|
||||||
self.request.event.slug.upper(), self.order.code, self.order_position.positionid,
|
filename='{}-{}-{}-{}{}'.format(
|
||||||
self.output.identifier, value.extension
|
self.request.event.slug.upper(), self.order.code, self.order_position.positionid,
|
||||||
|
self.output.identifier, value.extension
|
||||||
|
),
|
||||||
|
content_type=value.type
|
||||||
)
|
)
|
||||||
return resp
|
|
||||||
elif isinstance(value, CachedCombinedTicket):
|
|
||||||
if value.type == 'text/uri-list':
|
|
||||||
resp = HttpResponseRedirect(value.file.file.read())
|
|
||||||
return resp
|
|
||||||
else:
|
|
||||||
resp = FileResponse(value.file.file, content_type=value.type)
|
|
||||||
resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}{}"'.format(
|
|
||||||
self.request.event.slug.upper(), self.order.code, self.output.identifier, value.extension
|
|
||||||
)
|
|
||||||
return resp
|
|
||||||
else:
|
else:
|
||||||
return redirect(self.get_self_url())
|
return redirect(self.get_self_url())
|
||||||
|
|
||||||
def get_last_ct(self):
|
def get_last_ct(self):
|
||||||
if 'position' in self.kwargs:
|
ct = CachedTicket.objects.filter(
|
||||||
ct = CachedTicket.objects.filter(
|
order_position=self.order_position, provider=self.output.identifier, file__isnull=False
|
||||||
order_position=self.order_position, provider=self.output.identifier, file__isnull=False
|
).last()
|
||||||
).last()
|
|
||||||
else:
|
|
||||||
ct = CachedCombinedTicket.objects.filter(
|
|
||||||
order=self.order, provider=self.output.identifier, file__isnull=False
|
|
||||||
).last()
|
|
||||||
if not ct or not ct.file:
|
if not ct or not ct.file:
|
||||||
return None
|
return None
|
||||||
return ct
|
return ct
|
||||||
@@ -1831,15 +1818,15 @@ class InvoiceDownload(EventPermissionRequiredMixin, View):
|
|||||||
return redirect(self.get_order_url())
|
return redirect(self.get_order_url())
|
||||||
|
|
||||||
try:
|
try:
|
||||||
resp = FileResponse(self.invoice.file.file, content_type='application/pdf')
|
return FileResponse(
|
||||||
|
self.invoice.file.file,
|
||||||
|
filename='{}.pdf'.format(re.sub("[^a-zA-Z0-9-_.]+", "_", self.invoice.number)),
|
||||||
|
content_type='application/pdf'
|
||||||
|
)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
invoice_pdf_task.apply(args=(self.invoice.pk,))
|
invoice_pdf_task.apply(args=(self.invoice.pk,))
|
||||||
return self.get(request, *args, **kwargs)
|
return self.get(request, *args, **kwargs)
|
||||||
|
|
||||||
resp['Content-Disposition'] = 'inline; filename="{}.pdf"'.format(re.sub("[^a-zA-Z0-9-_.]+", "_", self.invoice.number))
|
|
||||||
resp._csp_ignore = True # Some browser's PDF readers do not work with CSP
|
|
||||||
return resp
|
|
||||||
|
|
||||||
|
|
||||||
class OrderExtend(OrderView):
|
class OrderExtend(OrderView):
|
||||||
permission = 'event.orders:write'
|
permission = 'event.orders:write'
|
||||||
|
|||||||
@@ -263,12 +263,7 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView):
|
|||||||
|
|
||||||
resp = HttpResponse(data, content_type=mimet)
|
resp = HttpResponse(data, content_type=mimet)
|
||||||
ftype = fname.split(".")[-1]
|
ftype = fname.split(".")[-1]
|
||||||
if settings.DEBUG:
|
resp['Content-Disposition'] = 'inline; filename="ticket-preview.{}"'.format(ftype)
|
||||||
# attachment is more secure as we're dealing with user-generated stuff here, but inline is much more convenient during debugging
|
|
||||||
resp['Content-Disposition'] = 'inline; filename="ticket-preview.{}"'.format(ftype)
|
|
||||||
resp._csp_ignore = True
|
|
||||||
else:
|
|
||||||
resp['Content-Disposition'] = 'attachment; filename="ticket-preview.{}"'.format(ftype)
|
|
||||||
return resp
|
return resp
|
||||||
elif "data" in request.POST:
|
elif "data" in request.POST:
|
||||||
if cf:
|
if cf:
|
||||||
@@ -289,7 +284,7 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView):
|
|||||||
ctx['pdf'] = self.get_current_background()
|
ctx['pdf'] = self.get_current_background()
|
||||||
ctx['variables'] = self.get_variables()
|
ctx['variables'] = self.get_variables()
|
||||||
ctx['images'] = self.get_images()
|
ctx['images'] = self.get_images()
|
||||||
ctx['layout'] = json.dumps(self.get_current_layout())
|
ctx['layout'] = self.get_current_layout()
|
||||||
ctx['title'] = self.title
|
ctx['title'] = self.title
|
||||||
ctx['locales'] = [p for p in settings.LANGUAGES if p[0] in self.request.event.settings.locales]
|
ctx['locales'] = [p for p in settings.LANGUAGES if p[0] in self.request.event.settings.locales]
|
||||||
ctx['maxfilesize'] = self.maxfilesize
|
ctx['maxfilesize'] = self.maxfilesize
|
||||||
@@ -309,6 +304,5 @@ class FontsCSSView(TemplateView):
|
|||||||
class PdfView(TemplateView):
|
class PdfView(TemplateView):
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
cf = get_object_or_404(CachedFile, id=kwargs.get("filename"), filename="background_preview.pdf")
|
cf = get_object_or_404(CachedFile, id=kwargs.get("filename"), filename="background_preview.pdf")
|
||||||
resp = FileResponse(cf.file, content_type='application/pdf')
|
resp = FileResponse(cf.file, filename=cf.filename, content_type='application/pdf')
|
||||||
resp['Content-Disposition'] = 'attachment; filename="{}"'.format(cf.filename)
|
|
||||||
return resp
|
return resp
|
||||||
|
|||||||
@@ -540,20 +540,31 @@ class SubEventUpdate(EventPermissionRequiredMixin, SubEventEditorMixin, UpdateVi
|
|||||||
# TODO: LogEntry?
|
# TODO: LogEntry?
|
||||||
|
|
||||||
messages.success(self.request, _('Your changes have been saved.'))
|
messages.success(self.request, _('Your changes have been saved.'))
|
||||||
if form.has_changed() or any(f.has_changed() for f in self.plugin_forms):
|
|
||||||
data = {
|
change_data = {
|
||||||
k: form.cleaned_data.get(k) for k in form.changed_data
|
k: (form.cleaned_data.get(k).name
|
||||||
}
|
if isinstance(form.cleaned_data.get(k), File)
|
||||||
for f in self.plugin_forms:
|
else form.cleaned_data.get(k))
|
||||||
data.update({
|
for k in form.changed_data
|
||||||
k: (f.cleaned_data.get(k).name
|
}
|
||||||
if isinstance(f.cleaned_data.get(k), File)
|
meta_changed = {}
|
||||||
else f.cleaned_data.get(k))
|
for f in self.meta_forms:
|
||||||
for k in f.changed_data
|
if f.has_changed():
|
||||||
})
|
meta_changed[f.property.name] = f.cleaned_data["value"]
|
||||||
|
if meta_changed:
|
||||||
|
change_data['meta_data'] = meta_changed
|
||||||
|
for f in self.plugin_forms:
|
||||||
|
change_data.update({
|
||||||
|
k: (f.cleaned_data.get(k).name
|
||||||
|
if isinstance(f.cleaned_data.get(k), File)
|
||||||
|
else f.cleaned_data.get(k))
|
||||||
|
for k in f.changed_data
|
||||||
|
})
|
||||||
|
if change_data:
|
||||||
self.object.log_action(
|
self.object.log_action(
|
||||||
'pretix.subevent.changed', user=self.request.user, data=data
|
'pretix.subevent.changed', user=self.request.user, data=change_data
|
||||||
)
|
)
|
||||||
|
|
||||||
for f in self.plugin_forms:
|
for f in self.plugin_forms:
|
||||||
f.subevent = self.object
|
f.subevent = self.object
|
||||||
f.save()
|
f.save()
|
||||||
@@ -628,6 +639,14 @@ class SubEventCreate(SubEventEditorMixin, EventPermissionRequiredMixin, CreateVi
|
|||||||
else f.cleaned_data.get(k))
|
else f.cleaned_data.get(k))
|
||||||
for k in f.cleaned_data
|
for k in f.cleaned_data
|
||||||
})
|
})
|
||||||
|
|
||||||
|
meta_changed = {}
|
||||||
|
for f in self.meta_forms:
|
||||||
|
if f.has_changed():
|
||||||
|
meta_changed[f.property.name] = f.cleaned_data["value"]
|
||||||
|
if meta_changed:
|
||||||
|
data['meta_data'] = meta_changed
|
||||||
|
|
||||||
form.instance.log_action('pretix.subevent.added', data=dict(data), user=self.request.user)
|
form.instance.log_action('pretix.subevent.added', data=dict(data), user=self.request.user)
|
||||||
|
|
||||||
self.save_formset(form.instance)
|
self.save_formset(form.instance)
|
||||||
@@ -917,6 +936,35 @@ class SubEventBulkCreate(SubEventEditorMixin, EventPermissionRequiredMixin, Asyn
|
|||||||
if len(subevents) > 100_000:
|
if len(subevents) > 100_000:
|
||||||
raise ValidationError(_('Please do not create more than 100.000 dates at once.'))
|
raise ValidationError(_('Please do not create more than 100.000 dates at once.'))
|
||||||
|
|
||||||
|
if form.cleaned_data.get("skip_if_overlap") and subevents:
|
||||||
|
def overlaps(a_from, a_to, b_from, b_to):
|
||||||
|
if a_from == b_from:
|
||||||
|
return True
|
||||||
|
if a_from > b_from:
|
||||||
|
# a starts after b
|
||||||
|
# check if it starts before b ends
|
||||||
|
return b_to and a_from < b_to
|
||||||
|
# a starts before b
|
||||||
|
# check if it ends before b starts
|
||||||
|
return a_to and a_to > b_from
|
||||||
|
|
||||||
|
date_min = min(se.date_from for se in subevents)
|
||||||
|
date_max = max(se.date_to or se.date_from for se in subevents)
|
||||||
|
dates_existing = list(self.request.event.subevents.annotate(
|
||||||
|
date_fromto=Coalesce('date_to', 'date_from'),
|
||||||
|
).filter(
|
||||||
|
date_from__lte=date_max,
|
||||||
|
date_fromto__gte=date_min,
|
||||||
|
).values('date_from', 'date_to'))
|
||||||
|
subevents = [
|
||||||
|
se for se in subevents if not any(
|
||||||
|
overlaps(se.date_from, se.date_to, other['date_from'], other['date_to'])
|
||||||
|
for other in dates_existing
|
||||||
|
)
|
||||||
|
]
|
||||||
|
if not subevents:
|
||||||
|
raise ValidationError(_('All dates would be skipped because they conflict with existing dates.'))
|
||||||
|
|
||||||
for i, se in enumerate(subevents):
|
for i, se in enumerate(subevents):
|
||||||
se.save(clear_cache=False)
|
se.save(clear_cache=False)
|
||||||
if i % 100 == 0:
|
if i % 100 == 0:
|
||||||
|
|||||||
@@ -316,7 +316,7 @@ def nav_context_list(request):
|
|||||||
page = 1
|
page = 1
|
||||||
|
|
||||||
qs_events = request.user.get_events_with_any_permission(request).filter(
|
qs_events = request.user.get_events_with_any_permission(request).filter(
|
||||||
Q(name__icontains=i18ncomp(query)) | Q(slug__icontains=query)
|
Q(name__icontains=i18ncomp(query)) | Q(slug__icontains=query) | Q(domain__domainname__iexact=query)
|
||||||
).annotate(
|
).annotate(
|
||||||
min_from=Min('subevents__date_from'),
|
min_from=Min('subevents__date_from'),
|
||||||
max_from=Max('subevents__date_from'),
|
max_from=Max('subevents__date_from'),
|
||||||
@@ -331,7 +331,7 @@ def nav_context_list(request):
|
|||||||
else:
|
else:
|
||||||
qs_orga = Organizer.objects.filter(pk__in=request.user.teams.values_list('organizer', flat=True))
|
qs_orga = Organizer.objects.filter(pk__in=request.user.teams.values_list('organizer', flat=True))
|
||||||
if query:
|
if query:
|
||||||
qs_orga = qs_orga.filter(Q(name__icontains=query) | Q(slug__icontains=query))
|
qs_orga = qs_orga.filter(Q(name__icontains=query) | Q(slug__icontains=query) | Q(domains__domainname__iexact=query))
|
||||||
qs_orga = qs_orga.annotate(
|
qs_orga = qs_orga.annotate(
|
||||||
n_events=Count("events")
|
n_events=Count("events")
|
||||||
).order_by("-n_events")
|
).order_by("-n_events")
|
||||||
@@ -619,7 +619,7 @@ def checkinlist_select2(request, **kwargs):
|
|||||||
|
|
||||||
qs = request.event.checkin_lists.select_related('subevent').filter(
|
qs = request.event.checkin_lists.select_related('subevent').filter(
|
||||||
qf
|
qf
|
||||||
).order_by('name')
|
).order_by('subevent__date_from', 'name', 'pk')
|
||||||
|
|
||||||
total = qs.count()
|
total = qs.count()
|
||||||
pagesize = 20
|
pagesize = 20
|
||||||
|
|||||||
@@ -19,19 +19,22 @@
|
|||||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
# 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/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
import hmac
|
||||||
import json
|
import json
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.auth import (
|
from django.contrib.auth import (
|
||||||
BACKEND_SESSION_KEY, get_user_model, load_backend, login,
|
BACKEND_SESSION_KEY, HASH_SESSION_KEY, get_user_model, load_backend, login,
|
||||||
|
logout,
|
||||||
)
|
)
|
||||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
|
from django.contrib.auth.views import redirect_to_login
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.shortcuts import get_object_or_404, redirect
|
from django.shortcuts import get_object_or_404, redirect
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.crypto import get_random_string
|
from django.utils.crypto import get_random_string, salted_hmac
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django.views import View
|
from django.views import View
|
||||||
@@ -230,7 +233,15 @@ class UserImpersonateView(AdministratorPermissionRequiredMixin, RecentAuthentica
|
|||||||
hijacked = self.object
|
hijacked = self.object
|
||||||
|
|
||||||
hijack_history = request.session.get("hijack_history", [])
|
hijack_history = request.session.get("hijack_history", [])
|
||||||
hijack_history.append(request.user._meta.pk.value_to_string(hijacker))
|
hijack_history.append({
|
||||||
|
"user": request.user.pk,
|
||||||
|
# We include the auth_hash, because it is unguessable. So should an attacker gain an attack vector to
|
||||||
|
# modify hijack_history, they can't just insert or change a user that shouldn't be there. We HMAC it
|
||||||
|
# again, though, since we also do not want the auth_hash of the admin user to be in the session of an
|
||||||
|
# unprivileged user to contain the risk if there is some leak of session data.
|
||||||
|
"auth_hash": salted_hmac(key_salt=b"hijack-history-hash", value=request.session[HASH_SESSION_KEY],
|
||||||
|
algorithm="sha256", secret=settings.SECRET_KEY).hexdigest(),
|
||||||
|
})
|
||||||
|
|
||||||
backend = get_used_backend(request)
|
backend = get_used_backend(request)
|
||||||
backend = f"{backend.__module__}.{backend.__class__.__name__}"
|
backend = f"{backend.__module__}.{backend.__class__.__name__}"
|
||||||
@@ -259,8 +270,21 @@ class UserImpersonateStopView(LoginRequiredMixin, View):
|
|||||||
hijs = request.session['hijacker_session']
|
hijs = request.session['hijacker_session']
|
||||||
hijack_history = request.session.get("hijack_history", [])
|
hijack_history = request.session.get("hijack_history", [])
|
||||||
hijacked = request.user
|
hijacked = request.user
|
||||||
user_pk = hijack_history.pop()
|
prev_session = hijack_history.pop()
|
||||||
hijacker = get_object_or_404(get_user_model(), pk=user_pk)
|
hijacker = get_object_or_404(get_user_model(), pk=prev_session["user"])
|
||||||
|
|
||||||
|
expected_hash = salted_hmac(
|
||||||
|
key_salt=b"hijack-history-hash",
|
||||||
|
value=hijacker.get_session_auth_hash(),
|
||||||
|
algorithm="sha256",
|
||||||
|
secret=settings.SECRET_KEY
|
||||||
|
).hexdigest()
|
||||||
|
if not hmac.compare_digest(expected_hash, prev_session["auth_hash"]):
|
||||||
|
# Could be an attacker-controlled hijack history, but could also be e.g. a password change of the admin user
|
||||||
|
# that happened during the hijack session
|
||||||
|
logout(request)
|
||||||
|
return redirect_to_login(request.get_full_path())
|
||||||
|
|
||||||
backend = get_used_backend(request)
|
backend = get_used_backend(request)
|
||||||
backend = f"{backend.__module__}.{backend.__class__.__name__}"
|
backend = f"{backend.__module__}.{backend.__class__.__name__}"
|
||||||
with signals.no_update_last_login(), keep_session_age(request.session):
|
with signals.no_update_last_login(), keep_session_age(request.session):
|
||||||
|
|||||||
@@ -29,3 +29,8 @@ class PretixHelpersConfig(AppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
from .monkeypatching import monkeypatch_all_at_ready
|
from .monkeypatching import monkeypatch_all_at_ready
|
||||||
monkeypatch_all_at_ready()
|
monkeypatch_all_at_ready()
|
||||||
|
|
||||||
|
# Ensure reportlab does not make any calls to the internet or the local disk
|
||||||
|
from reportlab import rl_config
|
||||||
|
rl_config.trustedHosts = []
|
||||||
|
rl_config.trustedSchemes = ['data']
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ from datetime import datetime
|
|||||||
from http import cookies
|
from http import cookies
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.core.exceptions import SuspiciousFileOperation
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from requests.adapters import HTTPAdapter
|
from requests.adapters import HTTPAdapter
|
||||||
from urllib3.connection import HTTPConnection, HTTPSConnection
|
from urllib3.connection import HTTPConnection, HTTPSConnection
|
||||||
@@ -40,6 +41,10 @@ from urllib3.util.connection import (
|
|||||||
)
|
)
|
||||||
from urllib3.util.timeout import _DEFAULT_TIMEOUT
|
from urllib3.util.timeout import _DEFAULT_TIMEOUT
|
||||||
|
|
||||||
|
from pretix.helpers.reportlab import ThumbnailingImageReader
|
||||||
|
|
||||||
|
_cgnat_net = ipaddress.ip_network('100.64.0.0/10')
|
||||||
|
|
||||||
|
|
||||||
def monkeypatch_vobject_performance():
|
def monkeypatch_vobject_performance():
|
||||||
"""
|
"""
|
||||||
@@ -226,9 +231,27 @@ def monkeypatch_cookie_morsel():
|
|||||||
cookies.Morsel._reserved.setdefault("partitioned", "Partitioned")
|
cookies.Morsel._reserved.setdefault("partitioned", "Partitioned")
|
||||||
|
|
||||||
|
|
||||||
|
def monkeypatch_reportlab_imagereader():
|
||||||
|
from reportlab.lib import utils
|
||||||
|
old_init = utils.ImageReader.__init__
|
||||||
|
|
||||||
|
def new_init(self, fileName, ident=None): # noqa
|
||||||
|
if not isinstance(fileName, Image.Image) and not hasattr(fileName, 'read') and not hasattr(fileName, 'str'):
|
||||||
|
if not isinstance(self, ThumbnailingImageReader):
|
||||||
|
# ThumbnailingImageReader is only used by us explicitly and not by using <img> in html, so it is safe
|
||||||
|
raise SuspiciousFileOperation("reportlab should not be reading images from disk")
|
||||||
|
|
||||||
|
return types.MethodType(old_init, self)(
|
||||||
|
fileName, ident
|
||||||
|
)
|
||||||
|
|
||||||
|
utils.ImageReader.__init__ = new_init
|
||||||
|
|
||||||
|
|
||||||
def monkeypatch_all_at_ready():
|
def monkeypatch_all_at_ready():
|
||||||
monkeypatch_vobject_performance()
|
monkeypatch_vobject_performance()
|
||||||
monkeypatch_pillow_safer()
|
monkeypatch_pillow_safer()
|
||||||
monkeypatch_requests_timeout()
|
monkeypatch_requests_timeout()
|
||||||
monkeypatch_urllib3_ssrf_protection()
|
monkeypatch_urllib3_ssrf_protection()
|
||||||
monkeypatch_cookie_morsel()
|
monkeypatch_cookie_morsel()
|
||||||
|
monkeypatch_reportlab_imagereader()
|
||||||
|
|||||||
@@ -20,14 +20,19 @@
|
|||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import logging
|
import logging
|
||||||
|
import re
|
||||||
|
import unicodedata
|
||||||
|
|
||||||
from arabic_reshaper import ArabicReshaper
|
from arabic_reshaper import ArabicReshaper
|
||||||
|
from bidi import get_display
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.functional import SimpleLazyObject
|
from django.utils.functional import SimpleLazyObject
|
||||||
|
from django.utils.html import escape
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from reportlab.lib.styles import ParagraphStyle
|
from reportlab.lib.styles import ParagraphStyle
|
||||||
from reportlab.lib.utils import ImageReader
|
from reportlab.lib.utils import ImageReader
|
||||||
from reportlab.pdfbase import pdfmetrics
|
from reportlab.pdfbase import pdfmetrics
|
||||||
|
from reportlab.pdfbase.ttfonts import TTFont
|
||||||
from reportlab.platypus import Paragraph
|
from reportlab.platypus import Paragraph
|
||||||
|
|
||||||
from pretix.presale.style import get_fonts
|
from pretix.presale.style import get_fonts
|
||||||
@@ -70,6 +75,20 @@ reshaper = SimpleLazyObject(lambda: ArabicReshaper(configuration={
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
|
|
||||||
|
def normalize_text(text: str) -> str:
|
||||||
|
# reportlab does not support unicode combination characters
|
||||||
|
# It's important we do this before we use ArabicReshaper
|
||||||
|
text = unicodedata.normalize("NFKC", text)
|
||||||
|
|
||||||
|
# reportlab does not support RTL, ligature-heavy scripts like Arabic. Therefore, we use ArabicReshaper
|
||||||
|
# to resolve all ligatures and python-bidi to switch RTL texts.
|
||||||
|
try:
|
||||||
|
text = "\n".join(get_display(reshaper.reshape(l)) for l in re.split("\n", text))
|
||||||
|
except:
|
||||||
|
logger.exception('Reshaping/Bidi fixes failed on string {}'.format(repr(text)))
|
||||||
|
return text
|
||||||
|
|
||||||
|
|
||||||
class FontFallbackParagraph(Paragraph):
|
class FontFallbackParagraph(Paragraph):
|
||||||
def __init__(self, text, style=None, *args, **kwargs):
|
def __init__(self, text, style=None, *args, **kwargs):
|
||||||
if style is None:
|
if style is None:
|
||||||
@@ -87,6 +106,8 @@ class FontFallbackParagraph(Paragraph):
|
|||||||
if not text:
|
if not text:
|
||||||
return True
|
return True
|
||||||
font = pdfmetrics.getFont(font_name)
|
font = pdfmetrics.getFont(font_name)
|
||||||
|
if not isinstance(font, TTFont):
|
||||||
|
return True
|
||||||
return all(
|
return all(
|
||||||
ord(c) in font.face.charToGlyph or not c.isprintable()
|
ord(c) in font.face.charToGlyph or not c.isprintable()
|
||||||
for c in text
|
for c in text
|
||||||
@@ -102,6 +123,24 @@ class FontFallbackParagraph(Paragraph):
|
|||||||
return family
|
return family
|
||||||
|
|
||||||
|
|
||||||
|
class PlainTextParagraph(FontFallbackParagraph):
|
||||||
|
def __init__(self, text, style=None, linebreaks=True, *args, **kwargs):
|
||||||
|
if not isinstance(text, str):
|
||||||
|
if hasattr(text, '__html__'):
|
||||||
|
raise ValueError("It is contradictory to pass escaped content to PlainTextParagraph")
|
||||||
|
text = str(text)
|
||||||
|
|
||||||
|
# Normalize unicode and apply reshaping
|
||||||
|
text = normalize_text(text)
|
||||||
|
|
||||||
|
# Escape any HTML in the text
|
||||||
|
text = escape(text)
|
||||||
|
|
||||||
|
if linebreaks:
|
||||||
|
text = text.strip().replace("\n", "<br />\n")
|
||||||
|
super().__init__(text, style, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def register_ttf_font_if_new(name, path):
|
def register_ttf_font_if_new(name, path):
|
||||||
from reportlab.pdfbase import pdfmetrics
|
from reportlab.pdfbase import pdfmetrics
|
||||||
from reportlab.pdfbase.ttfonts import TTFont
|
from reportlab.pdfbase.ttfonts import TTFont
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
#
|
||||||
|
# This file is part of pretix (Community Edition).
|
||||||
|
#
|
||||||
|
# Copyright (C) 2014-2020 Raphael Michel and contributors
|
||||||
|
# Copyright (C) 2020-today pretix GmbH and contributors
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
|
||||||
|
# Public License as published by the Free Software Foundation in version 3 of the License.
|
||||||
|
#
|
||||||
|
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
|
||||||
|
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
|
||||||
|
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
|
||||||
|
# this file, see <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/>.
|
||||||
|
#
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from django import template
|
||||||
|
from django.utils.html import format_html
|
||||||
|
|
||||||
|
register = template.Library()
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@register.filter
|
||||||
|
def wrap_in(content, tag_name):
|
||||||
|
return format_html(f'<{tag_name}>{{}}</{tag_name}>', content)
|
||||||
@@ -173,6 +173,7 @@ def create_thumbnail(source, size, formats=None):
|
|||||||
# filesystem path, this only works because _open() uses safe_join, which accepts absolute paths if they match the
|
# filesystem path, this only works because _open() uses safe_join, which accepts absolute paths if they match the
|
||||||
# expected base dir. For NanoCDN Files, this works because source.name is set to the storage path.
|
# expected base dir. For NanoCDN Files, this works because source.name is set to the storage path.
|
||||||
source_rb = default_storage.open(source_name, mode='rb')
|
source_rb = default_storage.open(source_name, mode='rb')
|
||||||
|
source_ext = os.path.splitext(source_name)[1].lower()
|
||||||
|
|
||||||
image = Image.open(BytesIO(source_rb.read()), formats=formats or settings.PILLOW_FORMATS_QUESTIONS_IMAGE)
|
image = Image.open(BytesIO(source_rb.read()), formats=formats or settings.PILLOW_FORMATS_QUESTIONS_IMAGE)
|
||||||
try:
|
try:
|
||||||
@@ -183,11 +184,14 @@ def create_thumbnail(source, size, formats=None):
|
|||||||
frames = []
|
frames = []
|
||||||
durations = []
|
durations = []
|
||||||
for f in ImageSequence.Iterator(image):
|
for f in ImageSequence.Iterator(image):
|
||||||
|
if f.mode in ("P", "PA") and source_ext == '.png':
|
||||||
|
f = f.convert('RGBA')
|
||||||
|
if f.mode not in ("1", "L", "RGB", "RGBA"):
|
||||||
|
f = f.convert('RGB')
|
||||||
durations.append(f.info.get("duration", 1000))
|
durations.append(f.info.get("duration", 1000))
|
||||||
frames.append(resize_image(f, size))
|
frames.append(resize_image(f, size))
|
||||||
image_out = frames[0]
|
image_out = frames[0]
|
||||||
save_kwargs = {}
|
save_kwargs = {}
|
||||||
source_ext = os.path.splitext(source_name)[1].lower()
|
|
||||||
|
|
||||||
if source_ext == '.jpg' or source_ext == '.jpeg':
|
if source_ext == '.jpg' or source_ext == '.jpeg':
|
||||||
# Yields better file sizes for photos
|
# Yields better file sizes for photos
|
||||||
@@ -211,10 +215,6 @@ def create_thumbnail(source, size, formats=None):
|
|||||||
checksum = hashlib.md5(image.tobytes()).hexdigest()
|
checksum = hashlib.md5(image.tobytes()).hexdigest()
|
||||||
name = checksum + '.' + size.replace('^', 'c') + '.' + target_ext
|
name = checksum + '.' + size.replace('^', 'c') + '.' + target_ext
|
||||||
buffer = BytesIO()
|
buffer = BytesIO()
|
||||||
if image_out.mode == "P" and source_ext == '.png':
|
|
||||||
image_out = image_out.convert('RGBA')
|
|
||||||
if image_out.mode not in ("1", "L", "RGB", "RGBA"):
|
|
||||||
image_out = image_out.convert('RGB')
|
|
||||||
image_out.save(fp=buffer, format=target_ext.upper(), quality=quality, **save_kwargs)
|
image_out.save(fp=buffer, format=target_ext.upper(), quality=quality, **save_kwargs)
|
||||||
imgfile = ContentFile(buffer.getvalue())
|
imgfile = ContentFile(buffer.getvalue())
|
||||||
|
|
||||||
|
|||||||
+1147
-1106
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+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"
|
||||||
@@ -632,56 +632,56 @@ msgstr ""
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
+1143
-1096
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+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/"
|
||||||
@@ -666,13 +666,13 @@ msgstr "توليد الرسائل …"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "خطأ غير معروف."
|
msgstr "خطأ غير معروف."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Your color has great contrast and is very easy to read!"
|
#| msgid "Your color has great contrast and is very easy to read!"
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr "اللون يتمتع بتباين كبير وتسهل قراءته!"
|
msgstr "اللون يتمتع بتباين كبير وتسهل قراءته!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -680,46 +680,46 @@ msgid ""
|
|||||||
"requirements."
|
"requirements."
|
||||||
msgstr "اللون يحظى بتباين معقول ويمكن أن يكون مناسب للقراءة!"
|
msgstr "اللون يحظى بتباين معقول ويمكن أن يكون مناسب للقراءة!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "البحث في الاستفسارات"
|
msgstr "البحث في الاستفسارات"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "الكل"
|
msgstr "الكل"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "لا شيء"
|
msgstr "لا شيء"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "المختارة فقط"
|
msgstr "المختارة فقط"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "قم باستخدم اسم مختلف داخليا"
|
msgstr "قم باستخدم اسم مختلف داخليا"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "لم تقم بحفظ التعديلات!"
|
msgstr "لم تقم بحفظ التعديلات!"
|
||||||
|
|
||||||
|
|||||||
+1147
-1106
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+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"
|
||||||
@@ -632,56 +632,56 @@ msgstr ""
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
+1143
-1096
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2025-10-31 17:00+0000\n"
|
"PO-Revision-Date: 2025-10-31 17:00+0000\n"
|
||||||
"Last-Translator: Núria Masclans <nuriamasclansserrat@gmail.com>\n"
|
"Last-Translator: Núria Masclans <nuriamasclansserrat@gmail.com>\n"
|
||||||
"Language-Team: Catalan <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Catalan <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
@@ -644,11 +644,11 @@ msgstr "Generant missatges…"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "Error desconegut."
|
msgstr "Error desconegut."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr "El teu color té molt contrast i garanteix bona accessibilitat."
|
msgstr "El teu color té molt contrast i garanteix bona accessibilitat."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
@@ -656,7 +656,7 @@ msgstr ""
|
|||||||
"El teu color té un contrast acceptable i compleix els requisits mínims "
|
"El teu color té un contrast acceptable i compleix els requisits mínims "
|
||||||
"d’accessibilitat."
|
"d’accessibilitat."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
@@ -664,40 +664,40 @@ msgstr ""
|
|||||||
"El color no té prou contrast amb el blanc i pot afectar a l'accessibilitat "
|
"El color no té prou contrast amb el blanc i pot afectar a l'accessibilitat "
|
||||||
"del lloc web."
|
"del lloc web."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Consulta de cerca"
|
msgstr "Consulta de cerca"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Tots"
|
msgstr "Tots"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Cap"
|
msgstr "Cap"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Només seleccionats"
|
msgstr "Només seleccionats"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr "Introdueix un número de pàgina entre 1 i %(max)s."
|
msgstr "Introdueix un número de pàgina entre 1 i %(max)s."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr "Número de pàgina no vàlid."
|
msgstr "Número de pàgina no vàlid."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Utilitza un nom diferent internament"
|
msgstr "Utilitza un nom diferent internament"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
msgstr "Prem per tancar"
|
msgstr "Prem per tancar"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1123
|
#: pretix/static/pretixcontrol/js/ui/main.js:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Tens canvis sense desar!"
|
msgstr "Tens canvis sense desar!"
|
||||||
|
|
||||||
|
|||||||
+1151
-1096
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2026-01-08 04:00+0000\n"
|
"PO-Revision-Date: 2026-01-08 04:00+0000\n"
|
||||||
"Last-Translator: Jiří Pastrňák <jiri@pastrnak.email>\n"
|
"Last-Translator: Jiří Pastrňák <jiri@pastrnak.email>\n"
|
||||||
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
@@ -657,57 +657,57 @@ msgstr "Vytváření zpráv…"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "Neznámá chyba."
|
msgstr "Neznámá chyba."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr "Tato barva má velmi dobrý kontrast a je velmi dobře čitelná."
|
msgstr "Tato barva má velmi dobrý kontrast a je velmi dobře čitelná."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Tato barva má slušný kontrast a pravděpodobně je dostatečně dobře čitelná."
|
"Tato barva má slušný kontrast a pravděpodobně je dostatečně dobře čitelná."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Hledaný výraz"
|
msgstr "Hledaný výraz"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Všechny"
|
msgstr "Všechny"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Žádný"
|
msgstr "Žádný"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Pouze vybrané"
|
msgstr "Pouze vybrané"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
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:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Máte neuložené změny!"
|
msgstr "Máte neuložené změny!"
|
||||||
|
|
||||||
|
|||||||
+1142
-1099
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+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"
|
||||||
@@ -633,56 +633,56 @@ msgstr ""
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
+2768
-2539
File diff suppressed because it is too large
Load Diff
@@ -6,8 +6,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2024-07-10 15:00+0000\n"
|
"PO-Revision-Date: 2026-04-22 18: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/"
|
||||||
"da/>\n"
|
"da/>\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.6.1\n"
|
"X-Generator: Weblate 5.17\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
|
||||||
@@ -682,56 +682,56 @@ msgstr "Opretter beskeder …"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "Ukendt fejl."
|
msgstr "Ukendt fejl."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr "Søgeforespørgsel"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Ingen"
|
msgstr "Ingen"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
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!"
|
||||||
|
|
||||||
|
|||||||
+1149
-1098
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2026-03-17 14:27+0000\n"
|
"PO-Revision-Date: 2026-03-17 14:27+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/"
|
||||||
@@ -650,12 +650,12 @@ msgstr "Generiere Nachrichten…"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "Unbekannter Fehler."
|
msgstr "Unbekannter Fehler."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Diese Farbe hat einen sehr guten Kontrast und trägt zur Barrierefreiheit bei!"
|
"Diese Farbe hat einen sehr guten Kontrast und trägt zur Barrierefreiheit bei!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
@@ -663,7 +663,7 @@ msgstr ""
|
|||||||
"Diese Farbe hat einen ausreichenden Kontrast und genügt den "
|
"Diese Farbe hat einen ausreichenden Kontrast und genügt den "
|
||||||
"Mindestanforderungen der Barrierefreiheit."
|
"Mindestanforderungen der Barrierefreiheit."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
@@ -671,40 +671,40 @@ msgstr ""
|
|||||||
"Diese Farbe hat keinen ausreichenden Kontrast zu weiß. Die Barrierefreiheit "
|
"Diese Farbe hat keinen ausreichenden Kontrast zu weiß. Die Barrierefreiheit "
|
||||||
"der Seite ist eingeschränkt."
|
"der Seite ist eingeschränkt."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Suchbegriff"
|
msgstr "Suchbegriff"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Keine"
|
msgstr "Keine"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Nur ausgewählte"
|
msgstr "Nur ausgewählte"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr "Ungültige Seitenzahl."
|
msgstr "Ungültige Seitenzahl."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
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:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Sie haben ungespeicherte Änderungen!"
|
msgstr "Sie haben ungespeicherte Änderungen!"
|
||||||
|
|
||||||
|
|||||||
@@ -302,6 +302,7 @@ Personalisierung
|
|||||||
P.IVA
|
P.IVA
|
||||||
PKCE-Erweiterung
|
PKCE-Erweiterung
|
||||||
Platzhalterzeichen
|
Platzhalterzeichen
|
||||||
|
PLN
|
||||||
Play
|
Play
|
||||||
Plugin
|
Plugin
|
||||||
Plugins
|
Plugins
|
||||||
|
|||||||
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2026-03-17 14:30+0000\n"
|
"PO-Revision-Date: 2026-03-17 14:30+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/"
|
||||||
@@ -650,12 +650,12 @@ msgstr "Generiere Nachrichten…"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "Unbekannter Fehler."
|
msgstr "Unbekannter Fehler."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Diese Farbe hat einen sehr guten Kontrast und trägt zur Barrierefreiheit bei!"
|
"Diese Farbe hat einen sehr guten Kontrast und trägt zur Barrierefreiheit bei!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
@@ -663,7 +663,7 @@ msgstr ""
|
|||||||
"Diese Farbe hat einen ausreichenden Kontrast und genügt den "
|
"Diese Farbe hat einen ausreichenden Kontrast und genügt den "
|
||||||
"Mindestanforderungen der Barrierefreiheit."
|
"Mindestanforderungen der Barrierefreiheit."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
@@ -671,40 +671,40 @@ msgstr ""
|
|||||||
"Diese Farbe hat keinen ausreichenden Kontrast zu weiß. Die Barrierefreiheit "
|
"Diese Farbe hat keinen ausreichenden Kontrast zu weiß. Die Barrierefreiheit "
|
||||||
"der Seite ist eingeschränkt."
|
"der Seite ist eingeschränkt."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Suchbegriff"
|
msgstr "Suchbegriff"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Keine"
|
msgstr "Keine"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Nur ausgewählte"
|
msgstr "Nur ausgewählte"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr "Ungültige Seitenzahl."
|
msgstr "Ungültige Seitenzahl."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
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:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Du hast ungespeicherte Änderungen!"
|
msgstr "Du hast ungespeicherte Änderungen!"
|
||||||
|
|
||||||
|
|||||||
@@ -302,6 +302,7 @@ Personalisierung
|
|||||||
P.IVA
|
P.IVA
|
||||||
PKCE-Erweiterung
|
PKCE-Erweiterung
|
||||||
Platzhalterzeichen
|
Platzhalterzeichen
|
||||||
|
PLN
|
||||||
Play
|
Play
|
||||||
Plugin
|
Plugin
|
||||||
Plugins
|
Plugins
|
||||||
|
|||||||
+1147
-1106
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: 2026-03-30 11:25+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+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"
|
||||||
@@ -632,56 +632,56 @@ msgstr ""
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
+1150
-1103
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2024-12-22 00:00+0000\n"
|
"PO-Revision-Date: 2024-12-22 00:00+0000\n"
|
||||||
"Last-Translator: Dimitris Tsimpidis <tsimpidisd@gmail.com>\n"
|
"Last-Translator: Dimitris Tsimpidis <tsimpidisd@gmail.com>\n"
|
||||||
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
@@ -689,14 +689,14 @@ msgstr "Δημιουργία μηνυμάτων …"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "Άγνωστο σφάλμα."
|
msgstr "Άγνωστο σφάλμα."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Your color has great contrast and is very easy to read!"
|
#| msgid "Your color has great contrast and is very easy to read!"
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Το χρώμα σας έχει μεγάλη αντίθεση και είναι πολύ εύκολο να το διαβάσετε!"
|
"Το χρώμα σας έχει μεγάλη αντίθεση και είναι πολύ εύκολο να το διαβάσετε!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -706,46 +706,46 @@ msgstr ""
|
|||||||
"Το χρώμα σας έχει αξιοπρεπή αντίθεση και είναι ίσως αρκετά καλό για να "
|
"Το χρώμα σας έχει αξιοπρεπή αντίθεση και είναι ίσως αρκετά καλό για να "
|
||||||
"διαβάσετε!"
|
"διαβάσετε!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Όλα"
|
msgstr "Όλα"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Κανένας"
|
msgstr "Κανένας"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "Χρησιμοποιήστε διαφορετικό όνομα εσωτερικά"
|
msgstr "Χρησιμοποιήστε διαφορετικό όνομα εσωτερικά"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
+1147
-1106
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+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"
|
||||||
@@ -632,56 +632,56 @@ msgstr ""
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
+1178
-1123
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2026-03-30 03:00+0000\n"
|
"PO-Revision-Date: 2026-03-30 03:00+0000\n"
|
||||||
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\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/pretix-"
|
||||||
@@ -648,12 +648,12 @@ msgstr "Generando mensajes…"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "Error desconocido."
|
msgstr "Error desconocido."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"El color tiene un gran contraste y proporcionará una excelente accesibilidad."
|
"El color tiene un gran contraste y proporcionará una excelente accesibilidad."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
@@ -661,7 +661,7 @@ msgstr ""
|
|||||||
"El color tiene un contraste decente y es suficiente para los requisitos "
|
"El color tiene un contraste decente y es suficiente para los requisitos "
|
||||||
"mínimos de accesibilidad."
|
"mínimos de accesibilidad."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
@@ -669,40 +669,40 @@ msgstr ""
|
|||||||
"El color no tiene suficiente contraste con el blanco. La accesibilidad de su "
|
"El color no tiene suficiente contraste con el blanco. La accesibilidad de su "
|
||||||
"sitio se verá afectada."
|
"sitio se verá afectada."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Consulta de búsqueda"
|
msgstr "Consulta de búsqueda"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Todos"
|
msgstr "Todos"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Ninguno"
|
msgstr "Ninguno"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Solamente seleccionados"
|
msgstr "Solamente seleccionados"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
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:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
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:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
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: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2025-08-04 14:16+0200\n"
|
"PO-Revision-Date: 2025-08-04 14:16+0200\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
@@ -633,56 +633,56 @@ msgstr ""
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
+1147
-1106
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2025-12-24 00:00+0000\n"
|
"PO-Revision-Date: 2025-12-24 00:00+0000\n"
|
||||||
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
|
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
|
||||||
"Language-Team: Estonian <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Estonian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
@@ -633,56 +633,56 @@ msgstr ""
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
+1151
-1096
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+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/"
|
||||||
@@ -645,56 +645,56 @@ msgstr ""
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Guztiak"
|
msgstr "Guztiak"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
+1151
-1096
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+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-"
|
||||||
@@ -663,56 +663,56 @@ msgstr ""
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "Tuntematon virhe."
|
msgstr "Tuntematon virhe."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Kaikki"
|
msgstr "Kaikki"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
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:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Sinulla on tallentamattomia muutoksia!"
|
msgstr "Sinulla on tallentamattomia muutoksia!"
|
||||||
|
|
||||||
|
|||||||
+1147
-1106
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+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"
|
||||||
@@ -632,56 +632,56 @@ msgstr ""
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
+1153
-1098
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2026-03-18 12:23+0000\n"
|
"PO-Revision-Date: 2026-03-18 12:23+0000\n"
|
||||||
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
|
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
|
||||||
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
@@ -650,12 +650,12 @@ msgstr "Création de messages …"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "Erreur inconnue."
|
msgstr "Erreur inconnue."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Votre choix de couleur a un bon contraste et il est très facile à lire."
|
"Votre choix de couleur a un bon contraste et il est très facile à lire."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
@@ -663,7 +663,7 @@ msgstr ""
|
|||||||
"Votre choix de couleur est assez bon pour la lecture et offre un bon "
|
"Votre choix de couleur est assez bon pour la lecture et offre un bon "
|
||||||
"contraste."
|
"contraste."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
@@ -671,40 +671,40 @@ msgstr ""
|
|||||||
"Votre choix de couleur n'est pas assez contrastée par rapport au blanc. "
|
"Votre choix de couleur n'est pas assez contrastée par rapport au blanc. "
|
||||||
"L'accessibilité de votre site en sera affectée."
|
"L'accessibilité de votre site en sera affectée."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Requête de recherche"
|
msgstr "Requête de recherche"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Tous"
|
msgstr "Tous"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Aucun"
|
msgstr "Aucun"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
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:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr "Saisir le numéro de page entre 1 et %(max)s."
|
msgstr "Saisir le numéro de page entre 1 et %(max)s."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
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:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
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:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
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 !"
|
||||||
|
|
||||||
|
|||||||
+1399
-1329
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2026-03-02 21:00+0000\n"
|
"PO-Revision-Date: 2026-03-02 21:00+0000\n"
|
||||||
"Last-Translator: Sandra Rial Pérez <sandrarial@gestiontickets.online>\n"
|
"Last-Translator: Sandra Rial Pérez <sandrarial@gestiontickets.online>\n"
|
||||||
"Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
@@ -646,13 +646,13 @@ msgstr "Xerando mensaxes…"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "Erro descoñecido."
|
msgstr "Erro descoñecido."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"A túa cor ten un gran contraste e proporcionará unha excelente "
|
"A túa cor ten un gran contraste e proporcionará unha excelente "
|
||||||
"accesibilidade."
|
"accesibilidade."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
@@ -660,7 +660,7 @@ msgstr ""
|
|||||||
"A túa cor ten un contraste decente e é suficiente para os requisitos mínimos "
|
"A túa cor ten un contraste decente e é suficiente para os requisitos mínimos "
|
||||||
"de accesibilidade."
|
"de accesibilidade."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
@@ -668,40 +668,40 @@ msgstr ""
|
|||||||
"A túa cor non ten suficiente contraste co branco. A accesibilidade do teu "
|
"A túa cor non ten suficiente contraste co branco. A accesibilidade do teu "
|
||||||
"sitio web verase afectada."
|
"sitio web verase afectada."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Consultar unha procura"
|
msgstr "Consultar unha procura"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Todos"
|
msgstr "Todos"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Ningún"
|
msgstr "Ningún"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Soamente seleccionados"
|
msgstr "Soamente seleccionados"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr "Introduza o número de páxina entre 1 e %(max)s."
|
msgstr "Introduza o número de páxina entre 1 e %(max)s."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr "Número de páxina non válido."
|
msgstr "Número de páxina non válido."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
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:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Tes cambios sen gardar!"
|
msgstr "Tes cambios sen gardar!"
|
||||||
|
|
||||||
|
|||||||
+1150
-1096
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2026-02-09 21:00+0000\n"
|
"PO-Revision-Date: 2026-02-09 21:00+0000\n"
|
||||||
"Last-Translator: roi belotsercovsky <rbelotsercovsky@gmail.com>\n"
|
"Last-Translator: roi belotsercovsky <rbelotsercovsky@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/"
|
||||||
@@ -638,56 +638,56 @@ msgstr "יוצר הודעות…"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "שגיאה לא ידועה."
|
msgstr "שגיאה לא ידועה."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr "לצבע שלך יש ניגודיות מצויינת ויאפשר נגישות טובה."
|
msgstr "לצבע שלך יש ניגודיות מצויינת ויאפשר נגישות טובה."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr "לצבע שלך יש ניגודיות סבירה ומתאים לדרישות הנגישות המינימליות."
|
msgstr "לצבע שלך יש ניגודיות סבירה ומתאים לדרישות הנגישות המינימליות."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr "לצבע שלך יש ניגודיות חלשה מדי ביחד לצבע לבן. נגישות האתר תיפגע."
|
msgstr "לצבע שלך יש ניגודיות חלשה מדי ביחד לצבע לבן. נגישות האתר תיפגע."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "שאילתת חיפוש"
|
msgstr "שאילתת חיפוש"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "הכל"
|
msgstr "הכל"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "כלום"
|
msgstr "כלום"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "שנבחרו בלבד"
|
msgstr "שנבחרו בלבד"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr "הכנס מספר דף בין 1 ל %(max)s."
|
msgstr "הכנס מספר דף בין 1 ל %(max)s."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr "מספר דף לא תקין."
|
msgstr "מספר דף לא תקין."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "השתמש בשם אחר לצורך פנימי"
|
msgstr "השתמש בשם אחר לצורך פנימי"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "יש לך שינויים שלא נשמרו!"
|
msgstr "יש לך שינויים שלא נשמרו!"
|
||||||
|
|
||||||
|
|||||||
+1151
-1096
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2025-03-16 10:17+0000\n"
|
"PO-Revision-Date: 2025-03-16 10:17+0000\n"
|
||||||
"Last-Translator: Robert Rigo <kontakt@bicikli.hr>\n"
|
"Last-Translator: Robert Rigo <kontakt@bicikli.hr>\n"
|
||||||
"Language-Team: Croatian <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Croatian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
@@ -634,56 +634,56 @@ msgstr ""
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
+1146
-1103
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2026-01-23 15:00+0000\n"
|
"PO-Revision-Date: 2026-01-23 15:00+0000\n"
|
||||||
"Last-Translator: Vajda Tamás <vajda.tamas@szwg.hu>\n"
|
"Last-Translator: Vajda Tamás <vajda.tamas@szwg.hu>\n"
|
||||||
"Language-Team: Hungarian <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Hungarian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
@@ -680,13 +680,13 @@ msgstr "Üzenetek generálása…"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "Ismeretlen hiba."
|
msgstr "Ismeretlen hiba."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Your color has great contrast and is very easy to read!"
|
#| msgid "Your color has great contrast and is very easy to read!"
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr "A választott színek remek kontrasztot adnak, és nagyon könnyű olvasni!"
|
msgstr "A választott színek remek kontrasztot adnak, és nagyon könnyű olvasni!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -695,46 +695,46 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"A választott színek kontrasztja elégséges, és valószínűleg jól olvasható!"
|
"A választott színek kontrasztja elégséges, és valószínűleg jól olvasható!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Összes"
|
msgstr "Összes"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Semmi"
|
msgstr "Semmi"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
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:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Mentetlen változtatások!"
|
msgstr "Mentetlen változtatások!"
|
||||||
|
|
||||||
|
|||||||
+1151
-1096
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+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/"
|
||||||
@@ -664,13 +664,13 @@ msgstr "Menghasilkan pesan…"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "Kesalahan yang tidak diketahui."
|
msgstr "Kesalahan yang tidak diketahui."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Your color has great contrast and is very easy to read!"
|
#| msgid "Your color has great contrast and is very easy to read!"
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr "Warna Anda sangat kontras dan sangat mudah dibaca!"
|
msgstr "Warna Anda sangat kontras dan sangat mudah dibaca!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -679,46 +679,46 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Warna Anda memiliki kontras yang layak dan mungkin cukup bagus untuk dibaca!"
|
"Warna Anda memiliki kontras yang layak dan mungkin cukup bagus untuk dibaca!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Permintaan pencarian"
|
msgstr "Permintaan pencarian"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Semua"
|
msgstr "Semua"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Tidak ada"
|
msgstr "Tidak ada"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Hanya dipilih"
|
msgstr "Hanya dipilih"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
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:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Anda memiliki perubahan yang belum disimpan!"
|
msgstr "Anda memiliki perubahan yang belum disimpan!"
|
||||||
|
|
||||||
|
|||||||
+1158
-1103
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2026-03-25 14:14+0000\n"
|
"PO-Revision-Date: 2026-03-25 14:14+0000\n"
|
||||||
"Last-Translator: Pietro Isotti <isottipietro@gmail.com>\n"
|
"Last-Translator: Pietro Isotti <isottipietro@gmail.com>\n"
|
||||||
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
@@ -659,13 +659,13 @@ msgstr "Stiamo generando i messaggi …"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "Errore sconosciuto."
|
msgstr "Errore sconosciuto."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Your color has great contrast and is very easy to read!"
|
#| msgid "Your color has great contrast and is very easy to read!"
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr "Il colore scelto ha un ottimo contrasto ed è molto leggibile!"
|
msgstr "Il colore scelto ha un ottimo contrasto ed è molto leggibile!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -674,46 +674,46 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Il colore scelto ha un buon contrasto e probabilmente è abbastanza leggibile!"
|
"Il colore scelto ha un buon contrasto e probabilmente è abbastanza leggibile!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "Chiave di ricerca"
|
msgstr "Chiave di ricerca"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Tutto"
|
msgstr "Tutto"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "Nessuno"
|
msgstr "Nessuno"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "Solo i selezionati"
|
msgstr "Solo i selezionati"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
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:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
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:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "Hai cambiamenti non salvati!"
|
msgstr "Hai cambiamenti non salvati!"
|
||||||
|
|
||||||
|
|||||||
+1166
-1113
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: 2026-03-17 14:06+0000\n"
|
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
|
||||||
"PO-Revision-Date: 2026-03-23 21:00+0000\n"
|
"PO-Revision-Date: 2026-03-23 21:00+0000\n"
|
||||||
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
|
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
|
||||||
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
@@ -643,13 +643,13 @@ msgstr "メッセージを作成中…"
|
|||||||
msgid "Unknown error."
|
msgid "Unknown error."
|
||||||
msgstr "不明なエラー。"
|
msgstr "不明なエラー。"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:310
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"選択した色は素晴らしいコントラストを持ち、優れたアクセシビリティを提供しま"
|
"選択した色は素晴らしいコントラストを持ち、優れたアクセシビリティを提供しま"
|
||||||
"す。"
|
"す。"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:314
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
@@ -657,7 +657,7 @@ msgstr ""
|
|||||||
"選択した色は適切なコントラストを持ち、最小限のアクセシビリティ要件に十分で"
|
"選択した色は適切なコントラストを持ち、最小限のアクセシビリティ要件に十分で"
|
||||||
"す。"
|
"す。"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:318
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
@@ -665,40 +665,40 @@ msgstr ""
|
|||||||
"選択した色は白に対して十分なコントラストがありません。サイトのアクセシビリ"
|
"選択した色は白に対して十分なコントラストがありません。サイトのアクセシビリ"
|
||||||
"ティに影響します。"
|
"ティに影響します。"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:445
|
#: pretix/static/pretixcontrol/js/ui/main.js:446
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Search query"
|
msgid "Search query"
|
||||||
msgstr "検索クエリ"
|
msgstr "検索クエリ"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "全て"
|
msgstr "全て"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:464
|
#: pretix/static/pretixcontrol/js/ui/main.js:465
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "なし"
|
msgstr "なし"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:468
|
#: pretix/static/pretixcontrol/js/ui/main.js:469
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
msgstr "選択したもののみ"
|
msgstr "選択したもののみ"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:841
|
#: pretix/static/pretixcontrol/js/ui/main.js:842
|
||||||
msgid "Enter page number between 1 and %(max)s."
|
msgid "Enter page number between 1 and %(max)s."
|
||||||
msgstr "1以上%(max)s以下のページ番号を入力。"
|
msgstr "1以上%(max)s以下のページ番号を入力。"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:844
|
#: pretix/static/pretixcontrol/js/ui/main.js:845
|
||||||
msgid "Invalid page number."
|
msgid "Invalid page number."
|
||||||
msgstr "無効なページ番号。"
|
msgstr "無効なページ番号。"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1002
|
#: pretix/static/pretixcontrol/js/ui/main.js:1003
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "内部で別の名前を使用する"
|
msgstr "内部で別の名前を使用する"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1042
|
#: pretix/static/pretixcontrol/js/ui/main.js:1043
|
||||||
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:1124
|
||||||
msgid "You have unsaved changes!"
|
msgid "You have unsaved changes!"
|
||||||
msgstr "保存されていない変更があります!"
|
msgstr "保存されていない変更があります!"
|
||||||
|
|
||||||
|
|||||||
+1150
-1096
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user