Compare commits

..

6 Commits

Author SHA1 Message Date
Richard Schreiber
796b034779 add organizer h1 2024-05-27 11:01:34 +02:00
Richard Schreiber
eaf46824e9 only add h1 if not event_logo_show_title 2024-05-27 11:01:24 +02:00
Richard Schreiber
873e2af128 add google_site_verification to organizer-page 2024-05-27 10:56:57 +02:00
Richard Schreiber
7b3ee88adc add hidden setting for google_site_verification 2024-05-27 10:50:14 +02:00
Richard Schreiber
77a5113875 add event-title to alt-attribute of header-image 2024-05-27 10:41:41 +02:00
Richard Schreiber
4d47ae85f2 SEO: add hidden h1 with event-title if header-image only 2024-05-27 10:41:05 +02:00
69 changed files with 8030 additions and 10453 deletions

View File

@@ -1,30 +1,29 @@
before_script:
tests:
image:
name: pretix/ci-image
stage: test
before_script:
- pip install -U pip uv
- uv pip install --system -U wheel setuptools
script:
- uv pip install --system -e ".[dev]"
- virtualenv env
- source env/bin/activate
- pip install -U pip wheel setuptools
- XDG_CACHE_HOME=/cache pip3 install -e ".[dev]"
- cd src
- python manage.py check
- make all compress
- PRETIX_CONFIG_FILE=tests/travis_sqlite.cfg py.test --reruns 3 -n 3 tests --maxfail=100
- py.test --reruns 3 -n 3 tests
tags:
- python3
except:
- pypi
pypi:
stage: release
image:
name: pretix/ci-image
before_script:
- cat $PYPIRC > ~/.pypirc
- pip install -U pip uv
- uv pip install --system -U wheel setuptools twine build pretix-plugin-build check-manifest
script:
- uv pip install --system -e ".[dev]"
- cp /keys/.pypirc ~/.pypirc
- virtualenv env
- source env/bin/activate
- pip install -U pip wheel setuptools check-manifest twine
- XDG_CACHE_HOME=/cache pip3 install -e ".[dev]"
- python setup.py sdist
- uv pip install --system dist/pretix-*.tar.gz
- pip install dist/pretix-*.tar.gz
- python -m pretix migrate
- python -m pretix check
- cd src
@@ -34,12 +33,13 @@ pypi:
- python -m build
- twine check dist/*
- twine upload dist/*
tags:
- python3
only:
- pypi
artifacts:
paths:
- src/dist/
stages:
- test
- build

View File

@@ -103,10 +103,10 @@ pretix_celery_tasks_queued_count
pretix_celery_tasks_queued_age_seconds
The age of the longest-waiting in the worker queue in seconds, labeled with ``queue``.
pretix_logins_successful
pretix_successful_logins
Counter. The number of successful backend logins.
pretix_logins_failed
pretix_failed_logins
Counter. The number of failed backend logins, labeled with ``reason``.
.. _metric types: https://prometheus.io/docs/concepts/metric_types/

View File

@@ -41,6 +41,6 @@ pretix/
tests/
This is the root directory for all test codes. It includes subdirectories ``api``, ``base``,
``control``, ``presale``, ``helpers``, ``multidomain`` and ``plugins`` to mirror the structure
``control``, ``presale``, ``helpers`, ``multidomain`` and ``plugins`` to mirror the structure
of the pretix source code as well as ``testdummy``, which is a pretix plugin used during
testing.

View File

@@ -38,13 +38,13 @@ dependencies = [
"dj-static",
"Django[argon2]==4.2.*",
"django-bootstrap3==24.2",
"django-compressor==4.5",
"django-compressor==4.4",
"django-countries==7.6.*",
"django-filter==24.2",
"django-formset-js-improved==0.5.0.3",
"django-formtools==2.5.1",
"django-hierarkey==1.2.*",
"django-hijack==3.5.*",
"django-hijack==3.4.*",
"django-i18nfield==1.9.*,>=1.9.4",
"django-libsass==0.9",
"django-localflavor==4.0",
@@ -91,8 +91,8 @@ dependencies = [
"qrcode==7.4.*",
"redis==5.0.*",
"reportlab==4.2.*",
"requests==2.31.*",
"sentry-sdk==2.5.*",
"requests==2.32.*",
"sentry-sdk==1.45.*",
"sepaxml==2.6.*",
"slimit",
"static3==0.7.*",
@@ -114,7 +114,7 @@ dev = [
"coverage",
"coveralls",
"fakeredis==2.23.*",
"flake8==7.1.*",
"flake8==7.0.*",
"freezegun",
"isort==5.13.*",
"pep8-naming==0.14.*",

View File

@@ -79,7 +79,6 @@ ALL_LANGUAGES = [
('de', _('German')),
('de-informal', _('German (informal)')),
('ar', _('Arabic')),
('ca', _('Catalan')),
('zh-hans', _('Chinese (simplified)')),
('zh-hant', _('Chinese (traditional)')),
('cs', _('Czech')),
@@ -99,7 +98,6 @@ ALL_LANGUAGES = [
('pt-br', _('Portuguese (Brazil)')),
('ro', _('Romanian')),
('ru', _('Russian')),
('sk', _('Slovak')),
('es', _('Spanish')),
('tr', _('Turkish')),
('uk', _('Ukrainian')),

View File

@@ -564,8 +564,6 @@ class CheckinListOrderPositionSerializer(OrderPositionSerializer):
attendee_name = AttendeeNameField(source='*')
attendee_name_parts = AttendeeNamePartsField(source='*')
order__status = serializers.SlugRelatedField(read_only=True, slug_field='status', source='order')
order__valid_if_pending = serializers.SlugRelatedField(read_only=True, slug_field='valid_if_pending', source='order')
order__require_approval = serializers.SlugRelatedField(read_only=True, slug_field='require_approval', source='order')
class Meta:
model = OrderPosition
@@ -573,8 +571,7 @@ class CheckinListOrderPositionSerializer(OrderPositionSerializer):
'company', 'street', 'zipcode', 'city', 'country', 'state',
'attendee_email', 'voucher', 'tax_rate', 'tax_value', 'secret', 'addon_to', 'subevent', 'checkins',
'downloads', 'answers', 'tax_rule', 'pseudonymization_id', 'pdf_data', 'seat', 'require_attention',
'order__status', 'order__valid_if_pending', 'order__require_approval', 'valid_from', 'valid_until',
'blocked')
'order__status', 'valid_from', 'valid_until', 'blocked')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

View File

@@ -32,7 +32,7 @@
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License.
from collections import OrderedDict, defaultdict
from collections import OrderedDict
from decimal import Decimal
from zoneinfo import ZoneInfo
@@ -605,9 +605,10 @@ class OrderListExporter(MultiSheetListExporter):
]
questions = list(Question.objects.filter(event__in=self.events))
options = defaultdict(list)
options = {}
for q in questions:
if q.type == Question.TYPE_CHOICE_MULTIPLE:
options[q.pk] = []
if form_data['group_multiple_choice']:
for o in q.options.all():
options[q.pk].append(o)
@@ -617,9 +618,6 @@ class OrderListExporter(MultiSheetListExporter):
headers.append(str(q.question) + ' ' + str(o.answer))
options[q.pk].append(o)
else:
if q.type == Question.TYPE_CHOICE:
for o in q.options.all():
options[q.pk].append(o)
headers.append(str(q.question))
headers += [
_('Company'),
@@ -729,7 +727,7 @@ class OrderListExporter(MultiSheetListExporter):
for a in op.answers.all():
# We do not want to localize Date, Time and Datetime question answers, as those can lead
# to difficulties parsing the data (for example 2019-02-01 may become Février, 2019 01 in French).
if a.question.type in (Question.TYPE_CHOICE_MULTIPLE, Question.TYPE_CHOICE):
if a.question.type == Question.TYPE_CHOICE_MULTIPLE:
acache[a.question_id] = set(o.pk for o in a.options.all())
elif a.question.type in Question.UNLOCALIZED_TYPES:
acache[a.question_id] = a.answer
@@ -742,10 +740,6 @@ class OrderListExporter(MultiSheetListExporter):
else:
for o in options[q.pk]:
row.append(_('Yes') if o.pk in acache.get(q.pk, set()) else _('No'))
elif q.type == Question.TYPE_CHOICE:
# Join is only necessary if the question type was modified but also keeps the code simpler here
# as we'd otherwise need some [0] and existance checks
row.append(", ".join(str(o.answer) for o in options[q.pk] if o.pk in acache.get(q.pk, set())))
else:
row.append(acache.get(q.pk, ''))

View File

@@ -1,112 +0,0 @@
from bootstrap3.renderers import FieldRenderer
from bootstrap3.text import text_value
from django.forms import CheckboxInput, CheckboxSelectMultiple, RadioSelect
from django.forms.utils import flatatt
from django.utils.html import format_html
from django.utils.safestring import mark_safe
from django.utils.translation import pgettext
def render_label(content, label_for=None, label_class=None, label_title='', label_id='', optional=False, is_valid=None, attrs=None):
"""
Render a label with content
"""
attrs = attrs or {}
if label_for:
attrs['for'] = label_for
if label_class:
attrs['class'] = label_class
if label_title:
attrs['title'] = label_title
if label_id:
attrs['id'] = label_id
opt = ""
if is_valid is not None:
if is_valid:
validation_text = pgettext('form', 'is valid')
else:
validation_text = pgettext('form', 'has errors')
opt += '<strong class="sr-only"> {}</strong>'.format(validation_text)
if text_value(content) == '&#160;':
# Empty label, e.g. checkbox
attrs.setdefault('class', '')
attrs['class'] += ' label-empty'
# usually checkboxes have overall empty labels and special labels per checkbox
# => remove for-attribute as well as "required"-text appended to label
if 'for' in attrs:
del attrs['for']
else:
opt += '<i class="sr-only label-required">, {}</i>'.format(pgettext('form', 'required')) if not optional else ''
builder = '<{tag}{attrs}>{content}{opt}</{tag}>'
return format_html(
builder,
tag='label',
attrs=mark_safe(flatatt(attrs)) if attrs else '',
opt=mark_safe(opt),
content=text_value(content),
)
class PretixFieldRenderer(FieldRenderer):
def __init__(self, *args, **kwargs):
kwargs['layout'] = 'horizontal'
super().__init__(*args, **kwargs)
self.is_group_widget = isinstance(self.widget, (CheckboxSelectMultiple, RadioSelect, )) or (self.is_multi_widget and len(self.widget.widgets) > 1)
def add_label(self, html):
attrs = {}
label = self.get_label()
if hasattr(self.field.field, '_show_required'):
# e.g. payment settings forms where a field is only required if the payment provider is active
required = self.field.field._show_required
elif hasattr(self.field.field, '_required'):
# e.g. payment settings forms where a field is only required if the payment provider is active
required = self.field.field._required
else:
required = self.field.field.required
if self.field.form.is_bound:
is_valid = len(self.field.errors) == 0
else:
is_valid = None
if self.is_group_widget:
label_for = ""
label_id = "legend-{}".format(self.field.html_name)
else:
label_for = self.field.id_for_label
label_id = ""
if hasattr(self.field.field, 'question') and self.field.field.question.identifier:
attrs["data-identifier"] = self.field.field.question.identifier
html = render_label(
label,
label_for=label_for,
label_class=self.get_label_class(),
label_id=label_id,
attrs=attrs,
optional=not required and not isinstance(self.widget, CheckboxInput),
is_valid=is_valid
) + html
return html
def wrap_label_and_field(self, html):
if self.is_group_widget:
attrs = ' role="group" aria-labelledby="legend-{}"'.format(self.field.html_name)
else:
attrs = ''
return '<div class="{klass}"{attrs}>{html}</div>'.format(klass=self.get_form_group_class(), html=html, attrs=attrs)
def wrap_widget(self, html):
if isinstance(self.widget, CheckboxInput):
css_class = "checkbox"
if self.field.field.disabled:
css_class += " disabled"
html = f'<div class="{css_class}">{html}</div>'
return html

View File

@@ -32,13 +32,13 @@
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License.
import re
from django.core.exceptions import ValidationError
from django.core.validators import BaseValidator
from django.utils.translation import gettext_lazy as _
from i18nfield.strings import LazyI18nString
from pretix.helpers.format import format_map
class PlaceholderValidator(BaseValidator):
"""
@@ -47,12 +47,6 @@ class PlaceholderValidator(BaseValidator):
which are not presented in taken list.
"""
error_message = _(
'There is an error with your placeholder syntax. Please check that the opening "{" and closing "}" curly '
'brackets on your placeholders match up. '
'Please note: to use literal "{" or "}", you need to double them as "{{" and "}}".'
)
def __init__(self, limit_value):
super().__init__(limit_value)
self.limit_value = limit_value
@@ -63,15 +57,22 @@ class PlaceholderValidator(BaseValidator):
self.__call__(v)
return
try:
format_map(value, {key.strip('{}'): "" for key in self.limit_value}, raise_on_missing=True)
except ValueError:
raise ValidationError(self.error_message, code='invalid_placeholder_syntax')
except KeyError as e:
if value.count('{') != value.count('}'):
raise ValidationError(
_('Invalid placeholder: {%(value)s}'),
_('Invalid placeholder syntax: You used a different number of "{" than of "}".'),
code='invalid_placeholder_syntax',
)
data_placeholders = list(re.findall(r'({[^}]*})', value, re.X))
invalid_placeholders = []
for placeholder in data_placeholders:
if placeholder not in self.limit_value:
invalid_placeholders.append(placeholder)
if invalid_placeholders:
raise ValidationError(
_('Invalid placeholder(s): %(value)s'),
code='invalid_placeholders',
params={'value': e.args[0]})
params={'value': ", ".join(invalid_placeholders,)})
def clean(self, x):
return x

View File

@@ -1468,6 +1468,8 @@ class SubEvent(EventMixin, LoggedModel):
seating_plan = models.ForeignKey('SeatingPlan', on_delete=models.PROTECT, null=True, blank=True,
related_name='subevents', verbose_name=_('Seating plan'))
items = models.ManyToManyField('Item', through='SubEventItem')
variations = models.ManyToManyField('ItemVariation', through='SubEventItemVariation')
comment = models.TextField(
verbose_name=_("Internal comment"),
null=True, blank=True

View File

@@ -444,8 +444,7 @@ class Item(LoggedModel):
free_price_suggestion = models.DecimalField(
verbose_name=_("Suggested price"),
help_text=_("This price will be used as the default value of the input field. The user can choose a lower "
"value, but not lower than the price this product would have without the free price option. This "
"will be ignored if a voucher is used that lowers the price."),
"value, but not lower than the price this product would have without the free price option."),
max_digits=13, decimal_places=2, null=True, blank=True,
)
tax_rule = models.ForeignKey(
@@ -1087,8 +1086,7 @@ class ItemVariation(models.Model):
free_price_suggestion = models.DecimalField(
verbose_name=_("Suggested price"),
help_text=_("This price will be used as the default value of the input field. The user can choose a lower "
"value, but not lower than the price this product would have without the free price option. This "
"will be ignored if a voucher is used that lowers the price."),
"value, but not lower than the price this product would have without the free price option."),
max_digits=13, decimal_places=2, null=True, blank=True,
)
require_approval = models.BooleanField(

View File

@@ -1068,72 +1068,36 @@ class Renderer:
canvas.showPage()
def render_background(self, buffer, title=_('Ticket')):
buffer.seek(0)
fg_pdf = PdfReader(buffer)
if settings.PDFTK:
with tempfile.TemporaryDirectory() as d:
fg_filename = os.path.join(d, 'fg.pdf')
bg_filename = os.path.join(d, 'bg.pdf')
out_filename = os.path.join(d, 'out.pdf')
buffer.seek(0)
with open(fg_filename, 'wb') as f:
f.write(buffer.read())
# pdf_header is a string like "%pdf-X.X"
if float(self.bg_pdf.pdf_header[5:]) > float(fg_pdf.pdf_header[5:]):
# To fix issues with pdftk and background-PDF using pdf-version greater
# than foreground-PDF, we stamp front onto back instead.
# Just changing PDF-version in fg.pdf to match the version of
# bg.pdf as we do with pypdf, does not work with pdftk.
#
# Make sure that bg.pdf matches the number of pages of fg.pdf
# note: self.bg_pdf is a PdfReader(), not a PdfWriter()
fg_num_pages = fg_pdf.get_num_pages()
bg_num_pages = self.bg_pdf.get_num_pages()
bg_pdf_to_merge = PdfWriter()
bg_pdf_to_merge.append(self.bg_pdf, pages=(0, min(bg_num_pages, fg_num_pages)))
if fg_num_pages > bg_num_pages:
# repeat last page in bg_pdf to match fg_pdf
bg_pdf_to_merge.append(bg_pdf_to_merge, pages=[bg_num_pages - 1] * (fg_num_pages - bg_num_pages))
bg_pdf_to_merge.write(bg_filename)
pdftk_cmd = [
settings.PDFTK,
bg_filename,
'multistamp',
fg_filename
]
else:
with open(bg_filename, 'wb') as f:
with tempfile.TemporaryDirectory() as d:
with open(os.path.join(d, 'back.pdf'), 'wb') as f:
f.write(self.bg_bytes)
pdftk_cmd = [
with open(os.path.join(d, 'front.pdf'), 'wb') as f:
f.write(buffer.read())
subprocess.run([
settings.PDFTK,
fg_filename,
os.path.join(d, 'front.pdf'),
'multibackground',
bg_filename
]
pdftk_cmd.extend(('output', out_filename, 'compress'))
subprocess.run(pdftk_cmd, check=True)
with open(out_filename, 'rb') as f:
os.path.join(d, 'back.pdf'),
'output',
os.path.join(d, 'out.pdf'),
'compress'
], check=True)
with open(os.path.join(d, 'out.pdf'), 'rb') as f:
return BytesIO(f.read())
else:
buffer.seek(0)
new_pdf = PdfReader(buffer)
output = PdfWriter()
for i, page in enumerate(fg_pdf.pages):
for i, page in enumerate(new_pdf.pages):
bg_page = self.bg_pdf.pages[i]
if bg_page.rotation != 0:
bg_page.transfer_rotation_to_content()
page.merge_page(bg_page, over=False)
output.add_page(page)
# pdf_header is a string like "%pdf-X.X"
if float(self.bg_pdf.pdf_header[5:]) > float(fg_pdf.pdf_header[5:]):
output.pdf_header = self.bg_pdf.pdf_header
output.add_metadata({
'/Title': str(title),
'/Creator': 'pretix',
@@ -1144,61 +1108,33 @@ class Renderer:
return outbuffer
def merge_background(fg_pdf: PdfWriter, bg_pdf: PdfWriter, out_file, compress):
def merge_background(fg_pdf, bg_pdf, out_file, compress):
if settings.PDFTK:
with tempfile.TemporaryDirectory() as d:
fg_filename = os.path.join(d, 'fg.pdf')
bg_filename = os.path.join(d, 'bg.pdf')
# pdf_header is a string like "%pdf-X.X"
if float(bg_pdf.pdf_header[5:]) > float(fg_pdf.pdf_header[5:]):
# To fix issues with pdftk and background-PDF using pdf-version greater
# than foreground-PDF, we stamp front onto back instead.
# Just changing PDF-version in fg.pdf to match the version of
# bg.pdf as we do with pypdf, does not work with pdftk.
# Make sure that bg.pdf matches the number of pages of fg.pdf
fg_num_pages = fg_pdf.get_num_pages()
bg_num_pages = bg_pdf.get_num_pages()
if fg_num_pages > bg_num_pages:
# repeat last page in bg_pdf to match fg_pdf
bg_pdf.append(bg_pdf, pages=[bg_num_pages - 1] * (fg_num_pages - bg_num_pages))
fg_pdf.write(fg_filename)
bg_pdf.write(bg_filename)
pdftk_cmd = [
settings.PDFTK,
bg_filename,
'multistamp',
fg_filename,
]
else:
pdftk_cmd = [
settings.PDFTK,
fg_filename,
'multibackground',
bg_filename
bg_filename,
'output',
'-',
]
pdftk_cmd.extend(('output', '-'))
if compress:
pdftk_cmd.append('compress')
fg_pdf.write(fg_filename)
bg_pdf.write(bg_filename)
subprocess.run(pdftk_cmd, check=True, stdout=out_file)
else:
output = PdfWriter()
for i, page in enumerate(fg_pdf.pages):
bg_page = bg_pdf.pages[i]
if bg_page.rotation != 0:
bg_page.transfer_rotation_to_content()
page.merge_page(bg_page, over=False)
# pdf_header is a string like "%pdf-X.X"
if float(bg_pdf.pdf_header[5:]) > float(fg_pdf.pdf_header[5:]):
fg_pdf.pdf_header = bg_pdf.pdf_header
fg_pdf.write(out_file)
output.add_page(page)
output.write(out_file)
@deconstructible

View File

@@ -62,10 +62,7 @@ class VATIDTemporaryError(VATIDError):
def _validate_vat_id_NO(vat_id, country_code):
# Inspired by vat_moss library
try:
vat_id = vat_moss.id.normalize(vat_id)
except ValueError:
raise VATIDFinalError(error_messages['invalid'])
if not vat_id or len(vat_id) < 3 or not re.match('^\\d{9}MVA$', vat_id[2:]):
raise VATIDFinalError(error_messages['invalid'])

View File

@@ -698,14 +698,6 @@ class ItemUpdateForm(I18nModelForm):
'tax_rule',
_("Gift card products should use a tax rule with a rate of 0 percent since sales tax will be applied when the gift card is redeemed.")
)
if d.get('validity_mode'):
self.add_error(
'validity_mode',
_(
"Do not set a specific validity for gift card products as it will not restrict the validity "
"of the gift card. A validity of gift cards can be set in your organizer settings."
)
)
if d.get('admission'):
self.add_error(
'admission',

View File

@@ -21,16 +21,82 @@
#
from bootstrap3.renderers import FieldRenderer, InlineFieldRenderer
from bootstrap3.text import text_value
from django.forms import CheckboxInput, CheckboxSelectMultiple, RadioSelect
from django.forms.utils import flatatt
from django.utils.html import format_html
from django.utils.safestring import mark_safe
from django.utils.translation import pgettext
from pretix.base.forms.renderers import PretixFieldRenderer
from i18nfield.forms import I18nFormField
class ControlFieldRenderer(PretixFieldRenderer):
pass
def render_label(content, label_for=None, label_class=None, label_title='', label_id='', optional=False):
"""
Render a label with content
"""
attrs = {}
if label_for:
attrs['for'] = label_for
if label_class:
attrs['class'] = label_class
if label_title:
attrs['title'] = label_title
if label_id:
attrs['id'] = label_id
if text_value(content) == '&#160;':
# Empty label, e.g. checkbox
attrs.setdefault('class', '')
attrs['class'] += ' label-empty'
builder = '<{tag}{attrs}>{content}{opt}</{tag}>'
return format_html(
builder,
tag='label',
attrs=mark_safe(flatatt(attrs)) if attrs else '',
opt=mark_safe('<br><span class="optional">{}</span>'.format(pgettext('form', 'Optional'))) if optional else '',
content=text_value(content),
)
class ControlFieldRenderer(FieldRenderer):
def __init__(self, *args, **kwargs):
kwargs['layout'] = 'horizontal'
super().__init__(*args, **kwargs)
self.is_group_widget = isinstance(self.widget, (CheckboxSelectMultiple, RadioSelect, )) or (self.is_multi_widget and len(self.widget.widgets) > 1)
def add_label(self, html):
label = self.get_label()
if hasattr(self.field.field, '_required'):
# e.g. payment settings forms where a field is only required if the payment provider is active
required = self.field.field._required
elif isinstance(self.field.field, I18nFormField):
required = self.field.field.one_required
else:
required = self.field.field.required
if self.is_group_widget:
label_for = ""
label_id = "legend-{}".format(self.field.html_name)
else:
label_for = self.field.id_for_label
label_id = ""
html = render_label(
label,
label_for=label_for,
label_class=self.get_label_class(),
label_id=label_id,
optional=not required and not isinstance(self.widget, CheckboxInput)
) + html
return html
def wrap_label_and_field(self, html):
if self.is_group_widget:
attrs = ' role="group" aria-labelledby="legend-{}"'.format(self.field.html_name)
else:
attrs = ''
return '<div class="{klass}"{attrs}>{html}</div>'.format(klass=self.get_form_group_class(), html=html, attrs=attrs)
class ControlFieldWithVisibilityRenderer(ControlFieldRenderer):

View File

@@ -373,7 +373,7 @@ class VoucherBulkForm(VoucherForm):
res.append(self.Recipient(
name=row.get('name', ''),
email=row['email'].strip(),
number=int(row.get('number', 1) or ""),
number=int(row.get('number', 1)),
tag=row.get('tag', None)
))
except ValueError as err:

View File

@@ -444,11 +444,6 @@ def get_global_navigation(request):
'url': reverse('control:global.license'),
'active': (url.url_name == 'global.license'),
},
{
'label': _('System report'),
'url': reverse('control:global.sysreport'),
'active': (url.url_name == 'global.sysreport'),
},
]
})

View File

@@ -1,307 +0,0 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-2021 rami.io GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/license>.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
import os
import platform
import sys
import zoneinfo
from datetime import datetime, timedelta
from django.conf import settings
from django.db.models import Count, Exists, F, Min, OuterRef, Q, Sum
from django.utils.formats import date_format
from django.utils.timezone import now
from reportlab.lib import pagesizes
from reportlab.lib.enums import TA_CENTER
from reportlab.lib.units import mm
from reportlab.platypus import Paragraph, Spacer, Table, TableStyle
from pretix import __version__
from pretix.base.models import Order, OrderPayment, Transaction
from pretix.base.plugins import get_all_plugins
from pretix.base.templatetags.money import money_filter
from pretix.plugins.reports.exporters import ReportlabExportMixin
from pretix.settings import DATA_DIR
class SysReport(ReportlabExportMixin):
@property
def pagesize(self):
return pagesizes.portrait(pagesizes.A4)
def __init__(self, start_month, tzname):
self.tzname = tzname
self.tz = zoneinfo.ZoneInfo(tzname)
self.start_month = start_month
def page_header(self, canvas, doc):
pass
def page_footer(self, canvas, doc):
from reportlab.lib.units import mm
canvas.setFont("OpenSans", 8)
canvas.drawString(15 * mm, 10 * mm, "Page %d" % doc.page)
canvas.drawRightString(
self.pagesize[0] - doc.rightMargin,
10 * mm,
"Created: %s"
% date_format(now().astimezone(self.tz), "SHORT_DATETIME_FORMAT"),
)
def render(self):
return "sysreport.pdf", "application/pdf", self.create({})
def get_story(self, doc, form_data):
headlinestyle = self.get_style()
headlinestyle.fontSize = 15
subheadlinestyle = self.get_style()
subheadlinestyle.fontSize = 13
style_small = self.get_style()
style_small.fontSize = 6
story = [
Paragraph("System report", headlinestyle),
Spacer(1, 5 * mm),
Paragraph("Usage", subheadlinestyle),
Spacer(1, 5 * mm),
self._usage_table(),
Spacer(1, 5 * mm),
Paragraph("Installed versions", subheadlinestyle),
Spacer(1, 5 * mm),
self._tech_table(),
Spacer(1, 5 * mm),
Paragraph("Plugins", subheadlinestyle),
Spacer(1, 5 * mm),
Paragraph(self._get_plugin_versions(), style_small),
Spacer(1, 5 * mm),
Paragraph("Custom templates", subheadlinestyle),
Spacer(1, 5 * mm),
Paragraph(self._get_custom_templates(), style_small),
Spacer(1, 5 * mm),
]
return story
def _tech_table(self):
style = self.get_style()
style.fontSize = 8
style_small = self.get_style()
style_small.fontSize = 6
w = self.pagesize[0] - 30 * mm
colwidths = [
a * w
for a in (
0.2,
0.8,
)
]
tstyledata = [
("VALIGN", (0, 0), (-1, -1), "TOP"),
("LEFTPADDING", (0, 0), (0, -1), 0),
("RIGHTPADDING", (-1, 0), (-1, -1), 0),
]
tdata = [
[Paragraph("Site URL:", style), Paragraph(settings.SITE_URL, style)],
[Paragraph("pretix version:", style), Paragraph(__version__, style)],
[Paragraph("Python version:", style), Paragraph(sys.version, style)],
[Paragraph("Platform:", style), Paragraph(platform.platform(), style)],
[
Paragraph("Database engine:", style),
Paragraph(settings.DATABASES["default"]["ENGINE"], style),
],
]
table = Table(tdata, colWidths=colwidths, repeatRows=0)
table.setStyle(TableStyle(tstyledata))
return table
def _usage_table(self):
style = self.get_style()
style.fontSize = 8
style_small = self.get_style()
style_small.fontSize = 6
style_small.leading = 8
style_small.alignment = TA_CENTER
style_small_head = self.get_style()
style_small_head.fontSize = 6
style_small_head.leading = 8
style_small_head.alignment = TA_CENTER
style_small_head.fontName = "OpenSansBd"
w = self.pagesize[0] - 30 * mm
successful = (
Q(status=Order.STATUS_PAID)
| Q(valid_if_pending=True, status=Order.STATUS_PENDING)
| Q(
Exists(
OrderPayment.objects.filter(
order_id=OuterRef("pk"),
state__in=(
OrderPayment.PAYMENT_STATE_CONFIRMED,
OrderPayment.PAYMENT_STATE_REFUNDED,
),
)
),
)
)
orders_q = Order.objects.filter(
successful,
testmode=False,
)
orders_testmode_q = Order.objects.filter(
testmode=True,
)
orders_unconfirmed_q = Order.objects.filter(
~successful,
testmode=False,
)
revenue_q = Transaction.objects.filter(
Exists(
OrderPayment.objects.filter(
order_id=OuterRef("order_id"),
state__in=(
OrderPayment.PAYMENT_STATE_CONFIRMED,
OrderPayment.PAYMENT_STATE_REFUNDED,
),
)
),
order__testmode=False,
)
currencies = sorted(
list(
set(
Transaction.objects.annotate(c=F("order__event__currency"))
.values_list("c", flat=True)
.distinct()
)
)
)
year_first = orders_q.aggregate(m=Min("datetime__year"))["m"]
if not year_first:
year_first = now().year
elif datetime.now().month - 1 <= self.start_month:
year_first -= 1
year_last = now().year
tdata = [
[
Paragraph(l, style_small_head)
for l in (
"Time frame",
"Currency",
"Successful orders",
"Net revenue",
"Testmode orders",
"Unsucessful orders",
"Positions",
"Gross revenue",
)
]
]
for year in range(year_first, year_last + 1):
for i, c in enumerate(currencies):
first_day = datetime(
year, self.start_month, 1, 0, 0, 0, 0, tzinfo=self.tz
)
after_day = datetime(
year + 1, self.start_month, 1, 0, 0, 0, 0, tzinfo=self.tz
)
orders_count = (
orders_q.filter(
datetime__gte=first_day, datetime__lt=after_day
).aggregate(c=Count("*"))["c"]
or 0
)
testmode_count = (
orders_testmode_q.filter(
datetime__gte=first_day, datetime__lt=after_day
).aggregate(c=Count("*"))["c"]
or 0
)
unconfirmed_count = (
orders_unconfirmed_q.filter(
datetime__gte=first_day, datetime__lt=after_day
).aggregate(c=Count("*"))["c"]
or 0
)
revenue_data = revenue_q.filter(
datetime__gte=first_day, datetime__lt=after_day, order__event__currency=c
).aggregate(
c=Sum("count"),
s_net=Sum(F("price") - F("tax_value")),
s_gross=Sum(F("price")),
)
tdata.append(
(
Paragraph(
date_format(first_day, "M Y")
+ " "
+ date_format(after_day - timedelta(days=1), "M Y"),
style_small,
),
Paragraph(c, style_small),
Paragraph(str(orders_count), style_small) if i == 0 else "",
Paragraph(money_filter(revenue_data.get("s_net") or 0, c), style_small),
Paragraph(str(testmode_count), style_small) if i == 0 else "",
Paragraph(str(unconfirmed_count), style_small) if i == 0 else "",
Paragraph(str(revenue_data.get("c") or 0), style_small),
Paragraph(money_filter(revenue_data.get("s_gross") or 0, c), style_small),
)
)
colwidths = [a * w for a in (0.18,) + (0.82 / 7,) * 7]
tstyledata = [
("VALIGN", (0, 0), (-1, -1), "TOP"),
("LEFTPADDING", (0, 0), (0, -1), 0),
("RIGHTPADDING", (-1, 0), (-1, -1), 0),
("TOPPADDING", (0, 0), (-1, -1), 0),
("BOTTOMPADDING", (0, 0), (-1, -1), 1),
]
table = Table(tdata, colWidths=colwidths, repeatRows=0)
table.setStyle(TableStyle(tstyledata))
return table
def _get_plugin_versions(self):
lines = []
for p in get_all_plugins():
lines.append(f"{p.name} {p.version}")
return ", ".join(lines)
def _get_custom_templates(self):
lines = []
for dirpath, dirnames, filenames in os.walk(
os.path.join(DATA_DIR, "templates")
):
for f in filenames:
lines.append(f"{dirpath}/{f}")
d = "<br/>".join(lines[:50])
if len(lines) > 50:
d += "<br/>..."
if not d:
return ""
return d

View File

@@ -327,7 +327,8 @@
{% endblocktrans %}
{% blocktrans trimmed %}
Internet Explorer is an old browser that does not support lots of recent web-based
technologies and is no longer supported by this website.
technologies. While some features might already not work properly, we plan on no longer
supporting Internet Explorer in our administrative backend in the next months.
{% endblocktrans %}
{% blocktrans trimmed %}
We kindly ask you to move to one of our supported browsers, such as Microsoft Edge,

View File

@@ -1,35 +0,0 @@
{% extends "pretixcontrol/global_settings_base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block inner %}
<p>
{% trans "If you have a pretix Enterprise license, this report must be submitted to pretix support when your license renews. It may also be requested by pretix support to aid debugging of problems." %}
{% trans "It serves two purposes: Collecting useful information that might help with debugging problems in your pretix installation, and verifying that your usage of pretix is in compliance with the Enterprise license you purchased." %}
</p>
<form method="post">
{% csrf_token %}
<p>
<label>
{% trans "First month of license term:" %}
<select name="month" class="form-control">
<option value="1">{% trans "January" %}</option>
<option value="2">{% trans "February" %}</option>
<option value="3">{% trans "March" %}</option>
<option value="4">{% trans "April" %}</option>
<option value="5">{% trans "May" %}</option>
<option value="6">{% trans "June" %}</option>
<option value="7">{% trans "July" %}</option>
<option value="8">{% trans "August" %}</option>
<option value="9">{% trans "September" %}</option>
<option value="10">{% trans "October" %}</option>
<option value="11">{% trans "November" %}</option>
<option value="11">{% trans "December" %}</option>
</select>
</label>
</p>
<button type="submit" class="btn btn-primary btn-lg">
{% trans "Generate report" %}
</button>
</form>
{% endblock %}

View File

@@ -56,7 +56,6 @@ urlpatterns = [
re_path(r'^global/settings/$', global_settings.GlobalSettingsView.as_view(), name='global.settings'),
re_path(r'^global/update/$', global_settings.UpdateCheckView.as_view(), name='global.update'),
re_path(r'^global/license/$', global_settings.LicenseCheckView.as_view(), name='global.license'),
re_path(r'^global/sysreport/$', global_settings.SysReportView.as_view(), name='global.sysreport'),
re_path(r'^global/message/$', global_settings.MessageView.as_view(), name='global.message'),
re_path(r'^logdetail/$', global_settings.LogDetailView.as_view(), name='global.logdetail'),
re_path(r'^logdetail/payment/$', global_settings.PaymentDetailView.as_view(), name='global.paymentdetail'),

View File

@@ -73,7 +73,6 @@ from i18nfield.utils import I18nJSONEncoder
from pretix.base.channels import get_all_sales_channels
from pretix.base.email import get_available_placeholders
from pretix.base.forms import PlaceholderValidator
from pretix.base.models import Event, LogEntry, Order, TaxRule, Voucher
from pretix.base.models.event import EventMetaValue
from pretix.base.services import tickets
@@ -714,6 +713,11 @@ class MailSettingsSetup(EventPermissionRequiredMixin, MailSettingsSetupView):
class MailSettingsPreview(EventPermissionRequiredMixin, View):
permission = 'can_change_event_settings'
# return the origin text if key is missing in dict
class SafeDict(dict):
def __missing__(self, key):
return '{' + key + '}'
# create index-language mapping
@cached_property
def supported_locale(self):
@@ -738,7 +742,7 @@ class MailSettingsPreview(EventPermissionRequiredMixin, View):
_('This value will be replaced based on dynamic parameters.'),
s
)
return ctx
return self.SafeDict(ctx)
def post(self, request, *args, **kwargs):
preview_item = request.POST.get('item', '')
@@ -754,21 +758,12 @@ class MailSettingsPreview(EventPermissionRequiredMixin, View):
idx = matched.group('idx')
if idx in self.supported_locale:
with language(self.supported_locale[idx], self.request.event.settings.region):
try:
if k.startswith('mail_subject_'):
msgs[self.supported_locale[idx]] = format_map(
bleach.clean(v), self.placeholders(preview_item), raise_on_missing=True
)
msgs[self.supported_locale[idx]] = format_map(bleach.clean(v), self.placeholders(preview_item))
else:
msgs[self.supported_locale[idx]] = markdown_compile_email(
format_map(v, self.placeholders(preview_item), raise_on_missing=True)
format_map(v, self.placeholders(preview_item))
)
except ValueError:
msgs[self.supported_locale[idx]] = '<div class="alert alert-danger">{}</div>'.format(
PlaceholderValidator.error_message)
except KeyError as e:
msgs[self.supported_locale[idx]] = '<div class="alert alert-danger">{}</div>'.format(
_('Invalid placeholder: {%(value)s}') % {'value': e.args[0]})
return JsonResponse({
'item': preview_item,

View File

@@ -32,16 +32,14 @@
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License.
import importlib_metadata as metadata
from django.conf import settings
from django.contrib import messages
from django.http import HttpResponse, JsonResponse
from django.http import JsonResponse
from django.shortcuts import get_object_or_404, redirect, reverse
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from django.views import View
from django.views.generic import FormView, TemplateView
from pretix.base.i18n import language
from pretix.base.models import LogEntry, OrderPayment, OrderRefund
from pretix.base.services.update_check import check_result_table, update_check
from pretix.base.settings import GlobalSettingsObject
@@ -51,7 +49,6 @@ from pretix.control.forms.global_settings import (
from pretix.control.permissions import (
AdministratorPermissionRequiredMixin, StaffMemberRequiredMixin,
)
from pretix.control.sysreport import SysReport
class GlobalSettingsView(AdministratorPermissionRequiredMixin, FormView):
@@ -265,25 +262,3 @@ class LicenseCheckView(StaffMemberRequiredMixin, FormView):
))
return res
class SysReportView(AdministratorPermissionRequiredMixin, TemplateView):
template_name = 'pretixcontrol/global_sysreport.html'
def get(self, request, *args, **kwargs):
return super().get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
with language("en"):
try:
month = int(request.POST.get("month"))
except ValueError:
return super().get(request, *args, **kwargs)
if month < 1 or month > 12:
return super().get(request, *args, **kwargs)
name, mime, data = SysReport(month, settings.TIME_ZONE).render()
resp = HttpResponse(data)
resp['Content-Type'] = mime
resp['Content-Disposition'] = 'inline; filename="{}"'.format(name)
resp._csp_ignore = True
return resp

View File

@@ -1323,8 +1323,6 @@ class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, MetaDataE
def plugin_forms(self):
forms = []
for rec, resp in item_forms.send(sender=self.request.event, item=self.item, request=self.request):
if not resp:
continue
if isinstance(resp, (list, tuple)):
forms.extend(resp)
else:

View File

@@ -30,15 +30,17 @@ class SafeFormatter(Formatter):
Customized version of ``str.format`` that (a) behaves just like ``str.format_map`` and
(b) does not allow any unwanted shenanigans like attribute access or format specifiers.
"""
def __init__(self, context, raise_on_missing=False):
def __init__(self, context):
self.context = context
self.raise_on_missing = raise_on_missing
def get_field(self, field_name, args, kwargs):
return self.get_value(field_name, args, kwargs), field_name
if '.' in field_name or '[' in field_name:
logger.warning(f'Ignored invalid field name "{field_name}"')
return ('{' + str(field_name) + '}', field_name)
return super().get_field(field_name, args, kwargs)
def get_value(self, key, args, kwargs):
if not self.raise_on_missing and key not in self.context:
if key not in self.context:
return '{' + str(key) + '}'
return self.context[key]
@@ -47,7 +49,7 @@ class SafeFormatter(Formatter):
return super().format_field(value, '')
def format_map(template, context, raise_on_missing=False):
def format_map(template, context):
if not isinstance(template, str):
template = str(template)
return SafeFormatter(context, raise_on_missing).format(template)
return SafeFormatter(context).format(template)

View File

@@ -72,13 +72,9 @@ def remove_invalid_excel_chars(val):
return val
def SafeCell(worksheet, row=None, column=None, value=None, **kwargs):
def SafeCell(*args, value=None, **kwargs):
value = remove_invalid_excel_chars(value)
if not column:
column = 1
if not row:
row = 1
c = Cell(worksheet, row=row, column=column, value=value, **kwargs)
c = Cell(*args, value=value, **kwargs)
if c.data_type == TYPE_FORMULA:
c.data_type = TYPE_STRING
return c

View File

@@ -180,11 +180,7 @@ def create_thumbnail(source, size, formats=None):
except:
raise ThumbnailError('Could not load image')
frames = []
durations = []
for f in ImageSequence.Iterator(image):
durations.append(f.info.get("duration", 1000))
frames.append(resize_image(f, size))
frames = [resize_image(frame, size) for frame in ImageSequence.Iterator(image)]
image_out = frames[0]
save_kwargs = {}
source_ext = os.path.splitext(source_name)[1].lower()
@@ -202,8 +198,6 @@ def create_thumbnail(source, size, formats=None):
'loop': image.info.get('loop', 0),
'save_all': True,
}
if len(frames) > 1 and 'duration' in image.info:
save_kwargs['duration'] = durations
else:
target_ext = 'png'
quality = None

View File

@@ -4,7 +4,7 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-19 16:00+0000\n"
"PO-Revision-Date: 2024-05-01 01:00+0000\n"
"Last-Translator: Nikolai <nikolai@lengefeldt.de>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/da/"
">\n"
@@ -13,7 +13,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.5.5\n"
"X-Generator: Weblate 5.4.3\n"
#: pretix/_base_settings.py:78
msgid "English"
@@ -186,12 +186,12 @@ msgstr ""
#: pretix/api/models.py:118 pretix/base/models/devices.py:123
#: pretix/base/models/organizer.py:264
msgid "All events (including newly created ones)"
msgstr "Alle arrangementer (inkl. nyoprettede begivenheder)"
msgstr "Alle arrangementer (inkl. nyligt oprettede)"
#: pretix/api/models.py:119 pretix/base/models/devices.py:124
#: pretix/base/models/organizer.py:265
msgid "Limit to events"
msgstr "Vis kun arrangementer"
msgstr "Begræns til arrangementer"
#: pretix/api/models.py:120 pretix/base/exporters/orderlist.py:283
#: pretix/base/exporters/orderlist.py:1049
@@ -844,7 +844,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/organizers/customer_profile.html:20
#, fuzzy
msgid "Customer ID"
msgstr "Kunde ID"
msgstr "Kundehandlinger"
#: pretix/base/exporters/customers.py:65
#: pretix/control/templates/pretixcontrol/organizers/customer.html:31
@@ -1278,7 +1278,7 @@ msgstr "Dato"
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:43
#: pretix/presale/templates/pretixpresale/organizers/customer_profile.html:70
msgid "Order code"
msgstr "Bestillingsnr."
msgstr "Bestillingskode"
#: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:329
#: pretix/base/modelimport_orders.py:60 pretix/base/models/customers.py:384
@@ -2816,7 +2816,7 @@ msgstr "Udløbsdato"
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:136
#, fuzzy
msgid "Customer account"
msgstr "Kundekonto"
msgstr "Kundehandlinger"
#: pretix/base/exporters/reusablemedia.py:51 pretix/base/models/media.py:97
#, fuzzy
@@ -3175,7 +3175,7 @@ msgstr "Faktura til"
#: pretix/base/invoice.py:401 pretix/base/invoice.py:951
msgctxt "invoice"
msgid "Order code"
msgstr "Bestillingsnr."
msgstr "Bestillingskode"
#: pretix/base/invoice.py:410 pretix/base/invoice.py:964
msgctxt "invoice"
@@ -8316,7 +8316,7 @@ msgstr "Produkterne er lagt i kurven."
#: pretix/base/services/placeholders.py:525
msgid "Please transfer money to this bank account: 9999-9999-9999-9999"
msgstr "Overfør venligst beløbet til denne bankkonto: 9999-9999-9999-9999"
msgstr ""
#: pretix/base/services/seating.py:61 pretix/base/services/seating.py:128
#, python-format
@@ -11468,7 +11468,7 @@ msgstr "Arrangement:"
#: pretix/base/templates/pretixbase/email/order_details.html:26
#: pretix/base/templates/pretixbase/email/order_details.html:77
msgid "Order code:"
msgstr "Bestillingsnr.:"
msgstr "Bestillingskode:"
#: pretix/base/templates/pretixbase/email/order_details.html:31
msgid "created by"
@@ -11791,6 +11791,7 @@ msgid "All time"
msgstr "Alle"
#: pretix/base/timeline.py:60
#, fuzzy
msgctxt "timeline"
msgid "Your event starts"
msgstr "Arrangements starttidspunkt"
@@ -11813,6 +11814,7 @@ msgid "Start of ticket sales"
msgstr "Start af forsalg"
#: pretix/base/timeline.py:95
#, fuzzy
msgctxt "timeline"
msgid "End of ticket sales"
msgstr "Slut af forsalg"
@@ -12828,8 +12830,9 @@ msgstr "Forsalg slut"
#: pretix/control/forms/filter.py:1629 pretix/control/forms/filter.py:1632
#: pretix/control/forms/filter.py:2265
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html:84
#, fuzzy
msgid "Date from"
msgstr "Dato fra"
msgstr "Dato"
#: pretix/control/forms/filter.py:1137 pretix/control/forms/filter.py:1140
#: pretix/control/forms/filter.py:1636 pretix/control/forms/filter.py:1639
@@ -14949,10 +14952,9 @@ msgid "The order has been reactivated."
msgstr "Bestilling oprettet."
#: pretix/control/logdisplay.py:390
#, python-brace-format
#, fuzzy, python-brace-format
msgid "The test mode order {code} has been deleted."
msgstr ""
"Bestillingen {code}, der blev oprettet under testmodus, er blevet slettet."
msgstr "Den valgte dato er blevet slettet."
#: pretix/control/logdisplay.py:391
msgid "The order has been created."
@@ -15979,8 +15981,9 @@ msgid "Payments"
msgstr "Betaling"
#: pretix/control/navigation.py:374
#, fuzzy
msgid "User settings"
msgstr "Brugerindstillinger"
msgstr "Basisindstillinger"
#: pretix/control/navigation.py:385
#: pretix/control/templates/pretixcontrol/user/settings.html:16
@@ -15992,8 +15995,9 @@ msgid "2FA"
msgstr ""
#: pretix/control/navigation.py:395
#, fuzzy
msgid "Authorized apps"
msgstr "Autoriserede apps"
msgstr "Kundehandlinger"
#: pretix/control/navigation.py:400
#: pretix/control/templates/pretixcontrol/user/history.html:4
@@ -17112,7 +17116,7 @@ msgstr "Gå til arrangement"
#: pretix/control/templates/pretixcontrol/dashboard.html:15
msgid "Your upcoming events"
msgstr "Dine kommende arrangementer"
msgstr ""
#: pretix/control/templates/pretixcontrol/dashboard.html:20
#: pretix/control/templates/pretixcontrol/events/create_base.html:4
@@ -17126,15 +17130,15 @@ msgstr "Opret arrangement"
#: pretix/control/templates/pretixcontrol/dashboard.html:39
msgid "View all upcoming events"
msgstr "Vis alle kommende arrangementer"
msgstr ""
#: pretix/control/templates/pretixcontrol/dashboard.html:44
msgid "Your most recent events"
msgstr "Dine fornylig afsluttede arrangementer"
msgstr ""
#: pretix/control/templates/pretixcontrol/dashboard.html:60
msgid "View all recent events"
msgstr "Vis alle afsluttede arrangementer"
msgstr ""
#: pretix/control/templates/pretixcontrol/dashboard.html:65
msgid "Your event series"
@@ -18712,8 +18716,8 @@ msgid ""
"The list below shows all events you have administrative access to. Click on "
"the event name to access event details."
msgstr ""
"I listen vises alle arrangementer, som du har administratoradgang til. Klik "
"navnet for at se flere informationer."
"Listen vises alle arrangementer som du har administratoradgang til. Klik "
"navnet for at se detaljer."
#: pretix/control/templates/pretixcontrol/events/index.html:12
#: pretix/control/templates/pretixcontrol/organizers/detail.html:18
@@ -19819,12 +19823,13 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/oauth/authorized.html:4
#: pretix/control/templates/pretixcontrol/oauth/authorized.html:6
#: pretix/control/templates/pretixcontrol/user/settings.html:61
#, fuzzy
msgid "Authorized applications"
msgstr "Autoriserede applikationer"
msgstr "Kundehandlinger"
#: pretix/control/templates/pretixcontrol/oauth/authorized.html:9
msgid "Manage your own apps"
msgstr "Styr dine egne apps"
msgstr ""
#: pretix/control/templates/pretixcontrol/oauth/authorized.html:18
msgid "Permissions"
@@ -19832,7 +19837,7 @@ msgstr "Tilladelser"
#: pretix/control/templates/pretixcontrol/oauth/authorized.html:59
msgid "No applications have access to your pretix account."
msgstr "Der er ingen applikationer, der har adgang til din Pretix-konto."
msgstr ""
#: pretix/control/templates/pretixcontrol/order/approve.html:4
#: pretix/control/templates/pretixcontrol/order/approve.html:8
@@ -23491,8 +23496,9 @@ msgid "Change two-factor settings"
msgstr "Ændr tofaktor-indstillinger"
#: pretix/control/templates/pretixcontrol/user/settings.html:65
#, fuzzy
msgid "Show applications"
msgstr "Vis applikationer"
msgstr "Vis information"
#: pretix/control/templates/pretixcontrol/user/settings.html:74
msgid "Show account history"
@@ -27562,7 +27568,7 @@ msgstr ""
#: pretix/plugins/reports/exporters.py:246
msgctxt "export_category"
msgid "Analysis"
msgstr "Analyse"
msgstr ""
#: pretix/plugins/reports/accountingreport.py:82
#, fuzzy
@@ -27660,8 +27666,9 @@ msgid "(excl. taxes)"
msgstr "inkl. %(rate)s%% moms"
#: pretix/plugins/reports/exporters.py:275
#, fuzzy
msgid "(incl. taxes)"
msgstr "(inkl. moms)"
msgstr "inkl. %(rate)s%% moms"
#: pretix/plugins/reports/exporters.py:285
#: pretix/plugins/reports/exporters.py:304
@@ -29400,6 +29407,7 @@ msgid "Step"
msgstr ""
#: pretix/presale/checkoutflow.py:248
#, fuzzy
msgctxt "checkoutflow"
msgid "Customer account"
msgstr "Kundekonto"
@@ -29538,9 +29546,8 @@ msgid "Save address in my customer account for future purchases"
msgstr ""
#: pretix/presale/forms/checkout.py:158
#, fuzzy
msgid "Save answers to my customer profiles for future purchases"
msgstr "Gem mine svar i min kundekonto, for at genbruge dem i fremtiden."
msgstr ""
#: pretix/presale/forms/checkout.py:165
#, fuzzy
@@ -29854,8 +29861,9 @@ msgid "Cart expired"
msgstr "Kurv udløbet"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:36
#, fuzzy
msgid "Show full cart"
msgstr "Vis hele indkøbskurven"
msgstr "Vis information"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:48
#: pretix/presale/templates/pretixpresale/event/index.html:78
@@ -31234,6 +31242,7 @@ msgid "Request invoice"
msgstr "Anmod om faktura"
#: pretix/presale/templates/pretixpresale/event/order.html:286
#, fuzzy
msgid "Your information"
msgstr "Dine oplysninger"
@@ -31257,6 +31266,7 @@ msgid "Change your order"
msgstr "Ret din ordre"
#: pretix/presale/templates/pretixpresale/event/order.html:353
#, fuzzy
msgctxt "action"
msgid "Cancel your order"
msgstr "Annuller bestilling"
@@ -31893,7 +31903,7 @@ msgstr "Er du sikker på at du vil slette gruppen?"
#: pretix/presale/templates/pretixpresale/organizers/customer_profile.html:15
#, fuzzy
msgid "Account information"
msgstr "Kontoinformationer"
msgstr "Kontoindstillinger ændret"
#: pretix/presale/templates/pretixpresale/organizers/customer_info.html:11
#, fuzzy
@@ -31935,7 +31945,7 @@ msgstr "Angiv ny adgangskode"
#: pretix/presale/templates/pretixpresale/organizers/customer_profile.html:10
#, fuzzy
msgid "Your account"
msgstr "Din konto"
msgstr "Din kurv"
#: pretix/presale/templates/pretixpresale/organizers/customer_profile.html:23
#, fuzzy

View File

@@ -7,8 +7,8 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-08 13:19+0000\n"
"PO-Revision-Date: 2024-05-30 17:00+0000\n"
"Last-Translator: Nikolai <nikolai@lengefeldt.de>\n"
"PO-Revision-Date: 2022-12-01 17:00+0000\n"
"Last-Translator: Mie Frydensbjerg <mif@aarhus.dk>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix-js/"
"da/>\n"
"Language: da\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.5.5\n"
"X-Generator: Weblate 4.14.2\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -724,6 +724,10 @@ msgid "Cart expired"
msgstr "Kurv udløbet"
#: pretix/static/pretixpresale/js/ui/cart.js:50
#, fuzzy
#| msgid "The items in your cart are reserved for you for one minute."
#| msgid_plural ""
#| "The items in your cart are reserved for you for {num} minutes."
msgid "The items in your cart are reserved for you for one minute."
msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "Varerne i din kurv er reserveret for dig i et minut."

View File

@@ -5,8 +5,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
"Last-Translator: Thilo-Alexander Ginkel <tg@tgbyte.de>\n"
"PO-Revision-Date: 2024-05-24 08:53+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/de/"
">\n"
"Language: de\n"
@@ -6357,7 +6357,7 @@ msgid ""
"The seat \"{id}\" is currently unavailable (blocked, already sold or a "
"different voucher)."
msgstr ""
"Der Sitzplatz \"{id}\" ist aktuell nicht verfügbar (blockiert, bereits "
"Der Sitzplatz \"{id}\" ist derzeit nicht verfügbar (blockiert, bereits "
"verkauft, oder einem anderen Gutschein zugewiesen)."
#: pretix/base/models/waitinglist.py:64
@@ -6390,7 +6390,7 @@ msgstr "Das ausgewählte Produkt ist im Moment nicht verfügbar."
#: pretix/base/models/waitinglist.py:186
msgid "No seat with this product is currently available."
msgstr "Es ist aktuell kein Sitzplatz mit diesem Produkt verfügbar."
msgstr "Es ist derzeit kein Sitzplatz mit diesem Produkt verfügbar."
#: pretix/base/models/waitinglist.py:189
msgid "A voucher has already been sent to this person."
@@ -6786,9 +6786,9 @@ msgid ""
"Create an invoice for orders using bank transfer immediately if the event is "
"otherwise configured to create invoices after payment is completed."
msgstr ""
"Generiere Rechnungen für Bestellungen die Banküberweisung als "
"Zahlungsmethode nutzen sofort, auch wenn die Veranstaltung konfiguriert ist "
"Rechnungen erst nach Zahlungseingang zu generieren."
"Generiere Rechnungen für Bestellungen die Bankeinzug als Zahlungsmethode "
"nutzen sofort, auch wenn die Veranstaltung konfiguriert ist Rechnungen erst "
"nach Zahlungseingang zu generieren."
#: pretix/base/payment.py:1260
msgid "Offsetting"
@@ -14050,7 +14050,7 @@ msgid ""
"people over 65. This ticket includes access to all parts of the event, "
"except the VIP area."
msgstr ""
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent*innen, "
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudenten, "
"Arbeitslose und Menschen über 65. Das Ticket enthält Zugang zu allen Teilen "
"der Veranstaltung außer des VIP-Bereiches."
@@ -28810,7 +28810,7 @@ msgstr ""
msgid ""
"Please click the \"Pay with PayPal\" button below to start your payment."
msgstr ""
"Bitte klicken Sie auf den \"Mit PayPal bezahlen\" Knopf, um mit der Zahlung "
"Bitte klicken Sie auf den \"Mit PayPal bezahlen\" Knopf um mit der Zahlung "
"zu beginnen."
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/checkout_payment_form.html:13
@@ -33115,7 +33115,7 @@ msgid ""
"There are currently no products available that can be bought with this "
"voucher."
msgstr ""
"Es sind aktuell keine Produkte verfügbar, die mit diesem Gutschein gebucht "
"Es sind derzeit keine Produkte verfügbar, die mit diesem Gutschein gebucht "
"werden können."
#: pretix/presale/templates/pretixpresale/event/voucher.html:52

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
"Last-Translator: Thilo-Alexander Ginkel <tg@tgbyte.de>\n"
"PO-Revision-Date: 2024-05-24 08:53+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix/de_Informal/>\n"
"Language: de_Informal\n"
@@ -6350,7 +6350,7 @@ msgid ""
"The seat \"{id}\" is currently unavailable (blocked, already sold or a "
"different voucher)."
msgstr ""
"Der Sitzplatz \"{id}\" ist aktuell nicht verfügbar (blockiert, bereits "
"Der Sitzplatz \"{id}\" ist derzeit nicht verfügbar (blockiert, bereits "
"verkauft, oder einem anderen Gutschein zugewiesen)."
#: pretix/base/models/waitinglist.py:64
@@ -6383,7 +6383,7 @@ msgstr "Das ausgewählte Produkt ist im Moment nicht verfügbar."
#: pretix/base/models/waitinglist.py:186
msgid "No seat with this product is currently available."
msgstr "Es ist aktuell kein Sitzplatz mit diesem Produkt verfügbar."
msgstr "Es ist derzeit kein Sitzplatz mit diesem Produkt verfügbar."
#: pretix/base/models/waitinglist.py:189
msgid "A voucher has already been sent to this person."
@@ -6778,9 +6778,9 @@ msgid ""
"Create an invoice for orders using bank transfer immediately if the event is "
"otherwise configured to create invoices after payment is completed."
msgstr ""
"Generiere Rechnungen für Bestellungen die Banküberweisung als "
"Zahlungsmethode nutzen sofort, auch wenn die Veranstaltung konfiguriert ist "
"Rechnungen erst nach Zahlungseingang zu generieren."
"Generiere Rechnungen für Bestellungen die Bankeinzug als Zahlungsmethode "
"nutzen sofort, auch wenn die Veranstaltung konfiguriert ist Rechnungen erst "
"nach Zahlungseingang zu generieren."
#: pretix/base/payment.py:1260
msgid "Offsetting"
@@ -14025,7 +14025,7 @@ msgid ""
"people over 65. This ticket includes access to all parts of the event, "
"except the VIP area."
msgstr ""
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent*innen, "
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudenten, "
"Arbeitslose und Menschen über 65. Das Ticket enthält Zugang zu allen Teilen "
"der Veranstaltung außer des VIP-Bereiches."
@@ -28759,7 +28759,7 @@ msgstr ""
msgid ""
"Please click the \"Pay with PayPal\" button below to start your payment."
msgstr ""
"Bitte klicke auf den \"Mit PayPal bezahlen\" Knopf, um mit der Zahlung zu "
"Bitte klicke auf den \"Mit PayPal bezahlen\" Knopf um mit der Zahlung zu "
"beginnen."
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/checkout_payment_form.html:13
@@ -33053,7 +33053,7 @@ msgid ""
"There are currently no products available that can be bought with this "
"voucher."
msgstr ""
"Es sind aktuell keine Produkte verfügbar, die mit diesem Gutschein gebucht "
"Es sind derzeit keine Produkte verfügbar, die mit diesem Gutschein gebucht "
"werden können."
#: pretix/presale/templates/pretixpresale/event/voucher.html:52

View File

@@ -8,16 +8,16 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-05-31 15:52+0000\n"
"Last-Translator: danijossnet <danijoss@yahoo.com>\n"
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix/el/>"
"\n"
"PO-Revision-Date: 2023-07-11 11:38+0000\n"
"Last-Translator: hara metaxa <metaxahara@gmail.com>\n"
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix/el/"
">\n"
"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.5.5\n"
"X-Generator: Weblate 4.17\n"
#: pretix/_base_settings.py:78
msgid "English"
@@ -34388,7 +34388,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_event_info.html:20
#, python-format
msgid "Begin: %(time)s"
msgstr "Έναρξη: %(time)s"
msgstr "Ξεκινήστε: %(time)s"
#: pretix/presale/templates/pretixpresale/event/fragment_event_info.html:29
#, python-format

View File

@@ -4,8 +4,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
"Last-Translator: simonD <simon.dalvy@gmail.com>\n"
"PO-Revision-Date: 2024-05-23 14:03+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/fr/"
">\n"
"Language: fr\n"
@@ -85,7 +85,7 @@ msgstr "Letton"
#: pretix/_base_settings.py:95
msgid "Norwegian Bokmål"
msgstr "Norvégien Bokmål"
msgstr ""
#: pretix/_base_settings.py:96
msgid "Polish"
@@ -158,8 +158,10 @@ msgid "Allowed URIs list, space separated"
msgstr "Liste des URI autorisées, séparées par des espaces"
#: pretix/api/models.py:47
#, fuzzy
#| msgid "Allowed URIs list, space separated"
msgid "Allowed Post Logout URIs list, space separated"
msgstr "Liste des URI de déconnexion autorisées, séparées par des espaces"
msgstr "Liste des URI autorisées, séparées par des espaces"
#: pretix/api/models.py:51 pretix/base/models/customers.py:395
#: pretix/plugins/paypal/payment.py:113 pretix/plugins/paypal2/payment.py:108
@@ -311,8 +313,10 @@ msgid "This type of question cannot be asked during check-in."
msgstr "Ce genre de questions ne peut pas être posé lors de l'enregistrement."
#: pretix/api/serializers/item.py:493 pretix/control/forms/item.py:143
#, fuzzy
#| msgid "This type of question cannot be asked during check-in."
msgid "This type of question cannot be shown during check-in."
msgstr "Ce type de questions ne peut pas être affiché lors de l'enregistrement."
msgstr "Ce genre de questions ne peut pas être posé lors de l'enregistrement."
#: pretix/api/serializers/media.py:108
msgid ""
@@ -457,7 +461,7 @@ msgstr "Commande modifiée"
#: pretix/api/webhooks.py:266
msgid "Refund of payment created"
msgstr "Le remboursement du paiement a été réalisé"
msgstr "Le remboursement de la paiement a été fait"
#: pretix/api/webhooks.py:270 pretix/base/notifications.py:293
msgid "External refund of payment"
@@ -465,15 +469,15 @@ msgstr "Remboursement externe du paiement"
#: pretix/api/webhooks.py:274
msgid "Refund of payment requested by customer"
msgstr "Un remboursement a été demandé par le.a client.e"
msgstr "Une remboursement a été demandé par le.a client.e"
#: pretix/api/webhooks.py:278
msgid "Refund of payment completed"
msgstr "Remboursement du paiement effectué"
msgstr "Paiement effectué"
#: pretix/api/webhooks.py:282
msgid "Refund of payment canceled"
msgstr "Le remboursement a été annulé"
msgstr "La remboursement a été annulée"
#: pretix/api/webhooks.py:286
msgid "Refund of payment failed"
@@ -1199,8 +1203,8 @@ msgid ""
msgstr ""
"N'incluez que les factures pour les commandes qui ont au moins une tentative "
"de paiement par ce fournisseur de paiement. Notez que cela peut inclure "
"certaines factures de commandes qui ont été payées partiellement ou "
"totalement par un autre fournisseur de paiement."
"certaines factures d'ordres qui ont été pa partiellement ou totalement par "
"un autre fournisseur de paiement."
#: pretix/base/exporters/invoices.py:126
msgid "All invoices"
@@ -1740,8 +1744,10 @@ msgstr "Nécessite une attention particulière"
#: pretix/base/exporters/items.py:91 pretix/base/exporters/orderlist.py:282
#: pretix/base/models/items.py:590 pretix/base/models/items.py:1155
#: pretix/base/models/orders.py:288
#, fuzzy
#| msgid "Check-in time"
msgid "Check-in text"
msgstr "Texte d'enregistrement"
msgstr "Heure du check-in"
#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:595
#: pretix/base/models/items.py:1080
@@ -1827,7 +1833,7 @@ msgstr "frais de la commande"
#: pretix/base/exporters/orderlist.py:109
msgid "Only paid orders"
msgstr "Seulement les commandes payées"
msgstr "Seulement les ordres payés"
#: pretix/base/exporters/orderlist.py:115
msgid "Include payment amounts"
@@ -1919,7 +1925,7 @@ msgstr "Total de la commande"
#: pretix/presale/templates/pretixpresale/organizers/customer_profile.html:75
#: pretix/presale/templates/pretixpresale/organizers/index.html:47
msgid "Status"
msgstr "État"
msgstr "Statut"
#: pretix/base/exporters/orderlist.py:260
#: pretix/base/exporters/orderlist.py:443
@@ -2679,7 +2685,7 @@ msgstr "Tous"
#: pretix/base/exporters/orderlist.py:1278 pretix/control/forms/filter.py:1343
msgid "Live"
msgstr "En ligne"
msgstr "En direct"
#: pretix/base/exporters/orderlist.py:1287 pretix/control/forms/filter.py:1351
#: pretix/control/templates/pretixcontrol/pdf/index.html:252
@@ -2750,6 +2756,8 @@ msgid "Reusable media"
msgstr "Support réutilisable"
#: pretix/base/exporters/reusablemedia.py:35
#, fuzzy
#| msgid "Reusable media"
msgctxt "export_category"
msgid "Reusable media"
msgstr "Support réutilisable"
@@ -2876,7 +2884,7 @@ msgstr "code de réduction"
#: pretix/base/forms/__init__.py:118
#, python-brace-format
msgid "You can use {markup_name} in this field."
msgstr "Vous pouvez utiliser {markup_name} dans ce champ."
msgstr ""
#: pretix/base/forms/__init__.py:178
#, python-format
@@ -3610,11 +3618,10 @@ msgid "Price mode"
msgstr "Mode prix"
#: pretix/base/modelimport_vouchers.py:150
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid "Could not parse {value} as a date and time."
msgid "Could not parse {value} as a price mode, use one of {options}."
msgstr ""
"Impossible d'analyser {value} en tant que mode de prix, utilisez l'une des "
"{options}."
msgstr "Impossible danalyser {value} comme date et heure."
#: pretix/base/modelimport_vouchers.py:160 pretix/base/models/vouchers.py:245
msgid "Voucher value"
@@ -3622,7 +3629,7 @@ msgstr "Valeur du bon"
#: pretix/base/modelimport_vouchers.py:165
msgid "It is pointless to set a value without a price mode."
msgstr "Il est inutile de fixer une valeur sans mode de prix."
msgstr ""
#: pretix/base/modelimport_vouchers.py:237 pretix/base/models/items.py:1998
#: pretix/base/models/vouchers.py:272
@@ -3632,8 +3639,12 @@ msgid "Quota"
msgstr "Quota"
#: pretix/base/modelimport_vouchers.py:253
#, fuzzy
#| msgid "You cannot select a quota and a specific product at the same time."
msgid "You cannot specify a quota if you specified a product."
msgstr "Vous ne pouvez pas spécifier un quota si vous avez spécifié un produit."
msgstr ""
"Vous ne pouvez pas sélectionner simultanément un quota et un produit "
"spécifique."
#: pretix/base/modelimport_vouchers.py:282 pretix/base/models/vouchers.py:495
msgid "You need to choose a date if you select a seat."
@@ -3680,14 +3691,12 @@ msgstr ""
"ce bon"
#: pretix/base/models/auth.py:248
#, fuzzy
msgid "Is active"
msgstr "Actif"
msgstr "Est actif"
#: pretix/base/models/auth.py:250
#, fuzzy
msgid "Is site admin"
msgstr "Administrateur du site"
msgstr "Est administrateur du site"
#: pretix/base/models/auth.py:252
msgid "Date joined"
@@ -3900,8 +3909,10 @@ msgid "Ticket blocked"
msgstr "Billet bloqué"
#: pretix/base/models/checkin.py:370
#, fuzzy
#| msgid "Order approved"
msgid "Order not approved"
msgstr "Commande non validée"
msgstr "Commande approuvé"
#: pretix/base/models/checkin.py:371
msgid "Ticket not valid at this time"
@@ -4007,9 +4018,8 @@ msgstr "Cet identificateur est déjà utilisé pour une autre question."
#: pretix/control/templates/pretixcontrol/checkin/checkins.html:67
#: pretix/control/templates/pretixcontrol/organizers/gates.html:16
#: pretix/plugins/checkinlists/exporters.py:754
#, fuzzy
msgid "Gate"
msgstr "Pont"
msgstr "Porte"
#: pretix/base/models/devices.py:132
#: pretix/control/templates/pretixcontrol/organizers/devices.html:83
@@ -4871,8 +4881,6 @@ msgid ""
"This text will be shown by the check-in app if a ticket of this type is "
"scanned."
msgstr ""
"Ce texte sera affiché par l'application de \"check-in\" si un billet de ce "
"type est scanné."
#: pretix/base/models/items.py:598 pretix/base/models/items.py:1083
msgid ""
@@ -6062,11 +6070,11 @@ msgstr "Possibilité de modifier les paramètres du produit"
#: pretix/base/models/organizer.py:309
msgid "Can view orders"
msgstr "Peut afficher les commandes"
msgstr "Peut afficher les ordres"
#: pretix/base/models/organizer.py:313
msgid "Can change orders"
msgstr "Possibilité de modifier les commandes"
msgstr "Possibilité de modifier les ordres"
#: pretix/base/models/organizer.py:317
msgid "Can perform check-ins"
@@ -7506,15 +7514,17 @@ msgstr ""
"dans la quantité sélectionnée. Voir ci-dessous pour plus de détails."
#: pretix/base/services/cart.py:122
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "Some of the products you selected are no longer available in the quantity "
#| "you selected. Please see below for details."
msgid ""
"Some of the products you selected are no longer available in the quantity "
"you selected. The following products are affected and have not been added to "
"your cart: %s"
msgstr ""
"Certains des produits que vous avez sélectionnés ne sont plus disponibles "
"dans la quantité sélectionnée. Les produits suivants sont concernés et n'ont "
"pas été ajoutés à votre panier : %s"
"dans la quantité sélectionnée. Voir ci-dessous pour plus de détails."
#: pretix/base/services/cart.py:127
#, python-format
@@ -8851,7 +8861,7 @@ msgid ""
"recommended!)"
msgstr ""
"Afficher les prix nets au lieu des prix bruts dans la liste de produits (pas "
"recommandé!)"
"recommandé!)"
#: pretix/base/settings.py:326
msgid ""
@@ -9192,9 +9202,8 @@ msgstr ""
"visiblement"
#: pretix/base/settings.py:720 pretix/base/settings.py:731
#, fuzzy
msgid "Only respected by some invoice renderers."
msgstr "Seulement respecté par certains générateurs de factures."
msgstr "Seulement respecté par certains exécutants de factures."
#: pretix/base/settings.py:730 pretix/base/settings.py:2847
#: pretix/control/templates/pretixcontrol/pdf/index.html:352
@@ -9735,8 +9744,10 @@ msgstr ""
"réattribué à la personne suivante sur la liste."
#: pretix/base/settings.py:1407
#, fuzzy
#| msgid "Enable waiting list"
msgid "Disable waiting list"
msgstr "Désactiver la liste d'attente"
msgstr "Activer la liste d'attente"
#: pretix/base/settings.py:1408
msgid ""
@@ -9746,11 +9757,6 @@ msgid ""
"still people on the waiting list. Vouchers that have already been sent "
"remain active."
msgstr ""
"Après cette date, la liste d'attente sera entièrement désactivée. Cela "
"signifie que plus personne ne pourra s'inscrire sur la liste d'attente, mais "
"que les billets seront à nouveau disponibles à la vente si les quotas le "
"permettent, même s'il y a encore des personnes sur la liste d'attente. Les "
"bons déjà envoyés restent actifs."
#: pretix/base/settings.py:1420
msgid "Ask for a name"
@@ -10092,9 +10098,6 @@ msgid ""
"Allow changes regardless of price, as long as no refund is required (i.e. "
"the resulting price is not lower than what has already been paid)."
msgstr ""
"Autoriser les modifications quel que soit le prix, à condition qu'aucun "
"remboursement ne soit exigé (c'est-à-dire que le prix obtenu ne soit pas "
"inférieur à celui qui a déjà été payé)."
#: pretix/base/settings.py:1732 pretix/base/settings.py:1743
msgid "Allow changes regardless of price, even if this results in a refund."
@@ -10587,16 +10590,17 @@ msgid ""
msgstr ""
"Bonjour\n"
"\n"
"Nous avons reçu avec succès votre commande pour l'événement {event}.\n"
"Votre commande nécessite lapprobation de lorganisateur de lévénement,\n"
"nous vous demandons d'être patient, nous vous recontacterons sous peu par "
"e-mail.\n"
"Nous avons reçu avec succès votre commande pour {event}. Depuis que vous "
"avez commandé\n"
"un produit qui nécessite lapprobation de lorganisateur de lévénement, "
"nous vous demandons de\n"
"Soyez patient et attendez notre prochain e-mail.\n"
"\n"
"Vous pouvez modifier les détails de votre commande et consulter son état à l"
"adresse suivante :\n"
"Vous pouvez modifier les détails de votre commande et consulter létat de "
"votre commande à ladresse\n"
"{url}\n"
"\n"
"Sincères salutations\n"
"Sinceres salutations \n"
"Votre équipe {event}"
#: pretix/base/settings.py:2243
@@ -11049,16 +11053,17 @@ msgid ""
msgstr ""
"Bonjour\n"
"\n"
"Nous avons approuvé votre commande pour l'événement {event} \n"
"et serons heureux de vous accueillir à cette occasion.\n"
"Nous avons approuvé votre commande pour {event} et serons heureux de vous "
"accueillir\n"
"lors de notre événement.\n"
"\n"
"Veuillez continuer en payant votre commande avant le {expire_date}.\n"
"Veuillez continuer en payant votre commande avant {expire_date}.\n"
"\n"
"Vous pouvez sélectionner un mode de paiement et effectuer le paiement ici:\n"
"\n"
"Vous pouvez sélectionner un mode de paiement et effectuer le paiement à l"
"adresse suivante :\n"
"{url}\n"
"\n"
"Sincères salutations\n"
"Sinceres salutations \n"
"Votre équipe {event}"
#: pretix/base/settings.py:2526 pretix/base/settings.py:2563
@@ -11105,16 +11110,16 @@ msgid ""
msgstr ""
"Bonjour\n"
"\n"
"Nous avons approuvé votre commande pour l'événement {event}\n"
"et serons heureux de vous accueillir\n"
"Votre commande ne comprend que des produits gratuits, \n"
"aucun paiement nest requis.\n"
"Nous avons approuvé votre commande pour {event} et serons heureux de vous "
"accueillir\n"
"lors de notre événement. Comme vous navez commandé que des produits "
"gratuits, aucun paiement nest requis.\n"
"\n"
"Vous pouvez modifier les détails de votre commande et consulter son état à l"
"adresse suivante :\n"
"Vous pouvez modifier les détails de votre commande et consulter létat de "
"votre commande à ladresse\n"
"{url}\n"
"\n"
"Sincères salutations\n"
"Sinceres salutations \n"
"Votre équipe {event}"
#: pretix/base/settings.py:2575
@@ -12583,9 +12588,11 @@ msgid "Customers can no longer cancel paid orders"
msgstr "Les clients ne peuvent plus annuler les commandes payées"
#: pretix/base/timeline.py:167
#, fuzzy
#| msgid "Waiting list entry deleted"
msgctxt "timeline"
msgid "Waiting list is disabled"
msgstr "La liste d'attente est désactivée"
msgstr "Suppression d'une inscription de la liste d'attente"
#: pretix/base/timeline.py:181
msgctxt "timeline"
@@ -13281,8 +13288,9 @@ msgid ""
"Our regular widget doesn't work in all website builders. If you run into "
"trouble, try using this compatibility mode."
msgstr ""
"Notre widget standard ne fonctionne pas avec tous les sites Web. Si vous "
"rencontrez des problèmes, essayez d'utiliser ce mode de compatibilité."
"Notre widget régulier ne fonctionne pas chez tous les constructeurs de sites "
"Web. Si vous rencontrez des problèmes, essayez d'utiliser ce mode de "
"compatibilité."
#: pretix/control/forms/event.py:1574
msgid "The given voucher code does not exist."
@@ -13620,7 +13628,7 @@ msgstr "jour de semaine"
#: pretix/control/forms/filter.py:1953 pretix/control/forms/filter.py:1955
#: pretix/control/forms/filter.py:2523 pretix/control/forms/filter.py:2525
msgid "Search query"
msgstr "Recherche"
msgstr "Requête de recherche"
#: pretix/control/forms/filter.py:1423 pretix/control/forms/filter.py:1496
#: pretix/control/templates/pretixcontrol/organizers/customer.html:45
@@ -18190,7 +18198,7 @@ msgstr ""
"Les e-mails seront envoyés via le serveur par défaut du système, mais avec "
"votre propre adresse dexpéditeur. Cela rendra vos e-mails plus "
"personnalisés et provenant directement de vous, mais cela pourrait également "
"nécessiter des étapes supplémentaires pour assurer une bonne déliverabilité."
"nécessiter des étapes supplémentaires pour assurer une bonne délivrabilité."
#: pretix/control/templates/pretixcontrol/email_setup.html:84
#: pretix/control/templates/pretixcontrol/email_setup_smtp.html:18
@@ -18723,7 +18731,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/event/live.html:51
#: pretix/control/templates/pretixcontrol/event/live.html:65
msgid "Go live"
msgstr "Publier"
msgstr "En direct"
#: pretix/control/templates/pretixcontrol/event/live.html:59
msgid "If you want to, you can publish your ticket shop now."
@@ -18780,7 +18788,7 @@ msgid ""
msgstr ""
"En outre, le mode test ne couvre que la boutique en ligne principale. Les "
"commandes créées via dautres canaux de vente tels que le module billetterie "
"ou revendeurs sont toujours créées en tant que commande de production."
"ou revendeurs sont toujours créées en tant quordres de fabrication."
#: pretix/control/templates/pretixcontrol/event/live.html:112
msgid ""
@@ -19246,7 +19254,7 @@ msgstr "Nom et adresse"
#: pretix/control/templates/pretixcontrol/event/settings.html:88
msgid "See invoice settings"
msgstr "Voir les paramètres de facturation"
msgstr "Voir les paramètre de facturation"
#: pretix/control/templates/pretixcontrol/event/settings.html:94
msgid "Attendee data (once per personalized ticket)"
@@ -19317,7 +19325,7 @@ msgstr "Affichage"
#, fuzzy
#| msgid "Product history"
msgid "Product list"
msgstr "Liste de produits"
msgstr "Historique du produit"
#: pretix/control/templates/pretixcontrol/event/settings.html:248
#, fuzzy
@@ -21170,9 +21178,9 @@ msgid ""
"If you chose \"split into new order\" for multiple positions, they will be "
"all split in one second order together, not multiple orders."
msgstr ""
"Si vous choisissez \" diviser en nouvelle commande \" pour plusieurs "
"positions, elles seront toutes divisées en une seule seconde commande "
"ensemble, et non en plusieurs commandes."
"Si vous choisissez \" diviser en nouvel ordre \" pour plusieurs positions, "
"elles seront toutes divisées en un seul second ordre ensemble, et non en "
"plusieurs ordres."
#: pretix/control/templates/pretixcontrol/order/change.html:48
msgid ""
@@ -22588,8 +22596,10 @@ msgstr "Sélectionner une action"
#: pretix/control/templates/pretixcontrol/orders/index.html:306
#: pretix/control/views/orders.py:332
#, fuzzy
#| msgid "Refund full paid amount"
msgid "Refund overpaid amount"
msgstr "Remboursement du trop-perçu"
msgstr "Remboursement du montant total payé"
#: pretix/control/templates/pretixcontrol/orders/index.html:314
#: pretix/control/views/orders.py:317
@@ -25001,9 +25011,8 @@ msgid "Generate 2FA emergency token"
msgstr "Générer de nouveaux tokens d'urgence"
#: pretix/control/templates/pretixcontrol/users/form.html:22
#, fuzzy
msgid "Impersonate user"
msgstr "Voir le site comme cet utilisateur"
msgstr "Utilisateur usurpé"
#: pretix/control/templates/pretixcontrol/users/form.html:42
msgid "Authentication backend"
@@ -25459,7 +25468,7 @@ msgid ""
"global settings to change them for all your organizers or you can unlock "
"them to change them for this event individually."
msgstr ""
"Ces paramètres sont actuellement définis au niveau global. De cette façon, "
"Ces paramètres sont actuellement définis au niveau mondial. De cette façon, "
"vous pouvez facilement les modifier pour tous les organisateurs en même "
"temps. Vous pouvez accéder aux paramètres globaux pour les modifier pour "
"tous vos organisateurs ou les déverrouiller pour les modifier "
@@ -25653,7 +25662,7 @@ msgstr "en ligne"
#: pretix/control/views/dashboards.py:271
msgid "live and in test mode"
msgstr "en production et en mode test"
msgstr "en direct et en mode test"
#: pretix/control/views/dashboards.py:272
msgid "not yet public"
@@ -28852,8 +28861,8 @@ msgstr "Le processus de paiement a commencé dans une nouvelle fenêtre."
#: pretix/plugins/stripe/templates/pretixplugins/stripe/redirect.html:20
msgid "The window to enter your payment data was not opened or was closed?"
msgstr ""
"La fenêtre de saisie de vos données de paiement a-t-elle été fermée ou ne "
"s'est pas ouverte ?"
"La fenêtre de saisie de vos données de paiement na pas été ouverte ou a été "
"fermée ?"
#: pretix/plugins/paypal/templates/pretixplugins/paypal/redirect.html:25
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/redirect.html:25
@@ -30234,7 +30243,7 @@ msgstr "Compte Stripe"
#: pretix/plugins/stripe/payment.py:258
msgctxt "stripe"
msgid "Live"
msgstr "En ligne"
msgstr "En direct"
#: pretix/plugins/stripe/payment.py:259
msgctxt "stripe"
@@ -30251,7 +30260,7 @@ msgstr ""
#: pretix/plugins/stripe/payment.py:274
msgid "Publishable key"
msgstr "Clé publique"
msgstr "Clé publiable"
#: pretix/plugins/stripe/payment.py:277
#, fuzzy
@@ -30750,7 +30759,7 @@ msgstr "Stripe Connect : clé secrète"
#: pretix/plugins/stripe/signals.py:137
msgid "Stripe Connect: Publishable key"
msgstr "Stripe Connect : clé publique"
msgstr "Stripe Connect : clé publiable"
#: pretix/plugins/stripe/signals.py:144
msgid "Stripe Connect: Secret key (test)"
@@ -30758,7 +30767,7 @@ msgstr "Stripe Connect : clé secrète (test)"
#: pretix/plugins/stripe/signals.py:151
msgid "Stripe Connect: Publishable key (test)"
msgstr "Stripe Connect : clé publique (test)"
msgstr "Stripe Connect : clé publiable (test)"
#: pretix/plugins/stripe/signals.py:177
#: pretix/plugins/stripe/templates/pretixplugins/stripe/oauth_disconnect.html:3
@@ -31513,17 +31522,23 @@ msgstr "Avertissement"
#: pretix/presale/templates/pretixpresale/event/base.html:116
#: pretix/presale/templates/pretixpresale/event/base.html:190
#, fuzzy
#| msgid "This ticket shop is currently disabled."
msgid "This ticket shop is currently in test mode."
msgstr "Cette billetterie est actuellement en mode test."
msgstr "Cette billetterie est actuellement désactivée."
#: pretix/presale/templates/pretixpresale/event/base.html:119
#: pretix/presale/templates/pretixpresale/event/base.html:193
#, fuzzy
#| msgid ""
#| "This ticket shop is currently in test mode. Please do not perform any "
#| "real purchases as your order might be deleted without notice."
msgid ""
"Please do not perform any real purchases as your order might be deleted "
"without notice."
msgstr ""
"Veuillez ne pas effectuer dachats réels car votre commande pourrait être "
"supprimée sans préavis."
"Cette billetterie est actuellement en mode test. Veuillez ne pas effectuer "
"dachats réels car votre commande pourrait être supprimée sans préavis."
#: pretix/presale/templates/pretixpresale/event/base.html:123
#, python-format
@@ -31531,8 +31546,6 @@ msgid ""
"You are currently using the time machine. The ticket shop is rendered as if "
"it were %(datetime)s."
msgstr ""
"Vous utilisez actuellement la time machine. La boutique de billets est "
"présentée comme s'il était le %(datetime)s."
#: pretix/presale/templates/pretixpresale/event/base.html:131
#: pretix/presale/templates/pretixpresale/event/base.html:141
@@ -34174,10 +34187,12 @@ msgstr ""
"total."
#: pretix/presale/views/order.py:1635
#, fuzzy
#| msgid "You may not change your order in a way that reduces the total price."
msgid "You may not change your order in a way that would require a refund."
msgstr ""
"Vous ne pouvez pas modifier votre commande d'une manière qui nécessiterait "
"un remboursement."
"Vous ne pouvez pas modifier votre commande dune manière qui réduit le prix "
"total."
#: pretix/presale/views/order.py:1643
msgid ""
@@ -34235,13 +34250,16 @@ msgstr ""
"actuellement disponible."
#: pretix/presale/views/waiting.py:141
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid ""
#| "We've added you to the waiting list. You will receive an email as soon as "
#| "this product gets available again."
msgid ""
"We've added you to the waiting list. We will send an email to {email} as "
"soon as this product gets available again."
msgstr ""
"Nous vous avons ajouté à la liste d'attente. Vous recevrez un email à "
"l'adresse {email} dès que ce produit sera de nouveau disponible."
"Nous vous avons ajouté à la liste d'attente. Vous recevrez un email dès que "
"les billets seront de nouveau disponibles."
#: pretix/presale/views/waiting.py:169
msgid "We could not find you on our waiting list."

View File

@@ -7,8 +7,8 @@ msgstr ""
"Project-Id-Version: French\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-08 13:19+0000\n"
"PO-Revision-Date: 2024-06-12 03:00+0000\n"
"Last-Translator: simonD <simon.dalvy@gmail.com>\n"
"PO-Revision-Date: 2023-09-11 10:00+0000\n"
"Last-Translator: Ronan LE MEILLAT <ronan.le_meillat@highcanfly.club>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
"fr/>\n"
"Language: fr\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.5.5\n"
"X-Generator: Weblate 4.18.2\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -305,7 +305,7 @@ msgstr "Le code du billet est ambigu dans la liste"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:65
msgid "Order not approved"
msgstr "Commande non validée"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:66
msgid "Checked-in Tickets"
@@ -433,7 +433,7 @@ msgstr "est après"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:40
msgid "="
msgstr "="
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:99
msgid "Product"
@@ -444,9 +444,8 @@ msgid "Product variation"
msgstr "Variation du produit"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:107
#, fuzzy
msgid "Gate"
msgstr "Pont"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:111
msgid "Current date and time"
@@ -472,13 +471,13 @@ msgstr "Nombre d'entrées depuis minuit"
#, fuzzy
#| msgid "Number of previous entries"
msgid "Number of previous entries since"
msgstr "Nombre d'entrées précédentes depuis"
msgstr "Nombre d'entrées précédentes"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:135
#, fuzzy
#| msgid "Number of previous entries"
msgid "Number of previous entries before"
msgstr "Nombre d'entrées précédentes avant"
msgstr "Nombre d'entrées précédentes"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:139
msgid "Number of days with a previous entry"
@@ -643,7 +642,7 @@ msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:475
#: pretix/static/pretixcontrol/js/ui/main.js:495
msgid "Search query"
msgstr "Recherche"
msgstr "Requête de recherche"
#: pretix/static/pretixcontrol/js/ui/main.js:493
msgid "All"
@@ -662,9 +661,8 @@ msgid "Enter page number between 1 and %(max)s."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:831
#, fuzzy
msgid "Invalid page number."
msgstr "Numéro de page invalide."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:989
msgid "Use a different name internally"
@@ -857,10 +855,9 @@ msgid "Not yet available"
msgstr "Méthode de paiement non disponible"
#: pretix/static/pretixpresale/js/widget/widget.js:36
#, fuzzy
msgctxt "widget"
msgid "Not available anymore"
msgstr "Méthode de paiement plus disponible"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:37
#, fuzzy
@@ -868,7 +865,7 @@ msgstr "Méthode de paiement plus disponible"
#| msgid "currently available: %s"
msgctxt "widget"
msgid "Currently not available"
msgstr "Actuellement non disponible"
msgstr "actuellement disponible: %s"
#: pretix/static/pretixpresale/js/widget/widget.js:38
#, javascript-format
@@ -966,7 +963,7 @@ msgstr "Continuer"
#| msgid "Select variant %s"
msgctxt "widget"
msgid "Show variants"
msgstr "Voir les variations"
msgstr "Sélectionner les variations %s"
#: pretix/static/pretixpresale/js/widget/widget.js:57
#, fuzzy
@@ -974,7 +971,7 @@ msgstr "Voir les variations"
#| msgid "Select variant %s"
msgctxt "widget"
msgid "Hide variants"
msgstr "Masquer les variations"
msgstr "Sélectionner les variations %s"
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgctxt "widget"

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
"Last-Translator: Anarion Dunedain <anarion@go2.pl>\n"
"PO-Revision-Date: 2024-05-07 22:00+0000\n"
"Last-Translator: Adam Kaput <adamkaput@gmail.com>\n"
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix/pl/"
">\n"
"Language: pl\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.5.5\n"
"X-Generator: Weblate 5.4.3\n"
#: pretix/_base_settings.py:78
msgid "English"
@@ -382,7 +382,7 @@ msgstr "Użyty voucher został już wykorzystany maksymalną ilość razy."
#: pretix/api/views/checkin.py:604 pretix/api/views/checkin.py:611
msgid "Medium connected to other event"
msgstr "Nośnik podpięty do innego wydarzenia"
msgstr ""
#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:472
#, python-brace-format
@@ -2741,7 +2741,7 @@ msgstr "Data ostatniej faktury zamówienia"
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:6
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:9
msgid "Reusable media"
msgstr "Nośnik wielokrotnego użytku"
msgstr ""
#: pretix/base/exporters/reusablemedia.py:35
#, fuzzy
@@ -2872,7 +2872,7 @@ msgstr "Kod vouchera"
#: pretix/base/forms/__init__.py:118
#, python-brace-format
msgid "You can use {markup_name} in this field."
msgstr "W tym polu możesz użyć {markup_name}."
msgstr ""
#: pretix/base/forms/__init__.py:178
#, python-format
@@ -3334,7 +3334,7 @@ msgstr ""
#: pretix/base/invoice.py:858
msgid "Default invoice renderer (European-style letter)"
msgstr "Domyślny renderer faktur (styl europejski)"
msgstr ""
#: pretix/base/invoice.py:947
msgctxt "invoice"
@@ -3343,7 +3343,7 @@ msgstr "(Proszę, cytuj przez cały czas.)"
#: pretix/base/invoice.py:994
msgid "Simplified invoice renderer"
msgstr "Uproszczony renderer faktur"
msgstr ""
#: pretix/base/invoice.py:1013
#, fuzzy, python-brace-format
@@ -3372,17 +3372,17 @@ msgstr "Zachowaj puste"
#: pretix/base/modelimport.py:139
#, python-brace-format
msgid "Invalid setting for column \"{header}\"."
msgstr "Niepoprawne ustawienie dla kolumny \"{header}\"."
msgstr ""
#: pretix/base/modelimport.py:199
#, python-brace-format
msgid "Could not parse {value} as a yes/no value."
msgstr "Nie udało się odczytać {value} jako wartości tak/nie."
msgstr ""
#: pretix/base/modelimport.py:216
#, python-brace-format
msgid "Could not parse {value} as a date and time."
msgstr "Nie udało się odczytać {value} jako daty i czasu."
msgstr ""
#: pretix/base/modelimport.py:226 pretix/control/views/orders.py:1162
#: pretix/control/views/orders.py:1191 pretix/control/views/orders.py:1235
@@ -3487,7 +3487,7 @@ msgstr "Państwo"
#: pretix/base/modelimport_orders.py:433
msgid "Calculate from product"
msgstr "Oblicz z produktu"
msgstr ""
#: pretix/base/modelimport_orders.py:450
#: pretix/control/templates/pretixcontrol/checkin/index.html:111

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
"Last-Translator: \"L. Pereira\" <l@tia.mat.br>\n"
"PO-Revision-Date: 2024-02-27 02:00+0000\n"
"Last-Translator: Adriano Lima <adrianocardoso1991@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
"pretix/pretix/pt_BR/>\n"
"Language: pt_BR\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.5.5\n"
"X-Generator: Weblate 5.4\n"
#: pretix/_base_settings.py:78
msgid "English"
@@ -160,8 +160,10 @@ msgid "Allowed URIs list, space separated"
msgstr "Lista de URIs permitidas, separadas por espaço"
#: pretix/api/models.py:47
#, fuzzy
#| msgid "Allowed URIs list, space separated"
msgid "Allowed Post Logout URIs list, space separated"
msgstr "Lista de URIs permitidas após logout, separadas por espaço"
msgstr "Lista de URIs permitidas, separadas por espaço"
#: pretix/api/models.py:51 pretix/base/models/customers.py:395
#: pretix/plugins/paypal/payment.py:113 pretix/plugins/paypal2/payment.py:108
@@ -229,7 +231,7 @@ msgid ""
"Events cannot be created as 'live'. Quotas and payment must be added to the "
"event before sales can go live."
msgstr ""
"Eventos não podem ser criados como 'ao vivo'. Cotas e pagamentos devem ser "
"Eventos não podem ser criados ao 'vivo'. Cotas e pagamentos devem ser "
"adicionados ao evento antes que as vendas possam ser ativadas."
#: pretix/api/serializers/event.py:232 pretix/api/serializers/event.py:531
@@ -310,12 +312,16 @@ msgid "This type of question cannot be shown during check-in."
msgstr "Esse tipo de pergunta não pode ser mostrada durante o check-in."
#: pretix/api/serializers/media.py:108
#, fuzzy
#| msgid ""
#| "A gift card with the same secret already exists in your or an affiliated "
#| "organizer account."
msgid ""
"A medium with the same identifier and type already exists in your organizer "
"account."
msgstr ""
"Um meio de pagamento com o mesmo tipo e identificador existe em sua conta de "
"organização."
"Um cartão de presente com o mesmo segredo já existe na sua conta ou na de "
"algum organizador afiliado."
#: pretix/api/serializers/order.py:79
#, python-brace-format
@@ -339,8 +345,10 @@ msgstr "Não existe quantidade suficiente em \"{}\" para executar esta ação."
#: pretix/api/serializers/organizer.py:102
#: pretix/control/forms/organizer.py:829 pretix/presale/forms/customer.py:439
#, fuzzy
#| msgid "A voucher with this code already exists."
msgid "An account with this email address is already registered."
msgstr "Uma conta com este endereço de email já foi registrada."
msgstr "Um voucher com esse código já existe."
#: pretix/api/serializers/organizer.py:205
#: pretix/control/forms/organizer.py:678
@@ -367,13 +375,15 @@ msgid "This user already has permissions for this team."
msgstr "Esse usuário tem permissão de acesso nessa equipe."
#: pretix/api/views/cart.py:209
#, fuzzy
#| msgid "Your cart has been updated."
msgid ""
"The specified voucher has already been used the maximum number of times."
msgstr "O cupom fornecido já foi usado um número máximo de vezes."
msgstr "Seu carrinho foi atualizado."
#: pretix/api/views/checkin.py:604 pretix/api/views/checkin.py:611
msgid "Medium connected to other event"
msgstr "Meio conectado à outro evento"
msgstr ""
#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:472
#, python-brace-format
@@ -431,8 +441,10 @@ msgid "Order expired"
msgstr "O carrinho expirou"
#: pretix/api/webhooks.py:250
#, fuzzy
#| msgid "Order information changed"
msgid "Order expiry date changed"
msgstr "Data de validade do pedido alterada"
msgstr "Informações do pedido alteradas"
#: pretix/api/webhooks.py:254 pretix/base/notifications.py:269
msgid "Order information changed"
@@ -448,8 +460,10 @@ msgid "Order changed"
msgstr "Pedido alterado"
#: pretix/api/webhooks.py:266
#, fuzzy
#| msgid "Payment method"
msgid "Refund of payment created"
msgstr "Pedido de reembolso criado"
msgstr "Meio de pagamento"
#: pretix/api/webhooks.py:270 pretix/base/notifications.py:293
msgid "External refund of payment"
@@ -460,20 +474,28 @@ msgid "Refund of payment requested by customer"
msgstr "Reembolso de pagamento solicitado pelo cliente"
#: pretix/api/webhooks.py:278
#, fuzzy
#| msgid "Payment method"
msgid "Refund of payment completed"
msgstr "Pedido de reembolso completado"
msgstr "Meio de pagamento"
#: pretix/api/webhooks.py:282
#, fuzzy
#| msgid "External refund of payment"
msgid "Refund of payment canceled"
msgstr "Reembolso de pagamento cancelado"
msgstr "Reembolso externo do pagamento"
#: pretix/api/webhooks.py:286
#, fuzzy
#| msgid "External refund of payment"
msgid "Refund of payment failed"
msgstr "Falha no reembolso de pagamento"
msgstr "Reembolso externo do pagamento"
#: pretix/api/webhooks.py:290
#, fuzzy
#| msgid "Payment date"
msgid "Payment confirmed"
msgstr "Pagamento confirmado"
msgstr "Data de pagamento"
#: pretix/api/webhooks.py:294
msgid "Order approved"
@@ -527,48 +549,69 @@ msgstr ""
"alterações em objetos aninhados como variaçoes ou pacotes)"
#: pretix/api/webhooks.py:339
#, fuzzy
#| msgid "Shop is live"
msgid "Shop taken live"
msgstr "Loja ativada"
msgstr "Loja ativa"
#: pretix/api/webhooks.py:343
#, fuzzy
#| msgid "Shop is live"
msgid "Shop taken offline"
msgstr "Loja desativada"
msgstr "Loja ativa"
#: pretix/api/webhooks.py:347
#, fuzzy
#| msgid "Your cart has been updated."
msgid "Test-Mode of shop has been activated"
msgstr "Modo de teste da loja ativado"
msgstr "Seu carrinho foi atualizado."
#: pretix/api/webhooks.py:351
#, fuzzy
#| msgid "Your cart has been updated."
msgid "Test-Mode of shop has been deactivated"
msgstr "Modo de teste da loja foi desativado"
msgstr "Seu carrinho foi atualizado."
#: pretix/api/webhooks.py:355
#, fuzzy
#| msgid "Waiting list"
msgid "Waiting list entry added"
msgstr "Entrada na lista de espera adicionada"
msgstr "Lista de espera"
#: pretix/api/webhooks.py:359
#, fuzzy
#| msgid "Waiting list"
msgid "Waiting list entry changed"
msgstr "Entrada na lista de espera alterada"
msgstr "Lista de espera"
#: pretix/api/webhooks.py:363
#, fuzzy
#| msgid "Waiting list"
msgid "Waiting list entry deleted"
msgstr "Entrada na lista de espera apagada"
msgstr "Lista de espera"
#: pretix/api/webhooks.py:367
msgid "Waiting list entry received voucher"
msgstr "Entrada na lista de espera recebeu cupom"
msgstr ""
#: pretix/api/webhooks.py:371
#, fuzzy
#| msgctxt "refund_source"
#| msgid "Customer"
msgid "Customer account created"
msgstr "Conta de usuário criada"
msgstr "Cliente"
#: pretix/api/webhooks.py:375
#, fuzzy
#| msgid "Account information changed"
msgid "Customer account changed"
msgstr "Informações da conta foram alteradas"
msgstr "Informações da conta alteradas"
#: pretix/api/webhooks.py:379
#, fuzzy
#| msgid "Your cart has been updated."
msgid "Customer account anonymized"
msgstr "Conta foi anonimizada"
msgstr "Seu carrinho foi atualizado."
#: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103
#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:953
@@ -658,9 +701,10 @@ msgid "Incompatible SSO provider: \"{error}\"."
msgstr "Provedor de SSO incompatível: \"{error}\"."
#: pretix/base/customersso/oidc.py:109
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid "Presale not started"
msgid "You are not requesting \"{scope}\"."
msgstr "Você não está requisitando \"{scope}\"."
msgstr "Pré-venda não iniciada"
#: pretix/base/customersso/oidc.py:115
#, python-brace-format
@@ -694,8 +738,6 @@ msgid ""
"The email address on this account is not yet verified. Please first confirm "
"the email address in your customer account."
msgstr ""
"O endereço de email desta conta ainda não foi verificado. Por favor, "
"confirme o endereço de email na sua conta."
#: pretix/base/email.py:199 pretix/base/exporters/items.py:152
#: pretix/base/exporters/items.py:197 pretix/control/views/main.py:311
@@ -737,8 +779,10 @@ msgid "Combined Excel (.xlsx)"
msgstr "Excel (.xlsx)"
#: pretix/base/exporters/answers.py:54
#, fuzzy
#| msgid "Questions"
msgid "Question answer file uploads"
msgstr "Upload de arquivos para perguntas e respostas"
msgstr "Perguntas"
#: pretix/base/exporters/answers.py:55 pretix/base/exporters/json.py:52
#: pretix/base/exporters/mail.py:53 pretix/base/exporters/orderlist.py:86
@@ -747,17 +791,17 @@ msgstr "Upload de arquivos para perguntas e respostas"
#: pretix/base/exporters/orderlist.py:1213
#: pretix/plugins/reports/exporters.py:478
#: pretix/plugins/reports/exporters.py:651
#, fuzzy
#| msgid "Order data"
msgctxt "export_category"
msgid "Order data"
msgstr "Informações do pedido"
msgstr "Informação do pedido"
#: pretix/base/exporters/answers.py:56
msgid ""
"Download a ZIP file including all files that have been uploaded by your "
"customers while creating an order."
msgstr ""
"Fazer o download de um ZIP incluindo todos os arquivos que foram enviados "
"pelos seus clientes quando um pedido foi criado."
#: pretix/base/exporters/answers.py:66 pretix/base/models/items.py:1672
#: pretix/control/navigation.py:182
@@ -816,41 +860,54 @@ msgstr "Data"
#: pretix/plugins/sendmail/forms.py:346
msgctxt "subevent"
msgid "All dates"
msgstr "Todas as datas"
msgstr ""
#: pretix/base/exporters/customers.py:49 pretix/control/navigation.py:592
#: pretix/control/templates/pretixcontrol/organizers/edit.html:132
#, fuzzy
#| msgctxt "invoice"
#| msgid "Invoice total"
msgid "Customer accounts"
msgstr "Contas de usuário"
msgstr "Total da fatura"
#: pretix/base/exporters/customers.py:51
#, fuzzy
#| msgctxt "invoice"
#| msgid "Invoice total"
msgctxt "export_category"
msgid "Customer accounts"
msgstr "Contas de usuário"
msgstr "Total da fatura"
#: pretix/base/exporters/customers.py:52
msgid "Download a spreadsheet of all currently registered customer accounts."
msgstr "Fazer o download de uma planilha com todos os usuários registrados."
msgstr ""
#: pretix/base/exporters/customers.py:64 pretix/base/models/customers.py:82
#: pretix/control/templates/pretixcontrol/organizers/customer.html:28
#: pretix/control/templates/pretixcontrol/organizers/customers.html:54
#: pretix/presale/templates/pretixpresale/event/checkout_customer.html:40
#: pretix/presale/templates/pretixpresale/organizers/customer_profile.html:20
#, fuzzy
#| msgctxt "refund_source"
#| msgid "Customer"
msgid "Customer ID"
msgstr "ID do Cliente"
msgstr "Cliente"
#: pretix/base/exporters/customers.py:65
#: pretix/control/templates/pretixcontrol/organizers/customer.html:31
#, fuzzy
#| msgid "Payment provider"
msgid "SSO provider"
msgstr "Provedor de Login Único (SSO)"
msgstr "Meio de pagamento"
#: pretix/base/exporters/customers.py:66 pretix/base/models/customers.py:108
#: pretix/control/templates/pretixcontrol/organizers/customer.html:35
#: pretix/control/templates/pretixcontrol/organizers/customers.html:65
#: pretix/control/templates/pretixcontrol/users/form.html:49
#, fuzzy
#| msgid "Internal identifier"
msgid "External identifier"
msgstr "Identificador externo"
msgstr "Identificador interno"
#: pretix/base/exporters/customers.py:68 pretix/base/exporters/orderlist.py:261
#: pretix/base/exporters/orderlist.py:444
@@ -923,22 +980,28 @@ msgid "Name"
msgstr "Nome"
#: pretix/base/exporters/customers.py:77 pretix/base/models/customers.py:99
#, fuzzy
#| msgid "This account is inactive."
msgid "Account active"
msgstr "Conta ativa"
msgstr "Esta conta está inativa."
#: pretix/base/exporters/customers.py:78 pretix/base/models/customers.py:100
#, fuzzy
#| msgid "Attendee email"
msgid "Verified email address"
msgstr "Email verificado"
msgstr "E-mail do participante"
#: pretix/base/exporters/customers.py:79 pretix/base/models/customers.py:101
#: pretix/control/templates/pretixcontrol/organizers/customer.html:67
msgid "Last login"
msgstr "Último login"
msgstr ""
#: pretix/base/exporters/customers.py:80 pretix/base/models/customers.py:102
#: pretix/control/templates/pretixcontrol/organizers/customer.html:65
#, fuzzy
#| msgid "Expiration date"
msgid "Registration date"
msgstr "Data de registro"
msgstr "Data de validade"
#: pretix/base/exporters/customers.py:81 pretix/base/exporters/invoices.py:205
#: pretix/base/exporters/waitinglist.py:118 pretix/base/models/auth.py:258
@@ -954,7 +1017,7 @@ msgstr "Idioma"
#: pretix/control/templates/pretixcontrol/organizers/customer.html:71
#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:68
msgid "Notes"
msgstr "Notas"
msgstr ""
#: pretix/base/exporters/customers.py:100
#: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83
@@ -1031,8 +1094,6 @@ msgid ""
"Download invoices in a format that can be used by the dekodi NREI conversion "
"software."
msgstr ""
"Fazer o download de faturas em um formato que possa ser usado no software de "
"conversão dekodi NREI."
#: pretix/base/exporters/dekodi.py:105
#, python-brace-format
@@ -1049,8 +1110,10 @@ msgstr "Ingresso do evento {event}-{code}"
#: pretix/plugins/reports/exporters.py:461
#: pretix/plugins/reports/exporters.py:698
#: pretix/plugins/ticketoutputpdf/exporters.py:85
#, fuzzy
#| msgid "Date and time"
msgid "Date range"
msgstr "Intervalo de datas"
msgstr "Data e hora"
#: pretix/base/exporters/dekodi.py:237 pretix/base/exporters/invoices.py:77
#, fuzzy
@@ -1065,21 +1128,23 @@ msgstr ""
"da fatura não corresponde sempre à ordem ou à data de pagamento."
#: pretix/base/exporters/events.py:47
#, fuzzy
#| msgid "Event start time"
msgid "Event data"
msgstr "Dados do evento"
msgstr "Hora de início do evento"
#: pretix/base/exporters/events.py:48
#, fuzzy
#| msgid "Event start time"
msgctxt "export_category"
msgid "Event data"
msgstr "Dados do evento"
msgstr "Hora de início do evento"
#: pretix/base/exporters/events.py:49
msgid ""
"Download a spreadsheet with information on all events in this organizer "
"account."
msgstr ""
"Fazer o download de uma planilha contendo informações sobre todos os eventos "
"nesta conta de organização."
#: pretix/base/exporters/events.py:57 pretix/base/exporters/orderlist.py:260
#: pretix/base/exporters/orderlist.py:440
@@ -1150,12 +1215,12 @@ msgstr "Localização"
#: pretix/base/exporters/events.py:68 pretix/base/models/event.py:597
#: pretix/base/models/event.py:1449
msgid "Latitude"
msgstr "Latitude"
msgstr ""
#: pretix/base/exporters/events.py:69 pretix/base/models/event.py:605
#: pretix/base/models/event.py:1457
msgid "Longitude"
msgstr "Longitude"
msgstr ""
#: pretix/base/exporters/events.py:70 pretix/base/models/event.py:617
#: pretix/base/models/event.py:1474
@@ -1203,8 +1268,6 @@ msgstr "Todos os pedidos"
#: pretix/base/exporters/invoices.py:127
msgid "Download all invoices created by the system as a ZIP file of PDF files."
msgstr ""
"Fazer o download de todas as faturas criadas pelo sistema como um arquivo "
"ZIP contendo arquivos PDF."
#: pretix/base/exporters/invoices.py:178
msgid "Invoice data"
@@ -1216,9 +1279,6 @@ msgid ""
"The spreadsheet includes two sheets, one with a line for every invoice, and "
"one with a line for every position of every invoice."
msgstr ""
"Fazer o download de uma planilha com dados de todas as faturas criadas pelo "
"sistema. A planilha inclui duas folhas, uma com uma linha para cada fatura, "
"and uma com uma linha o total de cada fatura."
#: pretix/base/exporters/invoices.py:191 pretix/base/shredder.py:576
#: pretix/control/templates/pretixcontrol/order/index.html:267
@@ -1518,8 +1578,10 @@ msgid "Gross price"
msgstr "Preço bruto"
#: pretix/base/exporters/invoices.py:322
#, fuzzy
#| msgid "Default price"
msgid "Net price"
msgstr "Preço líquido"
msgstr "Preço padrão"
#: pretix/base/exporters/invoices.py:323 pretix/base/exporters/orderlist.py:452
#: pretix/base/exporters/orderlist.py:577
@@ -1549,33 +1611,41 @@ msgid "Event start date"
msgstr "Data de início do evento"
#: pretix/base/exporters/invoices.py:350 pretix/base/pdf.py:278
#, fuzzy
#| msgid "Event end time"
msgid "Event end date"
msgstr "Data final do evento"
msgstr "Horário do final do evento"
#: pretix/base/exporters/items.py:50
#, fuzzy
#| msgid "Product picture"
msgid "Product data"
msgstr "Informações do produto"
msgstr "Imagem do produto"
#: pretix/base/exporters/items.py:51 pretix/base/exporters/orderlist.py:1100
#, fuzzy
#| msgid "Product picture"
msgctxt "export_category"
msgid "Product data"
msgstr "Informações do produto"
msgstr "Imagem do produto"
#: pretix/base/exporters/items.py:52
msgid "Download a spreadsheet with details about all products and variations."
msgstr ""
"Fazer o download de uma planilha com detalhes de todos os produtos e "
"variações."
#: pretix/base/exporters/items.py:58 pretix/base/exporters/orderlist.py:571
#: pretix/base/exporters/orderlist.py:862
#, fuzzy
#| msgid "Product"
msgid "Product ID"
msgstr "ID do Produto"
msgstr "Produto"
#: pretix/base/exporters/items.py:59 pretix/base/exporters/orderlist.py:573
#: pretix/base/exporters/orderlist.py:864
#, fuzzy
#| msgid "Variation"
msgid "Variation ID"
msgstr "ID da Variante"
msgstr "Variação"
#: pretix/base/exporters/items.py:60 pretix/base/models/items.py:115
#: pretix/base/pdf.py:151
@@ -1642,12 +1712,16 @@ msgstr "É um bilhete de admissão"
#: pretix/base/exporters/items.py:78
#: pretix/control/templates/pretixcontrol/item/create.html:74
#: pretix/control/templates/pretixcontrol/item/index.html:87
#, fuzzy
#| msgid "Device type"
msgid "Personalized ticket"
msgstr "Ingresso personalizado"
msgstr "Tipo de dispositivo"
#: pretix/base/exporters/items.py:79 pretix/base/models/items.py:471
#, fuzzy
#| msgid "Device type"
msgid "Generate tickets"
msgstr "Gerar ingressos"
msgstr "Tipo de dispositivo"
#: pretix/base/exporters/items.py:80 pretix/base/exporters/orderlist.py:1107
#: pretix/base/exporters/waitinglist.py:41 pretix/base/shredder.py:367
@@ -1712,11 +1786,13 @@ msgstr "Comprar este produto requer aprovação"
#: pretix/base/exporters/items.py:86 pretix/base/models/items.py:555
msgid "Only sell this product as part of a bundle"
msgstr "Apenas vender este produto como parte de um kit"
msgstr ""
#: pretix/base/exporters/items.py:87 pretix/base/models/items.py:562
#, fuzzy
#| msgid "Allow product to be canceled"
msgid "Allow product to be canceled or changed"
msgstr "Permitir que o produto seja cancelado ou alterado"
msgstr "Permitir que o produto seja cancelado"
#: pretix/base/exporters/items.py:88 pretix/base/models/items.py:568
msgid "Minimum amount per order"
@@ -1736,8 +1812,11 @@ msgstr "Requer atenção especial"
#: pretix/base/exporters/items.py:91 pretix/base/exporters/orderlist.py:282
#: pretix/base/models/items.py:590 pretix/base/models/items.py:1155
#: pretix/base/models/orders.py:288
#, fuzzy
#| msgctxt "subevent"
#| msgid "No date selected."
msgid "Check-in text"
msgstr "Texto para o check-in"
msgstr "Nenhuma data selecionada."
#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:595
#: pretix/base/models/items.py:1080
@@ -1746,19 +1825,21 @@ msgstr "Preço original"
#: pretix/base/exporters/items.py:93 pretix/base/models/items.py:607
msgid "This product is a gift card"
msgstr "Este produto é um cartão de presente"
msgstr ""
#: pretix/base/exporters/items.py:94 pretix/base/models/items.py:613
#: pretix/base/models/items.py:1100
#: pretix/control/templates/pretixcontrol/item/include_variations.html:40
#: pretix/control/templates/pretixcontrol/item/include_variations.html:148
msgid "Require a valid membership"
msgstr "Exigir associação válida"
msgstr ""
#: pretix/base/exporters/items.py:95 pretix/base/models/items.py:622
#: pretix/base/models/items.py:1109
#, fuzzy
#| msgid "Team members"
msgid "Hide without a valid membership"
msgstr "Esconder sem uma associação válida"
msgstr "Membros do time"
#: pretix/base/exporters/json.py:51 pretix/base/exporters/orderlist.py:85
msgid "Order data"
@@ -1769,8 +1850,6 @@ msgid ""
"Download a structured JSON representation of all orders. This might be "
"useful for the import in third-party systems."
msgstr ""
"Fazer o download de uma representação de todos os pedidos, em formato JSON. "
"Pode ser útil para importar em sistemas de terceiros."
#: pretix/base/exporters/mail.py:52
msgid "Email addresses (text file)"
@@ -1781,8 +1860,6 @@ msgid ""
"Download a text file with all email addresses collected either from buyers "
"or from ticket holders."
msgstr ""
"Fazer o download de um arquivo texto com todos os endereços de email "
"coletados por compradores ou possuidores de ingressos."
#: pretix/base/exporters/mail.py:76 pretix/plugins/reports/exporters.py:487
#: pretix/plugins/reports/exporters.py:669
@@ -1842,7 +1919,7 @@ msgstr "Incluir apenas pedidos criados a partir desta data."
#: pretix/plugins/reports/exporters.py:454
#: pretix/plugins/ticketoutputpdf/exporters.py:97
msgid "Event date"
msgstr "Data do evento"
msgstr ""
#: pretix/base/exporters/orderlist.py:137
#, fuzzy
@@ -9075,20 +9152,18 @@ msgid ""
"The part of your invoice number after your prefix will be filled up with "
"leading zeros up to this length, e.g. INV-001 or INV-00001."
msgstr ""
"A parte do seu número de fatura após o seu prefixo será preenchido com zeros "
"até este comprimento, p.ex. INV-001 ou INV-00001."
#: pretix/base/settings.py:661
msgid "Generate invoices with consecutive numbers"
msgstr "Gerar faturas com números consecutivos"
msgstr ""
#: pretix/base/settings.py:662
msgid "If deactivated, the order code will be used in the invoice number."
msgstr "Se desativado, o número de pedido será usado como número de fatura."
msgstr ""
#: pretix/base/settings.py:671
msgid "Invoice number prefix"
msgstr "Prefixo do número de fatura"
msgstr ""
#: pretix/base/settings.py:672
msgid ""
@@ -24558,19 +24633,19 @@ msgstr ""
#: pretix/plugins/sendmail/views.py:674 pretix/plugins/stripe/views.py:679
#: pretix/plugins/ticketoutputpdf/views.py:132
msgid "We could not save your changes. See below for details."
msgstr "Não conseguimos salvar suas alterações. Veja detalhes abaixo."
msgstr ""
#: pretix/control/views/checkin.py:416 pretix/control/views/checkin.py:453
msgid "The requested list does not exist."
msgstr "A lista solicitada não existe."
msgstr ""
#: pretix/control/views/checkin.py:462
msgid "The selected list has been deleted."
msgstr "A lista selecionada foi apagada."
msgstr ""
#: pretix/control/views/dashboards.py:114
msgid "Attendees (ordered)"
msgstr "Participantes (com pedidos)"
msgstr ""
#: pretix/control/views/dashboards.py:124
msgid "Attendees (paid)"

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-08 18:00+0000\n"
"Last-Translator: David Vaz <davidmgvaz@gmail.com>\n"
"PO-Revision-Date: 2023-04-24 19:00+0000\n"
"Last-Translator: Vasco Baleia <vb2003.12@gmail.com>\n"
"Language-Team: Portuguese (Portugal) <https://translate.pretix.eu/projects/"
"pretix/pretix/pt_PT/>\n"
"Language: pt_PT\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.5.5\n"
"X-Generator: Weblate 4.16.4\n"
#: pretix/_base_settings.py:78
msgid "English"
@@ -41,7 +41,7 @@ msgstr "Chinês (simplificado)"
#: pretix/_base_settings.py:83
msgid "Chinese (traditional)"
msgstr "Chinês (tradicional)"
msgstr ""
#: pretix/_base_settings.py:84
msgid "Czech"
@@ -77,7 +77,7 @@ msgstr "Grego"
#: pretix/_base_settings.py:92
msgid "Indonesian"
msgstr "Indonésia"
msgstr ""
#: pretix/_base_settings.py:93
msgid "Italian"
@@ -89,7 +89,7 @@ msgstr "Letão"
#: pretix/_base_settings.py:95
msgid "Norwegian Bokmål"
msgstr "Norueguês Bokmål"
msgstr ""
#: pretix/_base_settings.py:96
msgid "Polish"
@@ -160,8 +160,10 @@ msgid "Allowed URIs list, space separated"
msgstr "Lista de URIs permitidos, separados por espaço"
#: pretix/api/models.py:47
#, fuzzy
#| msgid "Allowed URIs list, space separated"
msgid "Allowed Post Logout URIs list, space separated"
msgstr "Lista de URIs pós-logout permitidos, separados por espaço"
msgstr "Lista de URIs permitidos, separados por espaço"
#: pretix/api/models.py:51 pretix/base/models/customers.py:395
#: pretix/plugins/paypal/payment.py:113 pretix/plugins/paypal2/payment.py:108
@@ -308,16 +310,21 @@ msgid "This type of question cannot be asked during check-in."
msgstr "Este tipo de pergunta não pode ser efetuado durante o check-in."
#: pretix/api/serializers/item.py:493 pretix/control/forms/item.py:143
#, fuzzy
#| msgid "This type of question cannot be asked during check-in."
msgid "This type of question cannot be shown during check-in."
msgstr "Este tipo de pergunta não pode ser apresentado durante o check-in."
msgstr "Este tipo de pergunta não pode ser efetuado durante o check-in."
#: pretix/api/serializers/media.py:108
#, fuzzy
#| msgid ""
#| "A gift card with the same secret already exists in your or an affiliated "
#| "organizer account."
msgid ""
"A medium with the same identifier and type already exists in your organizer "
"account."
msgstr ""
"Já existe um meio com o mesmo identificador e tipo nesta conta de "
"organizador."
"Um identificador com o mesmo ID e tipo já existe nesta conta de organizador."
#: pretix/api/serializers/order.py:79
#, python-brace-format
@@ -377,7 +384,7 @@ msgstr ""
#: pretix/api/views/checkin.py:604 pretix/api/views/checkin.py:611
msgid "Medium connected to other event"
msgstr "Meio ligado a outro evento"
msgstr ""
#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:472
#, python-brace-format
@@ -389,7 +396,7 @@ msgstr "A aplicação \"{application_name}\" foi autorizada a aceder sua conta."
#: pretix/api/views/order.py:589 pretix/control/views/orders.py:1588
#: pretix/presale/views/order.py:741 pretix/presale/views/order.py:814
msgid "You cannot generate an invoice for this order."
msgstr "Não é possível gerar uma fatura para esta encomenda."
msgstr "Não pode gerar uma factura para este pedido"
#: pretix/api/views/order.py:594 pretix/control/views/orders.py:1590
#: pretix/presale/views/order.py:743 pretix/presale/views/order.py:816
@@ -547,32 +554,46 @@ msgid "Test-Mode of shop has been deactivated"
msgstr "O modo de teste da loja foi desativado"
#: pretix/api/webhooks.py:355
#, fuzzy
#| msgid "Waiting list entry"
msgid "Waiting list entry added"
msgstr "Entrada em fila de espera adicionada"
msgstr "Entrada em fila de espera"
#: pretix/api/webhooks.py:359
#, fuzzy
#| msgid "Waiting list entry"
msgid "Waiting list entry changed"
msgstr "Entrada em fila de espera alterada"
msgstr "Entrada em fila de espera"
#: pretix/api/webhooks.py:363
#, fuzzy
#| msgid "Waiting list entry"
msgid "Waiting list entry deleted"
msgstr "Entrada em fila de espera removida"
msgstr "Entrada em fila de espera"
#: pretix/api/webhooks.py:367
#, fuzzy
#| msgid "Waiting list entries"
msgid "Waiting list entry received voucher"
msgstr "Entrada em fila de espera recebeu voucher"
msgstr "Entradas em fila de espera"
#: pretix/api/webhooks.py:371
#, fuzzy
#| msgid "Customer account"
msgid "Customer account created"
msgstr "Conta de cliente criada"
msgstr "Conta de cliente"
#: pretix/api/webhooks.py:375
#, fuzzy
#| msgid "Customer account email change"
msgid "Customer account changed"
msgstr "Conta do cliente alterada"
msgstr "Alteração de e -mail da conta do cliente"
#: pretix/api/webhooks.py:379
#, fuzzy
#| msgid "The customer account has been anonymized."
msgid "Customer account anonymized"
msgstr "Conta do cliente anonimizada"
msgstr "A conta do cliente foi anonimizada."
#: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103
#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:953
@@ -748,9 +769,11 @@ msgstr "Carregamento de Ficheiros de Resposta às Perguntas"
#: pretix/base/exporters/orderlist.py:1213
#: pretix/plugins/reports/exporters.py:478
#: pretix/plugins/reports/exporters.py:651
#, fuzzy
#| msgid "Order data"
msgctxt "export_category"
msgid "Order data"
msgstr "Dados da encomenda"
msgstr "Dados das encomendas"
#: pretix/base/exporters/answers.py:56
msgid ""
@@ -1064,6 +1087,8 @@ msgid "Event data"
msgstr "Dados do evento"
#: pretix/base/exporters/events.py:48
#, fuzzy
#| msgid "Event data"
msgctxt "export_category"
msgid "Event data"
msgstr "Dados do evento"
@@ -1728,8 +1753,10 @@ msgstr "Requer atenção especial"
#: pretix/base/exporters/items.py:91 pretix/base/exporters/orderlist.py:282
#: pretix/base/models/items.py:590 pretix/base/models/items.py:1155
#: pretix/base/models/orders.py:288
#, fuzzy
#| msgid "Check-in list"
msgid "Check-in text"
msgstr "Texto de check-in"
msgstr "Lista de check-in"
#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:595
#: pretix/base/models/items.py:1080
@@ -2264,8 +2291,10 @@ msgid "Invoice address state"
msgstr "Endereço de fatura: estado"
#: pretix/base/exporters/orderlist.py:794
#, fuzzy
#| msgid "Server Transaction Code"
msgid "Order transaction data"
msgstr "Dados de transação de pedidos"
msgstr "Código Transaction Servidor"
#: pretix/base/exporters/orderlist.py:796
msgid ""
@@ -2273,14 +2302,12 @@ msgid ""
"changes to products, prices or tax rates. The information is only accurate "
"for changes made with pretix versions released after October 2021."
msgstr ""
"Descarregue uma folha de cálculo de todas as alterações substanciais às "
"encomendas, ou seja, todas as alterações aos produtos, preços ou taxas de "
"imposto. As informações são precisas apenas para alterações feitas com "
"versões pretix lançadas após outubro de 2021."
#: pretix/base/exporters/orderlist.py:812
#, fuzzy
#| msgid "Only include orders created within this date range."
msgid "Only include transactions created within this date range."
msgstr "Apenas incluir pedidos criados neste intervalo de datas."
msgstr "Apenas incluir pedidos criados a partir deste intervalo de datas."
#: pretix/base/exporters/orderlist.py:847 pretix/base/models/event.py:640
#: pretix/base/models/items.py:401 pretix/base/models/items.py:1937
@@ -2312,16 +2339,22 @@ msgid "Currency"
msgstr "Moeda"
#: pretix/base/exporters/orderlist.py:855
#, fuzzy
#| msgid "Transaction Code"
msgid "Transaction date"
msgstr "Data da transação"
msgstr "Código de transação"
#: pretix/base/exporters/orderlist.py:856
#, fuzzy
#| msgid "Transaction Code"
msgid "Transaction time"
msgstr "Hora de transação"
msgstr "Código de transação"
#: pretix/base/exporters/orderlist.py:857
#, fuzzy
#| msgid "Order data"
msgid "Old data"
msgstr "Dados antigos"
msgstr "Dados dos pedidos"
#: pretix/base/exporters/orderlist.py:860 pretix/base/models/items.py:1460
#: pretix/control/templates/pretixcontrol/order/transactions.html:22
@@ -2329,39 +2362,48 @@ msgid "Quantity"
msgstr "Quantidade"
#: pretix/base/exporters/orderlist.py:867
#, fuzzy
#| msgid "Internal reference"
msgid "Internal fee type"
msgstr "Tipo de taxa interna"
msgstr "Referência interna"
#: pretix/base/exporters/orderlist.py:869
#, fuzzy
#| msgid "Date"
msgctxt "subevent"
msgid "Date ID"
msgstr "ID de data"
msgstr "Data"
#: pretix/base/exporters/orderlist.py:874
#, fuzzy
#| msgid "Tax rule"
msgid "Tax rule ID"
msgstr "ID de regra de Tributação"
msgstr "Regra fiscal"
#: pretix/base/exporters/orderlist.py:877
#: pretix/plugins/reports/accountingreport.py:319
#, fuzzy
#| msgctxt "invoice"
#| msgid "Gross value"
msgid "Gross total"
msgstr "Total bruto"
msgstr "Valor bruto"
#: pretix/base/exporters/orderlist.py:878
#: pretix/plugins/reports/accountingreport.py:318
#, fuzzy
#| msgid "Total"
msgid "Tax total"
msgstr "Total de impostos"
msgstr "Total"
#: pretix/base/exporters/orderlist.py:888
msgid ""
"This value is supplied for informational purposes, it is not part of the "
"original transaction data and might have changed since the transaction."
msgstr ""
"Este valor é fornecido para fins informativos, não faz parte dos dados "
"originais da transação e pode ter sido alterado desde a transação."
#: pretix/base/exporters/orderlist.py:911
msgid "Converted from legacy version"
msgstr "Convertido de versão antiga"
msgstr ""
#: pretix/base/exporters/orderlist.py:973
msgid "Payments and refunds"
@@ -2639,8 +2681,9 @@ msgid "Show value at"
msgstr "Mostrar valor em"
#: pretix/base/exporters/orderlist.py:1271
#, fuzzy
msgid "Defaults to the time of report."
msgstr "Predefinido para o tempo do relatório."
msgstr "Predefine para o tempo do relatório."
#: pretix/base/exporters/orderlist.py:1276
#: pretix/base/exporters/orderlist.py:1286 pretix/control/forms/filter.py:517
@@ -2731,29 +2774,39 @@ msgstr "Data da última fatura do pedido"
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:6
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:9
msgid "Reusable media"
msgstr "Media reutilizável"
msgstr ""
#: pretix/base/exporters/reusablemedia.py:35
#, fuzzy
#| msgid "Reusable media type"
msgctxt "export_category"
msgid "Reusable media"
msgstr "Média reutilizável"
msgstr "Tipo de identificador reutilizável"
#: pretix/base/exporters/reusablemedia.py:36
#, fuzzy
#| msgid ""
#| "Download a spreadsheet with information on all events in this organizer "
#| "account."
msgid ""
"Download a spread sheet with the data of all reusable medias on your account."
msgstr ""
"Descarregue uma folha de cálculo com os dados de todos os suportes "
"reutilizáveis da sua conta."
"Descarregar uma folha de cálculo com informação de todos os eventos nesta "
"conta de organizador."
#: pretix/base/exporters/reusablemedia.py:46 pretix/base/models/media.py:67
#, fuzzy
#| msgid "Fee type"
msgctxt "reusable_medium"
msgid "Media type"
msgstr "Tipo de suporte"
msgstr "Tipo de taxa"
#: pretix/base/exporters/reusablemedia.py:47 pretix/base/models/media.py:73
#, fuzzy
#| msgid "Internal identifier"
msgctxt "reusable_medium"
msgid "Identifier"
msgstr "Identificador"
msgstr "Identificador interno"
#: pretix/base/exporters/reusablemedia.py:49 pretix/base/models/media.py:81
#: pretix/base/models/orders.py:264 pretix/base/models/orders.py:3007
@@ -2769,12 +2822,16 @@ msgid "Customer account"
msgstr "Conta de cliente"
#: pretix/base/exporters/reusablemedia.py:51 pretix/base/models/media.py:97
#, fuzzy
#| msgid "Link text"
msgid "Linked ticket"
msgstr "Bilhete associado"
msgstr "Texto do link"
#: pretix/base/exporters/reusablemedia.py:52 pretix/base/models/media.py:104
#, fuzzy
#| msgid "Issued gift cards"
msgid "Linked gift card"
msgstr "Cartão-presente associado"
msgstr "Cartões-presente emitidos"
#: pretix/base/exporters/waitinglist.py:42
msgctxt "export_category"
@@ -2856,7 +2913,7 @@ msgstr "Código do voucher"
#: pretix/base/forms/__init__.py:118
#, python-brace-format
msgid "You can use {markup_name} in this field."
msgstr "Pode utilizar {markup_name} neste campo."
msgstr ""
#: pretix/base/forms/__init__.py:178
#, python-format
@@ -3079,9 +3136,10 @@ msgid "Invalid placeholder(s): %(value)s"
msgstr "Placeholder(s) inválido(s): %(value)s"
#: pretix/base/forms/widgets.py:67
#, python-format
#, fuzzy, python-format
#| msgid "Sample city"
msgid "Sample: %s"
msgstr "Exemplo: %s"
msgstr "Exemplo de cidade"
#: pretix/base/forms/widgets.py:70
#, python-brace-format
@@ -3322,22 +3380,25 @@ msgstr ""
#: pretix/base/invoice.py:858
msgid "Default invoice renderer (European-style letter)"
msgstr "Renderizador de facturas por defeito (Carta estilo europeu)"
msgstr ""
#: pretix/base/invoice.py:947
#, fuzzy
#| msgid "Please enter a valid state."
msgctxt "invoice"
msgid "(Please quote at all times.)"
msgstr "(Por favor, cite sempre.)"
msgstr "Por favor, indique um estado válido."
#: pretix/base/invoice.py:994
msgid "Simplified invoice renderer"
msgstr "Renderizador de facturas simplificado"
msgstr ""
#: pretix/base/invoice.py:1013
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid "Event date range"
msgctxt "invoice"
msgid "Event date: {date_range}"
msgstr "Data do evento: {date_range}"
msgstr "Datas limite do evento"
#: pretix/base/media.py:61
msgid "Barcode / QR-Code"
@@ -3345,6 +3406,7 @@ msgstr "Código de Barras / Código QR"
#: pretix/base/media.py:77
#: pretix/control/templates/pretixcontrol/organizers/edit.html:237
#, fuzzy
msgid "NFC UID-based"
msgstr "NFC Baseado em UID"
@@ -3365,12 +3427,12 @@ msgstr "Definição inválida para a coluna \"{header}\"."
#: pretix/base/modelimport.py:199
#, python-brace-format
msgid "Could not parse {value} as a yes/no value."
msgstr "Não foi possível analisar {value} como um valor sim/não."
msgstr ""
#: pretix/base/modelimport.py:216
#, python-brace-format
msgid "Could not parse {value} as a date and time."
msgstr "Não foi possível analisar {value} como uma data e hora."
msgstr ""
#: pretix/base/modelimport.py:226 pretix/control/views/orders.py:1162
#: pretix/control/views/orders.py:1191 pretix/control/views/orders.py:1235
@@ -3545,8 +3607,10 @@ msgid "Customer"
msgstr "Comprador"
#: pretix/base/modelimport_orders.py:685
#, fuzzy
#| msgid "No matching seat was found."
msgid "No matching customer was found."
msgstr "Não foi encontrado nenhum cliente correspondente."
msgstr "Nenhum lugar correspondente foi encontrado."
#: pretix/base/modelimport_vouchers.py:50 pretix/base/models/vouchers.py:488
msgid "A voucher with this code already exists."
@@ -3559,8 +3623,10 @@ msgid "Maximum usages"
msgstr "Usos máximos"
#: pretix/base/modelimport_vouchers.py:79
#, fuzzy
#| msgid "Maximum number of items per order"
msgid "The maximum number of usages must be set."
msgstr "O número máximo de utilizações deve ser definido."
msgstr "Número máximo de itens por pedido"
#: pretix/base/modelimport_vouchers.py:88 pretix/base/models/vouchers.py:205
msgid "Minimum usages"
@@ -3587,8 +3653,6 @@ msgstr "Modo de preço"
#, python-brace-format
msgid "Could not parse {value} as a price mode, use one of {options}."
msgstr ""
"Não foi possível analisar {value} como um modo de preço, utilizar uma das "
"{options}."
#: pretix/base/modelimport_vouchers.py:160 pretix/base/models/vouchers.py:245
msgid "Voucher value"
@@ -4487,8 +4551,10 @@ msgstr "Nenhum valor pode conter o caracter delimitador."
#: pretix/base/models/giftcards.py:81
#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:50
#, fuzzy
#| msgid "Download your ticket here:"
msgid "Owned by ticket holder"
msgstr "Propriedade do titular do bilhete"
msgstr "Descarregue o seu bilhete aqui:"
#: pretix/base/models/giftcards.py:93
msgid "The gift card code may only contain letters, numbers, dots and dashes."
@@ -5948,10 +6014,10 @@ msgid "Team members"
msgstr "Membros da equipa"
#: pretix/base/models/organizer.py:267
#, fuzzy
#| msgid "Do you really want to disable two-factor authentication?"
msgid "Require all members of this team to use two-factor authentication"
msgstr ""
"Exigir que todos os membros desta equipa utilizem autenticação de dois "
"fatores"
msgstr "Quer mesmo desativar a autenticação de dois fatores?"
#: pretix/base/models/organizer.py:268
msgid ""
@@ -6523,7 +6589,7 @@ msgstr "Pedido {order.code} foi pago em excesso."
#: pretix/base/notifications.py:294
#, python-brace-format
msgid "An external refund for {order.code} has occurred."
msgstr "Foi efetuado um reembolso externo para o pedido {order.code}."
msgstr "Foi efetuado um reembolso externo para o pedido {order.code}"
#: pretix/base/notifications.py:299
msgid "Refund requested"
@@ -7447,24 +7513,29 @@ msgstr ""
"quantidade selecionada. Por favor, veja abaixo para mais detalhes."
#: pretix/base/services/cart.py:118
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "Some of the products you selected are no longer available in the quantity "
#| "you selected. Please see below for details."
msgid ""
"Some of the products you selected are no longer available. The following "
"products are affected and have not been added to your cart: %s"
msgstr ""
"Alguns dos produtos que selecionou não estão disponíveis. Os seguintes "
"produtos foram afetados e não foram adicionados ao seu carrinho: %s"
"Alguns dos produtos que você selecionou não estão mais disponíveis na "
"quantidade selecionada. Por favor, veja abaixo para mais detalhes."
#: pretix/base/services/cart.py:122
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "Some of the products you selected are no longer available in the quantity "
#| "you selected. Please see below for details."
msgid ""
"Some of the products you selected are no longer available in the quantity "
"you selected. The following products are affected and have not been added to "
"your cart: %s"
msgstr ""
"Alguns dos produtos que selecionou não estão disponíveis na quantidade "
"que selecionou. Os seguintes produtos foram afetados e não foram adicionados "
"ao seu carrinho: %s"
"Alguns dos produtos que você selecionou não estão mais disponíveis na "
"quantidade selecionada. Por favor, veja abaixo para mais detalhes."
#: pretix/base/services/cart.py:127
#, fuzzy, python-format
@@ -8405,12 +8476,15 @@ msgstr ""
"do seu carrinho."
#: pretix/base/services/orders.py:202
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "You cannot delete the product <strong>%(item)s</strong> because it "
#| "already has been ordered."
msgid ""
"You cannot remove the position %(addon)s since it has already been checked "
"in."
msgstr ""
"Não é possível remover a posição %(addon)s uma vez que já foi feito check-in."
"Não pode excluir o produto <strong>%(item)s</strong> porque já foi pedido."
#: pretix/base/services/orders.py:203
#, fuzzy
@@ -10756,12 +10830,13 @@ msgstr ""
"Olá,\n"
"\n"
"Ainda não recebemos o pagamento total para o seu pedido {event}.\n"
"Tenha em atenção que tem de pagar antes de {expire_date}.\n"
"Tenha em mente que só garantimos o pedido se recebermos\n"
"o seu pagamento antes de {expire_date}.\n"
"\n"
"Pode ver as informações de pagamento e o estado da sua encomenda em\n"
"Pode visualizar as informações de pagamento e o estado do pedido em\n"
"{url}\n"
"\n"
"Com os melhores cumprimentos\n"
"Cumprimentos,\n"
"A sua equipa {event}"
#: pretix/base/settings.py:2409
@@ -12070,16 +12145,21 @@ msgid "Your export failed."
msgstr "Criar novo ficheiro de exportação"
#: pretix/base/templates/pretixbase/email/export_failed.txt:4
#, fuzzy
#| msgid "Refund reason"
msgid "Reason:"
msgstr "Razão:"
msgstr "Motivo do reembolso"
#: pretix/base/templates/pretixbase/email/export_failed.txt:7
msgid "If your export fails five times in a row, it will no longer be sent."
msgstr ""
#: pretix/base/templates/pretixbase/email/export_failed.txt:10
#, fuzzy
#| msgctxt "order state"
#| msgid "Confirmation pending"
msgid "Configuration link:"
msgstr "Link de Configuração:"
msgstr "Confirmação pendente"
#: pretix/base/templates/pretixbase/email/notification.html:55
#: pretix/base/templates/pretixbase/email/notification.txt:14
@@ -12318,9 +12398,11 @@ msgid "Next week"
msgstr ""
#: pretix/base/timeframes.py:148
#, fuzzy
#| msgid "Current:"
msgctxt "reporting_timeframe"
msgid "Current month"
msgstr "Mês Corrente"
msgstr "Corrente:"
#: pretix/base/timeframes.py:152 pretix/base/timeframes.py:161
#: pretix/base/timeframes.py:170 pretix/base/timeframes.py:179
@@ -12645,17 +12727,22 @@ msgid "Community translations"
msgstr "Tradução não oficial"
#: pretix/control/forms/__init__.py:332
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid ""
#| "This translation is not maintained by the pretix team. We cannot vouch "
#| "for its correctness and new or recently changed features might not be "
#| "translated and will show in English instead. You can help translating at "
#| "translate.pretix.eu."
msgid ""
"These translations are not maintained by the pretix team. We cannot vouch "
"for their correctness and new or recently changed features might not be "
"translated and will show in English instead. You can <a "
"href=\"{translate_url}\" target=\"_blank\">help translating</a>."
msgstr ""
"Esta tradução não é mantida pela equipa pretix. Não podemos garantir a sua "
"exatidão e funcionalidades novas ou recentemente alteradas podem não ser "
"traduzidas e vão aparecer em Inglês em alternativa. Pode <a href=\""
"{translate_url}\" target=\"_blank\">ajudar na tradução </a>."
"Esta tradução não é mantida pela equipa pretix. Não podemos atestar sua "
"veracidade e recursos novos ou recentemente alterados podem não ser "
"traduzido e vão aparecer em Inglês em alternativa. Pode ajudar a traduzir em "
"translate.pretix.eu."
#: pretix/control/forms/__init__.py:343
msgid "Development only"
@@ -15102,7 +15189,21 @@ msgid "Your voucher for {event}"
msgstr "Seu voucher para {event}"
#: pretix/control/forms/vouchers.py:278
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "with this email, we're sending you one or more vouchers for {event}:\n"
#| "\n"
#| "{voucher_list}\n"
#| "\n"
#| "You can redeem them here in our ticket shop:\n"
#| "\n"
#| "{url}\n"
#| "\n"
#| "Best regards, \n"
#| "\n"
#| "Your {event} team"
msgid ""
"Hello,\n"
"\n"
@@ -15119,15 +15220,16 @@ msgid ""
msgstr ""
"Olá,\n"
"\n"
"com este e-mail, estamos a enviar-lhe um ou mais vouchers para {event}:\n"
"com este e-mail, estamos enviando-lhe um ou mais vouchers para {event}:\n"
"\n"
"{voucher_list}\n"
"\n"
"Pode trocá-los aqui na nossa bilheteira:\n"
"Pode trocá-los aqui em nossa bilheteira:\n"
"\n"
"{url}\n"
"\n"
"Cumprimentos,\n"
"\n"
"A sua equipa {event}"
#: pretix/control/forms/vouchers.py:284
@@ -17877,8 +17979,10 @@ msgid "Valid check-in"
msgstr "Todos os check-ins"
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:68
#, fuzzy
#| msgid "Additional information"
msgid "Additional information required"
msgstr "Informação adicional necessária"
msgstr "Informação adicional"
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:70
msgid ""
@@ -19777,10 +19881,11 @@ msgid "Currently available: %(num)s"
msgstr "Actualmente disponíveis: %(num)s"
#: pretix/control/templates/pretixcontrol/giftcards/checkout_confirm.html:4
#, python-format
#, fuzzy, python-format
msgid "Your gift card %(card)s will be used to pay for this order."
msgstr ""
"O seu cartão presente %(card)s será utilizado para pagar esta encomenda."
"O cartão-presente pode ser usado para comprar bilhetes para todos os eventos "
"deste organizador."
#: pretix/control/templates/pretixcontrol/global_license.html:8
msgid ""
@@ -21968,8 +22073,10 @@ msgid ""
msgstr ""
#: pretix/control/templates/pretixcontrol/orders/bulk_action.html:71
#, fuzzy
#| msgid "You will not be able to continue."
msgid "Do you want to continue?"
msgstr "Quer continuar?"
msgstr "Você não poderá continuar."
#: pretix/control/templates/pretixcontrol/orders/bulk_action.html:77
#, fuzzy
@@ -22145,13 +22252,13 @@ msgstr "Apagar seleção"
#: pretix/control/templates/pretixcontrol/orders/export_delete.html:9
#: pretix/control/templates/pretixcontrol/organizers/export_delete.html:9
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "Are you sure you want to delete the quota <strong>%(quota)s</strong>?"
msgid ""
"Are you sure you want to delete the scheduled export <strong>%(export)s</"
"strong>?"
msgstr ""
"Tem certeza de que deseja excluir a exportação agendada "
"<strong>%(export)s</strong>?"
msgstr "Tem certeza de que deseja excluir a quota <strong>%(quota)s</strong>?"
#: pretix/control/templates/pretixcontrol/orders/export_form.html:26
#: pretix/control/templates/pretixcontrol/organizers/export_form.html:27
@@ -22190,9 +22297,10 @@ msgid "Repetition schedule"
msgstr "Regra de repetição"
#: pretix/control/templates/pretixcontrol/orders/fragment_export_schedule_form.html:46
#, python-format
#, fuzzy, python-format
#| msgid "Repeat every %(interval)s %(freq)s, starting at %(start)s."
msgid "Repeat every %(interval)s %(freq)s"
msgstr "Repetir a cada %(interval)s %(freq)s"
msgstr "Repetir a cada %(interval)s %(freq)s, a partir de %(start)s."
#: pretix/control/templates/pretixcontrol/orders/fragment_export_schedule_form.html:54
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:89
@@ -22246,8 +22354,10 @@ msgid ""
msgstr ""
#: pretix/control/templates/pretixcontrol/orders/fragment_export_schedule_form.html:111
#, fuzzy
#| msgid "Please confirm the following payment details."
msgid "Please note the following limitations:"
msgstr "Tenha em atenção as seguintes limitações:"
msgstr "Por favor, confirme os seguintes detalhes de pagamento."
#: pretix/control/templates/pretixcontrol/orders/fragment_export_schedule_form.html:114
msgid ""
@@ -25229,7 +25339,11 @@ msgid "Quota unlimited"
msgstr "Nome da quota"
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:229
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "\n"
#| " Waiting, product %(num)sx available\n"
#| " "
msgid ""
"\n"
" Waiting, product %(num)sx "
@@ -25237,8 +25351,7 @@ msgid ""
" "
msgstr ""
"\n"
" Em espera, produto %(num)sx "
"disponível\n"
" Esperando, produto %(num)sx disponíveis\n"
" "
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:235
@@ -26956,8 +27069,10 @@ msgstr ""
"verifique se a data e hora do seu telefone está configurado corretamente."
#: pretix/control/views/user.py:583
#, fuzzy
#| msgid "Do you really want to enable two-factor authentication?"
msgid "You have left all teams that require two-factor authentication."
msgstr "Deixou todas as equipas que requerem autenticação de dois factores."
msgstr "Deseja mesmo ativar a autenticação de dois fatores?"
#: pretix/control/views/user.py:597
msgid ""
@@ -27612,8 +27727,10 @@ msgid ""
msgstr ""
#: pretix/plugins/banktransfer/payment.py:334
#, fuzzy
#| msgid "Invoice recipient:"
msgid "Invoice recipient e-mail"
msgstr "E-mail do destinatário da fatura"
msgstr "destinatário da factura:"
#: pretix/plugins/banktransfer/payment.py:336
msgid ""
@@ -27774,12 +27891,16 @@ msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:36
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:36
#, fuzzy
#| msgid ""
#| "After completing your purchase, we will ask you to transfer the money to "
#| "the following bank account, using a personal reference code:"
msgid ""
"After completing your purchase, we will ask you to transfer the money to our "
"bank account, using a personal reference code."
msgstr ""
"Após concluir a sua compra, iremos pedir-lhe para transferir o dinheiro para "
"a nossa conta bancária, usando um código de referência pessoal."
"Após a conclusão da sua compra, pediremos-lhe que transfira o dinheiro para "
"a seguinte conta bancária, utilizando um código de referência pessoal:"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:43
#, python-format
@@ -28011,8 +28132,10 @@ msgid ""
msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:132
#, fuzzy
#| msgid "Invoice recipient:"
msgid "Invoice recipient email"
msgstr "E-mail do destinatário da fatura"
msgstr "destinatário da factura:"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:139
#, fuzzy
@@ -28338,6 +28461,8 @@ msgstr "Lista de check-in (PDF)"
#: pretix/plugins/checkinlists/exporters.py:461
#: pretix/plugins/checkinlists/exporters.py:661
#: pretix/plugins/checkinlists/exporters.py:731
#, fuzzy
#| msgid "Check-in"
msgctxt "export_category"
msgid "Check-in"
msgstr "Check-in"
@@ -31620,7 +31745,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:12
msgid "You already selected the following payment methods:"
msgstr "Já seleccionou os seguintes métodos de pagamento:"
msgstr "Por favor, confirme os seguintes detalhes de pagamento."
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:26
msgid "Remove payment"
@@ -31636,7 +31761,7 @@ msgstr "Por favor, selecione um método de pagamento."
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:52
msgid "Please select how you want to pay the remaining balance:"
msgstr "Seleccione como pretende pagar o saldo remanescente:"
msgstr "Por favor, selecione como deseja pagar."
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:95
msgid "This sales channel does not provide support for test mode."
@@ -31839,9 +31964,10 @@ msgstr "Novo preço:"
#: pretix/presale/templates/pretixpresale/event/voucher.html:176
#: pretix/presale/templates/pretixpresale/event/voucher.html:328
#: pretix/presale/templates/pretixpresale/event/voucher.html:330
#, python-format
#, fuzzy, python-format
#| msgid "Modify price for %(item)s"
msgid "Modify price for %(item)s, at least %(price)s"
msgstr "Modificar preço para %(item)s, pelo menos %(price)s"
msgstr "Modificar preço para %(item)s"
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:152
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:291
@@ -32116,8 +32242,10 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:377
#: pretix/presale/templates/pretixpresale/event/order_giftcard.html:20
#: pretix/presale/templates/pretixpresale/event/position_giftcard.html:20
#, fuzzy
#| msgid "Current value"
msgid "Current value:"
msgstr "Valor atual:"
msgstr "Valor atual"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:451
#, python-format
@@ -32204,9 +32332,10 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_change_confirm.html:56
#: pretix/presale/templates/pretixpresale/event/fragment_change_confirm.html:81
#: pretix/presale/templates/pretixpresale/event/fragment_change_confirm.html:106
#, python-format
#, fuzzy, python-format
#| msgid "Add-On to position #%(posid)s"
msgid "Add-on product to position #%(positionid)s"
msgstr "Add-On para a posição # %(positionid)s"
msgstr "Add-On para a posição %(posid)s"
#: pretix/presale/templates/pretixpresale/event/fragment_change_confirm.html:40
#, python-format
@@ -32458,17 +32587,19 @@ msgstr "Mostrar imagem em tamanho original do %(item)s"
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:329
#: pretix/presale/templates/pretixpresale/event/voucher.html:204
#: pretix/presale/templates/pretixpresale/event/voucher.html:358
#, python-format
#, fuzzy, python-format
#| msgid "(incl. taxes)"
msgid "%(value)s incl. taxes"
msgstr "%(value)s incl. impostos"
msgstr "(incl. impostos)"
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:183
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:335
#: pretix/presale/templates/pretixpresale/event/voucher.html:210
#: pretix/presale/templates/pretixpresale/event/voucher.html:364
#, python-format
#, fuzzy, python-format
#| msgid "Total value (without taxes)"
msgid "%(value)s without taxes"
msgstr "%(value)s sem impostos"
msgstr "Valor total (sem impostos)"
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:290
#: pretix/presale/templates/pretixpresale/event/voucher.html:321
@@ -32718,7 +32849,7 @@ msgstr "Obrigado!"
#: pretix/presale/templates/pretixpresale/event/order.html:14
#: pretix/presale/templates/pretixpresale/event/order.html:32
msgid "Your order has been placed successfully. See below for details."
msgstr "A sua encomenda foi efectuada com sucesso. Veja abaixo os detalhes."
msgstr "O seu pedido foi feito com sucesso. Vê abaixo os detalhes!"
#: pretix/presale/templates/pretixpresale/event/order.html:16
#: pretix/presale/templates/pretixpresale/event/order.html:48
@@ -33080,9 +33211,10 @@ msgstr "Confirme as seguintes alterações em seu pedido."
#: pretix/presale/templates/pretixpresale/event/order_giftcard.html:10
#: pretix/presale/templates/pretixpresale/event/position_giftcard.html:10
#, python-format
#, fuzzy, python-format
#| msgid "Gift card: %(card)s"
msgid "Gift card: %(code)s"
msgstr "Cartão-presente: %(code)s"
msgstr "Cartão-presente: %(card)s"
#: pretix/presale/templates/pretixpresale/event/order_modify.html:5
msgid "Modify order"
@@ -33876,8 +34008,10 @@ msgid "This feature is only available in test mode."
msgstr "Este cartão-presente só pode ser usado em modo de teste."
#: pretix/presale/views/event.py:969
#, fuzzy
#| msgid "This account is disabled."
msgid "Time machine disabled!"
msgstr "Máquina do tempo desactivada!"
msgstr "Esta conta está desativada."
#: pretix/presale/views/order.py:368 pretix/presale/views/order.py:433
#: pretix/presale/views/order.py:514

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-08 13:19+0000\n"
"PO-Revision-Date: 2024-06-08 18:00+0000\n"
"PO-Revision-Date: 2022-11-16 16:12+0000\n"
"Last-Translator: David Vaz <davidmgvaz@gmail.com>\n"
"Language-Team: Portuguese (Portugal) <https://translate.pretix.eu/projects/"
"pretix/pretix-js/pt_PT/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.5.5\n"
"X-Generator: Weblate 4.14.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -265,7 +265,7 @@ msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:51
msgid "Additional information required"
msgstr "Informação adicional necessária"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:52
msgid "Valid ticket"

File diff suppressed because it is too large Load Diff

View File

@@ -8,16 +8,14 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-08 13:19+0000\n"
"PO-Revision-Date: 2024-06-17 17:00+0000\n"
"Last-Translator: Kristian Feldsam <feldsam@gmail.com>\n"
"Language-Team: Slovak <https://translate.pretix.eu/projects/pretix/pretix-js/"
"sk/>\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: sk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 5.5.5\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -212,7 +210,7 @@ msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:39
msgid "Exit"
msgstr "Odchod"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:40
msgid "Scan a ticket or search and press return…"

File diff suppressed because it is too large Load Diff

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-01 01:00+0000\n"
"Last-Translator: Luan Thien <vanthienluan@gmail.com>\n"
"PO-Revision-Date: 2022-04-25 16:10+0000\n"
"Last-Translator: fsnaix <truonggiangsn@gmail.com>\n"
"Language-Team: Vietnamese <https://translate.pretix.eu/projects/pretix/"
"pretix/vi/>\n"
"Language: vi\n"
@@ -17,111 +17,111 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.5.5\n"
"X-Generator: Weblate 4.11.2\n"
#: pretix/_base_settings.py:78
msgid "English"
msgstr "Tiếng Anh"
msgstr ""
#: pretix/_base_settings.py:79
msgid "German"
msgstr "Tiếng Đức"
msgstr ""
#: pretix/_base_settings.py:80
msgid "German (informal)"
msgstr "Tiếng Đức (thân mật)"
msgstr ""
#: pretix/_base_settings.py:81
msgid "Arabic"
msgstr "Tiếng A-rập"
msgstr ""
#: pretix/_base_settings.py:82
msgid "Chinese (simplified)"
msgstr "Tiếng Trung (giản thể)"
msgstr ""
#: pretix/_base_settings.py:83
msgid "Chinese (traditional)"
msgstr "Tiếng Trung Quốc (phồn thể)"
msgstr ""
#: pretix/_base_settings.py:84
msgid "Czech"
msgstr "Tiếng Séc"
msgstr ""
#: pretix/_base_settings.py:85
msgid "Danish"
msgstr "Tiếng Đan Mạch"
msgstr ""
#: pretix/_base_settings.py:86
msgid "Dutch"
msgstr "Tiếng Hà Lan"
msgstr ""
#: pretix/_base_settings.py:87
msgid "Dutch (informal)"
msgstr "Tiếng Hà Lan (thân mật)"
msgstr ""
#: pretix/_base_settings.py:88
msgid "French"
msgstr "Tiếng Pháp"
msgstr ""
#: pretix/_base_settings.py:89
msgid "Finnish"
msgstr "Tiếng Phần Lan"
msgstr ""
#: pretix/_base_settings.py:90
msgid "Galician"
msgstr "Tiếng Galician"
msgstr ""
#: pretix/_base_settings.py:91
msgid "Greek"
msgstr "Tiếng Hy Lạp"
msgstr ""
#: pretix/_base_settings.py:92
msgid "Indonesian"
msgstr "Tiếng Indonesia"
msgstr ""
#: pretix/_base_settings.py:93
msgid "Italian"
msgstr "Tiếng Ý"
msgstr ""
#: pretix/_base_settings.py:94
msgid "Latvian"
msgstr "Tiếng Latvia"
msgstr ""
#: pretix/_base_settings.py:95
msgid "Norwegian Bokmål"
msgstr "Tiếng Na Uy"
msgstr ""
#: pretix/_base_settings.py:96
msgid "Polish"
msgstr "Tiếng Ba Lan"
msgstr ""
#: pretix/_base_settings.py:97
msgid "Portuguese (Portugal)"
msgstr "Tiếng Bồ Đào Nha"
msgstr ""
#: pretix/_base_settings.py:98
msgid "Portuguese (Brazil)"
msgstr "Tiếng Bồ Đào Nha (Brazil)"
msgstr ""
#: pretix/_base_settings.py:99
msgid "Romanian"
msgstr "Tiếng Ru-ma-ni"
msgstr ""
#: pretix/_base_settings.py:100
msgid "Russian"
msgstr "Tiếng Nga"
msgstr ""
#: pretix/_base_settings.py:101
msgid "Spanish"
msgstr "Tiếng Tây Ban Nha"
msgstr ""
#: pretix/_base_settings.py:102
msgid "Turkish"
msgstr "Tiếng Thổ Nhĩ Kỳ"
msgstr ""
#: pretix/_base_settings.py:103
msgid "Ukrainian"
msgstr "Tiếng Ukrainian"
msgstr ""
#: pretix/api/auth/devicesecurity.py:31
msgid ""
@@ -203,7 +203,7 @@ msgstr "Giới hạn cho sự kiện"
#: pretix/plugins/banktransfer/refund_export.py:46
#: pretix/plugins/checkinlists/exporters.py:509
msgid "Comment"
msgstr "Bình luận"
msgstr ""
#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1349
msgid "The product \"{}\" is not assigned to a quota."
@@ -212,7 +212,7 @@ msgstr "Mặt hàng \"{}\" chưa được chỉ định số hàng tồn."
#: pretix/api/serializers/checkin.py:66 pretix/base/models/event.py:1622
#: pretix/base/models/items.py:1822 pretix/base/models/items.py:2080
msgid "One or more items do not belong to this event."
msgstr "Một hoặc một vài mục không thuộc sự kiện này."
msgstr ""
#: pretix/api/serializers/checkin.py:70 pretix/api/serializers/checkin.py:73
#: pretix/base/models/items.py:2091 pretix/base/models/items.py:2094
@@ -233,23 +233,23 @@ msgstr ""
#: pretix/api/serializers/event.py:232 pretix/api/serializers/event.py:531
#, python-brace-format
msgid "Meta data property '{name}' does not exist."
msgstr "Thuộc tính '{name}' không tồn tại."
msgstr ""
#: pretix/api/serializers/event.py:235 pretix/api/serializers/event.py:534
#, python-brace-format
msgid "Meta data property '{name}' does not allow value '{value}'."
msgstr "Thuộc tính '{name}' không chấp nhận giá trị '{value}'"
msgstr ""
#: pretix/api/serializers/event.py:278
#, python-brace-format
msgid "Unknown plugin: '{name}'."
msgstr "Không có plugin: '{name}'."
msgstr ""
#: pretix/api/serializers/item.py:75 pretix/api/serializers/item.py:125
#: pretix/api/serializers/item.py:327
#, python-brace-format
msgid "Item meta data property '{name}' does not exist."
msgstr "Không tồn tại mục chứa thuộc tính '{name}'."
msgstr ""
#: pretix/api/serializers/item.py:184 pretix/control/forms/item.py:1207
msgid "The bundled item must not be the same item as the bundling one."
@@ -407,7 +407,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/event/mail.html:114
#: pretix/control/views/orders.py:1549
msgid "Order canceled"
msgstr "Đã huỷ đơn hàng"
msgstr ""
#: pretix/api/webhooks.py:242 pretix/base/notifications.py:257
msgid "Order reactivated"
@@ -969,7 +969,7 @@ msgstr ""
#: pretix/plugins/checkinlists/exporters.py:806
#: pretix/plugins/checkinlists/exporters.py:807
msgid "Yes"
msgstr ""
msgstr ""
#: pretix/base/exporters/customers.py:100
#: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83
@@ -992,7 +992,7 @@ msgstr "Có"
#: pretix/plugins/checkinlists/exporters.py:806
#: pretix/plugins/checkinlists/exporters.py:807
msgid "No"
msgstr "Không"
msgstr ""
#: pretix/base/exporters/dekodi.py:42 pretix/base/exporters/invoices.py:66
msgctxt "export_category"
@@ -2081,7 +2081,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:11
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:45
msgid "Product"
msgstr "Sản phẩm"
msgstr ""
#: pretix/base/exporters/orderlist.py:578
#: pretix/base/exporters/orderlist.py:583 pretix/base/forms/questions.py:655
@@ -2433,7 +2433,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/event/cancel.html:20
#: pretix/control/views/item.py:949
msgid "Paid orders"
msgstr "Đơn hàng đã thanh toán"
msgstr ""
#: pretix/base/exporters/orderlist.py:1106 pretix/control/views/item.py:954
msgid "Pending orders"
@@ -2590,7 +2590,7 @@ msgstr ""
#: pretix/plugins/reports/accountingreport.py:104
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:67
msgid "All"
msgstr "Tất cả"
msgstr ""
#: pretix/base/exporters/orderlist.py:1278 pretix/control/forms/filter.py:1343
msgid "Live"
@@ -3310,7 +3310,7 @@ msgstr ""
#: pretix/base/modelimport_vouchers.py:205 pretix/base/models/items.py:1163
#: pretix/base/models/vouchers.py:263 pretix/base/models/waitinglist.py:99
msgid "Product variation"
msgstr "Biến thể sản phẩm"
msgstr ""
#: pretix/base/modelimport_orders.py:160
#: pretix/base/modelimport_vouchers.py:225
@@ -3693,19 +3693,19 @@ msgstr ""
#: pretix/base/models/checkin.py:341
msgid "Entry"
msgstr "Vào"
msgstr ""
#: pretix/base/models/checkin.py:342
msgid "Exit"
msgstr "Ra"
msgstr ""
#: pretix/base/models/checkin.py:360
msgid "Unknown ticket"
msgstr "Không nhận ra vé"
msgstr ""
#: pretix/base/models/checkin.py:361
msgid "Ticket not paid"
msgstr "Vé chưa thanh toán"
msgstr ""
#: pretix/base/models/checkin.py:362
msgid "Forbidden by custom rule"
@@ -3713,23 +3713,23 @@ msgstr ""
#: pretix/base/models/checkin.py:363
msgid "Ticket code revoked/changed"
msgstr "Mã vé đã bị thu hồi / thay đổi"
msgstr ""
#: pretix/base/models/checkin.py:364
msgid "Information required"
msgstr "Thông tin được yêu cầu"
msgstr ""
#: pretix/base/models/checkin.py:365
msgid "Ticket already used"
msgstr "Vé đã được sử dụng"
msgstr ""
#: pretix/base/models/checkin.py:366
msgid "Ticket type not allowed here"
msgstr "Loại vé không được chấp nhập ở đây"
msgstr ""
#: pretix/base/models/checkin.py:367
msgid "Ticket code is ambiguous on list"
msgstr "Mã vé không rõ ràng trong danh sách"
msgstr ""
#: pretix/base/models/checkin.py:368
msgid "Server error"
@@ -3737,15 +3737,15 @@ msgstr ""
#: pretix/base/models/checkin.py:369
msgid "Ticket blocked"
msgstr "Vé đã bị khoá"
msgstr ""
#: pretix/base/models/checkin.py:370
msgid "Order not approved"
msgstr "Đơn hàng không được chấp nhận"
msgstr ""
#: pretix/base/models/checkin.py:371
msgid "Ticket not valid at this time"
msgstr "Vé không hợp lệ tại thời điểm này"
msgstr ""
#: pretix/base/models/customers.py:55
msgid "Provider name"
@@ -3844,7 +3844,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/organizers/gates.html:16
#: pretix/plugins/checkinlists/exporters.py:754
msgid "Gate"
msgstr "Cổng"
msgstr ""
#: pretix/base/models/devices.py:132
#: pretix/control/templates/pretixcontrol/organizers/devices.html:83
@@ -5225,7 +5225,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:30
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:78
msgid "Canceled"
msgstr "Đã huỷ"
msgstr ""
#: pretix/base/models/memberships.py:134
#: pretix/control/templates/pretixcontrol/organizers/customer.html:115
@@ -5742,7 +5742,7 @@ msgstr ""
#: pretix/base/models/vouchers.py:201 pretix/control/views/vouchers.py:119
msgid "Redeemed"
msgstr "Đã đổi"
msgstr ""
#: pretix/base/models/vouchers.py:206
msgid ""
@@ -6758,15 +6758,15 @@ msgstr ""
#: pretix/base/reldate.py:35
msgid "Event start"
msgstr "Sự kiện bắt đầu"
msgstr ""
#: pretix/base/reldate.py:36
msgid "Event end"
msgstr "Sự kiện kết thúc"
msgstr ""
#: pretix/base/reldate.py:37
msgid "Event admission"
msgstr "Ghi danh sự kiện"
msgstr ""
#: pretix/base/reldate.py:38
msgid "Presale start"
@@ -10554,7 +10554,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:355
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:364
msgid "minutes"
msgstr "phút"
msgstr ""
#: pretix/base/templates/pretixbase/forms/widgets/reldatetime.html:23
msgid "at"
@@ -11785,7 +11785,7 @@ msgstr ""
#: pretix/control/forms/filter.py:1953 pretix/control/forms/filter.py:1955
#: pretix/control/forms/filter.py:2523 pretix/control/forms/filter.py:2525
msgid "Search query"
msgstr "Truy vấn tìm kiếm"
msgstr ""
#: pretix/control/forms/filter.py:1423 pretix/control/forms/filter.py:1496
#: pretix/control/templates/pretixcontrol/organizers/customer.html:45
@@ -11906,7 +11906,7 @@ msgstr ""
#: pretix/control/forms/filter.py:2019
msgid "Valid"
msgstr "Hợp lệ"
msgstr ""
#: pretix/control/forms/filter.py:2020
msgid "Unredeemed"
@@ -14831,7 +14831,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:67
#: pretix/presale/templates/pretixpresale/event/position_change.html:29
msgid "Continue"
msgstr "Tiếp tục"
msgstr ""
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html:8
msgid "Authorize an application"
@@ -15292,7 +15292,7 @@ msgstr[0] ""
#: pretix/presale/templates/pretixpresale/event/position_change.html:24
#: pretix/presale/templates/pretixpresale/event/position_modify.html:44
msgid "Cancel"
msgstr "Huỷ"
msgstr ""
#: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html:27
#: pretix/control/templates/pretixcontrol/checkin/list_delete.html:24
@@ -15401,7 +15401,7 @@ msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:14
#: pretix/plugins/checkinlists/exporters.py:755
msgid "Result"
msgstr "Kết quả"
msgstr ""
#: pretix/control/templates/pretixcontrol/checkin/checkins.html:78
#: pretix/control/templates/pretixcontrol/order/index.html:391
@@ -15697,7 +15697,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:68
msgid "Additional information required"
msgstr "Yêu cầu thông tin bổ sung"
msgstr ""
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:70
msgid ""
@@ -18866,7 +18866,7 @@ msgstr ""
#: pretix/plugins/reports/exporters.py:957
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:449
msgid "Total"
msgstr "Tổng cộng"
msgstr ""
#: pretix/control/templates/pretixcontrol/order/index.html:712
#: pretix/presale/templates/pretixpresale/event/order.html:209
@@ -24712,7 +24712,7 @@ msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:80
msgid "Comment:"
msgstr "Bình luận:"
msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:98
msgid "No order code detected"
@@ -24979,7 +24979,7 @@ msgstr ""
#: pretix/plugins/paypal2/payment.py:136 pretix/plugins/paypal2/payment.py:1063
#: pretix/plugins/paypal2/payment.py:1064 pretix/plugins/stripe/payment.py:1915
msgid "PayPal"
msgstr "PayPal"
msgstr ""
#: pretix/plugins/paypal/apps.py:53
msgid ""
@@ -26430,7 +26430,7 @@ msgstr ""
#: pretix/plugins/stripe/payment.py:339 pretix/plugins/stripe/payment.py:1591
msgid "giropay"
msgstr "giropay"
msgstr ""
#: pretix/plugins/stripe/payment.py:341 pretix/plugins/stripe/payment.py:349
#: pretix/plugins/stripe/payment.py:357 pretix/plugins/stripe/payment.py:365
@@ -26445,7 +26445,7 @@ msgstr ""
#: pretix/plugins/stripe/payment.py:347 pretix/plugins/stripe/payment.py:1627
msgid "iDEAL"
msgstr "iDEAL"
msgstr ""
#: pretix/plugins/stripe/payment.py:355 pretix/plugins/stripe/payment.py:1652
msgid "Alipay"
@@ -26453,11 +26453,11 @@ msgstr ""
#: pretix/plugins/stripe/payment.py:363 pretix/plugins/stripe/payment.py:1664
msgid "Bancontact"
msgstr "Bancontact"
msgstr ""
#: pretix/plugins/stripe/payment.py:371
msgid "SEPA Direct Debit"
msgstr "Ghi nợ trực tiếp SEPA"
msgstr ""
#: pretix/plugins/stripe/payment.py:374
msgid ""
@@ -26485,7 +26485,7 @@ msgstr ""
#: pretix/plugins/stripe/payment.py:398
msgid "SOFORT"
msgstr "SOFORT"
msgstr ""
#: pretix/plugins/stripe/payment.py:401
msgid ""
@@ -27114,7 +27114,7 @@ msgstr ""
#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/edit.html:23
msgid "Ticket design"
msgstr "Thiết kế vé"
msgstr ""
#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/edit.html:27
msgid "You can modify the design after you saved this page."
@@ -29650,7 +29650,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/postmessage.html:21
#: pretix/presale/templates/pretixpresale/waiting.html:22
msgid "We are processing your request …"
msgstr "Chúng tôi đang xử lý yêu cầu …"
msgstr ""
#: pretix/presale/utils.py:256 pretix/presale/utils.py:389
#: pretix/presale/utils.py:390
@@ -29956,4 +29956,4 @@ msgstr ""
#: pretix/settings.py:748
msgid "Kosovo"
msgstr "Kosovo"
msgstr ""

View File

@@ -3,84 +3,83 @@
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-08 13:19+0000\n"
"PO-Revision-Date: 2024-05-30 17:00+0000\n"
"Last-Translator: Luan Thien <vanthienluan@gmail.com>\n"
"Language-Team: Vietnamese <https://translate.pretix.eu/projects/pretix/"
"pretix-js/vi/>\n"
"Language: vi\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.5.5\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:68
msgid "Marked as paid"
msgstr "Chuyển thành Đã thanh toán"
msgstr ""
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:76
msgid "Comment:"
msgstr "Bình luận:"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:34
msgid "PayPal"
msgstr "PayPal"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:35
msgid "Venmo"
msgstr "Venmo"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:36
#: pretix/static/pretixpresale/js/walletdetection.js:38
msgid "Apple Pay"
msgstr "Apple Pay"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:37
msgid "Itaú"
msgstr "Itaú"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:38
msgid "PayPal Credit"
msgstr "Tín dụng PayPal"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:39
msgid "Credit Card"
msgstr "Thẻ tín dụng"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:40
msgid "PayPal Pay Later"
msgstr "PayPal Pay Later"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:41
msgid "iDEAL"
msgstr "iDEAL"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:42
msgid "SEPA Direct Debit"
msgstr "Ghi nợ trực tiếp SEPA"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:43
msgid "Bancontact"
msgstr "Bancontact"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:44
msgid "giropay"
msgstr "giropay"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:45
msgid "SOFORT"
msgstr "SOFORT"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:46
msgid "eps"
msgstr "eps"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:47
msgid "MyBank"
@@ -133,7 +132,7 @@ msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:48
msgid "Continue"
msgstr "Tiếp tục"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:225
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:244
@@ -142,199 +141,199 @@ msgstr "Tiếp tục"
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:317
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:341
msgid "Confirming your payment …"
msgstr "Xác nhận thanh toán…"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:254
msgid "Payment method unavailable"
msgstr "Phương thức thanh toán không khả dụng"
msgstr ""
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:15
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Placed orders"
msgstr "Đặt hàng"
msgstr ""
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:15
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Paid orders"
msgstr "Đơn hàng đã thanh toán"
msgstr ""
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
msgid "Total revenue"
msgstr "Tổng doanh thu"
msgstr ""
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:15
msgid "Contacting Stripe …"
msgstr "Đang kết nối Stripe…"
msgstr ""
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:72
msgid "Total"
msgstr "Tổng cộng"
msgstr ""
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:291
msgid "Contacting your bank …"
msgstr "Đang kết nối đến ngân hàng…"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:30
msgid "Select a check-in list"
msgstr "Chọn một danh sách check-in"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:31
msgid "No active check-in lists found."
msgstr "Không có danh sách check-in nào đang kích hoạt."
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:32
msgid "Switch check-in list"
msgstr "Chuyển danh sách check-in"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:33
msgid "Search results"
msgstr "Kết quả tìm kiếm"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:34
msgid "No tickets found"
msgstr "Không có vé nào được tìm thấy"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:35
msgid "Result"
msgstr "Kết quả"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:36
msgid "This ticket requires special attention"
msgstr "Vé này cần được chú ý đặc biệt"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:37
msgid "Switch direction"
msgstr "Chuyển hướng"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:38
msgid "Entry"
msgstr "Vào"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:39
msgid "Exit"
msgstr "Ra"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:40
msgid "Scan a ticket or search and press return…"
msgstr "Quét mã vé hoặc tìm kiếm và nhấn Enter…"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:41
msgid "Load more"
msgstr "Tải thêm"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:42
msgid "Valid"
msgstr "Hợp lệ"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:43
msgid "Unpaid"
msgstr "Chưa thanh toán"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:44
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:45
msgid "Canceled"
msgstr "Đã huỷ"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:46
msgid "Redeemed"
msgstr "Đã đổi"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:47
msgid "Cancel"
msgstr "Huỷ"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:49
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:58
msgid "Ticket not paid"
msgstr "Vé chưa thanh toán"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:50
msgid "This ticket is not yet paid. Do you want to continue anyways?"
msgstr "Vé này chưa được thanh toán. Tiếp tục thực hiện?"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:51
msgid "Additional information required"
msgstr "Yêu cầu thông tin bổ sung"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:52
msgid "Valid ticket"
msgstr "Vé hợp lệ"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:53
msgid "Exit recorded"
msgstr "Đã ghi nhận Rời khỏi"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:54
msgid "Ticket already used"
msgstr "Vé đã được sử dụng"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:55
msgid "Information required"
msgstr "Thông tin được yêu cầu"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:56
msgid "Unknown ticket"
msgstr "Không nhận ra vé"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:57
msgid "Ticket type not allowed here"
msgstr "Loại vé không được chấp nhập ở đây"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:59
msgid "Entry not allowed"
msgstr "Không cho phép vào"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:60
msgid "Ticket code revoked/changed"
msgstr "Mã vé đã bị thu hồi / thay đổi"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:61
msgid "Ticket blocked"
msgstr "Vé đã bị khoá"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:62
msgid "Ticket not valid at this time"
msgstr "Vé không hợp lệ tại thời điểm này"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:63
msgid "Order canceled"
msgstr "Đã huỷ đơn hàng"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:64
msgid "Ticket code is ambiguous on list"
msgstr "Mã vé không rõ ràng trong danh sách"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:65
msgid "Order not approved"
msgstr "Đơn hàng không được chấp nhận"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:66
msgid "Checked-in Tickets"
msgstr "Vé đã check-in"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:67
msgid "Valid Tickets"
msgstr "Những vé hợp lệ"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:68
msgid "Currently inside"
msgstr "Hiện đang ở bên trong"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:69
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:270
msgid "Yes"
msgstr ""
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:70
#: pretix/static/pretixcontrol/js/ui/question.js:138
#: pretix/static/pretixpresale/js/ui/questions.js:270
msgid "No"
msgstr "Không"
msgstr ""
#: pretix/static/lightbox/js/lightbox.js:96
msgid "close"
msgstr "đóng"
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:58
#: pretix/static/pretixbase/js/asynctask.js:135
@@ -342,13 +341,11 @@ msgid ""
"Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes."
msgstr ""
"Yêu cầu của bạn đang được xử lý. Tuỳ thuộc vào quy mô của sự kiện, quá trình "
"có thể mất vài phút."
#: pretix/static/pretixbase/js/asynctask.js:63
#: pretix/static/pretixbase/js/asynctask.js:140
msgid "Your request has been queued on the server and will soon be processed."
msgstr "Yêu cầu của bạn đã được tiếp nhận và sẽ sớm được xử lý."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:69
#: pretix/static/pretixbase/js/asynctask.js:146
@@ -357,36 +354,34 @@ msgid ""
"If this takes longer than two minutes, please contact us or go back in your "
"browser and try again."
msgstr ""
"Chúng tôi đã nhận được yêu cầu của bạn nhưng chờ để xử lý. Vui lòng liên hệ "
"cho chúng tôi hoặc thực hiện lại nếu quá trình xử lý kéo dài hơn 2 phút."
#: pretix/static/pretixbase/js/asynctask.js:105
#: pretix/static/pretixbase/js/asynctask.js:193
#: pretix/static/pretixbase/js/asynctask.js:198
#: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred."
msgstr "Đã xảy ra lỗi {code}."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:108
msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: "
"{code}"
msgstr "Mất kết nối đến server, đang kết nối lại. Mã lỗi: {code}"
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:160
#: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again."
msgstr "Yêu cầu quá lâu. Vui lòng thực hiện lại."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:201
#: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "Không thể kết nối đến máy chủ. Vui lòng thử lại. Mã lỗi: {code}"
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:230
msgid "We are processing your request …"
msgstr "Chúng tôi đang xử lý yêu cầu …"
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:238
msgid ""
@@ -394,79 +389,77 @@ msgid ""
"than one minute, please check your internet connection and then reload this "
"page and try again."
msgstr ""
"Đang gửi yêu cầu đến máy chủ. Nếu quá trình này kéo dài hơn 1 phút, vui lòng "
"kiểm tra lại kết nối Internet, tải lại trang và thử lại."
#: pretix/static/pretixbase/js/asynctask.js:301
#: pretix/static/pretixcontrol/js/ui/main.js:71
msgid "Close message"
msgstr "Đóng tin nhắn"
msgstr ""
#: pretix/static/pretixcontrol/js/clipboard.js:23
msgid "Copied!"
msgstr "Đã sao chép!"
msgstr ""
#: pretix/static/pretixcontrol/js/clipboard.js:29
msgid "Press Ctrl-C to copy!"
msgstr "Nhấn Ctrl-C để sao chép!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:12
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:18
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:24
msgid "is one of"
msgstr "là một trong"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:30
msgid "is before"
msgstr "là trước"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:34
msgid "is after"
msgstr "là sau"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:40
msgid "="
msgstr "="
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:99
msgid "Product"
msgstr "Sản phẩm"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:103
msgid "Product variation"
msgstr "Biến thể sản phẩm"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:107
msgid "Gate"
msgstr "Cổng"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:111
msgid "Current date and time"
msgstr "Ngày và giờ hiện tại"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:115
msgid "Current day of the week (1 = Monday, 7 = Sunday)"
msgstr "Ngày hiện tại trong tuần (1 = Thứ 2, 7 = Chủ nhật)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:119
msgid "Current entry status"
msgstr "Trạng thái vào hiện tại"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:123
msgid "Number of previous entries"
msgstr "Số lượng các mục trước"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:127
msgid "Number of previous entries since midnight"
msgstr "Số mục trước đó tính từ nửa đêm"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:131
msgid "Number of previous entries since"
msgstr "Số mục trước từ khi"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:135
msgid "Number of previous entries before"
msgstr "Số mục trước trước lúc"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:139
msgid "Number of days with a previous entry"
@@ -490,159 +483,157 @@ msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:182
msgid "All of the conditions below (AND)"
msgstr "Tất cả các điều kiện bên dưới (và)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:183
msgid "At least one of the conditions below (OR)"
msgstr "Tối thiểu một điều kiện bên dưới (hoặc)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:184
msgid "Event start"
msgstr "Sự kiện bắt đầu"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:185
msgid "Event end"
msgstr "Sự kiện kết thúc"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:186
msgid "Event admission"
msgstr "Ghi danh sự kiện"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:187
msgid "custom date and time"
msgstr "tuỳ chỉnh ngày và giờ"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:188
msgid "custom time"
msgstr "tuỷ chỉnh giờ"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:189
msgid "Tolerance (minutes)"
msgstr "Tolerance (phút)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:190
msgid "Add condition"
msgstr "Thêm điều kiện"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:191
msgid "minutes"
msgstr "phút"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:192
msgid "Duplicate"
msgstr "Nhân bản"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:193
msgctxt "entry_status"
msgid "present"
msgstr "có mặt"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:194
msgctxt "entry_status"
msgid "absent"
msgstr "vắng"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:72
msgid "Check-in QR"
msgstr "Mã QR Check-in"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:387
msgid "The PDF background file could not be loaded for the following reason:"
msgstr "Không thể tải ảnh nền từ file PDF vì:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:656
msgid "Group of objects"
msgstr "Nhóm các đối tượng"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:661
msgid "Text object"
msgstr "Văn bản"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:663
msgid "Barcode area"
msgstr "Vùng mã vạch"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:665
msgid "Image area"
msgstr "Vùng ảnh"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:667
msgid "Powered by pretix"
msgstr "Được cung cấp bởi pretix"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:669
msgid "Object"
msgstr "Đối tượng"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:673
msgid "Ticket design"
msgstr "Thiết kế vé"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:972
msgid "Saving failed."
msgstr "Không thể lưu."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:1041
#: pretix/static/pretixcontrol/js/ui/editor.js:1091
msgid "Error while uploading your PDF file, please try again."
msgstr "Có lỗi xảy ra khi tải file PDF lên, vui lòng thử lại."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:1074
msgid "Do you really want to leave the editor without saving your changes?"
msgstr "Bạn thực sự muốn đóng mà không lưu các thay đổi chứ?"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/mail.js:19
msgid "An error has occurred."
msgstr "Đã có lỗi xảy ra."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/mail.js:52
msgid "Generating messages …"
msgstr "Đang tạo lời nhắn…"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:109
msgid "Unknown error."
msgstr "Lỗi không xác định."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:313
msgid "Your color has great contrast and is very easy to read!"
msgstr "Bạn đã chọn màu có độ tương phản tốt và dễ đọc!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:317
msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "Bạn đã giảm độ tương phản và có lẽ khá tốt để đọc!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:321
msgid ""
"Your color has bad contrast for text on white background, please choose a "
"darker shade."
msgstr ""
"Màu của bạn có độ tương phản kém đối với văn bản trên nền trắng, vui lòng "
"chọn màu tối hơn."
#: pretix/static/pretixcontrol/js/ui/main.js:475
#: pretix/static/pretixcontrol/js/ui/main.js:495
msgid "Search query"
msgstr "Truy vấn tìm kiếm"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:493
msgid "All"
msgstr "Tất cả"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:494
msgid "None"
msgstr "Không có"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:498
msgid "Selected only"
msgstr "Chỉ được chọn"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:828
msgid "Enter page number between 1 and %(max)s."
msgstr "Nhập số trang từ 1 đến %(max)s."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:831
msgid "Invalid page number."
msgstr "Số trang không hợp lệ."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:989
msgid "Use a different name internally"

View File

@@ -187,9 +187,7 @@ class BankTransfer(BasePaymentProvider):
help_text=_('Put one IBAN or IBAN prefix per line. The system will not attempt to send refunds to any '
'of these IBANs. Useful e.g. if you receive a lot of "forwarded payments" by a third-party payment '
'provider. You can also list country codes such as "GB" if you never want to send refunds to '
'IBANs from a specific country. The check digits will be ignored for comparison, so you '
'can e.g. ban DE0012345 to ban all German IBANs with the bank identifier starting with '
'12345.')
'IBANs from a specific country.')
)),
])
@@ -593,12 +591,7 @@ class BankTransfer(BasePaymentProvider):
except ValidationError:
return False
else:
def _compare(iban, prefix): # Compare IBAN with pretix ignoring the check digits
iban = iban[:2] + iban[4:]
prefix = prefix[:2] + prefix[4:]
return iban.startswith(prefix)
return not any(_compare(iban, b) for b in (self.settings.refund_iban_blocklist or '').splitlines() if b)
return not any(iban.startswith(b) for b in (self.settings.refund_iban_blocklist or '').splitlines() if b)
def payment_partial_refund_supported(self, payment: OrderPayment) -> bool:
return self.payment_refund_supported(payment)

View File

@@ -281,17 +281,6 @@ class TableTextRotate(Flowable):
canvas.drawString(0, -1, self.text)
def format_answer_for_export(a):
if a.question.type in (Question.TYPE_CHOICE, Question.TYPE_CHOICE_MULTIPLE):
return ", ".join(str(o.answer) for o in a.options.all())
elif a.question.type in Question.UNLOCALIZED_TYPES:
# We do not want to localize Date, Time and Datetime question answers, as those can lead
# to difficulties parsing the data (for example 2019-02-01 may become Février, 2019 01 in French).
return a.answer
else:
return str(a)
class PDFCheckinList(ReportlabExportMixin, CheckInListMixin, BaseExporter):
name = "overview"
identifier = 'checkinlistpdf'
@@ -383,14 +372,6 @@ class PDFCheckinList(ReportlabExportMixin, CheckInListMixin, BaseExporter):
tdata[0].append(p)
qs = self._get_queryset(cl, form_data)
qs = qs.prefetch_related(
'answers',
'answers__options',
'answers__question',
'addon_to__answers',
'addon_to__answers__question',
'addon_to__answers__options',
)
for op in qs:
try:
@@ -432,9 +413,19 @@ class PDFCheckinList(ReportlabExportMixin, CheckInListMixin, BaseExporter):
acache = {}
if op.addon_to:
for a in op.addon_to.answers.all():
acache[a.question_id] = format_answer_for_export(a)
# We do not want to localize Date, Time and Datetime question answers, as those can lead
# to difficulties parsing the data (for example 2019-02-01 may become Février, 2019 01 in French).
if a.question.type in Question.UNLOCALIZED_TYPES:
acache[a.question_id] = a.answer
else:
acache[a.question_id] = str(a)
for a in op.answers.all():
acache[a.question_id] = format_answer_for_export(a)
# We do not want to localize Date, Time and Datetime question answers, as those can lead
# to difficulties parsing the data (for example 2019-02-01 may become Février, 2019 01 in French).
if a.question.type in Question.UNLOCALIZED_TYPES:
acache[a.question_id] = a.answer
else:
acache[a.question_id] = str(a)
for q in questions:
txt = acache.get(q.pk, '')
txt = bleach.clean(txt, tags=['br']).strip().replace('<br>', '<br/>')
@@ -534,12 +525,7 @@ class CSVCheckinList(CheckInListMixin, ListExporter):
yield headers
qs = base_qs.prefetch_related(
'answers',
'answers__options',
'answers__question',
'addon_to__answers',
'addon_to__answers__question',
'addon_to__answers__options',
'answers', 'answers__question', 'addon_to__answers', 'addon_to__answers__question'
)
all_ids = list(base_qs.values_list('pk', flat=True))
@@ -611,9 +597,19 @@ class CSVCheckinList(CheckInListMixin, ListExporter):
acache = {}
if op.addon_to:
for a in op.addon_to.answers.all():
acache[a.question_id] = format_answer_for_export(a)
# We do not want to localize Date, Time and Datetime question answers, as those can lead
# to difficulties parsing the data (for example 2019-02-01 may become Février, 2019 01 in French).
if a.question.type in Question.UNLOCALIZED_TYPES:
acache[a.question_id] = a.answer
else:
acache[a.question_id] = str(a)
for a in op.answers.all():
acache[a.question_id] = format_answer_for_export(a)
# We do not want to localize Date, Time and Datetime question answers, as those can lead
# to difficulties parsing the data (for example 2019-02-01 may become Février, 2019 01 in French).
if a.question.type in Question.UNLOCALIZED_TYPES:
acache[a.question_id] = a.answer
else:
acache[a.question_id] = str(a)
for q in questions:
row.append(acache.get(q.pk, ''))

View File

@@ -229,10 +229,7 @@ class Paypal(BasePaymentProvider):
kwargs['cart_namespace'] = request.resolver_match.kwargs['cart_namespace']
try:
if self.settings.connect_client_id and not self.settings.secret:
if not request.event.settings.payment_paypal_connect_user_id:
raise PaymentException('Payment method misconfigured')
if request.event.settings.payment_paypal_connect_user_id:
try:
tokeninfo = Tokeninfo.create_with_refresh_token(request.event.settings.payment_paypal_connect_refresh_token)
except BadRequest as ex:

View File

@@ -30,7 +30,6 @@ from django import forms
from django.conf import settings
from django.contrib import messages
from django.core.cache import cache
from django.db import transaction
from django.http import HttpRequest
from django.template.loader import get_template
from django.templatetags.static import static
@@ -55,7 +54,6 @@ from pretix.base.models import Event, Order, OrderPayment, OrderRefund, Quota
from pretix.base.payment import BasePaymentProvider, PaymentException
from pretix.base.services.mail import SendMailException
from pretix.base.settings import SettingsSandbox
from pretix.helpers import OF_SELF
from pretix.helpers.urls import build_absolute_uri as build_global_uri
from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse
from pretix.plugins.paypal2.client.core.environment import (
@@ -524,13 +522,10 @@ class PaypalMethod(BasePaymentProvider):
kwargs['cart_namespace'] = request.resolver_match.kwargs['cart_namespace']
# ISU
if self.settings.connect_client_id and self.settings.connect_secret_key and not self.settings.secret:
if request.event.settings.payment_paypal_isu_merchant_id:
payee = {
"merchant_id": request.event.settings.payment_paypal_isu_merchant_id,
}
else:
raise PaymentException('Payment method misconfigured')
# Manual API integration
else:
payee = {}
@@ -590,9 +585,6 @@ class PaypalMethod(BasePaymentProvider):
},
})
response = self.client.execute(paymentreq)
if payment:
ReferencedPayPalObject.objects.get_or_create(order=payment.order, payment=payment, reference=response.result.id)
except IOError as e:
if "RESOURCE_NOT_FOUND" in str(e):
messages.error(request, _('Your payment has failed due to a known issue within PayPal. Please try '
@@ -625,13 +617,7 @@ class PaypalMethod(BasePaymentProvider):
}
return template.render(ctx)
@transaction.atomic
def execute_payment(self, request: HttpRequest, payment: OrderPayment):
payment = OrderPayment.objects.select_for_update(of=OF_SELF).get(pk=payment.pk)
if payment.state == OrderPayment.PAYMENT_STATE_CONFIRMED:
logger.warning('payment is already confirmed; possible return-view/webhook race-condition')
return
try:
if request.session.get('payment_paypal_oid', '') == '':
raise PaymentException(_('We were unable to process your payment. See below for details on how to '
@@ -1103,8 +1089,6 @@ class PaypalAPM(PaypalMethod):
payment.save(update_fields=["provider"])
paypal_order = self._create_paypal_order(request, payment, None)
if not paypal_order:
raise PaymentException(_('We had trouble communicating with PayPal'))
payment.info = json.dumps(paypal_order.dict())
payment.save(update_fields=['info'])

View File

@@ -477,8 +477,8 @@ def webhook(request, *args, **kwargs):
amount=payment.amount - known_sum
)
elif payment.state in (OrderPayment.PAYMENT_STATE_PENDING, OrderPayment.PAYMENT_STATE_CREATED,
OrderPayment.PAYMENT_STATE_CANCELED, OrderPayment.PAYMENT_STATE_FAILED):
if sale['status'] == 'COMPLETED':
OrderPayment.PAYMENT_STATE_CANCELED, OrderPayment.PAYMENT_STATE_FAILED) \
and sale['status'] == 'COMPLETED':
any_captures = False
all_captures_completed = True
for purchaseunit in sale['purchase_units']:
@@ -500,12 +500,6 @@ def webhook(request, *args, **kwargs):
payment.confirm()
except Quota.QuotaExceededException:
pass
elif sale['status'] == 'APPROVED':
request.session['payment_paypal_oid'] = payment.info_data['id']
try:
payment.payment_provider.execute_payment(request, payment)
except PaymentException as e:
logger.exception('PayPal2 - Could not capture/execute_payment from Webhook: {}'.format(str(e)))
return HttpResponse(status=200)

View File

@@ -225,11 +225,6 @@ class OrderMailForm(BaseMailForm):
]
self.fields['recipients'].choices = recp_choices
if not self.event.settings.mail_attach_tickets:
self.fields['attach_tickets'].disabled = True
self.fields['attach_tickets'].help_text = _("Attachment of tickets is disabled in this event's email "
"settings.")
choices = [(e, l) for e, l in Order.STATUS_CHOICE if e != 'n']
choices.insert(0, ('valid_if_pending', _('payment pending but already confirmed')))
choices.insert(0, ('na', _('payment pending (except unapproved or already confirmed)')))

View File

@@ -944,17 +944,6 @@ class StripeMethod(BasePaymentProvider):
reference=intent.id,
defaults={'order': payment.order, 'payment': payment}
)
if intent.status == 'requires_action':
payment.info = str(intent)
if intent.next_action.type == 'multibanco_display_details':
payment.state = OrderPayment.PAYMENT_STATE_PENDING
payment.save()
return
payment.state = OrderPayment.PAYMENT_STATE_CREATED
payment.save()
return self._redirect_to_sca(request, payment)
if intent.status == 'requires_action':
payment.info = str(intent)
payment.state = OrderPayment.PAYMENT_STATE_CREATED
@@ -1057,6 +1046,135 @@ class StripeMethod(BasePaymentProvider):
'with us if this problem persists.'))
class StripeSourceMethod(StripeMethod):
def payment_is_valid_session(self, request):
return True
def _charge_source(self, request, source, payment):
try:
params = {}
if not source.startswith('src_'):
params['statement_descriptor'] = self.statement_descriptor(payment)
params.update(self.api_kwargs)
params.update(self._connect_kwargs(payment))
charge = stripe.Charge.create(
amount=self._get_amount(payment),
currency=self.event.currency.lower(),
source=source,
description='{event}-{code}'.format(
event=self.event.slug.upper(),
code=payment.order.code
),
metadata={
'order': str(payment.order.id),
'event': self.event.id,
'code': payment.order.code
},
# TODO: Is this sufficient?
idempotency_key=str(self.event.id) + payment.order.code + source,
**params
)
except stripe.error.CardError as e:
if e.json_body:
err = e.json_body['error']
logger.exception('Stripe error: %s' % str(err))
else:
err = {'message': str(e)}
logger.exception('Stripe error: %s' % str(e))
logger.info('Stripe card error: %s' % str(err))
payment.fail(info={
'error': True,
'message': err['message'],
})
raise PaymentException(_('Stripe reported an error with your card: %s') % err['message'])
except stripe.error.StripeError as e:
if e.json_body and 'error' in e.json_body:
err = e.json_body['error']
logger.exception('Stripe error: %s' % str(err))
if err.get('code') == 'idempotency_key_in_use':
# This is not an error we normally expect, however some payment methods like iDEAL will redirect
# the user back to our confirmation page at the same time from two devices: the web browser the
# purchase is executed from and the online banking app the payment is authorized from.
# In this case we will just log the idempotency error but not expose it to the user and just
# forward them back to their order page. There is a good chance that by the time the user hits
# the order page, the other request has gone through and the payment is confirmed.
# Usually however this should be prevented by SELECT FOR UPDATE calls!
return
else:
err = {'message': str(e)}
logger.exception('Stripe error: %s' % str(e))
payment.fail(info={
'error': True,
'message': err['message'],
})
raise PaymentException(_('We had trouble communicating with Stripe. Please try again and get in touch '
'with us if this problem persists.'))
else:
ReferencedStripeObject.objects.get_or_create(
reference=charge.id,
defaults={'order': payment.order, 'payment': payment}
)
if charge.status == 'succeeded' and charge.paid:
try:
payment.info = str(charge)
payment.confirm()
except Quota.QuotaExceededException as e:
raise PaymentException(str(e))
except SendMailException:
raise PaymentException(_('There was an error sending the confirmation mail.'))
elif charge.status == 'pending':
if request:
messages.warning(request, _('Your payment is pending completion. We will inform you as soon as the '
'payment completed.'))
payment.info = str(charge)
payment.state = OrderPayment.PAYMENT_STATE_PENDING
payment.save()
return
else:
logger.info('Charge failed: %s' % str(charge))
payment.fail(info=str(charge))
raise PaymentException(_('Stripe reported an error: %s') % charge.failure_message)
def execute_payment(self, request: HttpRequest, payment: OrderPayment):
self._init_api()
try:
source = self._create_source(request, payment)
except stripe.error.StripeError as e:
if e.json_body and 'err' in e.json_body:
err = e.json_body['error']
logger.exception('Stripe error: %s' % str(err))
if err.get('code') == 'idempotency_key_in_use':
# Same thing happening twice we don't want to record a failure, as that might prevent the
# other thread from succeeding.
return
else:
err = {'message': str(e)}
logger.exception('Stripe error: %s' % str(e))
payment.fail(info={
'error': True,
'message': err['message'],
})
raise PaymentException(_('We had trouble communicating with Stripe. Please try again and get in touch '
'with us if this problem persists.'))
ReferencedStripeObject.objects.get_or_create(
reference=source.id,
defaults={'order': payment.order, 'payment': payment}
)
payment.info = str(source)
payment.state = OrderPayment.PAYMENT_STATE_PENDING
payment.save()
request.session['payment_stripe_order_secret'] = payment.order.secret
return self.redirect(request, source.redirect.url)
class StripeRedirectMethod(StripeMethod):
redirect_action_handling = "redirect"
@@ -1675,26 +1793,53 @@ class StripeEPS(StripeRedirectWithAccountNamePaymentIntentMethod):
return super().payment_presale_render(payment)
class StripeMultibanco(StripeRedirectMethod):
class StripeMultibanco(StripeSourceMethod):
identifier = 'stripe_multibanco'
verbose_name = _('Multibanco via Stripe')
public_name = _('Multibanco')
method = 'multibanco'
explanation = _(
'Multibanco is a payment method available to Portuguese bank account holders.'
)
redirect_in_widget_allowed = False
abort_pending_allowed = True
def _payment_intent_kwargs(self, request, payment):
return {
"payment_method_data": {
"type": "multibanco",
"billing_details": {
"email": payment.order.email,
}
}
def payment_form_render(self, request) -> str:
template = get_template('pretixplugins/stripe/checkout_payment_form_simple_noform.html')
ctx = {
'request': request,
'event': self.event,
'settings': self.settings,
'explanation': self.explanation,
'form': self.payment_form(request)
}
return template.render(ctx)
def _create_source(self, request, payment):
source = stripe.Source.create(
type='multibanco',
amount=self._get_amount(payment),
currency=self.event.currency.lower(),
metadata={
'order': str(payment.order.id),
'event': self.event.id,
'code': payment.order.code
},
owner={
'email': payment.order.email
},
redirect={
'return_url': build_absolute_uri(self.event, 'plugins:stripe:return', kwargs={
'order': payment.order.code,
'payment': payment.pk,
'hash': payment.order.tagged_secret('plugins:stripe'),
})
},
**self.api_kwargs
)
return source
def payment_is_valid_session(self, request):
return True
def checkout_prepare(self, request, cart):
return True
class StripePrzelewy24(StripeRedirectMethod):

View File

@@ -1,43 +1,10 @@
{% load i18n %}
{% load eventurl %}
{% load money %}
{% if payment.state == "pending" %}
{% if payment_info.next_action.type == "multibanco_display_details" %}
<p><strong>{% trans "Payment instructions" %}:</strong></p>
<ol>
<li>
{% blocktrans trimmed %}
In your online bank account or from an ATM, choose "Payment and other services".
{% endblocktrans %}
</li>
<li>
{% blocktrans trimmed %}
Click "Payments of services/shopping".
{% endblocktrans %}
</li>
<li>
{% blocktrans trimmed %}
Enter the entity number, reference number, and amount.
{% endblocktrans %}
</li>
</ol>
<dl class="dl-inline">
<dt>{% trans "Entity number:" %}</dt> <dd>{{ payment_info.next_action.multibanco_display_details.entity }}</dd><br>
<dt>{% trans "Reference number:" %}</dt> <dd>{{ payment_info.next_action.multibanco_display_details.reference }}</dd><br>
<dt>{% trans "Amount:" %}</dt> <dd>{{ payment.amount|money:event.currency }}</dd>
</dl>
<p class="text-muted">
{% trans "There is no further action required on this website." %}
{% trans "We will send you an email as soon as we received your payment." %}
</p>
{% else %}
<p>
{% blocktrans trimmed %}
<p>{% blocktrans trimmed %}
We're waiting for an answer from the payment provider regarding your payment. Please contact us if this
takes more than a few days.
{% endblocktrans %}
</p>
{% endif %}
{% endblocktrans %}</p>
{% elif payment.state == "created" and payment_info.status == "requires_action" %}
<p>{% blocktrans trimmed %}
You need to confirm your payment. Please click the link below to do so or start a new payment.

View File

@@ -595,7 +595,7 @@ class ScaView(StripeOrderView, View):
if intent.status == 'requires_action' and intent.next_action.type in [
'use_stripe_sdk', 'redirect_to_url', 'alipay_handle_redirect', 'wechat_pay_display_qr_code',
'swish_handle_redirect_or_display_qr_code', 'multibanco_display_details',
'swish_handle_redirect_or_display_qr_code',
]:
ctx = {
'order': self.order,
@@ -610,9 +610,6 @@ class ScaView(StripeOrderView, View):
elif intent.next_action.type == 'swish_handle_redirect_or_display_qr_code':
ctx['payment_intent_next_action_redirect_url'] = intent.next_action.swish_handle_redirect_or_display_qr_code['hosted_instructions_url']
ctx['payment_intent_redirect_action_handling'] = 'iframe'
elif intent.next_action.type == 'multibanco_display_details':
ctx['payment_intent_next_action_redirect_url'] = intent.next_action.multibanco_display_details['hosted_voucher_url']
ctx['payment_intent_redirect_action_handling'] = 'iframe'
r = render(request, 'pretixplugins/stripe/sca.html', ctx)
r._csp_ignore = True

View File

@@ -21,8 +21,6 @@ export default {
computed: {
status() {
if (this.position.checkins.length) return 'redeemed';
if (this.position.order__status === 'n' && this.position.order__valid_if_pending) return 'pending_valid';
if (this.position.order__status === 'n' && this.position.order__require_approval) return 'require_approval';
return this.position.order__status
},
itemvar() {

View File

@@ -43,8 +43,6 @@ window.vapp = new Vue({
'status.n': gettext('Unpaid'),
'status.c': gettext('Canceled'),
'status.e': gettext('Canceled'),
'status.pending_valid': gettext('Confirmed'),
'status.require_approval': gettext('Approval pending'),
'status.redeemed': gettext('Redeemed'),
'modal.cancel': gettext('Cancel'),
'modal.continue': gettext('Continue'),

View File

@@ -74,10 +74,10 @@ a.searchresult {
align-items: center;
font-size: 140%;
&.status-p, &.status-pending_valid {
&.status-p {
background: $brand-success;
}
&.status-c, &.status-e, &.status-n, &.status-require_approval {
&.status-c, &.status-e, &.status-n {
background: $brand-danger;
}
&.status-redeemed {

View File

@@ -182,6 +182,4 @@ def _default_context(request):
ctx['settings'] = pretix_settings
ctx['django_settings'] = settings
ctx['ie_deprecation_warning'] = 'MSIE' in request.headers.get('User-Agent', '') or 'Trident/' in request.headers.get('User-Agent', '')
return ctx

View File

@@ -19,14 +19,66 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
from bootstrap3.renderers import FieldRenderer
from bootstrap3.text import text_value
from bootstrap3.utils import add_css_class
from django.utils.html import escape, strip_tags
from django.forms import CheckboxInput, CheckboxSelectMultiple, RadioSelect
from django.forms.utils import flatatt
from django.utils.html import escape, format_html, strip_tags
from django.utils.safestring import mark_safe
from pretix.base.forms.renderers import PretixFieldRenderer
from django.utils.translation import pgettext
class CheckoutFieldRenderer(PretixFieldRenderer):
def render_label(content, label_for=None, label_class=None, label_title='', label_id='', optional=False, is_valid=None, attrs=None):
"""
Render a label with content
"""
attrs = attrs or {}
if label_for:
attrs['for'] = label_for
if label_class:
attrs['class'] = label_class
if label_title:
attrs['title'] = label_title
if label_id:
attrs['id'] = label_id
opt = ""
if is_valid is not None:
if is_valid:
validation_text = pgettext('form', 'is valid')
else:
validation_text = pgettext('form', 'has errors')
opt += '<strong class="sr-only"> {}</strong>'.format(validation_text)
if text_value(content) == '&#160;':
# Empty label, e.g. checkbox
attrs.setdefault('class', '')
attrs['class'] += ' label-empty'
# usually checkboxes have overall empty labels and special labels per checkbox
# => remove for-attribute as well as "required"-text appended to label
if 'for' in attrs:
del attrs['for']
else:
opt += '<i class="sr-only label-required">, {}</i>'.format(pgettext('form', 'required')) if not optional else ''
builder = '<{tag}{attrs}>{content}{opt}</{tag}>'
return format_html(
builder,
tag='label',
attrs=mark_safe(flatatt(attrs)) if attrs else '',
opt=mark_safe(opt),
content=text_value(content),
)
class CheckoutFieldRenderer(FieldRenderer):
def __init__(self, *args, **kwargs):
kwargs['layout'] = 'horizontal'
super().__init__(*args, **kwargs)
self.is_group_widget = isinstance(self.widget, (CheckboxSelectMultiple, RadioSelect, )) or (self.is_multi_widget and len(self.widget.widgets) > 1)
def get_form_group_class(self):
form_group_class = self.form_group_class
if self.field.errors:
@@ -69,6 +121,45 @@ class CheckoutFieldRenderer(PretixFieldRenderer):
help_ids = ["help-for-{id}-{idx}".format(id=self.field.id_for_label, idx=idx) for idx in range(help_cnt)]
widget.attrs["aria-describedby"] = " ".join(help_ids)
def add_label(self, html):
attrs = {}
label = self.get_label()
if hasattr(self.field.field, '_show_required'):
# e.g. payment settings forms where a field is only required if the payment provider is active
required = self.field.field._show_required
elif hasattr(self.field.field, '_required'):
# e.g. payment settings forms where a field is only required if the payment provider is active
required = self.field.field._required
else:
required = self.field.field.required
if self.field.form.is_bound:
is_valid = len(self.field.errors) == 0
else:
is_valid = None
if self.is_group_widget:
label_for = ""
label_id = "legend-{}".format(self.field.html_name)
else:
label_for = self.field.id_for_label
label_id = ""
if hasattr(self.field.field, 'question') and self.field.field.question.identifier:
attrs["data-identifier"] = self.field.field.question.identifier
html = render_label(
label,
label_for=label_for,
label_class=self.get_label_class(),
label_id=label_id,
attrs=attrs,
optional=not required and not isinstance(self.widget, CheckboxInput),
is_valid=is_valid
) + html
return html
def put_inside_label(self, html):
content = "{field} {label}".format(field=html, label=self.label)
return render_label(
@@ -76,3 +167,10 @@ class CheckoutFieldRenderer(PretixFieldRenderer):
label_for=self.field.id_for_label,
label_title=escape(strip_tags(self.field_help)),
)
def wrap_label_and_field(self, html):
if self.is_group_widget:
attrs = ' role="group" aria-labelledby="legend-{}"'.format(self.field.html_name)
else:
attrs = ''
return '<div class="{klass}"{attrs}>{html}</div>'.format(klass=self.get_form_group_class(), html=html, attrs=attrs)

View File

@@ -46,22 +46,6 @@
<body class="nojs" data-locale="{{ request.LANGUAGE_CODE }}" data-now="{% now "U.u" %}" data-datetimeformat="{{ js_datetime_format }}" data-timeformat="{{ js_time_format }}" data-dateformat="{{ js_date_format }}" data-datetimelocale="{{ js_locale }}" data-currency="{{ request.event.currency }}">
{{ html_page_header|safe }}
<header>
{% if ie_deprecation_warning %}
<div class="old-browser-warning">
<span class="fa fa-internet-explorer"></span>
{% blocktrans trimmed %}
We've detected that you are using <strong>Microsoft Internet Explorer</strong>.
{% endblocktrans %}
{% blocktrans trimmed %}
Internet Explorer is an old browser that does not support lots of recent web-based
technologies and is no longer supported by this website.
{% endblocktrans %}
{% blocktrans trimmed %}
We kindly ask you to move to one of our supported browsers, such as Microsoft Edge,
Mozilla Firefox, Google Chrome, or Safari.
{% endblocktrans %}
</div>
{% endif %}
{% block above %}
{% endblock %}
</header>

View File

@@ -8,7 +8,7 @@
<form class="event-list-filter-form" method="get" data-save-scrollpos>
<input type="hidden" name="filtered" value="1">
{% for f, v in request.GET.items %}
{% if f not in filter_form.fields and f != "page" %}
{% if f not in filter_form.fields %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}

View File

@@ -348,17 +348,15 @@ def get_grouped_items(event, subevent=None, voucher=None, channel='web', require
)
original_price = item_price_override.get(item.pk, item.default_price)
voucher_reduced = False
if voucher:
price = voucher.calculate_price(original_price)
voucher_reduced = price < original_price
include_bundled = not voucher.all_bundles_included
else:
price = original_price
include_bundled = True
item.display_price = item.tax(price, currency=event.currency, include_bundled=include_bundled)
if item.free_price and item.free_price_suggestion is not None and not voucher_reduced:
if item.free_price and item.free_price_suggestion is not None:
item.suggested_price = item.tax(max(price, item.free_price_suggestion), currency=event.currency, include_bundled=include_bundled)
else:
item.suggested_price = item.display_price
@@ -401,10 +399,8 @@ def get_grouped_items(event, subevent=None, voucher=None, channel='web', require
)
original_price = var_price_override.get(var.pk, var.price)
voucher_reduced = False
if voucher:
price = voucher.calculate_price(original_price)
voucher_reduced = price < original_price
include_bundled = not voucher.all_bundles_included
else:
price = original_price
@@ -412,10 +408,10 @@ def get_grouped_items(event, subevent=None, voucher=None, channel='web', require
var.display_price = var.tax(price, currency=event.currency, include_bundled=include_bundled)
if item.free_price and var.free_price_suggestion is not None and not voucher_reduced:
if item.free_price and var.free_price_suggestion is not None:
var.suggested_price = item.tax(max(price, var.free_price_suggestion), currency=event.currency,
include_bundled=include_bundled)
elif item.free_price and item.free_price_suggestion is not None and not voucher_reduced:
elif item.free_price and item.free_price_suggestion is not None:
var.suggested_price = item.tax(max(price, item.free_price_suggestion), currency=event.currency,
include_bundled=include_bundled)
else:

View File

@@ -19,13 +19,60 @@
# 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 re
import weakref
from collections import OrderedDict
from celery.exceptions import Retry
from sentry_sdk import Hub
from sentry_sdk.integrations import django as djangosentry
from sentry_sdk.utils import capture_internal_exceptions
MASK = '*' * 8
KEYS = frozenset([
'password',
'secret',
'passwd',
'authorization',
'api_key',
'apikey',
'sentry_dsn',
'access_token',
'session',
])
VALUES_RE = re.compile(r'^(?:\d[ -]*?){13,16}$')
def scrub_data(data):
if isinstance(data, dict):
for k, v in data.items():
if isinstance(k, bytes):
key = k.decode('utf-8', 'replace')
else:
key = k
key = key.lower()
data[k] = scrub_data(v)
for blk in KEYS:
if blk in key:
data[k] = MASK
elif isinstance(data, list):
for i, l in enumerate(list(data)):
data[i] = scrub_data(l)
elif isinstance(data, str):
if '=' in data:
# at this point we've assumed it's a standard HTTP query
# or cookie
if '&' in data:
delimiter = '&'
else:
delimiter = ';'
qd = scrub_data(OrderedDict(e.split('=', 1) if '=' in e else (e, None) for e in data.split(delimiter)))
return delimiter.join((k + '=' + v if v is not None else k) for k, v in qd.items())
if VALUES_RE.match(data):
return MASK
return data
def _make_event_processor(weak_request, integration):
def event_processor(event, hint):
@@ -35,6 +82,8 @@ def _make_event_processor(weak_request, integration):
with capture_internal_exceptions():
djangosentry._set_user_info(request, event)
request_info = event.setdefault("request", {})
request_info["cookies"] = dict(request.COOKIES)
# Sentry's DjangoIntegration already sets the transaction, but it gets confused by our multi-domain stuff
# where the URL resolver changes in the middleware stack. Additionally, we'd like to get the method.
@@ -47,6 +96,15 @@ def _make_event_processor(weak_request, integration):
request.method,
url
)
# We want to scrub data not only from the request, but from traceback frames as well!
scrub_data(event.get("request", {}))
if 'exception' in event:
exc = event.get("exception", {})
for val in exc.get('values', []):
stack = val.get('stacktrace', {})
for frame in stack.get('frames', []):
scrub_data(frame['vars'])
return event
return event_processor

View File

@@ -629,21 +629,15 @@ LOGGING = {
SENTRY_ENABLED = False
if config.has_option('sentry', 'dsn') and not any(c in sys.argv for c in ('shell', 'shell_scoped', 'shell_plus')):
import django.db.models.signals
import sentry_sdk
from sentry_sdk.integrations.celery import CeleryIntegration
from sentry_sdk.integrations.logging import (
LoggingIntegration, ignore_logger,
)
from sentry_sdk.scrubber import EventScrubber, DEFAULT_DENYLIST
from .sentry import PretixSentryIntegration, setup_custom_filters
SENTRY_TOKEN = config.get('sentry', 'traces_sample_token', fallback='')
pretix_denylist = DEFAULT_DENYLIST + [
"access_token",
"sentry_dsn",
]
def traces_sampler(sampling_context):
qs = sampling_context.get('wsgi_environ', {}).get('QUERY_STRING', '')
@@ -655,12 +649,7 @@ if config.has_option('sentry', 'dsn') and not any(c in sys.argv for c in ('shell
sentry_sdk.init(
dsn=config.get('sentry', 'dsn'),
integrations=[
PretixSentryIntegration(
signals_denylist=[
django.db.models.signals.pre_init,
django.db.models.signals.post_init,
]
),
PretixSentryIntegration(),
CeleryIntegration(),
LoggingIntegration(
level=logging.INFO,
@@ -670,7 +659,6 @@ if config.has_option('sentry', 'dsn') and not any(c in sys.argv for c in ('shell
traces_sampler=traces_sampler,
environment=urlparse(SITE_URL).netloc,
release=__version__,
event_scrubber=EventScrubber(denylist=pretix_denylist, recursive=True),
send_default_pii=False,
propagate_traces=False, # see https://github.com/getsentry/sentry-python/issues/1717
)

File diff suppressed because it is too large Load Diff

View File

@@ -4,8 +4,8 @@
"private": true,
"scripts": {},
"dependencies": {
"@babel/core": "^7.24.7",
"@babel/preset-env": "^7.24.6",
"@babel/core": "^7.24.5",
"@babel/preset-env": "^7.24.5",
"@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-node-resolve": "^15.2.3",
"vue": "^2.7.16",

View File

@@ -519,13 +519,6 @@ h2 .label {
.progress-bar-#{$i} { width: 1% * $i; }
}
.old-browser-warning {
background-color: #ffe761;
padding: 32px; /* 30px + 2px optical compensation */
font-size: 30px;
}
@import "_iframe.scss";
@import "_a11y.scss";
@import "_print.scss";

