Compare commits

...

47 Commits

Author SHA1 Message Date
Raphael Michel
c70596bace Remove subevent.items and subevent.variations as they very much not do what you'd expect 2024-06-14 13:18:07 +02:00
Raphael Michel
39caadb335 Compatibility of safe_openpyxl with openpyxl==3.1.3 2024-06-10 17:19:29 +02:00
Mira
dd6ebd7a48 Improve validation of email templates (#4184)
* Improve validation of email templates

* simplify SafeFormatter (skip attribute access code path altogether instead of blocklisting characters)

* let SafeFormatter optionally raise on missing key

* simplify placeholder validation

* rename parameter

* Remove unused import

---------

Co-authored-by: Raphael Michel <michel@rami.io>
2024-06-10 16:41:52 +02:00
Raphael Michel
ab576bb643 Update sentry-sdk requirement from ==1.45.* to ==2.5.* (#4176)
* Update sentry-sdk requirement from ==1.45.* to ==2.3.*

* Review notes
2024-06-10 16:25:08 +02:00
dependabot[bot]
8bc16af36e Bump @babel/core from 7.24.5 to 7.24.7 in /src/pretix/static/npm_dir (#4209)
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.24.5 to 7.24.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.24.7/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-10 15:13:24 +02:00
Raphael Michel
537044bdc8 Bank transfer: Ignore checksum for blocklist (Z#23154934) (#4194)
* Bank transfer: Ignore checksum for blocklist (Z#23154934)

* Update src/pretix/plugins/banktransfer/payment.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

---------

Co-authored-by: Richard Schreiber <schreiber@rami.io>
2024-06-10 14:49:51 +02:00
dependabot[bot]
1ac7d03bb8 Bump pug-code-gen and @vue/component-compiler in /src/pretix/static/npm_dir (#4210)
Bumps [pug-code-gen](https://github.com/pugjs/pug) and [@vue/component-compiler](https://github.com/vuejs/vue-component-compiler). These dependencies needed to be updated together.

Updates `pug-code-gen` from 2.0.3 to 3.0.3
- [Release notes](https://github.com/pugjs/pug/releases)
- [Commits](https://github.com/pugjs/pug/compare/pug@2.0.3...pug-code-gen@3.0.3)

Updates `@vue/component-compiler` from 4.2.3 to 4.2.4
- [Release notes](https://github.com/vuejs/vue-component-compiler/releases)
- [Changelog](https://github.com/vuejs/vue-component-compiler/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-component-compiler/compare/v4.2.3...v4.2.4)

---
updated-dependencies:
- dependency-name: pug-code-gen
  dependency-type: indirect
- dependency-name: "@vue/component-compiler"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-10 14:48:55 +02:00
Raphael Michel
b939fad1c0 Sendmail: Prevent confusion around setting attach_tickets (Z#23155893) (#4211) 2024-06-10 14:48:47 +02:00
dependabot[bot]
fb3a608c54 Update django-hijack requirement from ==3.4.* to ==3.5.* (#4198)
Updates the requirements on [django-hijack](https://github.com/django-hijack/django-hijack) to permit the latest version.
- [Release notes](https://github.com/django-hijack/django-hijack/releases)
- [Changelog](https://github.com/django-hijack/django-hijack/blob/master/docs/release-button.png)
- [Commits](https://github.com/django-hijack/django-hijack/compare/3.4.0...3.5.0)

---
updated-dependencies:
- dependency-name: django-hijack
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-10 14:31:17 +02:00
Raphael Michel
ebda10542e Add IE11 banner to frontend (#4207) 2024-06-10 14:29:17 +02:00
dependabot[bot]
93dd6bf34d Bump @babel/preset-env from 7.24.5 to 7.24.6 in /src/pretix/static/npm_dir (#4189)
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.24.5 to 7.24.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.24.6/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-10 14:12:02 +02:00
David Vaz
52148ebb7a Translations: Update Portuguese (Portugal)
Currently translated at 56.3% (129 of 229 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/pt_PT/

powered by weblate
2024-06-10 14:11:41 +02:00
David Vaz
82b4fe2733 Translations: Update Portuguese (Portugal)
Currently translated at 88.0% (4962 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt_PT/

powered by weblate
2024-06-10 14:11:41 +02:00
alemairebe
79750e4f4b Translations: Update French
Currently translated at 96.2% (5423 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/fr/

powered by weblate
2024-06-10 14:11:41 +02:00
Mira
dbabbf7aab Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (5634 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de_Informal/

powered by weblate
2024-06-10 14:11:41 +02:00
Mira
6158a1f2a4 Translations: Update German
Currently translated at 100.0% (5634 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de/

powered by weblate
2024-06-10 14:11:41 +02:00
Charlie Lundberg
68f6f921b5 Translations: Update Swedish
Currently translated at 20.7% (1171 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/sv/

powered by weblate
2024-06-10 14:11:41 +02:00
Charlie Lundberg
d0e672435a Translations: Update Swedish
Currently translated at 20.6% (1163 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/sv/

powered by weblate
2024-06-10 14:11:41 +02:00
Raphael Michel
5bc622bcfe PayPal: Validate proper payee set with ISU integration (#4206) 2024-06-10 14:10:02 +02:00
Raphael Michel
d0184c1f48 PayPal: Fix issue in ASV setup (PRETIXEU-A5V) 2024-06-10 12:28:57 +02:00
Raphael Michel
e28bbb7ea0 Voucher creation: Fix TypeError in validation (PRETIXEU-A52) 2024-06-10 12:23:20 +02:00
Raphael Michel
fe54a42fc7 Web checkin: Render special cases of pending state in search (Z#23154934) (#4193) 2024-06-04 21:53:30 +02:00
Raphael Michel
7365f165ad Thumbnails: Keep frame durations of GIFs (#4183) 2024-06-04 21:53:20 +02:00
Raphael Michel
90ce802a33 Item form: Prevent combining validity_mode with gift cards (#4187) 2024-06-04 11:57:49 +02:00
Raphael Michel
d463878514 Do not use price suggestion if voucher is used (Z#23155018) (#4195) 2024-06-04 11:57:26 +02:00
Charlie Lundberg
dd7ee84d29 Translations: Update Swedish
Currently translated at 20.2% (1143 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/sv/

powered by weblate
2024-06-03 12:48:45 +02:00
Jo Siebert
f1e2d1f44c Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (5634 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de_Informal/

powered by weblate
2024-06-03 12:48:45 +02:00
Jo Siebert
87a6a58f32 Translations: Update German
Currently translated at 100.0% (5634 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de/

powered by weblate
2024-06-03 12:48:45 +02:00
Luan Thien
b2dd56bd41 Translations: Update Vietnamese
Currently translated at 1.5% (90 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/vi/

powered by weblate
2024-06-03 12:48:45 +02:00
Charlie Lundberg
f0ceab2305 Translations: Update Swedish
Currently translated at 19.7% (1113 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/sv/

powered by weblate
2024-06-03 12:48:45 +02:00
danijossnet
14e3316dd9 Translations: Update Greek
Currently translated at 49.7% (2803 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/el/

powered by weblate
2024-06-03 12:48:45 +02:00
Luan Thien
eb28fdcba9 Translations: Update Vietnamese
Currently translated at 55.0% (126 of 229 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/vi/

powered by weblate
2024-06-03 12:48:45 +02:00
Luan Thien
49e4a0faa0 Translations: Update Vietnamese
Currently translated at 1.5% (89 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/vi/

powered by weblate
2024-06-03 12:48:45 +02:00
Nikolai
e486089590 Translations: Update Danish
Currently translated at 62.4% (143 of 229 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/da/

powered by weblate
2024-06-03 12:48:45 +02:00
Nikolai
4bb02d4ad9 Translations: Update Danish
Currently translated at 31.2% (1761 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/da/

powered by weblate
2024-06-03 12:48:45 +02:00
Luan Thien
8ad852d9cb Translations: Update Vietnamese
Currently translated at 0.8% (46 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/vi/

powered by weblate
2024-06-03 12:48:45 +02:00
Nikolai
868fcfc471 Translations: Update Danish
Currently translated at 30.9% (1745 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/da/

powered by weblate
2024-06-03 12:48:45 +02:00
Nikolai
d847c9a095 Translations: Update Danish
Currently translated at 30.9% (1744 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/da/

powered by weblate
2024-06-03 12:48:45 +02:00
Charlie Lundberg
d1c6b22624 Translations: Update Swedish
Currently translated at 19.4% (1093 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/sv/

powered by weblate
2024-06-03 12:48:45 +02:00
mathbrito
842987f48e Translations: Update Portuguese (Brazil)
Currently translated at 11.7% (664 of 5634 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt_BR/

powered by weblate
2024-06-03 12:48:45 +02:00
Jannik
58fc13ed91 Docs: Fix metrics names (#4192) 2024-06-03 12:33:28 +02:00
Raphael Michel
8010d2e6bb Update GitLab CI script 2024-05-31 17:46:45 +02:00
Raphael Michel
1566f54764 VAT ID validation: Fix crash with invalid Norwegian IDs (PRETIXEU-A3J) 2024-05-29 09:31:58 +02:00
Richard Schreiber
9d380557e1 SEO improvements - add h1.sr-only if only header-image is used
* add hidden h1 with event-title if header-image only

* add event-title to alt-attribute of header-image

* add hidden setting for google_site_verification
2024-05-28 09:18:15 +02:00
Martin Gross
5758e0dd68 PPv2 APM: Create referenced PPObjects for APM Orders; enable webhooks to capture them (#3958) 2024-05-27 13:45:37 +02:00
Martin Gross
b4629e24a5 Downgrade requests to 2.31.* again while waiting for 2.33.3 release 2024-05-27 12:11:40 +02:00
Raphael Michel
27f5121211 Bump version to 2024.6.0.dev0 2024-05-24 14:11:21 +02:00
50 changed files with 2297 additions and 2523 deletions

View File

@@ -1,29 +1,30 @@
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:
- virtualenv env
- source env/bin/activate
- pip install -U pip wheel setuptools
- XDG_CACHE_HOME=/cache pip3 install -e ".[dev]"
- uv pip install --system -e ".[dev]"
- cd src
- python manage.py check
- make all compress
- py.test --reruns 3 -n 3 tests
tags:
- python3
- PRETIX_CONFIG_FILE=tests/travis_sqlite.cfg py.test --reruns 3 -n 3 tests --maxfail=100
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:
- 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]"
- uv pip install --system -e ".[dev]"
- python setup.py sdist
- pip install dist/pretix-*.tar.gz
- uv pip install --system dist/pretix-*.tar.gz
- python -m pretix migrate
- python -m pretix check
- cd src
@@ -33,13 +34,12 @@ pypi:
- python -m build
- twine check dist/*
- twine upload dist/*
tags:
- python3
only:
- pypi
artifacts:
paths:
- src/dist/
stages:
- test
- build

View File

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

View File

@@ -44,7 +44,7 @@ dependencies = [
"django-formset-js-improved==0.5.0.3",
"django-formtools==2.5.1",
"django-hierarkey==1.2.*",
"django-hijack==3.4.*",
"django-hijack==3.5.*",
"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.32.*",
"sentry-sdk==1.45.*",
"requests==2.31.*",
"sentry-sdk==2.5.*",
"sepaxml==2.6.*",
"slimit",
"static3==0.7.*",

View File

@@ -19,4 +19,4 @@
# 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/>.
#
__version__ = "2024.5.0"
__version__ = "2024.6.0.dev0"

View File

@@ -564,6 +564,8 @@ 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
@@ -571,7 +573,8 @@ 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', 'valid_from', 'valid_until', 'blocked')
'order__status', 'order__valid_if_pending', 'order__require_approval', 'valid_from', 'valid_until',
'blocked')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

View File

@@ -32,13 +32,13 @@
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License.
import re
from django.core.exceptions import ValidationError
from django.core.validators import BaseValidator
from django.utils.translation import gettext_lazy as _
from i18nfield.strings import LazyI18nString
from pretix.helpers.format import format_map
class PlaceholderValidator(BaseValidator):
"""
@@ -47,6 +47,12 @@ 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
@@ -57,22 +63,15 @@ class PlaceholderValidator(BaseValidator):
self.__call__(v)
return
if value.count('{') != value.count('}'):
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:
raise ValidationError(
_('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'),
_('Invalid placeholder: {%(value)s}'),
code='invalid_placeholders',
params={'value': ", ".join(invalid_placeholders,)})
params={'value': e.args[0]})
def clean(self, x):
return x

View File

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

View File

@@ -444,7 +444,8 @@ 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."),
"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."),
max_digits=13, decimal_places=2, null=True, blank=True,
)
tax_rule = models.ForeignKey(
@@ -1086,7 +1087,8 @@ 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."),
"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."),
max_digits=13, decimal_places=2, null=True, blank=True,
)
require_approval = models.BooleanField(

View File

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

View File

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

View File

@@ -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)),
number=int(row.get('number', 1) or ""),
tag=row.get('tag', None)
))
except ValueError as err:

View File

@@ -327,8 +327,7 @@
{% endblocktrans %}
{% blocktrans trimmed %}
Internet Explorer is an old browser that does not support lots of recent web-based
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.
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,

View File

@@ -73,6 +73,7 @@ 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
@@ -713,11 +714,6 @@ 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):
@@ -742,7 +738,7 @@ class MailSettingsPreview(EventPermissionRequiredMixin, View):
_('This value will be replaced based on dynamic parameters.'),
s
)
return self.SafeDict(ctx)
return ctx
def post(self, request, *args, **kwargs):
preview_item = request.POST.get('item', '')
@@ -758,12 +754,21 @@ 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):
if k.startswith('mail_subject_'):
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))
)
try:
if k.startswith('mail_subject_'):
msgs[self.supported_locale[idx]] = format_map(
bleach.clean(v), self.placeholders(preview_item), raise_on_missing=True
)
else:
msgs[self.supported_locale[idx]] = markdown_compile_email(
format_map(v, self.placeholders(preview_item), raise_on_missing=True)
)
except ValueError:
msgs[self.supported_locale[idx]] = '<div class="alert alert-danger">{}</div>'.format(
PlaceholderValidator.error_message)
except KeyError as e:
msgs[self.supported_locale[idx]] = '<div class="alert alert-danger">{}</div>'.format(
_('Invalid placeholder: {%(value)s}') % {'value': e.args[0]})
return JsonResponse({
'item': preview_item,

View File

@@ -30,17 +30,15 @@ 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):
def __init__(self, context, raise_on_missing=False):
self.context = context
self.raise_on_missing = raise_on_missing
def get_field(self, field_name, args, kwargs):
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)
return self.get_value(field_name, args, kwargs), field_name
def get_value(self, key, args, kwargs):
if key not in self.context:
if not self.raise_on_missing and key not in self.context:
return '{' + str(key) + '}'
return self.context[key]
@@ -49,7 +47,7 @@ class SafeFormatter(Formatter):
return super().format_field(value, '')
def format_map(template, context):
def format_map(template, context, raise_on_missing=False):
if not isinstance(template, str):
template = str(template)
return SafeFormatter(context).format(template)
return SafeFormatter(context, raise_on_missing).format(template)

View File

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

View File

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

View File

@@ -4,7 +4,7 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-05-01 01:00+0000\n"
"PO-Revision-Date: 2024-05-30 17: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.4.3\n"
"X-Generator: Weblate 5.5.5\n"
#: pretix/_base_settings.py:78
msgid "English"
@@ -844,7 +844,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/organizers/customer_profile.html:20
#, fuzzy
msgid "Customer ID"
msgstr "Kundehandlinger"
msgstr "Kunde ID"
#: pretix/base/exporters/customers.py:65
#: pretix/control/templates/pretixcontrol/organizers/customer.html:31
@@ -2816,7 +2816,7 @@ msgstr "Udløbsdato"
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:136
#, fuzzy
msgid "Customer account"
msgstr "Kundehandlinger"
msgstr "Kundekonto"
#: pretix/base/exporters/reusablemedia.py:51 pretix/base/models/media.py:97
#, fuzzy
@@ -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 ""
msgstr "Overfør venligst beløbet til denne bankkonto: 9999-9999-9999-9999"
#: pretix/base/services/seating.py:61 pretix/base/services/seating.py:128
#, python-format
@@ -11791,7 +11791,6 @@ msgid "All time"
msgstr "Alle"
#: pretix/base/timeline.py:60
#, fuzzy
msgctxt "timeline"
msgid "Your event starts"
msgstr "Arrangements starttidspunkt"
@@ -11814,7 +11813,6 @@ 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"
@@ -12830,9 +12828,8 @@ 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"
msgstr "Dato fra"
#: pretix/control/forms/filter.py:1137 pretix/control/forms/filter.py:1140
#: pretix/control/forms/filter.py:1636 pretix/control/forms/filter.py:1639
@@ -15981,9 +15978,8 @@ msgid "Payments"
msgstr "Betaling"
#: pretix/control/navigation.py:374
#, fuzzy
msgid "User settings"
msgstr "Basisindstillinger"
msgstr "Brugerindstillinger"
#: pretix/control/navigation.py:385
#: pretix/control/templates/pretixcontrol/user/settings.html:16
@@ -15995,9 +15991,8 @@ msgid "2FA"
msgstr ""
#: pretix/control/navigation.py:395
#, fuzzy
msgid "Authorized apps"
msgstr "Kundehandlinger"
msgstr "Autoriserede apps"
#: pretix/control/navigation.py:400
#: pretix/control/templates/pretixcontrol/user/history.html:4
@@ -17116,7 +17111,7 @@ msgstr "Gå til arrangement"
#: pretix/control/templates/pretixcontrol/dashboard.html:15
msgid "Your upcoming events"
msgstr ""
msgstr "Dine kommende arrangementer"
#: pretix/control/templates/pretixcontrol/dashboard.html:20
#: pretix/control/templates/pretixcontrol/events/create_base.html:4
@@ -17130,15 +17125,15 @@ msgstr "Opret arrangement"
#: pretix/control/templates/pretixcontrol/dashboard.html:39
msgid "View all upcoming events"
msgstr ""
msgstr "Vis alle kommende arrangementer"
#: pretix/control/templates/pretixcontrol/dashboard.html:44
msgid "Your most recent events"
msgstr ""
msgstr "Dine fornylig afsluttede arrangementer"
#: pretix/control/templates/pretixcontrol/dashboard.html:60
msgid "View all recent events"
msgstr ""
msgstr "Vis alle afsluttede arrangementer"
#: pretix/control/templates/pretixcontrol/dashboard.html:65
msgid "Your event series"
@@ -18716,8 +18711,8 @@ msgid ""
"The list below shows all events you have administrative access to. Click on "
"the event name to access event details."
msgstr ""
"Listen vises alle arrangementer som du har administratoradgang til. Klik "
"navnet for at se detaljer."
"I listen vises alle arrangementer, som du har administratoradgang til. Klik "
"navnet for at se flere informationer."
#: pretix/control/templates/pretixcontrol/events/index.html:12
#: pretix/control/templates/pretixcontrol/organizers/detail.html:18
@@ -19823,13 +19818,12 @@ 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 "Kundehandlinger"
msgstr "Autoriserede applikationer"
#: pretix/control/templates/pretixcontrol/oauth/authorized.html:9
msgid "Manage your own apps"
msgstr ""
msgstr "Styr dine egne apps"
#: pretix/control/templates/pretixcontrol/oauth/authorized.html:18
msgid "Permissions"
@@ -19837,7 +19831,7 @@ msgstr "Tilladelser"
#: pretix/control/templates/pretixcontrol/oauth/authorized.html:59
msgid "No applications have access to your pretix account."
msgstr ""
msgstr "Der er ingen applikationer, der har adgang til din Pretix-konto."
#: pretix/control/templates/pretixcontrol/order/approve.html:4
#: pretix/control/templates/pretixcontrol/order/approve.html:8
@@ -23496,9 +23490,8 @@ msgid "Change two-factor settings"
msgstr "Ændr tofaktor-indstillinger"
#: pretix/control/templates/pretixcontrol/user/settings.html:65
#, fuzzy
msgid "Show applications"
msgstr "Vis information"
msgstr "Vis applikationer"
#: pretix/control/templates/pretixcontrol/user/settings.html:74
msgid "Show account history"
@@ -29407,7 +29400,6 @@ msgid "Step"
msgstr ""
#: pretix/presale/checkoutflow.py:248
#, fuzzy
msgctxt "checkoutflow"
msgid "Customer account"
msgstr "Kundekonto"
@@ -29546,8 +29538,9 @@ 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 ""
msgstr "Gem mine svar i min kundekonto, for at genbruge dem i fremtiden."
#: pretix/presale/forms/checkout.py:165
#, fuzzy
@@ -29861,9 +29854,8 @@ msgid "Cart expired"
msgstr "Kurv udløbet"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:36
#, fuzzy
msgid "Show full cart"
msgstr "Vis information"
msgstr "Vis hele indkøbskurven"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:48
#: pretix/presale/templates/pretixpresale/event/index.html:78
@@ -31242,7 +31234,6 @@ msgid "Request invoice"
msgstr "Anmod om faktura"
#: pretix/presale/templates/pretixpresale/event/order.html:286
#, fuzzy
msgid "Your information"
msgstr "Dine oplysninger"
@@ -31266,7 +31257,6 @@ 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"
@@ -31903,7 +31893,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 "Kontoindstillinger ændret"
msgstr "Kontoinformationer"
#: pretix/presale/templates/pretixpresale/organizers/customer_info.html:11
#, fuzzy
@@ -31945,7 +31935,7 @@ msgstr "Angiv ny adgangskode"
#: pretix/presale/templates/pretixpresale/organizers/customer_profile.html:10
#, fuzzy
msgid "Your account"
msgstr "Din kurv"
msgstr "Din konto"
#: pretix/presale/templates/pretixpresale/organizers/customer_profile.html:23
#, fuzzy

View File

@@ -7,8 +7,8 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-08 13:19+0000\n"
"PO-Revision-Date: 2022-12-01 17:00+0000\n"
"Last-Translator: Mie Frydensbjerg <mif@aarhus.dk>\n"
"PO-Revision-Date: 2024-05-30 17:00+0000\n"
"Last-Translator: Nikolai <nikolai@lengefeldt.de>\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 4.14.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
@@ -724,10 +724,6 @@ msgid "Cart expired"
msgstr "Kurv udløbet"
#: pretix/static/pretixpresale/js/ui/cart.js:50
#, fuzzy
#| msgid "The items in your cart are reserved for you for one minute."
#| msgid_plural ""
#| "The items in your cart are reserved for you for {num} minutes."
msgid "The items in your cart are reserved for you for one minute."
msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "Varerne i din kurv er reserveret for dig i et minut."

View File

@@ -5,8 +5,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-05-24 08:53+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"PO-Revision-Date: 2024-06-06 19:00+0000\n"
"Last-Translator: Mira <weller@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/de/"
">\n"
"Language: de\n"
@@ -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 Vollzeitstudenten, "
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent*innen, "
"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

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-05-24 08:53+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"PO-Revision-Date: 2024-06-06 19:00+0000\n"
"Last-Translator: Mira <weller@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix/de_Informal/>\n"
"Language: de_Informal\n"
@@ -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 Vollzeitstudenten, "
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent*innen, "
"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

View File

@@ -8,16 +8,16 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 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"
"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"
"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 4.17\n"
"X-Generator: Weblate 5.5.5\n"
#: pretix/_base_settings.py:78
msgid "English"
@@ -34388,7 +34388,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_event_info.html:20
#, python-format
msgid "Begin: %(time)s"
msgstr "Ξεκινήστε: %(time)s"
msgstr "Έναρξη: %(time)s"
#: pretix/presale/templates/pretixpresale/event/fragment_event_info.html:29
#, python-format

View File

@@ -4,8 +4,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-05-23 14:03+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"PO-Revision-Date: 2024-06-08 18:00+0000\n"
"Last-Translator: alemairebe <adrien@alemaire.be>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/fr/"
">\n"
"Language: fr\n"
@@ -28861,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 na pas été ouverte ou a été "
"fermée ?"
"La fenêtre de saisie de vos données de paiement a-t-elle été fermée ou ne "
"s'est pas ouverte ?"
#: pretix/plugins/paypal/templates/pretixplugins/paypal/redirect.html:25
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/redirect.html:25

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-02-27 02:00+0000\n"
"Last-Translator: Adriano Lima <adrianocardoso1991@gmail.com>\n"
"PO-Revision-Date: 2024-05-27 21:00+0000\n"
"Last-Translator: mathbrito <mathbrito@users.noreply.translate.pretix.eu>\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.4\n"
"X-Generator: Weblate 5.5.5\n"
#: pretix/_base_settings.py:78
msgid "English"
@@ -9152,18 +9152,20 @@ 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 ""
msgstr "Gerar faturas com números consecutivos"
#: pretix/base/settings.py:662
msgid "If deactivated, the order code will be used in the invoice number."
msgstr ""
msgstr "Se desativado, o número de pedido será usado como número de fatura."
#: pretix/base/settings.py:671
msgid "Invoice number prefix"
msgstr ""
msgstr "Prefixo do número de fatura"
#: pretix/base/settings.py:672
msgid ""
@@ -24633,19 +24635,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 ""
msgstr "Não conseguimos salvar suas alterações. Veja detalhes abaixo."
#: pretix/control/views/checkin.py:416 pretix/control/views/checkin.py:453
msgid "The requested list does not exist."
msgstr ""
msgstr "A lista solicitada não existe."
#: pretix/control/views/checkin.py:462
msgid "The selected list has been deleted."
msgstr ""
msgstr "A lista selecionada foi apagada."
#: pretix/control/views/dashboards.py:114
msgid "Attendees (ordered)"
msgstr ""
msgstr "Participantes (com pedidos)"
#: pretix/control/views/dashboards.py:124
msgid "Attendees (paid)"

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2023-04-24 19:00+0000\n"
"Last-Translator: Vasco Baleia <vb2003.12@gmail.com>\n"
"PO-Revision-Date: 2024-06-08 18:00+0000\n"
"Last-Translator: David Vaz <davidmgvaz@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 4.16.4\n"
"X-Generator: Weblate 5.5.5\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 ""
msgstr "Chinês (tradicional)"
#: pretix/_base_settings.py:84
msgid "Czech"
@@ -77,7 +77,7 @@ msgstr "Grego"
#: pretix/_base_settings.py:92
msgid "Indonesian"
msgstr ""
msgstr "Indonésia"
#: pretix/_base_settings.py:93
msgid "Italian"
@@ -89,7 +89,7 @@ msgstr "Letão"
#: pretix/_base_settings.py:95
msgid "Norwegian Bokmål"
msgstr ""
msgstr "Norueguês Bokmål"
#: pretix/_base_settings.py:96
msgid "Polish"
@@ -160,10 +160,8 @@ msgid "Allowed URIs list, space separated"
msgstr "Lista de URIs permitidos, separados por espaço"
#: pretix/api/models.py:47
#, fuzzy
#| msgid "Allowed URIs list, space separated"
msgid "Allowed Post Logout URIs list, space separated"
msgstr "Lista de URIs permitidos, separados por espaço"
msgstr "Lista de URIs pós-logout 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
@@ -310,21 +308,16 @@ 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 efetuado durante o check-in."
msgstr "Este tipo de pergunta não pode ser apresentado 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 identificador com o mesmo ID e tipo já existe nesta conta de organizador."
"Já existe um meio com o mesmo identificador e tipo nesta conta de "
"organizador."
#: pretix/api/serializers/order.py:79
#, python-brace-format
@@ -384,7 +377,7 @@ msgstr ""
#: pretix/api/views/checkin.py:604 pretix/api/views/checkin.py:611
msgid "Medium connected to other event"
msgstr ""
msgstr "Meio ligado a outro evento"
#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:472
#, python-brace-format
@@ -396,7 +389,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 pode gerar uma factura para este pedido"
msgstr "Não é possível gerar uma fatura para esta encomenda."
#: pretix/api/views/order.py:594 pretix/control/views/orders.py:1590
#: pretix/presale/views/order.py:743 pretix/presale/views/order.py:816
@@ -554,46 +547,32 @@ 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"
msgstr "Entrada em fila de espera adicionada"
#: pretix/api/webhooks.py:359
#, fuzzy
#| msgid "Waiting list entry"
msgid "Waiting list entry changed"
msgstr "Entrada em fila de espera"
msgstr "Entrada em fila de espera alterada"
#: pretix/api/webhooks.py:363
#, fuzzy
#| msgid "Waiting list entry"
msgid "Waiting list entry deleted"
msgstr "Entrada em fila de espera"
msgstr "Entrada em fila de espera removida"
#: pretix/api/webhooks.py:367
#, fuzzy
#| msgid "Waiting list entries"
msgid "Waiting list entry received voucher"
msgstr "Entradas em fila de espera"
msgstr "Entrada em fila de espera recebeu voucher"
#: pretix/api/webhooks.py:371
#, fuzzy
#| msgid "Customer account"
msgid "Customer account created"
msgstr "Conta de cliente"
msgstr "Conta de cliente criada"
#: pretix/api/webhooks.py:375
#, fuzzy
#| msgid "Customer account email change"
msgid "Customer account changed"
msgstr "Alteração de e -mail da conta do cliente"
msgstr "Conta do cliente alterada"
#: pretix/api/webhooks.py:379
#, fuzzy
#| msgid "The customer account has been anonymized."
msgid "Customer account anonymized"
msgstr "A conta do cliente foi anonimizada."
msgstr "Conta do cliente anonimizada"
#: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103
#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:953
@@ -769,11 +748,9 @@ 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 das encomendas"
msgstr "Dados da encomenda"
#: pretix/base/exporters/answers.py:56
msgid ""
@@ -1087,8 +1064,6 @@ 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"
@@ -1753,10 +1728,8 @@ 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 "Lista de check-in"
msgstr "Texto de check-in"
#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:595
#: pretix/base/models/items.py:1080
@@ -2291,10 +2264,8 @@ 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 "Código Transaction Servidor"
msgstr "Dados de transação de pedidos"
#: pretix/base/exporters/orderlist.py:796
msgid ""
@@ -2302,12 +2273,14 @@ 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 a partir deste intervalo de datas."
msgstr "Apenas incluir pedidos criados neste 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
@@ -2339,22 +2312,16 @@ msgid "Currency"
msgstr "Moeda"
#: pretix/base/exporters/orderlist.py:855
#, fuzzy
#| msgid "Transaction Code"
msgid "Transaction date"
msgstr "Código de transação"
msgstr "Data da transação"
#: pretix/base/exporters/orderlist.py:856
#, fuzzy
#| msgid "Transaction Code"
msgid "Transaction time"
msgstr "Código de transação"
msgstr "Hora de transação"
#: pretix/base/exporters/orderlist.py:857
#, fuzzy
#| msgid "Order data"
msgid "Old data"
msgstr "Dados dos pedidos"
msgstr "Dados antigos"
#: pretix/base/exporters/orderlist.py:860 pretix/base/models/items.py:1460
#: pretix/control/templates/pretixcontrol/order/transactions.html:22
@@ -2362,48 +2329,39 @@ msgid "Quantity"
msgstr "Quantidade"
#: pretix/base/exporters/orderlist.py:867
#, fuzzy
#| msgid "Internal reference"
msgid "Internal fee type"
msgstr "Referência interna"
msgstr "Tipo de taxa interna"
#: pretix/base/exporters/orderlist.py:869
#, fuzzy
#| msgid "Date"
msgctxt "subevent"
msgid "Date ID"
msgstr "Data"
msgstr "ID de data"
#: pretix/base/exporters/orderlist.py:874
#, fuzzy
#| msgid "Tax rule"
msgid "Tax rule ID"
msgstr "Regra fiscal"
msgstr "ID de regra de Tributação"
#: pretix/base/exporters/orderlist.py:877
#: pretix/plugins/reports/accountingreport.py:319
#, fuzzy
#| msgctxt "invoice"
#| msgid "Gross value"
msgid "Gross total"
msgstr "Valor bruto"
msgstr "Total bruto"
#: pretix/base/exporters/orderlist.py:878
#: pretix/plugins/reports/accountingreport.py:318
#, fuzzy
#| msgid "Total"
msgid "Tax total"
msgstr "Total"
msgstr "Total de impostos"
#: 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 ""
msgstr "Convertido de versão antiga"
#: pretix/base/exporters/orderlist.py:973
msgid "Payments and refunds"
@@ -2681,9 +2639,8 @@ msgid "Show value at"
msgstr "Mostrar valor em"
#: pretix/base/exporters/orderlist.py:1271
#, fuzzy
msgid "Defaults to the time of report."
msgstr "Predefine para o tempo do relatório."
msgstr "Predefinido para o tempo do relatório."
#: pretix/base/exporters/orderlist.py:1276
#: pretix/base/exporters/orderlist.py:1286 pretix/control/forms/filter.py:517
@@ -2774,39 +2731,29 @@ 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 ""
msgstr "Media reutilizável"
#: pretix/base/exporters/reusablemedia.py:35
#, fuzzy
#| msgid "Reusable media type"
msgctxt "export_category"
msgid "Reusable media"
msgstr "Tipo de identificador reutilizável"
msgstr "Média 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 ""
"Descarregar uma folha de cálculo com informação de todos os eventos nesta "
"conta de organizador."
"Descarregue uma folha de cálculo com os dados de todos os suportes "
"reutilizáveis da sua conta."
#: 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 taxa"
msgstr "Tipo de suporte"
#: pretix/base/exporters/reusablemedia.py:47 pretix/base/models/media.py:73
#, fuzzy
#| msgid "Internal identifier"
msgctxt "reusable_medium"
msgid "Identifier"
msgstr "Identificador interno"
msgstr "Identificador"
#: pretix/base/exporters/reusablemedia.py:49 pretix/base/models/media.py:81
#: pretix/base/models/orders.py:264 pretix/base/models/orders.py:3007
@@ -2822,16 +2769,12 @@ 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 "Texto do link"
msgstr "Bilhete associado"
#: pretix/base/exporters/reusablemedia.py:52 pretix/base/models/media.py:104
#, fuzzy
#| msgid "Issued gift cards"
msgid "Linked gift card"
msgstr "Cartões-presente emitidos"
msgstr "Cartão-presente associado"
#: pretix/base/exporters/waitinglist.py:42
msgctxt "export_category"
@@ -2913,7 +2856,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 ""
msgstr "Pode utilizar {markup_name} neste campo."
#: pretix/base/forms/__init__.py:178
#, python-format
@@ -3136,10 +3079,9 @@ msgid "Invalid placeholder(s): %(value)s"
msgstr "Placeholder(s) inválido(s): %(value)s"
#: pretix/base/forms/widgets.py:67
#, fuzzy, python-format
#| msgid "Sample city"
#, python-format
msgid "Sample: %s"
msgstr "Exemplo de cidade"
msgstr "Exemplo: %s"
#: pretix/base/forms/widgets.py:70
#, python-brace-format
@@ -3380,25 +3322,22 @@ msgstr ""
#: pretix/base/invoice.py:858
msgid "Default invoice renderer (European-style letter)"
msgstr ""
msgstr "Renderizador de facturas por defeito (Carta estilo europeu)"
#: pretix/base/invoice.py:947
#, fuzzy
#| msgid "Please enter a valid state."
msgctxt "invoice"
msgid "(Please quote at all times.)"
msgstr "Por favor, indique um estado válido."
msgstr "(Por favor, cite sempre.)"
#: pretix/base/invoice.py:994
msgid "Simplified invoice renderer"
msgstr ""
msgstr "Renderizador de facturas simplificado"
#: pretix/base/invoice.py:1013
#, fuzzy, python-brace-format
#| msgid "Event date range"
#, python-brace-format
msgctxt "invoice"
msgid "Event date: {date_range}"
msgstr "Datas limite do evento"
msgstr "Data do evento: {date_range}"
#: pretix/base/media.py:61
msgid "Barcode / QR-Code"
@@ -3406,7 +3345,6 @@ 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"
@@ -3427,12 +3365,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 ""
msgstr "Não foi possível analisar {value} como um valor sim/não."
#: pretix/base/modelimport.py:216
#, python-brace-format
msgid "Could not parse {value} as a date and time."
msgstr ""
msgstr "Não foi possível analisar {value} como uma data e hora."
#: pretix/base/modelimport.py:226 pretix/control/views/orders.py:1162
#: pretix/control/views/orders.py:1191 pretix/control/views/orders.py:1235
@@ -3607,10 +3545,8 @@ msgid "Customer"
msgstr "Comprador"
#: pretix/base/modelimport_orders.py:685
#, fuzzy
#| msgid "No matching seat was found."
msgid "No matching customer was found."
msgstr "Nenhum lugar correspondente foi encontrado."
msgstr "Não foi encontrado nenhum cliente correspondente."
#: pretix/base/modelimport_vouchers.py:50 pretix/base/models/vouchers.py:488
msgid "A voucher with this code already exists."
@@ -3623,10 +3559,8 @@ 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 "Número máximo de itens por pedido"
msgstr "O número máximo de utilizações deve ser definido."
#: pretix/base/modelimport_vouchers.py:88 pretix/base/models/vouchers.py:205
msgid "Minimum usages"
@@ -3653,6 +3587,8 @@ 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"
@@ -4551,10 +4487,8 @@ 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 "Descarregue o seu bilhete aqui:"
msgstr "Propriedade do titular do bilhete"
#: pretix/base/models/giftcards.py:93
msgid "The gift card code may only contain letters, numbers, dots and dashes."
@@ -6014,10 +5948,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 "Quer mesmo desativar a autenticação de dois fatores?"
msgstr ""
"Exigir que todos os membros desta equipa utilizem autenticação de dois "
"fatores"
#: pretix/base/models/organizer.py:268
msgid ""
@@ -6589,7 +6523,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"
@@ -7513,29 +7447,24 @@ msgstr ""
"quantidade selecionada. Por favor, veja abaixo para mais detalhes."
#: pretix/base/services/cart.py:118
#, fuzzy, python-format
#| msgid ""
#| "Some of the products you selected are no longer available in the quantity "
#| "you selected. Please see below for details."
#, python-format
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 você selecionou não estão mais disponíveis na "
"quantidade selecionada. Por favor, veja abaixo para mais detalhes."
"Alguns dos produtos que selecionou não estão disponíveis. Os seguintes "
"produtos foram afetados e não foram adicionados ao seu carrinho: %s"
#: pretix/base/services/cart.py:122
#, fuzzy, python-format
#| msgid ""
#| "Some of the products you selected are no longer available in the quantity "
#| "you selected. Please see below for details."
#, python-format
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 você selecionou não estão mais disponíveis na "
"quantidade selecionada. Por favor, veja abaixo para mais detalhes."
"Alguns dos produtos que selecionou não estão disponíveis na quantidade "
"que selecionou. Os seguintes produtos foram afetados e não foram adicionados "
"ao seu carrinho: %s"
#: pretix/base/services/cart.py:127
#, fuzzy, python-format
@@ -8476,15 +8405,12 @@ msgstr ""
"do seu carrinho."
#: pretix/base/services/orders.py:202
#, fuzzy, python-format
#| msgid ""
#| "You cannot delete the product <strong>%(item)s</strong> because it "
#| "already has been ordered."
#, python-format
msgid ""
"You cannot remove the position %(addon)s since it has already been checked "
"in."
msgstr ""
"Não pode excluir o produto <strong>%(item)s</strong> porque já foi pedido."
"Não é possível remover a posição %(addon)s uma vez que já foi feito check-in."
#: pretix/base/services/orders.py:203
#, fuzzy
@@ -10830,13 +10756,12 @@ msgstr ""
"Olá,\n"
"\n"
"Ainda não recebemos o pagamento total para o seu pedido {event}.\n"
"Tenha em mente que só garantimos o pedido se recebermos\n"
"o seu pagamento antes de {expire_date}.\n"
"Tenha em atenção que tem de pagar antes de {expire_date}.\n"
"\n"
"Pode visualizar as informações de pagamento e o estado do pedido em\n"
"Pode ver as informações de pagamento e o estado da sua encomenda em\n"
"{url}\n"
"\n"
"Cumprimentos,\n"
"Com os melhores cumprimentos\n"
"A sua equipa {event}"
#: pretix/base/settings.py:2409
@@ -12145,21 +12070,16 @@ 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 "Motivo do reembolso"
msgstr "Razão:"
#: 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 "Confirmação pendente"
msgstr "Link de Configuração:"
#: pretix/base/templates/pretixbase/email/notification.html:55
#: pretix/base/templates/pretixbase/email/notification.txt:14
@@ -12398,11 +12318,9 @@ msgid "Next week"
msgstr ""
#: pretix/base/timeframes.py:148
#, fuzzy
#| msgid "Current:"
msgctxt "reporting_timeframe"
msgid "Current month"
msgstr "Corrente:"
msgstr "Mês Corrente"
#: pretix/base/timeframes.py:152 pretix/base/timeframes.py:161
#: pretix/base/timeframes.py:170 pretix/base/timeframes.py:179
@@ -12727,22 +12645,17 @@ msgid "Community translations"
msgstr "Tradução não oficial"
#: pretix/control/forms/__init__.py:332
#, 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."
#, python-brace-format
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 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."
"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>."
#: pretix/control/forms/__init__.py:343
msgid "Development only"
@@ -15189,21 +15102,7 @@ msgid "Your voucher for {event}"
msgstr "Seu voucher para {event}"
#: pretix/control/forms/vouchers.py:278
#, 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"
#, python-brace-format
msgid ""
"Hello,\n"
"\n"
@@ -15220,16 +15119,15 @@ msgid ""
msgstr ""
"Olá,\n"
"\n"
"com este e-mail, estamos enviando-lhe um ou mais vouchers para {event}:\n"
"com este e-mail, estamos a enviar-lhe um ou mais vouchers para {event}:\n"
"\n"
"{voucher_list}\n"
"\n"
"Pode trocá-los aqui em nossa bilheteira:\n"
"Pode trocá-los aqui na nossa bilheteira:\n"
"\n"
"{url}\n"
"\n"
"Cumprimentos,\n"
"\n"
"A sua equipa {event}"
#: pretix/control/forms/vouchers.py:284
@@ -17979,10 +17877,8 @@ 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"
msgstr "Informação adicional necessária"
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:70
msgid ""
@@ -19881,11 +19777,10 @@ msgid "Currently available: %(num)s"
msgstr "Actualmente disponíveis: %(num)s"
#: pretix/control/templates/pretixcontrol/giftcards/checkout_confirm.html:4
#, fuzzy, python-format
#, python-format
msgid "Your gift card %(card)s will be used to pay for this order."
msgstr ""
"O cartão-presente pode ser usado para comprar bilhetes para todos os eventos "
"deste organizador."
"O seu cartão presente %(card)s será utilizado para pagar esta encomenda."
#: pretix/control/templates/pretixcontrol/global_license.html:8
msgid ""
@@ -22073,10 +21968,8 @@ 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 "Você não poderá continuar."
msgstr "Quer continuar?"
#: pretix/control/templates/pretixcontrol/orders/bulk_action.html:77
#, fuzzy
@@ -22252,13 +22145,13 @@ msgstr "Apagar seleção"
#: pretix/control/templates/pretixcontrol/orders/export_delete.html:9
#: pretix/control/templates/pretixcontrol/organizers/export_delete.html:9
#, fuzzy, python-format
#| msgid ""
#| "Are you sure you want to delete the quota <strong>%(quota)s</strong>?"
#, python-format
msgid ""
"Are you sure you want to delete the scheduled export <strong>%(export)s</"
"strong>?"
msgstr "Tem certeza de que deseja excluir a quota <strong>%(quota)s</strong>?"
msgstr ""
"Tem certeza de que deseja excluir a exportação agendada "
"<strong>%(export)s</strong>?"
#: pretix/control/templates/pretixcontrol/orders/export_form.html:26
#: pretix/control/templates/pretixcontrol/organizers/export_form.html:27
@@ -22297,10 +22190,9 @@ msgid "Repetition schedule"
msgstr "Regra de repetição"
#: pretix/control/templates/pretixcontrol/orders/fragment_export_schedule_form.html:46
#, fuzzy, python-format
#| msgid "Repeat every %(interval)s %(freq)s, starting at %(start)s."
#, python-format
msgid "Repeat every %(interval)s %(freq)s"
msgstr "Repetir a cada %(interval)s %(freq)s, a partir de %(start)s."
msgstr "Repetir a cada %(interval)s %(freq)s"
#: pretix/control/templates/pretixcontrol/orders/fragment_export_schedule_form.html:54
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:89
@@ -22354,10 +22246,8 @@ 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 "Por favor, confirme os seguintes detalhes de pagamento."
msgstr "Tenha em atenção as seguintes limitações:"
#: pretix/control/templates/pretixcontrol/orders/fragment_export_schedule_form.html:114
msgid ""
@@ -25339,11 +25229,7 @@ msgid "Quota unlimited"
msgstr "Nome da quota"
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:229
#, fuzzy, python-format
#| msgid ""
#| "\n"
#| " Waiting, product %(num)sx available\n"
#| " "
#, python-format
msgid ""
"\n"
" Waiting, product %(num)sx "
@@ -25351,8 +25237,9 @@ msgid ""
" "
msgstr ""
"\n"
" Esperando, produto %(num)sx disponíveis\n"
" "
" Em espera, produto %(num)sx "
"disponível\n"
" "
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:235
msgid "Waiting, product unavailable"
@@ -27069,10 +26956,8 @@ 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 "Deseja mesmo ativar a autenticação de dois fatores?"
msgstr "Deixou todas as equipas que requerem autenticação de dois factores."
#: pretix/control/views/user.py:597
msgid ""
@@ -27727,10 +27612,8 @@ msgid ""
msgstr ""
#: pretix/plugins/banktransfer/payment.py:334
#, fuzzy
#| msgid "Invoice recipient:"
msgid "Invoice recipient e-mail"
msgstr "destinatário da factura:"
msgstr "E-mail do destinatário da fatura"
#: pretix/plugins/banktransfer/payment.py:336
msgid ""
@@ -27891,16 +27774,12 @@ 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 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:"
"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."
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:43
#, python-format
@@ -28132,10 +28011,8 @@ msgid ""
msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:132
#, fuzzy
#| msgid "Invoice recipient:"
msgid "Invoice recipient email"
msgstr "destinatário da factura:"
msgstr "E-mail do destinatário da fatura"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:139
#, fuzzy
@@ -28461,8 +28338,6 @@ 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"
@@ -31745,7 +31620,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:12
msgid "You already selected the following payment methods:"
msgstr "Por favor, confirme os seguintes detalhes de pagamento."
msgstr "Já seleccionou os seguintes métodos de pagamento:"
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:26
msgid "Remove payment"
@@ -31761,7 +31636,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 "Por favor, selecione como deseja pagar."
msgstr "Seleccione como pretende pagar o saldo remanescente:"
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:95
msgid "This sales channel does not provide support for test mode."
@@ -31964,10 +31839,9 @@ 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
#, fuzzy, python-format
#| msgid "Modify price for %(item)s"
#, python-format
msgid "Modify price for %(item)s, at least %(price)s"
msgstr "Modificar preço para %(item)s"
msgstr "Modificar preço para %(item)s, pelo menos %(price)s"
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:152
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:291
@@ -32242,10 +32116,8 @@ 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
@@ -32332,10 +32204,9 @@ 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
#, fuzzy, python-format
#| msgid "Add-On to position #%(posid)s"
#, python-format
msgid "Add-on product to position #%(positionid)s"
msgstr "Add-On para a posição %(posid)s"
msgstr "Add-On para a posição # %(positionid)s"
#: pretix/presale/templates/pretixpresale/event/fragment_change_confirm.html:40
#, python-format
@@ -32587,19 +32458,17 @@ 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
#, fuzzy, python-format
#| msgid "(incl. taxes)"
#, python-format
msgid "%(value)s incl. taxes"
msgstr "(incl. impostos)"
msgstr "%(value)s 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
#, fuzzy, python-format
#| msgid "Total value (without taxes)"
#, python-format
msgid "%(value)s without taxes"
msgstr "Valor total (sem impostos)"
msgstr "%(value)s sem impostos"
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:290
#: pretix/presale/templates/pretixpresale/event/voucher.html:321
@@ -32849,7 +32718,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 "O seu pedido foi feito com sucesso. Vê abaixo os detalhes!"
msgstr "A sua encomenda foi efectuada com sucesso. Veja abaixo os detalhes."
#: pretix/presale/templates/pretixpresale/event/order.html:16
#: pretix/presale/templates/pretixpresale/event/order.html:48
@@ -33211,10 +33080,9 @@ 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
#, fuzzy, python-format
#| msgid "Gift card: %(card)s"
#, python-format
msgid "Gift card: %(code)s"
msgstr "Cartão-presente: %(card)s"
msgstr "Cartão-presente: %(code)s"
#: pretix/presale/templates/pretixpresale/event/order_modify.html:5
msgid "Modify order"
@@ -34008,10 +33876,8 @@ 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 "Esta conta está desativada."
msgstr "Máquina do tempo desactivada!"
#: pretix/presale/views/order.py:368 pretix/presale/views/order.py:433
#: pretix/presale/views/order.py:514

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-08 13:19+0000\n"
"PO-Revision-Date: 2022-11-16 16:12+0000\n"
"PO-Revision-Date: 2024-06-08 18:00+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 4.14.1\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
@@ -265,7 +265,7 @@ msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:51
msgid "Additional information required"
msgstr ""
msgstr "Informação adicional necessária"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:52
msgid "Valid ticket"

View File

@@ -8,7 +8,7 @@ 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-23 14:03+0000\n"
"PO-Revision-Date: 2024-06-05 15:00+0000\n"
"Last-Translator: Charlie Lundberg <charlieblundberg@gmail.com>\n"
"Language-Team: Swedish <https://translate.pretix.eu/projects/pretix/pretix/"
"sv/>\n"
@@ -4346,12 +4346,16 @@ msgid ""
"You need to either set a minimum number of matching products or a minimum "
"value."
msgstr ""
"Du kan antingen ställa in ett minsta antal matchande produkter eller ett "
"lägsta värde, inte båda."
#: pretix/base/models/discount.py:206
msgid ""
"You cannot apply the discount only to some of the matched products if you "
"are matching on a minimum value."
msgstr ""
"Du kan inte tillämpa rabatten endast på vissa av de matchade produkterna om "
"du matchar på ett minimivärde."
#: pretix/base/models/discount.py:212
msgid ""
@@ -4608,7 +4612,7 @@ msgstr "Fullständigt namn"
#: pretix/base/models/event.py:1690
#: pretix/control/templates/pretixcontrol/organizers/properties.html:40
msgid "Can be used for filtering"
msgstr ""
msgstr "Kan användas för filtrering"
#: pretix/base/models/event.py:1691
msgid ""
@@ -4616,6 +4620,9 @@ msgid ""
"can also be used for hidden filter parameters in the frontend (e.g. using "
"the widget)."
msgstr ""
"Det här fältet kommer att visas för att filtrera händelser eller rapporter i "
"backend, och det kan också användas för dolda filterparametrar i frontend ("
"t.ex. med hjälp av widgeten)."
#: pretix/base/models/event.py:1701
msgid "A property can either be required or have a default value, not both."
@@ -4630,7 +4637,7 @@ msgstr "Text (flera rader)"
#: pretix/base/models/event.py:1784 pretix/base/models/organizer.py:497
msgid "Link URL"
msgstr ""
msgstr "Länk-URL"
#: pretix/base/models/exports.py:42 pretix/control/navigation.py:227
#: pretix/control/navigation.py:636
@@ -4677,7 +4684,7 @@ msgstr ""
#: pretix/plugins/sendmail/forms.py:58 pretix/plugins/sendmail/forms.py:78
#: pretix/plugins/sendmail/models.py:233
msgid "Message"
msgstr ""
msgstr "Meddelande"
#: pretix/base/models/exports.py:85
#, fuzzy
@@ -4687,7 +4694,7 @@ msgstr "events start tid"
#: pretix/base/models/exports.py:86
msgid "The actual start time might be delayed depending on system load."
msgstr ""
msgstr "Den faktiska starttiden kan vara försenad beroende på systembelastning."
#: pretix/base/models/fields.py:33
msgid "No value can contain the delimiter character."
@@ -4713,7 +4720,7 @@ msgstr "Speciella villkor"
#: pretix/base/models/giftcards.py:219 pretix/base/models/giftcards.py:223
msgid "Manual transaction"
msgstr ""
msgstr "Manuell transaktion"
#: pretix/base/models/invoices.py:185
#, python-format
@@ -4796,7 +4803,7 @@ msgstr "Kund"
#: pretix/base/models/items.py:375
msgid "Dynamic validity"
msgstr ""
msgstr "Dynamisk giltighet"
#: pretix/base/models/items.py:381 pretix/control/forms/item.py:605
#: pretix/control/templates/pretixcontrol/subevents/fragment_unavail_mode_indicator.html:3
@@ -4808,7 +4815,7 @@ msgstr "Denna produkt är just nu inte tillgänglig."
#: pretix/base/models/items.py:382
#: pretix/control/templates/pretixcontrol/subevents/fragment_unavail_mode_indicator.html:5
msgid "Show info text if unavailable"
msgstr ""
msgstr "Visa infotext om den inte är tillgänglig"
#: pretix/base/models/items.py:389 pretix/base/models/items.py:703
msgid "Don't use re-usable media, use regular one-off tickets"
@@ -4816,15 +4823,15 @@ msgstr ""
#: pretix/base/models/items.py:390
msgid "Require an existing medium to be re-used"
msgstr ""
msgstr "Kräv att ett befintligt medium återanvänds"
#: pretix/base/models/items.py:391
msgid "Require a previously unknown medium to be newly added"
msgstr ""
msgstr "Kräv att ett tidigare okänt medium läggs till nyligen"
#: pretix/base/models/items.py:392
msgid "Require either an existing or a new medium to be used"
msgstr ""
msgstr "Kräv att antingen ett befintligt eller ett nytt medium ska användas"
#: pretix/base/models/items.py:408 pretix/base/models/items.py:1363
#: pretix/control/templates/pretixcontrol/items/index.html:40
@@ -4878,6 +4885,9 @@ msgid ""
"can choose a lower value, but not lower than the price this product would "
"have without the free price option."
msgstr ""
"Detta pris kommer att användas som standardvärde för inmatningsfältet. "
"Användaren kan välja ett lägre värde, men inte lägre än det pris som denna "
"produkt skulle ha utan det fria prisalternativet."
#: pretix/base/models/items.py:459
#, fuzzy
@@ -5055,6 +5065,8 @@ msgid ""
"This text will be shown by the check-in app if a ticket of this type is "
"scanned."
msgstr ""
"Denna text kommer att visas av incheckningsappen om en biljett av denna typ "
"skannas."
#: pretix/base/models/items.py:598 pretix/base/models/items.py:1083
msgid ""
@@ -5124,6 +5136,15 @@ msgid ""
"change the settings here later, existing tickets will not be affected by the "
"change but keep their current validity."
msgstr ""
"När du ställer in en vanlig händelse, eller en händelseserie med tidsluckor, "
"behöver du vanligtvis INTE ändra detta värde. Standardinställningen innebär "
"att giltighetstiden för biljetter inte bestäms av produkten, utan av "
"evenemanget och incheckningskonfigurationen. Använd bara de andra "
"alternativen om du behöver dem för att realisera t.ex. en bokning av en "
"årsbiljett med ett dynamiskt startdatum. Observera att giltigheten kommer "
"att lagras med biljetten, så om du ändrar inställningarna här senare kommer "
"befintliga biljetter inte att påverkas av ändringen utan behålla sin "
"nuvarande giltighet."
#: pretix/base/models/items.py:660 pretix/control/forms/item.py:668
#, fuzzy
@@ -5145,23 +5166,23 @@ msgstr "minuter"
#: pretix/base/models/items.py:668
msgid "Hours"
msgstr ""
msgstr "Timmar"
#: pretix/base/models/items.py:672
msgid "Days"
msgstr ""
msgstr "Dagar"
#: pretix/base/models/items.py:676
msgid "Months"
msgstr ""
msgstr "Månader"
#: pretix/base/models/items.py:679
msgid "Customers can select the validity start date"
msgstr ""
msgstr "Kunder kan välja startdatum för giltigheten"
#: pretix/base/models/items.py:680
msgid "If not selected, the validity always starts at the time of purchase."
msgstr ""
msgstr "Om ej valt börjar giltigheten alltid vid köptillfället."
#: pretix/base/models/items.py:685
#, fuzzy
@@ -5171,11 +5192,11 @@ msgstr "Maximalt antal"
#: pretix/base/models/items.py:686
msgid "The selected start date may only be this many days in the future."
msgstr ""
msgstr "Det valda startdatumet kan bara vara så här många dagar i framtiden."
#: pretix/base/models/items.py:692
msgid "Reusable media policy"
msgstr ""
msgstr "Återanvändbar mediepolicy"
#: pretix/base/models/items.py:694
msgid ""
@@ -5186,6 +5207,12 @@ msgid ""
"feature that also requires specific configuration of ticketing and printing "
"settings."
msgstr ""
"Om denna produkt ska lagras på ett återanvändbart fysiskt medium kan du "
"bifoga en policy för fysiskt media. Detta krävs inte för vanliga biljetter, "
"som bara använder en engångs-streckkod, utan endast för produkter som "
"förnybara säsongsbiljetter eller laddningsbara presentkort-armband. Detta är "
"en avancerad funktion som också kräver specifik konfiguration av biljett- "
"och utskriftsinställningar."
#: pretix/base/models/items.py:704
msgid "Reusable media type"
@@ -6712,7 +6739,7 @@ msgstr ""
#: pretix/base/notifications.py:288
#, python-brace-format
msgid "Order {order.code} has been overpaid."
msgstr ""
msgstr "Order {order.code} har blivit överbetald."
#: pretix/base/notifications.py:294
#, python-brace-format
@@ -6721,36 +6748,39 @@ msgstr ""
#: pretix/base/notifications.py:299
msgid "Refund requested"
msgstr ""
msgstr "Återbetalning begärd"
#: pretix/base/notifications.py:300
#, python-brace-format
msgid "You have been requested to issue a refund for {order.code}."
msgstr ""
msgstr "Du har blivit ombedd att utfärda en återbetalning för {order.code}."
#: pretix/base/payment.py:87
msgctxt "payment"
msgid "Apple Pay"
msgstr ""
msgstr "Apple Pay"
#: pretix/base/payment.py:88
#, fuzzy
msgctxt "payment"
msgid "Google Pay"
msgstr ""
msgstr "Google Pay"
#: pretix/base/payment.py:257
#: pretix/presale/templates/pretixpresale/event/order.html:115
msgid "Pay now"
msgstr ""
msgstr "Betala nu"
#: pretix/base/payment.py:331
msgid "Enable payment method"
msgstr ""
msgstr "Aktivera betalningsmetod"
#: pretix/base/payment.py:337
msgid ""
"Users will not be able to choose this payment provider after the given date."
msgstr ""
"Användare kommer inte att kunna välja denna betalningsleverantör efter det "
"angivna datumet."
#: pretix/base/payment.py:343
#, fuzzy
@@ -6761,7 +6791,7 @@ msgstr "Den här produkten kommer inte säljas innan angivet datum."
#: pretix/base/payment.py:348
msgid "Minimum order total"
msgstr ""
msgstr "Minsta ordersumma"
#: pretix/base/payment.py:349
msgid ""
@@ -6769,10 +6799,14 @@ msgid ""
"exceeds the given value. The order total for this purpose may be computed "
"without taking the fees imposed by this payment method into account."
msgstr ""
"Denna betalning kommer endast att vara tillgänglig om ordersumman är lika "
"med eller överstiger det angivna värdet. Ordersumman för detta ändamål kan "
"komma att beräknas utan att ta hänsyn till de avgifter som tas ut av denna "
"betalningsmetod."
#: pretix/base/payment.py:359
msgid "Maximum order total"
msgstr ""
msgstr "Maximal ordersumma"
#: pretix/base/payment.py:360
msgid ""
@@ -6780,22 +6814,26 @@ msgid ""
"the given value. The order total for this purpose may be computed without "
"taking the fees imposed by this payment method into account."
msgstr ""
"Denna betalning kommer endast att vara tillgänglig om ordersumman är lika "
"med eller under det angivna värdet. Ordersumman för detta ändamål kan komma "
"att beräknas utan att ta hänsyn till de avgifter som tas ut av denna "
"betalningsmetod."
#: pretix/base/payment.py:370 pretix/base/payment.py:379
msgid "Additional fee"
msgstr ""
msgstr "Extra avgift"
#: pretix/base/payment.py:371
msgid "Absolute value"
msgstr ""
msgstr "Absolutvärde"
#: pretix/base/payment.py:380
msgid "Percentage of the order total."
msgstr ""
msgstr "Andel av ordersumman."
#: pretix/base/payment.py:386
msgid "Calculate the fee from the total value including the fee."
msgstr ""
msgstr "Beräkna avgiften från det totala värdet inklusive avgiften."
#: pretix/base/payment.py:387
#, python-brace-format
@@ -6805,10 +6843,14 @@ msgid ""
"rel=\"noopener\">Click here for detailed information on what this does.</a> "
"Don't forget to set the correct fees above!"
msgstr ""
"Vi rekommenderar att du aktiverar detta om du vill att dina användare ska "
"betala betalningsavgifterna från din betalningsleverantör. <a href=\""
"{docs_url}\" target=\"_blank\" rel=\"noopener\">Klicka här för detaljerad "
"information om vad detta gör.</a> Glöm inte att ange rätt avgifter ovan!"
#: pretix/base/payment.py:395
msgid "Text on invoices"
msgstr ""
msgstr "Text på fakturor"
#: pretix/base/payment.py:396
msgid ""
@@ -6817,10 +6859,14 @@ msgid ""
"order is paid. If the invoice is generated later, it will show a text "
"stating that it has already been paid."
msgstr ""
"Kommer att skrivas ut precis under betalningssiffrorna och ovanför "
"sluttexten på fakturor. Detta kommer endast att användas om fakturan "
"genereras innan beställningen betalas. Om fakturan genereras senare kommer "
"den att visa en text om att den redan är betald."
#: pretix/base/payment.py:405
msgid "Restrict to countries"
msgstr ""
msgstr "Begränsa till länder"
#: pretix/base/payment.py:407
msgid ""
@@ -6940,6 +6986,10 @@ msgid ""
"It should instruct the user on how to proceed with the payment. You can use "
"the placeholders {order}, {amount}, {currency} and {amount_with_currency}."
msgstr ""
"Denna text kommer att visas på orderbekräftelsesidan för väntande "
"beställningar. Den bör instruera användaren om hur man går vidare med "
"betalningen. Du kan använda platshållarna {order}, {amount}, {currency} och "
"{amount_with_currency}."
#: pretix/base/payment.py:1209 pretix/plugins/banktransfer/payment.py:151
msgid ""
@@ -6949,16 +6999,16 @@ msgstr ""
#: pretix/base/payment.py:1260
msgid "Offsetting"
msgstr ""
msgstr "Förskjutning"
#: pretix/base/payment.py:1274 pretix/control/views/orders.py:1244
msgid "You entered an order that could not be found."
msgstr ""
msgstr "Du angav en beställning som inte kunde hittas."
#: pretix/base/payment.py:1303
#, python-format
msgid "Balanced against orders: %s"
msgstr ""
msgstr "Balanserat mot order: %s"
#: pretix/base/payment.py:1329
#, fuzzy
@@ -6968,27 +7018,27 @@ msgstr "Betalnings metod"
#: pretix/base/payment.py:1346
msgid "In test mode, only test cards will work."
msgstr ""
msgstr "I testläge fungerar endast testkort."
#: pretix/base/payment.py:1428 pretix/base/payment.py:1479
#: pretix/base/payment.py:1522
msgid "You cannot pay with gift cards when buying a gift card."
msgstr ""
msgstr "Du kan inte betala med presentkort vid köp av presentkort."
#: pretix/base/payment.py:1437 pretix/base/payment.py:1487
#: pretix/base/payment.py:1532 pretix/base/payment.py:1534
msgid "This gift card does not support this currency."
msgstr ""
msgstr "Detta presentkort stöder inte denna valuta."
#: pretix/base/payment.py:1440 pretix/base/payment.py:1490
#: pretix/base/payment.py:1540
msgid "This gift card can only be used in test mode."
msgstr ""
msgstr "Detta presentkort kan endast användas i testläge."
#: pretix/base/payment.py:1443 pretix/base/payment.py:1493
#: pretix/base/payment.py:1542
msgid "Only test gift cards can be used in test mode."
msgstr ""
msgstr "Endast testpresentkort kan användas i testläge."
#: pretix/base/payment.py:1446 pretix/base/payment.py:1496
#: pretix/base/payment.py:1544
@@ -6999,31 +7049,35 @@ msgstr "Dina ändringar har sparats."
#: pretix/base/payment.py:1449 pretix/base/payment.py:1499
msgid "All credit on this gift card has been used."
msgstr ""
msgstr "All kredit på detta presentkort har använts."
#: pretix/base/payment.py:1454
msgid "This gift card is already used for your payment."
msgstr ""
msgstr "Detta presentkort används redan för din betalning."
#: pretix/base/payment.py:1469 pretix/base/payment.py:1512
msgid ""
"You entered a voucher instead of a gift card. Vouchers can only be entered "
"on the first page of the shop below the product selection."
msgstr ""
"Du angav en kupong istället för ett presentkort. Kuponger kan endast anges "
"på första sidan i butiken under produkturvalet."
#: pretix/base/payment.py:1472 pretix/base/payment.py:1515
msgid "This gift card is not known."
msgstr ""
msgstr "Detta presentkort är inte känt."
#: pretix/base/payment.py:1474 pretix/base/payment.py:1517
msgid ""
"This gift card can not be redeemed since its code is not unique. Please "
"contact the organizer of this event."
msgstr ""
"Detta presentkort kan inte lösas in eftersom dess kod inte är unik. Kontakta "
"arrangören av detta evenemang."
#: pretix/base/payment.py:1536
msgid "This gift card is not accepted by this event organizer."
msgstr ""
msgstr "Detta presentkort accepteras inte av denna arrangör."
#: pretix/base/payment.py:1538
#, fuzzy
@@ -7036,11 +7090,11 @@ msgstr ""
#: pretix/base/pdf.py:96
msgid "Ticket code (barcode content)"
msgstr ""
msgstr "Biljettkod (streckkodsinnehåll)"
#: pretix/base/pdf.py:108
msgid "Order position number"
msgstr ""
msgstr "Orderpositionsnummer"
#: pretix/base/pdf.py:116
#, fuzzy
@@ -7051,11 +7105,11 @@ msgstr "Beställningsrad"
#: pretix/base/pdf.py:122 pretix/base/services/tickets.py:100
#: pretix/control/views/event.py:795 pretix/control/views/pdf.py:94
msgid "Sample product"
msgstr ""
msgstr "Exempelprodukt"
#: pretix/base/pdf.py:126
msgid "Variation name"
msgstr ""
msgstr "Variationsnamn"
#: pretix/base/pdf.py:127
msgid "Sample variation"
@@ -7209,16 +7263,18 @@ msgstr ""
#: pretix/base/pdf.py:253 pretix/base/pdf.py:279 pretix/base/pdf.py:388
#: pretix/base/pdf.py:412 pretix/base/pdf.py:436 pretix/base/pdf.py:460
#: pretix/base/pdf.py:517 pretix/base/pdf.py:522
#, fuzzy
msgid "2017-05-31"
msgstr ""
msgstr "2017-05-31"
#: pretix/base/pdf.py:260
msgid "Event begin time"
msgstr ""
msgstr "Eventets starttid"
#: pretix/base/pdf.py:261
#, fuzzy
msgid "20:00"
msgstr ""
msgstr "20:00"
#: pretix/base/pdf.py:265
#, fuzzy
@@ -7229,19 +7285,20 @@ msgstr "Evenemangets slutdatum"
#: pretix/base/pdf.py:266 pretix/base/pdf.py:295
#: pretix/base/services/checkin.py:362 pretix/control/forms/filter.py:1160
msgid "Friday"
msgstr ""
msgstr "Fredag"
#: pretix/base/pdf.py:270
msgid "Event end date and time"
msgstr ""
msgstr "Eventets slutdatum och tid"
#: pretix/base/pdf.py:271
msgid "2017-05-31 22:00"
msgstr ""
msgstr "2017-05-31 22:00"
#: pretix/base/pdf.py:287
#, fuzzy
msgid "22:00"
msgstr ""
msgstr "22:00"
#: pretix/base/pdf.py:294
#, fuzzy
@@ -7251,45 +7308,49 @@ msgstr "Evenemangets slutdatum"
#: pretix/base/pdf.py:299
msgid "Event admission date and time"
msgstr ""
msgstr "Datum och tid för tillträde till evenemanget"
#: pretix/base/pdf.py:300 pretix/base/pdf.py:396 pretix/base/pdf.py:420
#: pretix/base/pdf.py:444 pretix/base/pdf.py:468 pretix/base/pdf.py:511
#, fuzzy
msgid "2017-05-31 19:00"
msgstr ""
msgstr "2017-05-31 19:00"
#: pretix/base/pdf.py:307
msgid "Event admission time"
msgstr ""
msgstr "Tillträdestid för evenemang"
#: pretix/base/pdf.py:308 pretix/base/pdf.py:404 pretix/base/pdf.py:428
#: pretix/base/pdf.py:452 pretix/base/pdf.py:476
#, fuzzy
msgid "19:00"
msgstr ""
msgstr "19:00"
#: pretix/base/pdf.py:315
msgid "Event location"
msgstr ""
msgstr "Eventplats"
#: pretix/base/pdf.py:316 pretix/base/settings.py:1118
msgid "Random City"
msgstr ""
msgstr "Slumpmässig stad"
#: pretix/base/pdf.py:335
msgid "Invoice address company"
msgstr ""
msgstr "Fakturaadress företag"
#: pretix/base/pdf.py:341
#, fuzzy
msgid "Sesame Street 42"
msgstr ""
msgstr "Sesame Street 42"
#: pretix/base/pdf.py:346
#, fuzzy
msgid "12345"
msgstr ""
msgstr "12345"
#: pretix/base/pdf.py:351 pretix/base/services/invoices.py:473
msgid "Sample city"
msgstr ""
msgstr "Teststad"
#: pretix/base/pdf.py:355
#, fuzzy
@@ -7305,18 +7366,21 @@ msgid "Sample State"
msgstr "Välj region"
#: pretix/base/pdf.py:361
#, fuzzy
msgid "Atlantis"
msgstr ""
msgstr "Atlantis"
#: pretix/base/pdf.py:365
msgid "List of Add-Ons"
msgstr ""
msgstr "Lista över tillägg"
#: pretix/base/pdf.py:366
msgid ""
"Add-on 1\n"
"2x Add-on 2"
msgstr ""
"Tillägg 1\n"
"2x tillägg 2"
#: pretix/base/pdf.py:372 pretix/control/forms/filter.py:1301
#: pretix/control/forms/filter.py:1303
@@ -7506,7 +7570,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/checkin/checkins.html:66
#: pretix/plugins/ticketoutputpdf/ticketoutput.py:113
msgid "Ticket"
msgstr ""
msgstr "Biljett"
#: pretix/base/pdf.py:1156
#, fuzzy
@@ -7528,45 +7592,47 @@ msgstr "Tillträde till evenemang"
#: pretix/base/reldate.py:38
msgid "Presale start"
msgstr ""
msgstr "Förköpsperiod startar"
#: pretix/base/reldate.py:39
msgid "Presale end"
msgstr ""
msgstr "Förköpsperiod slutar"
#: pretix/base/reldate.py:183
msgid "before"
msgstr ""
msgstr "före"
#: pretix/base/reldate.py:184
msgid "after"
msgstr ""
msgstr "efter"
#: pretix/base/reldate.py:231 pretix/base/reldate.py:359
msgid "Fixed date:"
msgstr ""
msgstr "Fixerat datum:"
#: pretix/base/reldate.py:232 pretix/base/reldate.py:360
msgid "Relative date:"
msgstr ""
msgstr "Relativt datum:"
#: pretix/base/reldate.py:233
msgid "Relative time:"
msgstr ""
msgstr "Relativ tid:"
#: pretix/base/reldate.py:241 pretix/base/reldate.py:363
msgid "Not set"
msgstr ""
msgstr "Inte inställt"
#: pretix/base/secrets.py:119
msgid "Random (default, works with all pretix apps)"
msgstr ""
msgstr "Slumpmässig (standard, fungerar med alla pretix-appar)"
#: pretix/base/secrets.py:150
msgid ""
"pretix signature scheme 1 (for very large events, changes semantics of "
"offline scanning please refer to documentation or support for details)"
msgstr ""
"pretix signaturschema 1 (för mycket stora events, ändrar semantik för "
"offline-skanning se dokumentation eller support för detaljer)"
#: pretix/base/services/cancelevent.py:229
#: pretix/base/services/cancelevent.py:287
@@ -7687,24 +7753,28 @@ msgid ""
"The booking period for this event has not yet started. The affected "
"positions have been removed from your cart."
msgstr ""
"Bokningsperioden för detta evenemang har ännu inte börjat. De berörda "
"produkterna har tagits bort från din kundvagn."
#: pretix/base/services/cart.py:152 pretix/base/services/orders.py:182
msgid ""
"The booking period for one of the events in your cart has ended. The "
"affected positions have been removed from your cart."
msgstr ""
"Bokningsperioden för ett av evenemangen i din varukorg har gått ut. De "
"berörda platserna har tagits bort från din kundvagn."
#: pretix/base/services/cart.py:154
msgid "The entered price is not a number."
msgstr ""
msgstr "Det angivna priset är inte en siffra."
#: pretix/base/services/cart.py:155
msgid "The entered price is to high."
msgstr ""
msgstr "Det angivna priset är för högt."
#: pretix/base/services/cart.py:156
msgid "This voucher code is not known in our database."
msgstr ""
msgstr "Denna kupongkod är inte känd i vår databas."
#: pretix/base/services/cart.py:158 pretix/base/services/orders.py:157
#, python-format
@@ -7715,7 +7785,11 @@ msgid_plural ""
"The voucher code \"%(voucher)s\" can only be used if you select at least "
"%(number)s matching products."
msgstr[0] ""
"Verifikationskoden \"%(voucher)s\" kan endast användas om du väljer minst "
"%(number)s matchande produkter."
msgstr[1] ""
"Verifikationskoderna \"%(voucher)s\" kan endast användas om du väljer minst "
"%(number)s matchande produkter."
#: pretix/base/services/cart.py:163
#, python-format
@@ -7728,12 +7802,18 @@ msgid_plural ""
"%(number)s matching products. We have therefore removed some positions from "
"your cart that can no longer be purchased like this."
msgstr[0] ""
"Verifikationskoden \"%(voucher)s\" kan endast användas om du väljer minst "
"%(number)s matchande produkter. Vi har därför tagit bort några positioner "
"från din varukorg som inte längre går att köpa så här."
msgstr[1] ""
"Verifikationskoderna \"%(voucher)s\" kan endast användas om du väljer minst "
"%(number)s matchande produkter. Vi har därför tagit bort några positioner "
"från din varukorg som inte längre går att köpa så här."
#: pretix/base/services/cart.py:169
msgid ""
"This voucher code has already been used the maximum number of times allowed."
msgstr ""
msgstr "Denna kupongkod har redan använts det maximala antalet tillåtna gånger."
#: pretix/base/services/cart.py:171
#, python-format
@@ -7743,6 +7823,10 @@ msgid ""
"or that you tried to redeem it before but did not complete the checkout "
"process. You can try to use it again in %d minutes."
msgstr ""
"Denna kupongkod är för närvarande låst eftersom den redan finns i en "
"kundvagn. Det kan betyda att någon annan löser in den här kupongen just nu, "
"eller att du försökte lösa in den tidigare men inte slutförde "
"utcheckningsprocessen. Du kan försöka använda den igen om %d minuter."
#: pretix/base/services/cart.py:176
#, python-format
@@ -7798,15 +7882,15 @@ msgstr ""
#: pretix/base/services/cart.py:194
msgctxt "subevent"
msgid "The selected event date is not active."
msgstr ""
msgstr "Det valda händelsedatumet är inte aktivt."
#: pretix/base/services/cart.py:195 pretix/base/services/orders.py:189
msgid "You can not select an add-on for the selected product."
msgstr ""
msgstr "Du kan inte välja ett tillägg för den valda produkten."
#: pretix/base/services/cart.py:196 pretix/base/services/orders.py:190
msgid "You can not select two variations of the same add-on product."
msgstr ""
msgstr "Du kan inte välja två varianter av samma tilläggsprodukt."
#: pretix/base/services/cart.py:198 pretix/base/services/orders.py:192
#, python-format
@@ -7817,7 +7901,11 @@ msgid_plural ""
"You can select at most %(max)s add-ons from the category %(cat)s for the "
"product %(base)s."
msgstr[0] ""
"Du kan välja högst %(max)s tillägg från kategorin %(cat)s för produkten "
"%(base)s."
msgstr[1] ""
"Du kan välja högst %(max)s tillägg från kategorin %(cat)s för produkterna "
"%(base)s."
#: pretix/base/services/cart.py:203 pretix/base/services/orders.py:197
#, fuzzy, python-format
@@ -7853,15 +7941,15 @@ msgstr ""
#: pretix/base/services/cart.py:209
msgid "One of the products you selected can only be bought part of a bundle."
msgstr ""
msgstr "En av de produkter du valt kan endast köpas som en del av ett paket."
#: pretix/base/services/cart.py:211
msgid "Please select a valid seat."
msgstr ""
msgstr "Välj en giltig plats."
#: pretix/base/services/cart.py:212
msgid "You can not select a seat for this position."
msgstr ""
msgstr "Du kan inte välja en plats för denna plats."
#: pretix/base/services/cart.py:214
msgid "You can not select the same seat multiple times."
@@ -7912,7 +8000,7 @@ msgstr "Försäljningen har inte påbörjats"
#: pretix/base/services/checkin.py:289
msgid "Wrong entrance gate"
msgstr ""
msgstr "Fel ingång/entre"
#: pretix/base/services/checkin.py:313
#, fuzzy

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2022-04-25 16:10+0000\n"
"Last-Translator: fsnaix <truonggiangsn@gmail.com>\n"
"PO-Revision-Date: 2024-06-01 01:00+0000\n"
"Last-Translator: Luan Thien <vanthienluan@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 4.11.2\n"
"X-Generator: Weblate 5.5.5\n"
#: pretix/_base_settings.py:78
msgid "English"
msgstr ""
msgstr "Tiếng Anh"
#: pretix/_base_settings.py:79
msgid "German"
msgstr ""
msgstr "Tiếng Đức"
#: pretix/_base_settings.py:80
msgid "German (informal)"
msgstr ""
msgstr "Tiếng Đức (thân mật)"
#: pretix/_base_settings.py:81
msgid "Arabic"
msgstr ""
msgstr "Tiếng A-rập"
#: pretix/_base_settings.py:82
msgid "Chinese (simplified)"
msgstr ""
msgstr "Tiếng Trung (giản thể)"
#: pretix/_base_settings.py:83
msgid "Chinese (traditional)"
msgstr ""
msgstr "Tiếng Trung Quốc (phồn thể)"
#: pretix/_base_settings.py:84
msgid "Czech"
msgstr ""
msgstr "Tiếng Séc"
#: pretix/_base_settings.py:85
msgid "Danish"
msgstr ""
msgstr "Tiếng Đan Mạch"
#: pretix/_base_settings.py:86
msgid "Dutch"
msgstr ""
msgstr "Tiếng Hà Lan"
#: pretix/_base_settings.py:87
msgid "Dutch (informal)"
msgstr ""
msgstr "Tiếng Hà Lan (thân mật)"
#: pretix/_base_settings.py:88
msgid "French"
msgstr ""
msgstr "Tiếng Pháp"
#: pretix/_base_settings.py:89
msgid "Finnish"
msgstr ""
msgstr "Tiếng Phần Lan"
#: pretix/_base_settings.py:90
msgid "Galician"
msgstr ""
msgstr "Tiếng Galician"
#: pretix/_base_settings.py:91
msgid "Greek"
msgstr ""
msgstr "Tiếng Hy Lạp"
#: pretix/_base_settings.py:92
msgid "Indonesian"
msgstr ""
msgstr "Tiếng Indonesia"
#: pretix/_base_settings.py:93
msgid "Italian"
msgstr ""
msgstr "Tiếng Ý"
#: pretix/_base_settings.py:94
msgid "Latvian"
msgstr ""
msgstr "Tiếng Latvia"
#: pretix/_base_settings.py:95
msgid "Norwegian Bokmål"
msgstr ""
msgstr "Tiếng Na Uy"
#: pretix/_base_settings.py:96
msgid "Polish"
msgstr ""
msgstr "Tiếng Ba Lan"
#: pretix/_base_settings.py:97
msgid "Portuguese (Portugal)"
msgstr ""
msgstr "Tiếng Bồ Đào Nha"
#: pretix/_base_settings.py:98
msgid "Portuguese (Brazil)"
msgstr ""
msgstr "Tiếng Bồ Đào Nha (Brazil)"
#: pretix/_base_settings.py:99
msgid "Romanian"
msgstr ""
msgstr "Tiếng Ru-ma-ni"
#: pretix/_base_settings.py:100
msgid "Russian"
msgstr ""
msgstr "Tiếng Nga"
#: pretix/_base_settings.py:101
msgid "Spanish"
msgstr ""
msgstr "Tiếng Tây Ban Nha"
#: pretix/_base_settings.py:102
msgid "Turkish"
msgstr ""
msgstr "Tiếng Thổ Nhĩ Kỳ"
#: pretix/_base_settings.py:103
msgid "Ukrainian"
msgstr ""
msgstr "Tiếng Ukrainian"
#: 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 ""
msgstr "Bình luận"
#: 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 ""
msgstr "Một hoặc một vài mục không thuộc sự kiện này."
#: 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 ""
msgstr "Thuộc tính '{name}' không tồn tại."
#: 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 ""
msgstr "Thuộc tính '{name}' không chấp nhận giá trị '{value}'"
#: pretix/api/serializers/event.py:278
#, python-brace-format
msgid "Unknown plugin: '{name}'."
msgstr ""
msgstr "Không có plugin: '{name}'."
#: 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 ""
msgstr "Không tồn tại mục chứa thuộc tính '{name}'."
#: 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 ""
msgstr "Đã huỷ đơn hàng"
#: pretix/api/webhooks.py:242 pretix/base/notifications.py:257
msgid "Order reactivated"
@@ -969,7 +969,7 @@ msgstr ""
#: pretix/plugins/checkinlists/exporters.py:806
#: pretix/plugins/checkinlists/exporters.py:807
msgid "Yes"
msgstr ""
msgstr ""
#: pretix/base/exporters/customers.py:100
#: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83
@@ -992,7 +992,7 @@ msgstr ""
#: pretix/plugins/checkinlists/exporters.py:806
#: pretix/plugins/checkinlists/exporters.py:807
msgid "No"
msgstr ""
msgstr "Không"
#: 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 ""
msgstr "Sản phẩm"
#: 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 ""
msgstr "Đơn hàng đã thanh toán"
#: 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 ""
msgstr "Tất cả"
#: 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 ""
msgstr "Biến thể sản phẩm"
#: 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 ""
msgstr "Vào"
#: pretix/base/models/checkin.py:342
msgid "Exit"
msgstr ""
msgstr "Ra"
#: pretix/base/models/checkin.py:360
msgid "Unknown ticket"
msgstr ""
msgstr "Không nhận ra vé"
#: pretix/base/models/checkin.py:361
msgid "Ticket not paid"
msgstr ""
msgstr "Vé chưa thanh toán"
#: 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 ""
msgstr "Mã vé đã bị thu hồi / thay đổi"
#: pretix/base/models/checkin.py:364
msgid "Information required"
msgstr ""
msgstr "Thông tin được yêu cầu"
#: pretix/base/models/checkin.py:365
msgid "Ticket already used"
msgstr ""
msgstr "Vé đã được sử dụng"
#: pretix/base/models/checkin.py:366
msgid "Ticket type not allowed here"
msgstr ""
msgstr "Loại vé không được chấp nhập ở đây"
#: pretix/base/models/checkin.py:367
msgid "Ticket code is ambiguous on list"
msgstr ""
msgstr "Mã vé không rõ ràng trong danh sách"
#: pretix/base/models/checkin.py:368
msgid "Server error"
@@ -3737,15 +3737,15 @@ msgstr ""
#: pretix/base/models/checkin.py:369
msgid "Ticket blocked"
msgstr ""
msgstr "Vé đã bị khoá"
#: pretix/base/models/checkin.py:370
msgid "Order not approved"
msgstr ""
msgstr "Đơn hàng không được chấp nhận"
#: pretix/base/models/checkin.py:371
msgid "Ticket not valid at this time"
msgstr ""
msgstr "Vé không hợp lệ tại thời điểm này"
#: 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 ""
msgstr "Cổng"
#: 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 ""
msgstr "Đã huỷ"
#: 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 ""
msgstr "Đã đổi"
#: pretix/base/models/vouchers.py:206
msgid ""
@@ -6758,15 +6758,15 @@ msgstr ""
#: pretix/base/reldate.py:35
msgid "Event start"
msgstr ""
msgstr "Sự kiện bắt đầu"
#: pretix/base/reldate.py:36
msgid "Event end"
msgstr ""
msgstr "Sự kiện kết thúc"
#: pretix/base/reldate.py:37
msgid "Event admission"
msgstr ""
msgstr "Ghi danh sự kiện"
#: 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 ""
msgstr "phút"
#: 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 ""
msgstr "Truy vấn tìm kiếm"
#: 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 ""
msgstr "Hợp lệ"
#: 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 ""
msgstr "Tiếp tục"
#: 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 ""
msgstr "Huỷ"
#: 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 ""
msgstr "Kết quả"
#: 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 ""
msgstr "Yêu cầu thông tin bổ sung"
#: 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 ""
msgstr "Tổng cộng"
#: 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 ""
msgstr "Bình luận:"
#: 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 ""
msgstr "PayPal"
#: 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 ""
msgstr "giropay"
#: 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 ""
msgstr "iDEAL"
#: 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 ""
msgstr "Bancontact"
#: pretix/plugins/stripe/payment.py:371
msgid "SEPA Direct Debit"
msgstr ""
msgstr "Ghi nợ trực tiếp SEPA"
#: pretix/plugins/stripe/payment.py:374
msgid ""
@@ -26485,7 +26485,7 @@ msgstr ""
#: pretix/plugins/stripe/payment.py:398
msgid "SOFORT"
msgstr ""
msgstr "SOFORT"
#: 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 ""
msgstr "Thiết kế vé"
#: 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 ""
msgstr "Chúng tôi đang xử lý yêu cầu …"
#: 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 ""
msgstr "Kosovo"

View File

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

View File

@@ -187,7 +187,9 @@ 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.')
'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.')
)),
])
@@ -591,7 +593,12 @@ class BankTransfer(BasePaymentProvider):
except ValidationError:
return False
else:
return not any(iban.startswith(b) for b in (self.settings.refund_iban_blocklist or '').splitlines() if b)
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)
def payment_partial_refund_supported(self, payment: OrderPayment) -> bool:
return self.payment_refund_supported(payment)

View File

@@ -229,7 +229,10 @@ class Paypal(BasePaymentProvider):
kwargs['cart_namespace'] = request.resolver_match.kwargs['cart_namespace']
try:
if request.event.settings.payment_paypal_connect_user_id:
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')
try:
tokeninfo = Tokeninfo.create_with_refresh_token(request.event.settings.payment_paypal_connect_refresh_token)
except BadRequest as ex:

View File

@@ -30,6 +30,7 @@ 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
@@ -54,6 +55,7 @@ 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 (
@@ -522,10 +524,13 @@ class PaypalMethod(BasePaymentProvider):
kwargs['cart_namespace'] = request.resolver_match.kwargs['cart_namespace']
# ISU
if request.event.settings.payment_paypal_isu_merchant_id:
payee = {
"merchant_id": request.event.settings.payment_paypal_isu_merchant_id,
}
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 = {}
@@ -585,6 +590,9 @@ 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 '
@@ -617,7 +625,13 @@ 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 '
@@ -1089,6 +1103,8 @@ class PaypalAPM(PaypalMethod):
payment.save(update_fields=["provider"])
paypal_order = self._create_paypal_order(request, payment, None)
if not paypal_order:
raise PaymentException(_('We had trouble communicating with PayPal'))
payment.info = json.dumps(paypal_order.dict())
payment.save(update_fields=['info'])

View File

@@ -477,29 +477,35 @@ 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) \
and sale['status'] == 'COMPLETED':
any_captures = False
all_captures_completed = True
for purchaseunit in sale['purchase_units']:
for capture in purchaseunit['payments']['captures']:
try:
ReferencedPayPalObject.objects.get_or_create(order=payment.order, payment=payment,
reference=capture['id'])
except ReferencedPayPalObject.MultipleObjectsReturned:
pass
OrderPayment.PAYMENT_STATE_CANCELED, OrderPayment.PAYMENT_STATE_FAILED):
if sale['status'] == 'COMPLETED':
any_captures = False
all_captures_completed = True
for purchaseunit in sale['purchase_units']:
for capture in purchaseunit['payments']['captures']:
try:
ReferencedPayPalObject.objects.get_or_create(order=payment.order, payment=payment,
reference=capture['id'])
except ReferencedPayPalObject.MultipleObjectsReturned:
pass
if capture['status'] not in ('COMPLETED', 'REFUNDED', 'PARTIALLY_REFUNDED'):
all_captures_completed = False
else:
any_captures = True
if any_captures and all_captures_completed:
if capture['status'] not in ('COMPLETED', 'REFUNDED', 'PARTIALLY_REFUNDED'):
all_captures_completed = False
else:
any_captures = True
if any_captures and all_captures_completed:
try:
payment.info = json.dumps(sale.dict())
payment.save(update_fields=['info'])
payment.confirm()
except Quota.QuotaExceededException:
pass
elif sale['status'] == 'APPROVED':
request.session['payment_paypal_oid'] = payment.info_data['id']
try:
payment.info = json.dumps(sale.dict())
payment.save(update_fields=['info'])
payment.confirm()
except Quota.QuotaExceededException:
pass
payment.payment_provider.execute_payment(request, payment)
except PaymentException as e:
logger.exception('PayPal2 - Could not capture/execute_payment from Webhook: {}'.format(str(e)))
return HttpResponse(status=200)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -19,6 +19,9 @@
{% if social_image %}
<meta property="og:image" content="{{ social_image }}" />
{% endif %}
{% if event.settings.google_site_verification %}
<meta name="google-site-verification" content="{{ event.settings.google_site_verification }}" />
{% endif %}
{{ block.super }}
{% endblock %}
{% block above %}
@@ -68,15 +71,23 @@
{% block page %}
<div class="page-header{% if event_logo %} pager-header-with-logo{% endif %}{% if event_logo and event_logo_image_large %} logo-large{% endif %}">
<div class="{% if not event_logo or not event_logo_image_large %}pull-left flip{% endif %}">
{% if event_logo and not event_logo_show_title %}
<h1 class="sr-only">
{{ event.name }}
{% if request.event.settings.show_dates_on_frontpage and not event.has_subevents %}
<small>{{ event.get_date_range_display_as_html }}</small>
{% endif %}
</h1>
{% endif %}
{% if event_logo and event_logo_image_large %}
<a href="{% eventurl event "presale:event.index" cart_namespace=cart_namespace|default_if_none:"" %}"
aria-label="{% trans 'Homepage' %}" title="{% trans 'Homepage' %}">
<img src="{{ event_logo|thumb:'1170x5000' }}" alt="" class="event-logo" />
<img src="{{ event_logo|thumb:'1170x5000' }}" alt="{{ event.name }}" class="event-logo" />
</a>
{% elif event_logo %}
<a href="{% eventurl event "presale:event.index" cart_namespace=cart_namespace|default_if_none:"" %}"
aria-label="{% trans 'Homepage' %}" title="{% trans 'Homepage' %}">
<img src="{{ event_logo|thumb:'5000x120' }}" alt="" class="event-logo" />
<img src="{{ event_logo|thumb:'5000x120' }}" alt="{{ event.name }}" class="event-logo" />
</a>
{% else %}
<h1>

View File

@@ -12,6 +12,10 @@
<meta name="robots" content="noindex, nofollow">
{% endif %}
<meta property="og:type" content="website" />
{% if organizer.settings.google_site_verification %}
<meta name="google-site-verification" content="{{ organizer.settings.google_site_verification }}" />
{% endif %}
{{ block.super }}
{% endblock %}
{% block above %}
@@ -39,6 +43,11 @@
{% block page %}
<div class="page-header{% if organizer_logo %} pager-header-with-logo{% endif %}{% if organizer_logo and organizer.settings.organizer_logo_image_large %} logo-large{% endif %}">
<div class="{% if not organizer_logo or not organizer.settings.organizer_logo_image_large %}pull-left flip{% endif %}">
{% if organizer_logo %}
<h1 class="sr-only">
{{ organizer.name }}
</h1>
{% endif %}
{% if organizer_logo and organizer.settings.organizer_logo_image_large %}
<a href="{% eventurl organizer "presale:organizer.index" %}" title="{{ organizer.name }}">
<img src="{{ organizer_logo|thumb:'1170x5000' }}" alt="{{ organizer.name }}"

View File

@@ -348,15 +348,17 @@ 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:
if item.free_price and item.free_price_suggestion is not None and not voucher_reduced:
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
@@ -399,8 +401,10 @@ 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
@@ -408,10 +412,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:
if item.free_price and var.free_price_suggestion is not None and not voucher_reduced:
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:
elif item.free_price and item.free_price_suggestion is not None and not voucher_reduced:
var.suggested_price = item.tax(max(price, item.free_price_suggestion), currency=event.currency,
include_bundled=include_bundled)
else:

View File

@@ -19,60 +19,13 @@
# 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):
@@ -82,8 +35,6 @@ 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.
@@ -96,15 +47,6 @@ def _make_event_processor(weak_request, integration):
request.method,
url
)
# We want to scrub data not only from the request, but from traceback frames as well!
scrub_data(event.get("request", {}))
if 'exception' in event:
exc = event.get("exception", {})
for val in exc.get('values', []):
stack = val.get('stacktrace', {})
for frame in stack.get('frames', []):
scrub_data(frame['vars'])
return event
return event_processor

View File

@@ -629,15 +629,21 @@ 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', '')
@@ -649,7 +655,12 @@ 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(),
PretixSentryIntegration(
signals_denylist=[
django.db.models.signals.pre_init,
django.db.models.signals.post_init,
]
),
CeleryIntegration(),
LoggingIntegration(
level=logging.INFO,
@@ -659,6 +670,7 @@ if config.has_option('sentry', 'dsn') and not any(c in sys.argv for c in ('shell
traces_sampler=traces_sampler,
environment=urlparse(SITE_URL).netloc,
release=__version__,
event_scrubber=EventScrubber(denylist=pretix_denylist, recursive=True),
send_default_pii=False,
propagate_traces=False, # see https://github.com/getsentry/sentry-python/issues/1717
)

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

@@ -105,6 +105,8 @@ 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,
@@ -140,6 +142,8 @@ 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,
@@ -175,6 +179,8 @@ TEST_ORDERPOSITION3_RES = {
"id": 3,
"require_attention": False,
"order__status": "p",
"order__require_approval": False,
"order__valid_if_pending": False,
"order": "FOO",
"positionid": 3,
"item": 1,

View File

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

View File

@@ -28,7 +28,7 @@ from django_countries.fields import Country
from django_scopes import scopes_disabled
from pretix.base.models import (
InvoiceAddress, Order, OrderPosition, SeatingPlan, SubEvent,
InvoiceAddress, ItemVariation, 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 subevent.items.get(id=item.pk).default_price == Decimal('23.00')
assert event.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 subevent.variations.get(id=variations[0].pk).default_price == Decimal('12.00')
assert ItemVariation.objects.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(