forked from CGM_Public/pretix_original
Compare commits
6 Commits
fix-checkb
...
seo-improv
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
796b034779 | ||
|
|
eaf46824e9 | ||
|
|
873e2af128 | ||
|
|
7b3ee88adc | ||
|
|
77a5113875 | ||
|
|
4d47ae85f2 |
@@ -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
|
||||
|
||||
@@ -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/
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.*",
|
||||
|
||||
@@ -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')),
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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, ''))
|
||||
|
||||
|
||||
@@ -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) == ' ':
|
||||
# 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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'])
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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) == ' ':
|
||||
# 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):
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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'),
|
||||
},
|
||||
]
|
||||
})
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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,
|
||||
|
||||
@@ -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 %}
|
||||
@@ -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'),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 "
|
||||
"på navnet for at se flere informationer."
|
||||
"Listen vises alle arrangementer som du har administratoradgang til. Klik på "
|
||||
"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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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é paié 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 d’analyser {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 l’approbation de l’organisateur 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 l’approbation de l’organisateur 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 à l’adresse\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 n’est requis.\n"
|
||||
"Nous avons approuvé votre commande pour {event} et serons heureux de vous "
|
||||
"accueillir\n"
|
||||
"lors de notre événement. Comme vous n’avez commandé que des produits "
|
||||
"gratuits, aucun paiement n’est 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 à l’adresse\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 d’expé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 d’autres 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 qu’ordres 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 n’a 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 d’achats réels car votre commande pourrait être "
|
||||
"supprimée sans préavis."
|
||||
"Cette billetterie est actuellement en mode test. Veuillez ne pas effectuer "
|
||||
"d’achats 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 d’une 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."
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)"
|
||||
|
||||
@@ -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 já 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 já 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
|
||||
|
||||
@@ -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
@@ -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
@@ -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 "Có"
|
||||
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 ""
|
||||
|
||||
@@ -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 "Có"
|
||||
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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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, ''))
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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'])
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)')))
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) == ' ':
|
||||
# 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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
3225
src/pretix/static/npm_dir/package-lock.json
generated
3225
src/pretix/static/npm_dir/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -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",
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user