View File

@@ -20,7 +20,6 @@ DJANGO_SETTINGS_MODULE = tests.settings
addopts = --reruns 3 -rw
filterwarnings =
error
ignore:.*invalid escape sequence.*:
ignore:The 'warn' method is deprecated:DeprecationWarning
ignore::django.utils.deprecation.RemovedInDjango51Warning:django.core.files.storage
ignore:.*index_together.*:django.utils.deprecation.RemovedInDjango51Warning:

View File

@@ -105,8 +105,6 @@ TEST_ORDERPOSITION1_RES = {
"id": 1,
"require_attention": False,
"order__status": "p",
"order__require_approval": False,
"order__valid_if_pending": False,
"order": "FOO",
"positionid": 1,
"item": 1,
@@ -142,8 +140,6 @@ TEST_ORDERPOSITION2_RES = {
"id": 2,
"require_attention": False,
"order__status": "p",
"order__require_approval": False,
"order__valid_if_pending": False,
"order": "FOO",
"positionid": 2,
"item": 1,
@@ -179,8 +175,6 @@ TEST_ORDERPOSITION3_RES = {
"id": 3,
"require_attention": False,
"order__status": "p",
"order__require_approval": False,
"order__valid_if_pending": False,
"order": "FOO",
"positionid": 3,
"item": 1,

View File

@@ -144,8 +144,6 @@ TEST_ORDERPOSITION1_RES = {
"id": 1,
"require_attention": False,
"order__status": "p",
"order__require_approval": False,
"order__valid_if_pending": False,
"order": "FOO",
"positionid": 1,
"item": 1,

View File

@@ -28,7 +28,7 @@ from django_countries.fields import Country
from django_scopes import scopes_disabled
from pretix.base.models import (
InvoiceAddress, ItemVariation, Order, OrderPosition, SeatingPlan, SubEvent,
InvoiceAddress, Order, OrderPosition, SeatingPlan, SubEvent,
)
from pretix.base.models.orders import OrderFee
@@ -503,7 +503,7 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
)
assert resp.status_code == 200
with scopes_disabled():
assert event.items.get(id=item.pk).default_price == Decimal('23.00')
assert subevent.items.get(id=item.pk).default_price == Decimal('23.00')
assert subevent.item_price_overrides[item.pk] == Decimal('99.99')
resp = token_client.patch(
@@ -609,7 +609,7 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
)
assert resp.status_code == 200
with scopes_disabled():
assert ItemVariation.objects.get(id=variations[0].pk).default_price == Decimal('12.00')
assert subevent.variations.get(id=variations[0].pk).default_price == Decimal('12.00')
assert subevent.var_price_overrides[variations[0].pk] == Decimal('99.99')
resp = token_client.patch(