Compare commits

..
217 changed files with 106856 additions and 136983 deletions
+2 -1
View File
@@ -10,7 +10,8 @@ tests:
- cd src - cd src
- python manage.py check - python manage.py check
- make all compress - make all compress
- PRETIX_CONFIG_FILE=tests/ci_sqlite.cfg py.test -n 3 tests --ignore=tests/e2e --maxfail=100 - playwright install
- PRETIX_CONFIG_FILE=tests/ci_sqlite.cfg py.test -n 3 tests --maxfail=100
except: except:
- '/^v.*$/' - '/^v.*$/'
pypi: pypi:
+1 -1
View File
@@ -81,7 +81,7 @@ is a python method that emulates a behavior similar to ``reverse``:
If you need to communicate the URL externally, you can use a different method to ensure that it is always an absolute URL: If you need to communicate the URL externally, you can use a different method to ensure that it is always an absolute URL:
.. autofunction:: pretix.multidomain.urlreverse.eventreverse_absolute .. autofunction:: pretix.multidomain.urlreverse.build_absolute_uri
In addition, there is a template tag that works similar to ``url`` but takes an event or organizer object In addition, there is a template tag that works similar to ``url`` but takes an event or organizer object
as its first argument and can be used like this:: as its first argument and can be used like this::
+91 -109
View File
@@ -370,14 +370,14 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@napi-rs/wasm-runtime": { "node_modules/@napi-rs/wasm-runtime": {
"version": "1.1.5", "version": "1.1.4",
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
"integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"@tybys/wasm-util": "^0.10.2" "@tybys/wasm-util": "^0.10.1"
}, },
"funding": { "funding": {
"type": "github", "type": "github",
@@ -427,9 +427,9 @@
} }
}, },
"node_modules/@oxc-project/types": { "node_modules/@oxc-project/types": {
"version": "0.133.0", "version": "0.129.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.129.0.tgz",
"integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", "integrity": "sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"funding": { "funding": {
@@ -758,9 +758,9 @@
} }
}, },
"node_modules/@rolldown/binding-android-arm64": { "node_modules/@rolldown/binding-android-arm64": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0.tgz",
"integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", "integrity": "sha512-TWMZnRLMe63C2Lhyicviu7ZHaU4kxa6PS3rofvc9GmcvptzNN11BcfQ4Sl7MwTOsisQoa2keB/EBdNCAnUo8vA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -775,9 +775,9 @@
} }
}, },
"node_modules/@rolldown/binding-darwin-arm64": { "node_modules/@rolldown/binding-darwin-arm64": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0.tgz",
"integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", "integrity": "sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -792,9 +792,9 @@
} }
}, },
"node_modules/@rolldown/binding-darwin-x64": { "node_modules/@rolldown/binding-darwin-x64": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0.tgz",
"integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", "integrity": "sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -809,9 +809,9 @@
} }
}, },
"node_modules/@rolldown/binding-freebsd-x64": { "node_modules/@rolldown/binding-freebsd-x64": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0.tgz",
"integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", "integrity": "sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -826,9 +826,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-arm-gnueabihf": { "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0.tgz",
"integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", "integrity": "sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@@ -843,16 +843,13 @@
} }
}, },
"node_modules/@rolldown/binding-linux-arm64-gnu": { "node_modules/@rolldown/binding-linux-arm64-gnu": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0.tgz",
"integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", "integrity": "sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -863,16 +860,13 @@
} }
}, },
"node_modules/@rolldown/binding-linux-arm64-musl": { "node_modules/@rolldown/binding-linux-arm64-musl": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0.tgz",
"integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", "integrity": "sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -883,16 +877,13 @@
} }
}, },
"node_modules/@rolldown/binding-linux-ppc64-gnu": { "node_modules/@rolldown/binding-linux-ppc64-gnu": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0.tgz",
"integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", "integrity": "sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg==",
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -903,16 +894,13 @@
} }
}, },
"node_modules/@rolldown/binding-linux-s390x-gnu": { "node_modules/@rolldown/binding-linux-s390x-gnu": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0.tgz",
"integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", "integrity": "sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA==",
"cpu": [ "cpu": [
"s390x" "s390x"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -923,16 +911,13 @@
} }
}, },
"node_modules/@rolldown/binding-linux-x64-gnu": { "node_modules/@rolldown/binding-linux-x64-gnu": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0.tgz",
"integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", "integrity": "sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -943,16 +928,13 @@
} }
}, },
"node_modules/@rolldown/binding-linux-x64-musl": { "node_modules/@rolldown/binding-linux-x64-musl": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0.tgz",
"integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", "integrity": "sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -963,9 +945,9 @@
} }
}, },
"node_modules/@rolldown/binding-openharmony-arm64": { "node_modules/@rolldown/binding-openharmony-arm64": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0.tgz",
"integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", "integrity": "sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -980,9 +962,9 @@
} }
}, },
"node_modules/@rolldown/binding-wasm32-wasi": { "node_modules/@rolldown/binding-wasm32-wasi": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0.tgz",
"integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", "integrity": "sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg==",
"cpu": [ "cpu": [
"wasm32" "wasm32"
], ],
@@ -999,9 +981,9 @@
} }
}, },
"node_modules/@rolldown/binding-win32-arm64-msvc": { "node_modules/@rolldown/binding-win32-arm64-msvc": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0.tgz",
"integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", "integrity": "sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1016,9 +998,9 @@
} }
}, },
"node_modules/@rolldown/binding-win32-x64-msvc": { "node_modules/@rolldown/binding-win32-x64-msvc": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0.tgz",
"integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", "integrity": "sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -3176,9 +3158,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/nanoid": { "node_modules/nanoid": {
"version": "3.3.12", "version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@@ -3352,9 +3334,9 @@
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.5.15", "version": "8.5.14",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
"integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -3371,7 +3353,7 @@
], ],
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"nanoid": "^3.3.12", "nanoid": "^3.3.11",
"picocolors": "^1.1.1", "picocolors": "^1.1.1",
"source-map-js": "^1.2.1" "source-map-js": "^1.2.1"
}, },
@@ -3628,14 +3610,14 @@
} }
}, },
"node_modules/rolldown": { "node_modules/rolldown": {
"version": "1.0.3", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0.tgz",
"integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", "integrity": "sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@oxc-project/types": "=0.133.0", "@oxc-project/types": "=0.129.0",
"@rolldown/pluginutils": "^1.0.0" "@rolldown/pluginutils": "1.0.0"
}, },
"bin": { "bin": {
"rolldown": "bin/cli.mjs" "rolldown": "bin/cli.mjs"
@@ -3644,27 +3626,27 @@
"node": "^20.19.0 || >=22.12.0" "node": "^20.19.0 || >=22.12.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"@rolldown/binding-android-arm64": "1.0.3", "@rolldown/binding-android-arm64": "1.0.0",
"@rolldown/binding-darwin-arm64": "1.0.3", "@rolldown/binding-darwin-arm64": "1.0.0",
"@rolldown/binding-darwin-x64": "1.0.3", "@rolldown/binding-darwin-x64": "1.0.0",
"@rolldown/binding-freebsd-x64": "1.0.3", "@rolldown/binding-freebsd-x64": "1.0.0",
"@rolldown/binding-linux-arm-gnueabihf": "1.0.3", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0",
"@rolldown/binding-linux-arm64-gnu": "1.0.3", "@rolldown/binding-linux-arm64-gnu": "1.0.0",
"@rolldown/binding-linux-arm64-musl": "1.0.3", "@rolldown/binding-linux-arm64-musl": "1.0.0",
"@rolldown/binding-linux-ppc64-gnu": "1.0.3", "@rolldown/binding-linux-ppc64-gnu": "1.0.0",
"@rolldown/binding-linux-s390x-gnu": "1.0.3", "@rolldown/binding-linux-s390x-gnu": "1.0.0",
"@rolldown/binding-linux-x64-gnu": "1.0.3", "@rolldown/binding-linux-x64-gnu": "1.0.0",
"@rolldown/binding-linux-x64-musl": "1.0.3", "@rolldown/binding-linux-x64-musl": "1.0.0",
"@rolldown/binding-openharmony-arm64": "1.0.3", "@rolldown/binding-openharmony-arm64": "1.0.0",
"@rolldown/binding-wasm32-wasi": "1.0.3", "@rolldown/binding-wasm32-wasi": "1.0.0",
"@rolldown/binding-win32-arm64-msvc": "1.0.3", "@rolldown/binding-win32-arm64-msvc": "1.0.0",
"@rolldown/binding-win32-x64-msvc": "1.0.3" "@rolldown/binding-win32-x64-msvc": "1.0.0"
} }
}, },
"node_modules/rolldown/node_modules/@rolldown/pluginutils": { "node_modules/rolldown/node_modules/@rolldown/pluginutils": {
"version": "1.0.1", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0.tgz",
"integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "integrity": "sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
@@ -4343,9 +4325,9 @@
} }
}, },
"node_modules/tinyglobby": { "node_modules/tinyglobby": {
"version": "0.2.17", "version": "0.2.16",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
"integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -4483,17 +4465,17 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "8.0.16", "version": "8.0.12",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.12.tgz",
"integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", "integrity": "sha512-w2dDofOWv2QB09ZITZBsvKTVAlYvPR4IAmrY/v0ir9KvLs0xybR7i48wxhM1/oyBWO34wPns+bPGw5ZrZqDpZg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"lightningcss": "^1.32.0", "lightningcss": "^1.32.0",
"picomatch": "^4.0.4", "picomatch": "^4.0.4",
"postcss": "^8.5.15", "postcss": "^8.5.14",
"rolldown": "1.0.3", "rolldown": "1.0.0",
"tinyglobby": "^0.2.17" "tinyglobby": "^0.2.16"
}, },
"bin": { "bin": {
"vite": "bin/vite.js" "vite": "bin/vite.js"
+5 -6
View File
@@ -33,8 +33,8 @@ dependencies = [
"bleach==6.4.*", "bleach==6.4.*",
"celery==5.6.*", "celery==5.6.*",
"chardet==5.2.*", "chardet==5.2.*",
"cryptography>=49.0.0", "cryptography>=48.0.1",
"css-inline==0.21.*", "css-inline==0.20.*",
"defusedcsv>=3.0.0", "defusedcsv>=3.0.0",
"dnspython==2.*", "dnspython==2.*",
"Django[argon2]==5.2.*", "Django[argon2]==5.2.*",
@@ -53,7 +53,6 @@ dependencies = [
"django-oauth-toolkit==2.3.*", "django-oauth-toolkit==2.3.*",
"django-otp==1.7.*", "django-otp==1.7.*",
"django-phonenumber-field==8.4.*", "django-phonenumber-field==8.4.*",
"django-querytagger==0.0.2",
"django-redis==6.0.*", "django-redis==6.0.*",
"django-scopes==2.0.*", "django-scopes==2.0.*",
"django-statici18n==2.7.*", "django-statici18n==2.7.*",
@@ -94,7 +93,7 @@ dependencies = [
"redis==7.4.*", "redis==7.4.*",
"reportlab==4.5.*", "reportlab==4.5.*",
"requests==2.32.*", "requests==2.32.*",
"sentry-sdk==2.64.*", "sentry-sdk==2.62.*",
"sepaxml==2.7.*", "sepaxml==2.7.*",
"stripe==7.9.*", "stripe==7.9.*",
"text-unidecode==1.*", "text-unidecode==1.*",
@@ -102,7 +101,7 @@ dependencies = [
"tqdm==4.*", "tqdm==4.*",
"ua-parser==1.0.*", "ua-parser==1.0.*",
"vobject==0.9.*", "vobject==0.9.*",
"webauthn==2.8.*", "webauthn==2.7.*",
"zeep==4.3.*" "zeep==4.3.*"
] ]
@@ -126,7 +125,7 @@ dev = [
"pytest-sugar", "pytest-sugar",
"pytest-xdist==3.8.*", "pytest-xdist==3.8.*",
"pytest-playwright", "pytest-playwright",
"pytest==9.1.*", "pytest==9.0.*",
"playwright", "playwright",
"responses", "responses",
] ]
+2 -2
View File
@@ -6,8 +6,8 @@ localecompile:
./manage.py compilemessages ./manage.py compilemessages
localegen: localegen:
./manage.py makemessages --keep-pot --add-location file --ignore "pretix/static/npm_dir/*" $(LNGS) ./manage.py makemessages --keep-pot --ignore "pretix/static/npm_dir/*" $(LNGS)
./manage.py makemessages --keep-pot --add-location file -e js,ts,vue -d djangojs --ignore "pretix/static/npm_dir/*" --ignore "pretix/helpers/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static.dist/*" --ignore "data/*" --ignore "pretix/static/rrule/*" --ignore "build/*" $(LNGS) ./manage.py makemessages --keep-pot -d djangojs --ignore "pretix/static/npm_dir/*" --ignore "pretix/helpers/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static.dist/*" --ignore "data/*" --ignore "pretix/static/rrule/*" --ignore "build/*" $(LNGS)
staticfiles: npminstall npmbuild jsi18n staticfiles: npminstall npmbuild jsi18n
./manage.py collectstatic --noinput ./manage.py collectstatic --noinput
+1 -1
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 # You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>. # <https://www.gnu.org/licenses/>.
# #
__version__ = "2026.7.0.dev0" __version__ = "2026.6.0.dev0"
-1
View File
@@ -118,7 +118,6 @@ ALL_LANGUAGES = [
('sv', _('Swedish')), ('sv', _('Swedish')),
('es', _('Spanish')), ('es', _('Spanish')),
('es-419', _('Spanish (Latin America)')), ('es-419', _('Spanish (Latin America)')),
('th', _('Thai')),
('tr', _('Turkish')), ('tr', _('Turkish')),
('uk', _('Ukrainian')), ('uk', _('Ukrainian')),
] ]
+2 -2
View File
@@ -73,7 +73,7 @@ from pretix.base.settings import (
LazyI18nStringList, validate_event_settings, LazyI18nStringList, validate_event_settings,
) )
from pretix.base.signals import api_event_settings_fields from pretix.base.signals import api_event_settings_fields
from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.multidomain.urlreverse import build_absolute_uri
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -173,7 +173,7 @@ class EventSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
) )
def get_event_url(self, event): def get_event_url(self, event):
return eventreverse_absolute(event, 'presale:event.index') return build_absolute_uri(event, 'presale:event.index')
class Meta: class Meta:
model = Event model = Event
+3 -3
View File
@@ -76,7 +76,7 @@ from pretix.base.settings import (
) )
from pretix.base.signals import register_ticket_outputs from pretix.base.signals import register_ticket_outputs
from pretix.helpers.countries import CachedCountries from pretix.helpers.countries import CachedCountries
from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.multidomain.urlreverse import build_absolute_uri
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -757,7 +757,7 @@ class PaymentURLField(serializers.URLField):
def to_representation(self, instance: OrderPayment): def to_representation(self, instance: OrderPayment):
if instance.state != OrderPayment.PAYMENT_STATE_CREATED: if instance.state != OrderPayment.PAYMENT_STATE_CREATED:
return None return None
return eventreverse_absolute(instance.order.event, 'presale:event.order.pay', kwargs={ return build_absolute_uri(instance.order.event, 'presale:event.order.pay', kwargs={
'order': instance.order.code, 'order': instance.order.code,
'secret': instance.order.secret, 'secret': instance.order.secret,
'payment': instance.pk, 'payment': instance.pk,
@@ -806,7 +806,7 @@ class OrderRefundSerializer(I18nAwareModelSerializer):
class OrderURLField(serializers.URLField): class OrderURLField(serializers.URLField):
def to_representation(self, instance: Order): def to_representation(self, instance: Order):
return eventreverse_absolute(instance.event, 'presale:event.order', kwargs={ return build_absolute_uri(instance.event, 'presale:event.order', kwargs={
'order': instance.code, 'order': instance.code,
'secret': instance.secret, 'secret': instance.secret,
}) })
+4 -4
View File
@@ -58,8 +58,8 @@ from pretix.helpers.permission_migration import (
OLD_TO_NEW_EVENT_COMPAT, OLD_TO_NEW_EVENT_MIGRATION, OLD_TO_NEW_EVENT_COMPAT, OLD_TO_NEW_EVENT_MIGRATION,
OLD_TO_NEW_ORGANIZER_COMPAT, OLD_TO_NEW_ORGANIZER_MIGRATION, OLD_TO_NEW_ORGANIZER_COMPAT, OLD_TO_NEW_ORGANIZER_MIGRATION,
) )
from pretix.helpers.urls import mainreverse_absolute from pretix.helpers.urls import build_absolute_uri as build_global_uri
from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.multidomain.urlreverse import build_absolute_uri
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -71,7 +71,7 @@ class OrganizerSerializer(I18nAwareModelSerializer):
slug = serializers.CharField(read_only=True) slug = serializers.CharField(read_only=True)
def get_organizer_url(self, organizer): def get_organizer_url(self, organizer):
return eventreverse_absolute(organizer, 'presale:organizer.index') return build_absolute_uri(organizer, 'presale:organizer.index')
class Meta: class Meta:
model = Organizer model = Organizer
@@ -499,7 +499,7 @@ class TeamInviteSerializer(serializers.ModelSerializer):
'user': self, 'user': self,
'organizer': self.context['organizer'].name, 'organizer': self.context['organizer'].name,
'team': instance.team.name, 'team': instance.team.name,
'url': mainreverse_absolute('control:auth.invite', kwargs={ 'url': build_global_uri('control:auth.invite', kwargs={
'token': instance.token 'token': instance.token
}) })
}, },
-1
View File
@@ -872,7 +872,6 @@ def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force,
'media_policy': e.media_policy, 'media_policy': e.media_policy,
'media_type': e.media_type, 'media_type': e.media_type,
'list': MiniCheckinListSerializer(list_by_event[op.order.event_id]).data, 'list': MiniCheckinListSerializer(list_by_event[op.order.event_id]).data,
'reason': e.code,
'reason_explanation': e.msg, 'reason_explanation': e.msg,
}, status=400) }, status=400)
except CheckInError as e: except CheckInError as e:
+2 -2
View File
@@ -36,7 +36,7 @@ from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from requests import RequestException from requests import RequestException
from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.multidomain.urlreverse import build_absolute_uri
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -313,7 +313,7 @@ def _get_or_create_server_keypair(organizer):
def generate_id_token(customer, client, auth_time, nonce, scope, expires: datetime, scope_claims=False, with_code=None, with_access_token=None): def generate_id_token(customer, client, auth_time, nonce, scope, expires: datetime, scope_claims=False, with_code=None, with_access_token=None):
payload = { payload = {
'iss': eventreverse_absolute(client.organizer, 'presale:organizer.index').rstrip('/'), 'iss': build_absolute_uri(client.organizer, 'presale:organizer.index').rstrip('/'),
'aud': client.client_id, 'aud': client.client_id,
'exp': int(expires.timestamp()), 'exp': int(expires.timestamp()),
'iat': int(time.time()), 'iat': int(time.time()),
+3 -3
View File
@@ -28,7 +28,7 @@ from django.utils.translation import gettext_lazy as _, pgettext_lazy
from pretix.base.models import Checkin, InvoiceAddress, Order, Question from pretix.base.models import Checkin, InvoiceAddress, Order, Question
from pretix.base.settings import PERSON_NAME_SCHEMES from pretix.base.settings import PERSON_NAME_SCHEMES
from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.multidomain.urlreverse import build_absolute_uri
def get_answer(op, question_identifier=None): def get_answer(op, question_identifier=None):
@@ -545,7 +545,7 @@ def get_data_fields(event, for_model=None):
_("Order link"), _("Order link"),
Question.TYPE_STRING, Question.TYPE_STRING,
None, None,
lambda order: eventreverse_absolute( lambda order: build_absolute_uri(
event, event,
'presale:event.order', kwargs={ 'presale:event.order', kwargs={
'order': order.code, 'order': order.code,
@@ -560,7 +560,7 @@ def get_data_fields(event, for_model=None):
_("Ticket link"), _("Ticket link"),
Question.TYPE_STRING, Question.TYPE_STRING,
None, None,
lambda op: eventreverse_absolute( lambda op: build_absolute_uri(
event, event,
'presale:event.order.position', kwargs={ 'presale:event.order.position', kwargs={
'order': op.order.code, 'order': op.order.code,
-5
View File
@@ -57,8 +57,6 @@ logger = logging.getLogger('pretix.base.email')
T = TypeVar("T", bound=EmailBackend) T = TypeVar("T", bound=EmailBackend)
_cgnat_net = ipaddress.ip_network('100.64.0.0/10')
def test_custom_smtp_backend(backend: T, from_addr: str) -> None: def test_custom_smtp_backend(backend: T, from_addr: str) -> None:
try: try:
@@ -255,15 +253,12 @@ def create_connection(address, timeout=socket.getdefaulttimeout(),
if not getattr(settings, "MAIL_CUSTOM_SMTP_ALLOW_PRIVATE_NETWORKS", False): if not getattr(settings, "MAIL_CUSTOM_SMTP_ALLOW_PRIVATE_NETWORKS", False):
ip_addr = ipaddress.ip_address(sa[0]) ip_addr = ipaddress.ip_address(sa[0])
check_ip4 = ip_addr.ipv4_mapped if getattr(ip_addr, "ipv4_mapped", None) else ip_addr
if ip_addr.is_multicast: if ip_addr.is_multicast:
raise socket.error(f"Request to multicast address {sa[0]} blocked") raise socket.error(f"Request to multicast address {sa[0]} blocked")
if ip_addr.is_loopback or ip_addr.is_link_local: if ip_addr.is_loopback or ip_addr.is_link_local:
raise socket.error(f"Request to local address {sa[0]} blocked") raise socket.error(f"Request to local address {sa[0]} blocked")
if ip_addr.is_private: if ip_addr.is_private:
raise socket.error(f"Request to private address {sa[0]} blocked") raise socket.error(f"Request to private address {sa[0]} blocked")
if check_ip4 in _cgnat_net:
raise socket.error(f"Request to RFC 6598 address {sa[0]} blocked")
sock = None sock = None
try: try:
+3 -3
View File
@@ -68,7 +68,7 @@ from ...control.forms.filter import get_all_payment_providers
from ...helpers import GroupConcat from ...helpers import GroupConcat
from ...helpers.iter import chunked_iterable from ...helpers.iter import chunked_iterable
from ...helpers.safe_openpyxl import remove_invalid_excel_chars from ...helpers.safe_openpyxl import remove_invalid_excel_chars
from ...multidomain.urlreverse import eventreverse_absolute from ...multidomain.urlreverse import build_absolute_uri
from ..exporter import ( from ..exporter import (
ListExporter, MultiSheetListExporter, OrganizerLevelExportMixin, ListExporter, MultiSheetListExporter, OrganizerLevelExportMixin,
) )
@@ -429,7 +429,7 @@ class OrderListExporter(MultiSheetListExporter):
])) ]))
row.append( row.append(
eventreverse_absolute(order.event, 'presale:event.order', kwargs={ build_absolute_uri(order.event, 'presale:event.order', kwargs={
'order': order.code, 'order': order.code,
'secret': order.secret, 'secret': order.secret,
}) })
@@ -855,7 +855,7 @@ class OrderListExporter(MultiSheetListExporter):
])) ]))
row.append( row.append(
eventreverse_absolute(order.event, 'presale:event.order.position', kwargs={ build_absolute_uri(order.event, 'presale:event.order.position', kwargs={
'order': order.code, 'order': order.code,
'secret': op.web_secret, 'secret': op.web_secret,
'position': op.positionid 'position': op.positionid
+90 -76
View File
@@ -22,7 +22,9 @@
import datetime import datetime
import logging import logging
import math import math
import re
import textwrap import textwrap
import unicodedata
from collections import defaultdict from collections import defaultdict
from decimal import Decimal from decimal import Decimal
from io import BytesIO from io import BytesIO
@@ -56,8 +58,8 @@ from pretix.base.services.currencies import SOURCE_NAMES
from pretix.base.signals import register_invoice_renderers from pretix.base.signals import register_invoice_renderers
from pretix.base.templatetags.money import money_filter from pretix.base.templatetags.money import money_filter
from pretix.helpers.reportlab import ( from pretix.helpers.reportlab import (
FontFallbackParagraph, PlainTextParagraph, ThumbnailingImageReader, FontFallbackParagraph, ThumbnailingImageReader, register_ttf_font_if_new,
normalize_text, register_ttf_font_if_new, reshaper, reshaper,
) )
from pretix.presale.style import get_fonts from pretix.presale.style import get_fonts
@@ -257,8 +259,18 @@ class BaseReportlabInvoiceRenderer(BaseInvoiceRenderer):
register_ttf_font_if_new(family + ' B I', finders.find(styles['bolditalic']['truetype'])) register_ttf_font_if_new(family + ' B I', finders.find(styles['bolditalic']['truetype']))
def _normalize(self, text): def _normalize(self, text):
# alias kept for plugin compatibility # reportlab does not support unicode combination characters
return normalize_text(text) # It's important we do this before we use ArabicReshaper
text = unicodedata.normalize("NFKC", text)
# reportlab does not support RTL, ligature-heavy scripts like Arabic. Therefore, we use ArabicReshaper
# to resolve all ligatures and python-bidi to switch RTL texts.
try:
text = "<br />".join(get_display(reshaper.reshape(l)) for l in re.split("<br ?/>", text))
except:
logger.exception('Reshaping/Bidi fixes failed on string {}'.format(repr(text)))
return text
def _upper(self, val): def _upper(self, val):
# We uppercase labels, but not in every language # We uppercase labels, but not in every language
@@ -339,15 +351,10 @@ class BaseReportlabInvoiceRenderer(BaseInvoiceRenderer):
return 'invoice.pdf', 'application/pdf', buffer.read() return 'invoice.pdf', 'application/pdf', buffer.read()
def _clean_text(self, text, tags=None): def _clean_text(self, text, tags=None):
# For backwards compatibility with customer content, we need to support tags like <br> and <b> in a few text return self._normalize(bleach.clean(
# fields. Therefore, we can't use PlainTextParagraph for these, but run bleach instead to limit the allowed text,
# tags. tags=set(tags) if tags else set()
return self._normalize( ).strip().replace('<br>', '<br />').replace('\n', '<br />\n'))
bleach.clean(
text,
tags=set(tags) if tags else set()
).strip().replace('<br>', '<br />').replace('\n', '<br />\n')
)
class PaidMarker(Flowable): class PaidMarker(Flowable):
@@ -398,7 +405,8 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
invoice_to_top = 52 * mm invoice_to_top = 52 * mm
def _draw_invoice_to(self, canvas): def _draw_invoice_to(self, canvas):
p = PlainTextParagraph(self.invoice.address_invoice_to, style=self.stylesheet['Normal']) p = FontFallbackParagraph(self._clean_text(self.invoice.address_invoice_to),
style=self.stylesheet['Normal'])
p.wrapOn(canvas, self.invoice_to_width, self.invoice_to_height) p.wrapOn(canvas, self.invoice_to_width, self.invoice_to_height)
p_size = p.wrap(self.invoice_to_width, self.invoice_to_height) p_size = p.wrap(self.invoice_to_width, self.invoice_to_height)
p.drawOn(canvas, self.invoice_to_left, self.pagesize[1] - p_size[1] - self.invoice_to_top) p.drawOn(canvas, self.invoice_to_left, self.pagesize[1] - p_size[1] - self.invoice_to_top)
@@ -409,8 +417,8 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
invoice_from_top = 17 * mm invoice_from_top = 17 * mm
def _draw_invoice_from(self, canvas): def _draw_invoice_from(self, canvas):
p = PlainTextParagraph( p = FontFallbackParagraph(
self.invoice.full_invoice_from, self._clean_text(self.invoice.full_invoice_from),
style=self.stylesheet['InvoiceFrom'] style=self.stylesheet['InvoiceFrom']
) )
p.wrapOn(canvas, self.invoice_from_width, self.invoice_from_height) p.wrapOn(canvas, self.invoice_from_width, self.invoice_from_height)
@@ -540,12 +548,13 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
def _draw_event(self, canvas): def _draw_event(self, canvas):
def shorten(txt): def shorten(txt):
txt = str(txt) txt = str(txt)
p = PlainTextParagraph(txt, style=self.stylesheet['Normal']) txt = bleach.clean(txt, tags=set()).strip()
p = FontFallbackParagraph(self._normalize(txt.strip().replace('\n', '<br />\n')), style=self.stylesheet['Normal'])
p_size = p.wrap(self.event_width, self.event_height) p_size = p.wrap(self.event_width, self.event_height)
while p_size[1] > 2 * self.stylesheet['Normal'].leading: while p_size[1] > 2 * self.stylesheet['Normal'].leading:
txt = ' '.join(txt.replace('', '').split()[:-1]) + '' txt = ' '.join(txt.replace('', '').split()[:-1]) + ''
p = PlainTextParagraph(txt, style=self.stylesheet['Normal']) p = FontFallbackParagraph(self._normalize(txt.strip().replace('\n', '<br />\n')), style=self.stylesheet['Normal'])
p_size = p.wrap(self.event_width, self.event_height) p_size = p.wrap(self.event_width, self.event_height)
return txt return txt
@@ -563,7 +572,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
else: else:
p_str = shorten(self.invoice.event.name) p_str = shorten(self.invoice.event.name)
p = PlainTextParagraph(p_str, style=self.stylesheet['Normal']) p = FontFallbackParagraph(self._normalize(p_str.strip().replace('\n', '<br />\n')), style=self.stylesheet['Normal'])
p.wrapOn(canvas, self.event_width, self.event_height) p.wrapOn(canvas, self.event_width, self.event_height)
p_size = p.wrap(self.event_width, self.event_height) p_size = p.wrap(self.event_width, self.event_height)
p.drawOn(canvas, self.event_left, self.pagesize[1] - self.event_top - p_size[1]) p.drawOn(canvas, self.event_left, self.pagesize[1] - self.event_top - p_size[1])
@@ -636,37 +645,39 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
type_info_text = self.invoice.transmission_type_instance.pdf_info_text() type_info_text = self.invoice.transmission_type_instance.pdf_info_text()
if type_info_text: if type_info_text:
story.append(PlainTextParagraph( story.append(FontFallbackParagraph(
type_info_text, type_info_text,
self.stylesheet['WarningBlock'] self.stylesheet['WarningBlock']
)) ))
if self.invoice.custom_field: if self.invoice.custom_field:
story.append(PlainTextParagraph( story.append(FontFallbackParagraph(
'{}: {}'.format( '{}: {}'.format(
str(self.invoice.event.settings.invoice_address_custom_field), self._clean_text(str(self.invoice.event.settings.invoice_address_custom_field)),
self.invoice.custom_field, self._clean_text(self.invoice.custom_field),
), ),
self.stylesheet['Normal'] self.stylesheet['Normal']
)) ))
if self.invoice.internal_reference: if self.invoice.internal_reference:
story.append(PlainTextParagraph( story.append(FontFallbackParagraph(
pgettext('invoice', 'Customer reference: {reference}').format( self._normalize(pgettext('invoice', 'Customer reference: {reference}').format(
reference=self.invoice.internal_reference, reference=self._clean_text(self.invoice.internal_reference),
), )),
self.stylesheet['Normal'] self.stylesheet['Normal']
)) ))
if self.invoice.invoice_to_vat_id: if self.invoice.invoice_to_vat_id:
story.append(PlainTextParagraph( story.append(FontFallbackParagraph(
pgettext('invoice', 'Customer VAT ID') + ': ' + self.invoice.invoice_to_vat_id, self._normalize(pgettext('invoice', 'Customer VAT ID')) + ': ' +
self._clean_text(self.invoice.invoice_to_vat_id),
self.stylesheet['Normal'] self.stylesheet['Normal']
)) ))
if self.invoice.invoice_to_beneficiary: if self.invoice.invoice_to_beneficiary:
story.append(PlainTextParagraph( story.append(FontFallbackParagraph(
pgettext('invoice', 'Beneficiary') + ':\n' + self.invoice.invoice_to_beneficiary, self._normalize(pgettext('invoice', 'Beneficiary')) + ':<br />' +
self._clean_text(self.invoice.invoice_to_beneficiary),
self.stylesheet['Normal'] self.stylesheet['Normal']
)) ))
@@ -696,11 +707,11 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
story = [ story = [
NextPageTemplate('FirstPage'), NextPageTemplate('FirstPage'),
PlainTextParagraph( FontFallbackParagraph(
( self._normalize(
pgettext('invoice', 'Tax Invoice') if str(self.invoice.invoice_from_country) == 'AU' pgettext('invoice', 'Tax Invoice') if str(self.invoice.invoice_from_country) == 'AU'
else pgettext('invoice', 'Invoice') else pgettext('invoice', 'Invoice')
) if not self.invoice.is_cancellation else pgettext('invoice', 'Cancellation'), ) if not self.invoice.is_cancellation else self._normalize(pgettext('invoice', 'Cancellation')),
self.stylesheet['Heading1'] self.stylesheet['Heading1']
), ),
Spacer(1, 5 * mm), Spacer(1, 5 * mm),
@@ -722,17 +733,17 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
] ]
if has_taxes: if has_taxes:
tdata = [( tdata = [(
PlainTextParagraph(pgettext('invoice', 'Description'), self.stylesheet['Bold']), FontFallbackParagraph(self._normalize(pgettext('invoice', 'Description')), self.stylesheet['Bold']),
PlainTextParagraph(pgettext('invoice', 'Qty'), self.stylesheet['BoldRightNoSplit']), FontFallbackParagraph(self._normalize(pgettext('invoice', 'Qty')), self.stylesheet['BoldRightNoSplit']),
PlainTextParagraph(pgettext('invoice', 'Tax rate'), self.stylesheet['BoldRightNoSplit']), FontFallbackParagraph(self._normalize(pgettext('invoice', 'Tax rate')), self.stylesheet['BoldRightNoSplit']),
PlainTextParagraph(pgettext('invoice', 'Net'), self.stylesheet['BoldRightNoSplit']), FontFallbackParagraph(self._normalize(pgettext('invoice', 'Net')), self.stylesheet['BoldRightNoSplit']),
PlainTextParagraph(pgettext('invoice', 'Gross'), self.stylesheet['BoldRightNoSplit']), FontFallbackParagraph(self._normalize(pgettext('invoice', 'Gross')), self.stylesheet['BoldRightNoSplit']),
)] )]
else: else:
tdata = [( tdata = [(
PlainTextParagraph(pgettext('invoice', 'Description'), self.stylesheet['Bold']), FontFallbackParagraph(self._normalize(pgettext('invoice', 'Description')), self.stylesheet['Bold']),
PlainTextParagraph(pgettext('invoice', 'Qty'), self.stylesheet['BoldRightNoSplit']), FontFallbackParagraph(self._normalize(pgettext('invoice', 'Qty')), self.stylesheet['BoldRightNoSplit']),
PlainTextParagraph(pgettext('invoice', 'Amount'), self.stylesheet['BoldRightNoSplit']), FontFallbackParagraph(self._normalize(pgettext('invoice', 'Amount')), self.stylesheet['BoldRightNoSplit']),
)] )]
def _group_key(line): def _group_key(line):
@@ -769,8 +780,8 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
max_height = self.stylesheet['Normal'].leading * 5 max_height = self.stylesheet['Normal'].leading * 5
p_style = self.stylesheet['Normal'] p_style = self.stylesheet['Normal']
for __ in range(1000): for __ in range(1000):
p = PlainTextParagraph( p = FontFallbackParagraph(
curr_description, self._clean_text(curr_description, tags=['br']),
p_style p_style
) )
h = p.wrap(max_width, doc.height)[1] h = p.wrap(max_width, doc.height)[1]
@@ -851,7 +862,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
# Group together at the end of the invoice # Group together at the end of the invoice
request_show_service_date = period_line request_show_service_date = period_line
elif period_line: elif period_line:
description_p_list.append(PlainTextParagraph( description_p_list.append(FontFallbackParagraph(
period_line, period_line,
self.stylesheet['Fineprint'] self.stylesheet['Fineprint']
)) ))
@@ -863,7 +874,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
net_price=money_filter(net_value, self.invoice.event.currency), net_price=money_filter(net_value, self.invoice.event.currency),
gross_price=money_filter(gross_value, self.invoice.event.currency), gross_price=money_filter(gross_value, self.invoice.event.currency),
) )
description_p_list.append(PlainTextParagraph( description_p_list.append(FontFallbackParagraph(
single_price_line, single_price_line,
self.stylesheet['Fineprint'] self.stylesheet['Fineprint']
)) ))
@@ -872,11 +883,11 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
description_p_list.pop(0), description_p_list.pop(0),
str(len(lines)), str(len(lines)),
localize(tax_rate) + " %", localize(tax_rate) + " %",
PlainTextParagraph( FontFallbackParagraph(
money_filter(net_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '), money_filter(net_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '),
self.stylesheet['NormalRight'] self.stylesheet['NormalRight']
), ),
PlainTextParagraph( FontFallbackParagraph(
money_filter(gross_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '), money_filter(gross_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '),
self.stylesheet['NormalRight'] self.stylesheet['NormalRight']
), ),
@@ -893,14 +904,14 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
single_price_line = pgettext('invoice', 'Single price: {price}').format( single_price_line = pgettext('invoice', 'Single price: {price}').format(
price=money_filter(gross_value, self.invoice.event.currency), price=money_filter(gross_value, self.invoice.event.currency),
) )
description_p_list.append(PlainTextParagraph( description_p_list.append(FontFallbackParagraph(
single_price_line, single_price_line,
self.stylesheet['Fineprint'] self.stylesheet['Fineprint']
)) ))
tdata.append(( tdata.append((
description_p_list.pop(0), description_p_list.pop(0),
str(len(lines)), str(len(lines)),
PlainTextParagraph( FontFallbackParagraph(
money_filter(gross_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '), money_filter(gross_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '),
self.stylesheet['NormalRight'] self.stylesheet['NormalRight']
), ),
@@ -933,12 +944,12 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
if has_taxes: if has_taxes:
tdata.append([ tdata.append([
PlainTextParagraph(pgettext('invoice', 'Invoice total'), self.stylesheet['Bold']), '', '', '', FontFallbackParagraph(self._normalize(pgettext('invoice', 'Invoice total')), self.stylesheet['Bold']), '', '', '',
money_filter(total, self.invoice.event.currency) money_filter(total, self.invoice.event.currency)
]) ])
else: else:
tdata.append([ tdata.append([
PlainTextParagraph(pgettext('invoice', 'Invoice total'), self.stylesheet['Bold']), '', FontFallbackParagraph(self._normalize(pgettext('invoice', 'Invoice total')), self.stylesheet['Bold']), '',
money_filter(total, self.invoice.event.currency) money_filter(total, self.invoice.event.currency)
]) ])
@@ -947,12 +958,12 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
pending_sum = self.invoice.order.pending_sum pending_sum = self.invoice.order.pending_sum
if pending_sum != total: if pending_sum != total:
tdata.append( tdata.append(
[PlainTextParagraph(pgettext('invoice', 'Received payments'), self.stylesheet['Normal'])] + [FontFallbackParagraph(self._normalize(pgettext('invoice', 'Received payments')), self.stylesheet['Normal'])] +
(['', '', ''] if has_taxes else ['']) + (['', '', ''] if has_taxes else ['']) +
[money_filter(pending_sum - total, self.invoice.event.currency)] [money_filter(pending_sum - total, self.invoice.event.currency)]
) )
tdata.append( tdata.append(
[PlainTextParagraph(pgettext('invoice', 'Outstanding payments'), self.stylesheet['Bold'])] + [FontFallbackParagraph(self._normalize(pgettext('invoice', 'Outstanding payments')), self.stylesheet['Bold'])] +
(['', '', ''] if has_taxes else ['']) + (['', '', ''] if has_taxes else ['']) +
[money_filter(pending_sum, self.invoice.event.currency)] [money_filter(pending_sum, self.invoice.event.currency)]
) )
@@ -969,12 +980,12 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
s=Sum('amount') s=Sum('amount')
)['s'] or Decimal('0.00') )['s'] or Decimal('0.00')
tdata.append( tdata.append(
[PlainTextParagraph(pgettext('invoice', 'Paid by gift card'), self.stylesheet['Normal'])] + [FontFallbackParagraph(self._normalize(pgettext('invoice', 'Paid by gift card')), self.stylesheet['Normal'])] +
(['', '', ''] if has_taxes else ['']) + (['', '', ''] if has_taxes else ['']) +
[money_filter(giftcard_sum, self.invoice.event.currency)] [money_filter(giftcard_sum, self.invoice.event.currency)]
) )
tdata.append( tdata.append(
[PlainTextParagraph(pgettext('invoice', 'Remaining amount'), self.stylesheet['Bold'])] + [FontFallbackParagraph(self._normalize(pgettext('invoice', 'Remaining amount')), self.stylesheet['Bold'])] +
(['', '', ''] if has_taxes else ['']) + (['', '', ''] if has_taxes else ['']) +
[money_filter(total - giftcard_sum, self.invoice.event.currency)] [money_filter(total - giftcard_sum, self.invoice.event.currency)]
) )
@@ -997,14 +1008,14 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
story.append(Spacer(1, 10 * mm)) story.append(Spacer(1, 10 * mm))
if request_show_service_date: if request_show_service_date:
story.append(PlainTextParagraph( story.append(FontFallbackParagraph(
pgettext('invoice', 'Invoice period: {daterange}').format(daterange=request_show_service_date), self._normalize(pgettext('invoice', 'Invoice period: {daterange}').format(daterange=request_show_service_date)),
self.stylesheet['Normal'] self.stylesheet['Normal']
)) ))
if self.invoice.payment_provider_text: if self.invoice.payment_provider_text:
story.append(FontFallbackParagraph( story.append(FontFallbackParagraph(
self._clean_text(self.invoice.payment_provider_text, tags=['br', 'b']), self._normalize(self.invoice.payment_provider_text),
self.stylesheet['Normal'] self.stylesheet['Normal']
)) ))
@@ -1028,10 +1039,10 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
('FONTNAME', (0, 0), (-1, -1), self.font_regular), ('FONTNAME', (0, 0), (-1, -1), self.font_regular),
] ]
thead = [ thead = [
PlainTextParagraph(pgettext('invoice', 'Tax rate'), self.stylesheet['Fineprint']), FontFallbackParagraph(self._normalize(pgettext('invoice', 'Tax rate')), self.stylesheet['Fineprint']),
PlainTextParagraph(pgettext('invoice', 'Net value'), self.stylesheet['FineprintRight']), FontFallbackParagraph(self._normalize(pgettext('invoice', 'Net value')), self.stylesheet['FineprintRight']),
PlainTextParagraph(pgettext('invoice', 'Gross value'), self.stylesheet['FineprintRight']), FontFallbackParagraph(self._normalize(pgettext('invoice', 'Gross value')), self.stylesheet['FineprintRight']),
PlainTextParagraph(pgettext('invoice', 'Tax'), self.stylesheet['FineprintRight']), FontFallbackParagraph(self._normalize(pgettext('invoice', 'Tax')), self.stylesheet['FineprintRight']),
'' ''
] ]
tdata = [thead] tdata = [thead]
@@ -1042,7 +1053,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
continue continue
tax = taxvalue_map[idx] tax = taxvalue_map[idx]
tdata.append([ tdata.append([
PlainTextParagraph(localize(rate) + " % " + name, self.stylesheet['Fineprint']), FontFallbackParagraph(self._normalize(localize(rate) + " % " + name), self.stylesheet['Fineprint']),
money_filter(gross - tax, self.invoice.event.currency), money_filter(gross - tax, self.invoice.event.currency),
money_filter(gross, self.invoice.event.currency), money_filter(gross, self.invoice.event.currency),
money_filter(tax, self.invoice.event.currency), money_filter(tax, self.invoice.event.currency),
@@ -1061,7 +1072,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
table.setStyle(TableStyle(tstyledata)) table.setStyle(TableStyle(tstyledata))
story.append(Spacer(5 * mm, 5 * mm)) story.append(Spacer(5 * mm, 5 * mm))
story.append(KeepTogether([ story.append(KeepTogether([
PlainTextParagraph(pgettext('invoice', 'Included taxes'), self.stylesheet['FineprintHeading']), FontFallbackParagraph(self._normalize(pgettext('invoice', 'Included taxes')), self.stylesheet['FineprintHeading']),
table table
])) ]))
@@ -1078,7 +1089,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
net = gross - tax net = gross - tax
tdata.append([ tdata.append([
PlainTextParagraph(localize(rate) + " % " + name, self.stylesheet['Fineprint']), FontFallbackParagraph(self._normalize(localize(rate) + " % " + name), self.stylesheet['Fineprint']),
fmt(net), fmt(gross), fmt(tax), '' fmt(net), fmt(gross), fmt(tax), ''
]) ])
@@ -1087,13 +1098,13 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
story.append(KeepTogether([ story.append(KeepTogether([
Spacer(1, height=2 * mm), Spacer(1, height=2 * mm),
PlainTextParagraph( FontFallbackParagraph(
pgettext( self._normalize(pgettext(
'invoice', 'Using the conversion rate of 1:{rate} as published by the {authority} on ' 'invoice', 'Using the conversion rate of 1:{rate} as published by the {authority} on '
'{date}, this corresponds to:' '{date}, this corresponds to:'
).format(rate=localize(self.invoice.foreign_currency_rate), ).format(rate=localize(self.invoice.foreign_currency_rate),
authority=SOURCE_NAMES.get(self.invoice.foreign_currency_source, "?"), authority=SOURCE_NAMES.get(self.invoice.foreign_currency_source, "?"),
date=date_format(self.invoice.foreign_currency_rate_date, "SHORT_DATE_FORMAT")), date=date_format(self.invoice.foreign_currency_rate_date, "SHORT_DATE_FORMAT"))),
self.stylesheet['Fineprint'] self.stylesheet['Fineprint']
), ),
Spacer(1, height=3 * mm), Spacer(1, height=3 * mm),
@@ -1102,14 +1113,14 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
elif self.invoice.foreign_currency_display and self.invoice.foreign_currency_rate: elif self.invoice.foreign_currency_display and self.invoice.foreign_currency_rate:
foreign_total = round_decimal(total * self.invoice.foreign_currency_rate) foreign_total = round_decimal(total * self.invoice.foreign_currency_rate)
story.append(Spacer(1, 5 * mm)) story.append(Spacer(1, 5 * mm))
story.append(PlainTextParagraph( story.append(FontFallbackParagraph(self._normalize(
pgettext( pgettext(
'invoice', 'Using the conversion rate of 1:{rate} as published by the {authority} on ' 'invoice', 'Using the conversion rate of 1:{rate} as published by the {authority} on '
'{date}, the invoice total corresponds to {total}.' '{date}, the invoice total corresponds to {total}.'
).format(rate=localize(self.invoice.foreign_currency_rate), ).format(rate=localize(self.invoice.foreign_currency_rate),
date=date_format(self.invoice.foreign_currency_rate_date, "SHORT_DATE_FORMAT"), date=date_format(self.invoice.foreign_currency_rate_date, "SHORT_DATE_FORMAT"),
authority=SOURCE_NAMES.get(self.invoice.foreign_currency_source, "?"), authority=SOURCE_NAMES.get(self.invoice.foreign_currency_source, "?"),
total=fmt(foreign_total)), total=fmt(foreign_total))),
self.stylesheet['Fineprint'] self.stylesheet['Fineprint']
)) ))
@@ -1151,8 +1162,11 @@ class Modern1Renderer(ClassicInvoiceRenderer):
def _draw_invoice_from(self, canvas): def _draw_invoice_from(self, canvas):
if not self.invoice.address_invoice_from: if not self.invoice.address_invoice_from:
return return
c = self.invoice.address_invoice_from.strip().split('\n') c = [
p = PlainTextParagraph(' · '.join(c), style=self.stylesheet['Sender']) self._clean_text(l)
for l in self.invoice.address_invoice_from.strip().split('\n')
]
p = FontFallbackParagraph(self._normalize(' · '.join(c)), style=self.stylesheet['Sender'])
p.wrapOn(canvas, self.invoice_to_width, 15.7 * mm) p.wrapOn(canvas, self.invoice_to_width, 15.7 * mm)
p.drawOn(canvas, self.invoice_to_left, self.pagesize[1] - self.invoice_to_top + 2 * mm) p.drawOn(canvas, self.invoice_to_left, self.pagesize[1] - self.invoice_to_top + 2 * mm)
super()._draw_invoice_from(canvas) super()._draw_invoice_from(canvas)
@@ -1211,8 +1225,8 @@ class Modern1Renderer(ClassicInvoiceRenderer):
_draw(pgettext('invoice', 'Order code'), self.invoice.order.full_code, value_size, self.left_margin, 45 * mm, **kwargs) _draw(pgettext('invoice', 'Order code'), self.invoice.order.full_code, value_size, self.left_margin, 45 * mm, **kwargs)
] ]
p = PlainTextParagraph( p = FontFallbackParagraph(
date_format(self.invoice.date, "DATE_FORMAT"), self._normalize(date_format(self.invoice.date, "DATE_FORMAT")),
style=ParagraphStyle(name=f'Normal{value_size}', fontName=self.font_regular, fontSize=value_size, leading=value_size * 1.2) style=ParagraphStyle(name=f'Normal{value_size}', fontName=self.font_regular, fontSize=value_size, leading=value_size * 1.2)
) )
w = stringWidth(p.text, p.frags[0].fontName, p.frags[0].fontSize) w = stringWidth(p.text, p.frags[0].fontName, p.frags[0].fontSize)
@@ -1269,7 +1283,7 @@ class Modern1SimplifiedRenderer(Modern1Renderer):
i = [] i = []
if not self.invoice.event.has_subevents and self.invoice.event.settings.show_dates_on_frontpage: if not self.invoice.event.has_subevents and self.invoice.event.settings.show_dates_on_frontpage:
i.append(PlainTextParagraph( i.append(FontFallbackParagraph(
pgettext('invoice', 'Event date: {date_range}').format( pgettext('invoice', 'Event date: {date_range}').format(
date_range=self.invoice.event.get_date_range_display(), date_range=self.invoice.event.get_date_range_display(),
), ),
+2 -4
View File
@@ -282,12 +282,10 @@ def metric_values():
# Throwaway metrics # Throwaway metrics
exact_tables = [ exact_tables = [
Order, Invoice, Event, Organizer Order, OrderPosition, Invoice, Event, Organizer
] ]
for m in apps.get_models(): # Count all models for m in apps.get_models(): # Count all models
if issubclass(m, OrderPosition): if any(issubclass(m, p) for p in exact_tables):
metrics['pretix_model_instances']['{model="%s"}' % m._meta] = m.all.count()
elif any(issubclass(m, p) for p in exact_tables):
metrics['pretix_model_instances']['{model="%s"}' % m._meta] = m.objects.count() metrics['pretix_model_instances']['{model="%s"}' % m._meta] = m.objects.count()
else: else:
metrics['pretix_model_instances']['{model="%s"}' % m._meta] = estimate_count_fast(m) metrics['pretix_model_instances']['{model="%s"}' % m._meta] = estimate_count_fast(m)
+103 -85
View File
@@ -19,8 +19,6 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see # You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>. # <https://www.gnu.org/licenses/>.
# #
import logging
import re
from collections import OrderedDict from collections import OrderedDict
from urllib.parse import urlparse, urlsplit from urllib.parse import urlparse, urlsplit
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
@@ -45,8 +43,6 @@ from pretix.multidomain.urlreverse import (
) )
from pretix.presale.style import get_fonts from pretix.presale.style import get_fonts
logger = logging.getLogger(__name__)
_supported = None _supported = None
@@ -69,16 +65,48 @@ def get_supported_language(requested_language, allowed_languages, default_langua
return language return language
class LocaleMiddleware(MiddlewareMixin): class BaseLocaleMiddleware(MiddlewareMixin):
""" """
This middleware sets the correct locale and timezone This is a reduced LocaleMiddleware that uses only information contained in the WSGI request data
for a request. to figure out the language (cookie and browser settings). We need it to have a consistent language
for error pages that are generated from the middleware stack before we know e.g. which user is logged
in or which event is selected.
"""
def process_request(self, request: HttpRequest):
language = get_language_from_early_request(request)
translation.activate(language)
set_region(None)
request.LANGUAGE_CODE = language
timezone.deactivate()
def process_response(self, request: HttpRequest, response: HttpResponse):
language = translation.get_language()
patch_vary_headers(response, ('Accept-Language',))
if 'Content-Language' not in response:
response['Content-Language'] = language
return response
class LocaleMiddleware(MiddlewareMixin):
"""
This is the full LocaleMiddleware that uses all available information to figure out the correct
language for the request using all available sources, in this order of priority:
- Backend: User settings
- Language cookie
- Frontend: Customer account settings
- Browser settings
- Frontend: Event/Organizer settings
- System default
It needs to run late in the middleware stack to have all information available for these steps.
For some cases, it is even ran a second time since the event is sometimes only figured out after the
middleware stack (can happen for plugin views).
""" """
def process_request(self, request: HttpRequest): def process_request(self, request: HttpRequest):
language = get_language_from_request(request) language = get_language_from_request(request)
region = None
# Normally, this middleware runs *before* the event is set. However, on event frontend pages it # Normally, this middleware runs *before* the event is set. However, on event frontend pages it
# might be run a second time by pretix.presale.EventMiddleware and in this case the event is already # might be run a second time by pretix.presale.EventMiddleware and in this case the event is already
# set and can be taken into account for the decision. # set and can be taken into account for the decision.
@@ -99,16 +127,15 @@ class LocaleMiddleware(MiddlewareMixin):
if '-' not in language and settings_holder.settings.region: if '-' not in language and settings_holder.settings.region:
language += '-' + settings_holder.settings.region language += '-' + settings_holder.settings.region
if settings_holder.settings.region: if settings_holder.settings.region:
region = settings_holder.settings.region set_region(settings_holder.settings.region)
else: else:
gs = global_settings_object(request) gs = global_settings_object(request)
if '-' not in language and gs.settings.region: if '-' not in language and gs.settings.region:
language += '-' + gs.settings.region language += '-' + gs.settings.region
if gs.settings.region: if gs.settings.region:
region = gs.settings.region set_region(gs.settings.region)
translation.activate(language) translation.activate(language)
set_region(region)
request.LANGUAGE_CODE = get_language_without_region() request.LANGUAGE_CODE = get_language_without_region()
tzname = None tzname = None
@@ -188,6 +215,24 @@ def get_default_language():
return settings.LANGUAGE_CODE return settings.LANGUAGE_CODE
def get_language_from_early_request(request: HttpRequest) -> str:
"""
Analyzes the request to find what language the user wants the system to
show using only WSGI-available information. Only languages listed in
settings.LANGUAGES are taken into account. If the user requests a sublanguage
where we have a main language, we send out the main language.
"""
global _supported
if _supported is None:
_supported = OrderedDict(settings.LANGUAGES)
return (
get_language_from_cookie(request)
or get_language_from_browser(request)
or get_default_language()
)
def get_language_from_request(request: HttpRequest) -> str: def get_language_from_request(request: HttpRequest) -> str:
""" """
Analyzes the request to find what language the user wants the system to Analyzes the request to find what language the user wants the system to
@@ -202,7 +247,6 @@ def get_language_from_request(request: HttpRequest) -> str:
if request.path.startswith(get_script_prefix() + 'control'): if request.path.startswith(get_script_prefix() + 'control'):
return ( return (
get_language_from_user_settings(request) get_language_from_user_settings(request)
or get_language_from_customer_settings(request)
or get_language_from_cookie(request) or get_language_from_cookie(request)
or get_language_from_browser(request) or get_language_from_browser(request)
or get_language_from_event(request) or get_language_from_event(request)
@@ -227,26 +271,7 @@ def _parse_csp(header):
return h return h
VALID_CSP_DIRECTIVES = [
"child-src", "connect-src", "default-src", "fenced-frame-src", "font-src", "form-action", "frame-src", "img-src",
"manifest-src", "media-src", "object-src", "prefetch-src", "report-uri", "script-src", "script-src-elem",
"script-src-attr", "style-src", "style-src-elem", "style-src-attr", "worker-src",
]
CSP_ILLEGAL_CHARS = re.compile(r'[\s,;]')
def _sanitize_csp(h):
for k, v in h.items():
if k not in VALID_CSP_DIRECTIVES:
raise ValueError("Invalid CSP directive " + k)
if any(CSP_ILLEGAL_CHARS.search(el) for el in v):
logger.warning("Stripping invalid component from CSP: %r", h)
h[k] = [el for el in v if not CSP_ILLEGAL_CHARS.search(el)]
def _render_csp(h): def _render_csp(h):
_sanitize_csp(h)
return "; ".join(k + ' ' + ' '.join(v) for k, v in h.items() if v) return "; ".join(k + ' ' + ' '.join(v) for k, v in h.items() if v)
@@ -266,7 +291,21 @@ def _merge_csp(a, b):
class SecurityMiddleware(MiddlewareMixin): class SecurityMiddleware(MiddlewareMixin):
CSP_EXEMPT = (
'/api/v1/docs/',
)
def process_response(self, request, resp): def process_response(self, request, resp):
def nested_dict_values(d):
for v in d.values():
if isinstance(v, dict):
yield from nested_dict_values(v)
else:
if isinstance(v, str):
yield v
url = resolve(request.path_info)
if settings.DEBUG and resp.status_code >= 400: if settings.DEBUG and resp.status_code >= 400:
# Don't use CSP on debug error page as it breaks of Django's fancy error # Don't use CSP on debug error page as it breaks of Django's fancy error
# pages # pages
@@ -277,15 +316,18 @@ class SecurityMiddleware(MiddlewareMixin):
# https://github.com/pretix/pretix/issues/765 # https://github.com/pretix/pretix/issues/765
resp['P3P'] = 'CP=\"ALL DSP COR CUR ADM TAI OUR IND COM NAV INT\"' resp['P3P'] = 'CP=\"ALL DSP COR CUR ADM TAI OUR IND COM NAV INT\"'
if not getattr(resp, '_csp_ignore', False): img_src = []
resp['Content-Security-Policy'] = _render_csp(self._build_csp(request, resp)) gs = global_settings_object(request)
elif 'Content-Security-Policy' in resp: if gs.settings.leaflet_tiles:
del resp['Content-Security-Policy'] img_src.append(gs.settings.leaflet_tiles[:gs.settings.leaflet_tiles.index("/", 10)].replace("{s}", "*"))
return resp font_src = set()
if hasattr(request, 'event'):
def _build_csp(self, request, resp): for font in get_fonts(request.event, pdf_support_required=False).values():
url = resolve(request.path_info) for path in list(nested_dict_values(font)):
font_location = urlparse(path)
if font_location.scheme and font_location.netloc:
font_src.add('{}://{}'.format(font_location.scheme, font_location.netloc))
h = { h = {
'default-src': ["{static}"], 'default-src': ["{static}"],
@@ -294,8 +336,8 @@ class SecurityMiddleware(MiddlewareMixin):
'frame-src': ['{static}'], 'frame-src': ['{static}'],
'style-src': ["{static}", "{media}"], 'style-src': ["{static}", "{media}"],
'connect-src': ["{dynamic}", "{media}"], 'connect-src': ["{dynamic}", "{media}"],
'img-src': ["{static}", "{media}", "data:"], 'img-src': ["{static}", "{media}", "data:"] + img_src,
'font-src': ["{static}"], 'font-src': ["{static}"] + list(font_src),
'media-src': ["{static}", "data:"], 'media-src': ["{static}", "data:"],
# form-action is not only used to match on form actions, but also on URLs # form-action is not only used to match on form actions, but also on URLs
# form-actions redirect to. In the context of e.g. payment providers or # form-actions redirect to. In the context of e.g. payment providers or
@@ -304,13 +346,6 @@ class SecurityMiddleware(MiddlewareMixin):
'form-action': ["{dynamic}", "https:"] + (['http:'] if settings.SITE_URL.startswith('http://') else []), 'form-action': ["{dynamic}", "https:"] + (['http:'] if settings.SITE_URL.startswith('http://') else []),
} }
gs = global_settings_object(request)
if gs.settings.leaflet_tiles:
h['img-src'].append(gs.settings.leaflet_tiles[:gs.settings.leaflet_tiles.index("/", 10)].replace("{s}", "*"))
if hasattr(request, 'event'):
h['font-src'] += list(self._get_font_origins(request.event))
if settings.VITE_DEV_MODE: if settings.VITE_DEV_MODE:
h['script-src'] += ["http://localhost:5173", "ws://localhost:5173"] h['script-src'] += ["http://localhost:5173", "ws://localhost:5173"]
h['style-src'] += ["'unsafe-inline'"] h['style-src'] += ["'unsafe-inline'"]
@@ -322,7 +357,6 @@ class SecurityMiddleware(MiddlewareMixin):
if not settings.VITE_DEV_MODE: if not settings.VITE_DEV_MODE:
# can't have 'unsafe-inline' and nonce at the same time # can't have 'unsafe-inline' and nonce at the same time
h['style-src'].append(nonce) h['style-src'].append(nonce)
# Only include pay.google.com for wallet detection purposes on the Payment selection page # Only include pay.google.com for wallet detection purposes on the Payment selection page
if ( if (
url.url_name == "event.order.pay.change" or url.url_name == "event.order.pay.change" or
@@ -331,32 +365,27 @@ class SecurityMiddleware(MiddlewareMixin):
h['script-src'].append('https://pay.google.com') h['script-src'].append('https://pay.google.com')
h['frame-src'].append('https://pay.google.com') h['frame-src'].append('https://pay.google.com')
h['connect-src'].append('https://google.com/pay') h['connect-src'].append('https://google.com/pay')
if settings.LOG_CSP: if settings.LOG_CSP:
h['report-uri'] = ["/csp_report/"] h['report-uri'] = ["/csp_report/"]
if 'Content-Security-Policy' in resp: if 'Content-Security-Policy' in resp:
_merge_csp(h, _parse_csp(resp['Content-Security-Policy'])) _merge_csp(h, _parse_csp(resp['Content-Security-Policy']))
if settings.CSP_ADDITIONAL_HEADER: if settings.CSP_ADDITIONAL_HEADER:
_merge_csp(h, _parse_csp(settings.CSP_ADDITIONAL_HEADER)) _merge_csp(h, _parse_csp(settings.CSP_ADDITIONAL_HEADER))
placeholders = { staticdomain = "'self'"
"{static}": ["'self'"], dynamicdomain = "'self'"
"{dynamic}": ["'self'"], mediadomain = "'self'"
"{media}": ["'self'"],
}
if settings.MEDIA_URL.startswith('http'): if settings.MEDIA_URL.startswith('http'):
placeholders["{media}"].append(settings.MEDIA_URL[:settings.MEDIA_URL.find('/', 9)]) mediadomain += " " + settings.MEDIA_URL[:settings.MEDIA_URL.find('/', 9)]
if settings.STATIC_URL.startswith('http'): if settings.STATIC_URL.startswith('http'):
placeholders["{static}"].append(settings.STATIC_URL[:settings.STATIC_URL.find('/', 9)]) staticdomain += " " + settings.STATIC_URL[:settings.STATIC_URL.find('/', 9)]
if settings.SITE_URL.startswith('http'): if settings.SITE_URL.startswith('http'):
if settings.SITE_URL.find('/', 9) > 0: if settings.SITE_URL.find('/', 9) > 0:
placeholders["{static}"].append(settings.SITE_URL[:settings.SITE_URL.find('/', 9)]) staticdomain += " " + settings.SITE_URL[:settings.SITE_URL.find('/', 9)]
placeholders["{dynamic}"].append(settings.SITE_URL[:settings.SITE_URL.find('/', 9)]) dynamicdomain += " " + settings.SITE_URL[:settings.SITE_URL.find('/', 9)]
else: else:
placeholders["{static}"].append(settings.SITE_URL) staticdomain += " " + settings.SITE_URL
placeholders["{dynamic}"].append(settings.SITE_URL) dynamicdomain += " " + settings.SITE_URL
if hasattr(request, 'organizer') and request.organizer: if hasattr(request, 'organizer') and request.organizer:
if hasattr(request, 'event') and request.event: if hasattr(request, 'event') and request.event:
@@ -367,29 +396,18 @@ class SecurityMiddleware(MiddlewareMixin):
siteurlsplit = urlsplit(settings.SITE_URL) siteurlsplit = urlsplit(settings.SITE_URL)
if siteurlsplit.port and siteurlsplit.port not in (80, 443): if siteurlsplit.port and siteurlsplit.port not in (80, 443):
domain = '%s:%d' % (domain, siteurlsplit.port) domain = '%s:%d' % (domain, siteurlsplit.port)
placeholders["{dynamic}"].append(domain) dynamicdomain += " " + domain
for k, v in h.items(): if request.path not in self.CSP_EXEMPT and not getattr(resp, '_csp_ignore', False):
h[k] = sorted(set(result for part in v for result in placeholders.get(part, [part]))) resp['Content-Security-Policy'] = _render_csp(h).format(static=staticdomain, dynamic=dynamicdomain,
media=mediadomain)
for k, v in h.items():
h[k] = sorted(set(' '.join(v).format(static=staticdomain, dynamic=dynamicdomain, media=mediadomain).split(' ')))
resp['Content-Security-Policy'] = _render_csp(h)
elif 'Content-Security-Policy' in resp:
del resp['Content-Security-Policy']
return h return resp
def _get_font_origins(self, event):
def nested_dict_values(d):
for v in d.values():
if isinstance(v, dict):
yield from nested_dict_values(v)
else:
if isinstance(v, str):
yield v
font_src = set()
for font in get_fonts(event, pdf_support_required=False).values():
for path in list(nested_dict_values(font)):
font_location = urlparse(path)
if font_location.scheme and font_location.netloc:
font_src.add('{}://{}'.format(font_location.scheme, font_location.netloc))
return font_src
class RejectInvalidInputMiddleware(MiddlewareMixin): class RejectInvalidInputMiddleware(MiddlewareMixin):
+12 -9
View File
@@ -57,7 +57,7 @@ from django_otp.models import Device
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pretix.base.i18n import language from pretix.base.i18n import language
from pretix.helpers.urls import mainreverse_absolute from pretix.helpers.urls import build_absolute_uri
from ...helpers.countries import FastCountryField from ...helpers.countries import FastCountryField
from ...helpers.u2f import pub_key_from_der, websafe_decode from ...helpers.u2f import pub_key_from_der, websafe_decode
@@ -378,7 +378,7 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
{ {
'user': self, 'user': self,
'messages': msg, 'messages': msg,
'url': mainreverse_absolute('control:user.settings'), 'url': build_absolute_uri('control:user.settings'),
'instance': settings.PRETIX_INSTANCE_NAME, 'instance': settings.PRETIX_INSTANCE_NAME,
}, },
event=None, event=None,
@@ -466,7 +466,7 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
{ {
'instance': settings.PRETIX_INSTANCE_NAME, 'instance': settings.PRETIX_INSTANCE_NAME,
'user': self, 'user': self,
'url': (mainreverse_absolute('control:auth.forgot.recover') 'url': (build_absolute_uri('control:auth.forgot.recover')
+ '?id=%d&token=%s' % (self.id, default_token_generator.make_token(self))) + '?id=%d&token=%s' % (self.id, default_token_generator.make_token(self)))
}, },
None, locale=self.locale, user=self None, locale=self.locale, user=self
@@ -647,22 +647,25 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
id__in=self.teams.filter(TeamQuerySet.organizer_permission_q(permission)).values_list('organizer', flat=True) id__in=self.teams.filter(TeamQuerySet.organizer_permission_q(permission)).values_list('organizer', flat=True)
) )
def has_active_staff_session(self, session_key): def has_active_staff_session(self, session_key=None):
""" """
Returns whether or not a user has an active staff session (formerly known as superuser session) Returns whether or not a user has an active staff session (formerly known as superuser session)
with the given session key. with the given session key.
""" """
return self.get_active_staff_session(session_key) is not None return self.get_active_staff_session(session_key) is not None
def get_active_staff_session(self, session_key): def get_active_staff_session(self, session_key=None):
if not self.is_staff or not session_key: if not self.is_staff:
return None return None
if not hasattr(self, '_staff_session_cache'): if not hasattr(self, '_staff_session_cache'):
self._staff_session_cache = {} self._staff_session_cache = {}
if session_key not in self._staff_session_cache: if session_key not in self._staff_session_cache:
sess = StaffSession.objects.filter( qs = StaffSession.objects.filter(
user=self, date_end__isnull=True, session_key=session_key user=self, date_end__isnull=True
).first() )
if session_key:
qs = qs.filter(session_key=session_key)
sess = qs.first()
if sess: if sess:
if sess.date_start < now() - timedelta(seconds=settings.PRETIX_SESSION_TIMEOUT_ABSOLUTE): if sess.date_start < now() - timedelta(seconds=settings.PRETIX_SESSION_TIMEOUT_ABSOLUTE):
sess.date_end = now() sess.date_end = now()
+5 -5
View File
@@ -167,7 +167,7 @@ class Customer(LoggedModel):
def send_security_notice(self, message, email=None): def send_security_notice(self, message, email=None):
from pretix.base.services.mail import SendMailException, mail from pretix.base.services.mail import SendMailException, mail
from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.multidomain.urlreverse import build_absolute_uri
try: try:
with language(self.locale): with language(self.locale):
@@ -178,7 +178,7 @@ class Customer(LoggedModel):
{ {
**self.get_email_context(), **self.get_email_context(),
'message': str(message), 'message': str(message),
'url': eventreverse_absolute(self.organizer, 'presale:organizer.customer.index') 'url': build_absolute_uri(self.organizer, 'presale:organizer.customer.index')
}, },
customer=self, customer=self,
organizer=self.organizer, organizer=self.organizer,
@@ -299,12 +299,12 @@ class Customer(LoggedModel):
def send_activation_mail(self): def send_activation_mail(self):
from pretix.base.services.mail import mail from pretix.base.services.mail import mail
from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.presale.forms.customer import TokenGenerator from pretix.presale.forms.customer import TokenGenerator
ctx = self.get_email_context() ctx = self.get_email_context()
token = TokenGenerator().make_token(self) token = TokenGenerator().make_token(self)
ctx['url'] = eventreverse_absolute( ctx['url'] = build_absolute_uri(
self.organizer, self.organizer,
'presale:organizer.customer.activate' 'presale:organizer.customer.activate'
) + '?id=' + self.identifier + '&token=' + token ) + '?id=' + self.identifier + '&token=' + token
@@ -395,7 +395,7 @@ class AttendeeProfile(models.Model):
self.company, self.company,
self.street, self.street,
(self.zipcode or '') + ' ' + (self.city or '') + ' ' + (self.state_for_address or ''), (self.zipcode or '') + ' ' + (self.city or '') + ' ' + (self.state_for_address or ''),
self.country.name if self.country else None, self.country.name,
] ]
for a in self.answers: for a in self.answers:
value = a.get('value') value = a.get('value')
+6 -26
View File
@@ -40,7 +40,6 @@ import warnings
from collections import Counter, OrderedDict, defaultdict from collections import Counter, OrderedDict, defaultdict
from datetime import datetime, time, timedelta from datetime import datetime, time, timedelta
from operator import attrgetter from operator import attrgetter
from typing import TYPE_CHECKING
from urllib.parse import urljoin from urllib.parse import urljoin
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
@@ -80,16 +79,10 @@ from pretix.helpers.thumb import get_thumbnail
from ..settings import settings_hierarkey from ..settings import settings_hierarkey
from .organizer import Organizer, Team from .organizer import Organizer, Team
if TYPE_CHECKING:
from hierarkey.proxy import HierarkeyProxy
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class EventMixin: class EventMixin:
if TYPE_CHECKING:
settings: HierarkeyProxy
def clean(self): def clean(self):
if self.presale_start and self.presale_end and self.presale_start > self.presale_end: if self.presale_start and self.presale_end and self.presale_start > self.presale_end:
raise ValidationError({'presale_end': _('The end of the presale period has to be later than its start.')}) raise ValidationError({'presale_end': _('The end of the presale period has to be later than its start.')})
@@ -731,7 +724,7 @@ class Event(EventMixin, LoggedModel):
@property @property
def social_image(self): def social_image(self):
from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.multidomain.urlreverse import build_absolute_uri
img = None img = None
logo_file = self.settings.get('logo_image', as_type=str, default='')[7:] logo_file = self.settings.get('logo_image', as_type=str, default='')[7:]
@@ -749,7 +742,7 @@ class Event(EventMixin, LoggedModel):
logger.exception(f'Failed to create thumbnail of {logo_file}') logger.exception(f'Failed to create thumbnail of {logo_file}')
img = default_storage.url(logo_file) img = default_storage.url(logo_file)
if img: if img:
return urljoin(eventreverse_absolute(self, 'presale:event.index'), img) return urljoin(build_absolute_uri(self, 'presale:event.index'), img)
def _seats(self, ignore_voucher=None): def _seats(self, ignore_voucher=None):
from .seating import Seat from .seating import Seat
@@ -890,8 +883,6 @@ class Event(EventMixin, LoggedModel):
ItemProgramTime, ItemVariationMetaValue, Question, Quota, ItemProgramTime, ItemVariationMetaValue, Question, Quota,
) )
is_cross_organizer = other.organizer_id != self.organizer_id
# Note: avoid self.set_active_plugins(), it causes trouble e.g. for the badges plugin. # Note: avoid self.set_active_plugins(), it causes trouble e.g. for the badges plugin.
# Plugins can create data in installed() hook based on existing data of the event. # Plugins can create data in installed() hook based on existing data of the event.
# Calling set_active_plugins() results in defaults being created while actually data # Calling set_active_plugins() results in defaults being created while actually data
@@ -906,7 +897,7 @@ class Event(EventMixin, LoggedModel):
self.save() self.save()
self.log_action('pretix.object.cloned', data={'source': other.slug, 'source_id': other.pk}) self.log_action('pretix.object.cloned', data={'source': other.slug, 'source_id': other.pk})
if hasattr(other, 'alternative_domain_assignment') and not is_cross_organizer: if hasattr(other, 'alternative_domain_assignment'):
other.alternative_domain_assignment.domain.event_assignments.create(event=self) other.alternative_domain_assignment.domain.event_assignments.create(event=self)
if not self.all_sales_channels: if not self.all_sales_channels:
@@ -920,15 +911,6 @@ class Event(EventMixin, LoggedModel):
for emv in EventMetaValue.objects.filter(event=other): for emv in EventMetaValue.objects.filter(event=other):
emv.pk = None emv.pk = None
emv.event = self emv.event = self
if is_cross_organizer:
try:
emv.property = self.organizer.meta_properties.get(name=emv.property.name)
except EventMetaProperty.DoesNotExist:
meta_prop = emv.property
meta_prop.pk = None
meta_prop.organizer = self.organizer
meta_prop.save(force_insert=True)
emv.property = meta_prop
emv.save(force_insert=True) emv.save(force_insert=True)
for fl in EventFooterLink.objects.filter(event=other): for fl in EventFooterLink.objects.filter(event=other):
@@ -982,13 +964,13 @@ class Event(EventMixin, LoggedModel):
if i.tax_rule_id: if i.tax_rule_id:
i.tax_rule = tax_map[i.tax_rule_id] i.tax_rule = tax_map[i.tax_rule_id]
if i.grant_membership_type and is_cross_organizer: if i.grant_membership_type and other.organizer_id != self.organizer_id:
i.grant_membership_type = None i.grant_membership_type = None
i.save() # no force_insert since i.picture.save could have already inserted i.save() # no force_insert since i.picture.save could have already inserted
i.log_action('pretix.object.cloned') i.log_action('pretix.object.cloned')
if require_membership_types and not is_cross_organizer: if require_membership_types and other.organizer_id == self.organizer_id:
i.require_membership_types.set(require_membership_types) i.require_membership_types.set(require_membership_types)
if not i.all_sales_channels: if not i.all_sales_channels:
@@ -1003,7 +985,7 @@ class Event(EventMixin, LoggedModel):
v._prefetched_objects_cache = {} v._prefetched_objects_cache = {}
v.save(force_insert=True) v.save(force_insert=True)
if require_membership_types and not is_cross_organizer: if require_membership_types and other.organizer_id == self.organizer_id:
v.require_membership_types.set(require_membership_types) v.require_membership_types.set(require_membership_types)
if not v.all_sales_channels: if not v.all_sales_channels:
v.limit_sales_channels.set(self.organizer.sales_channels.filter(identifier__in=[s.identifier for s in limit_sales_channels])) v.limit_sales_channels.set(self.organizer.sales_channels.filter(identifier__in=[s.identifier for s in limit_sales_channels]))
@@ -1887,8 +1869,6 @@ class EventMetaValue(LoggedModel):
self.event.cache.clear() self.event.cache.clear()
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if self.event and self.event.organizer != self.property.organizer:
raise ValidationError(_("Property and event must belong to the same organizer."))
super().save(*args, **kwargs) super().save(*args, **kwargs)
if self.event: if self.event:
self.event.cache.clear() self.event.cache.clear()
+30 -52
View File
@@ -354,60 +354,38 @@ class Order(LockModel, LoggedModel):
def _transaction_key_reset(self): def _transaction_key_reset(self):
self.__initial_status_paid_or_pending = self.status in (Order.STATUS_PENDING, Order.STATUS_PAID) and not self.require_approval self.__initial_status_paid_or_pending = self.status in (Order.STATUS_PENDING, Order.STATUS_PAID) and not self.require_approval
@classmethod
def gracefully_delete_bulk(cls, event, orders, user=None, auth=None):
# Expects to be called in a transaction
from . import (
GiftCard, GiftCardTransaction, LogEntry, Membership, Voucher,
)
if not transaction.get_connection().in_atomic_block:
raise Exception('gracefully_delete_bulk should only be called in atomic transaction!')
logs_create = []
for o in orders:
if not o.testmode:
raise TypeError("Only test mode orders can be deleted.")
order_gracefully_delete.send(event, order=o)
logs_create.append(o.log_action(
'pretix.event.order.deleted', user=user, auth=auth,
data={
'code': o.code,
},
save=False,
))
LogEntry.bulk_create_and_postprocess(logs_create)
voucher_ids = OrderPosition.objects.filter(
order__in=orders,
voucher__isnull=False
).exclude(order__status=Order.STATUS_CANCELED).values_list("voucher_id", flat=True)
voucher_usages = Counter(voucher_ids)
for v_id, usage_count in voucher_usages.items():
Voucher.objects.filter(pk=v_id).update(redeemed=Greatest(0, F('redeemed') - usage_count))
GiftCardTransaction.objects.filter(payment__order__in=orders).update(payment=None)
GiftCardTransaction.objects.filter(refund__order__in=orders).update(refund=None)
GiftCardTransaction.objects.filter(order__in=orders).update(order=None)
GiftCard.objects.filter(issued_in__order__in=orders).update(issued_in=None)
Membership.objects.filter(granted_in__order__in=orders, testmode=True).update(granted_in=None)
OrderPosition.all.filter(order__in=orders, addon_to__isnull=False).delete()
OrderPosition.all.filter(order__in=orders).delete()
OrderFee.all.filter(order__in=orders).delete()
Transaction.objects.filter(order__in=orders).delete()
OrderRefund.objects.filter(order__in=orders).delete()
OrderPayment.objects.filter(order__in=orders).delete()
if isinstance(orders, models.QuerySet):
orders.delete()
else:
Order.objects.filter(pk__in=[o.pk for o in orders]).delete()
event.cache.delete('complain_testmode_orders')
def gracefully_delete(self, user=None, auth=None): def gracefully_delete(self, user=None, auth=None):
from . import GiftCard, GiftCardTransaction, Membership, Voucher
if not self.testmode: if not self.testmode:
raise TypeError("Only test mode orders can be deleted.") raise TypeError("Only test mode orders can be deleted.")
self.log_action(
'pretix.event.order.deleted', user=user, auth=auth,
data={
'code': self.code,
}
)
Order.gracefully_delete_bulk(self.event, Order.objects.filter(pk=self.pk), user, auth) order_gracefully_delete.send(self.event, order=self)
if self.status != Order.STATUS_CANCELED:
for position in self.positions.all():
if position.voucher:
Voucher.objects.filter(pk=position.voucher.pk).update(redeemed=Greatest(0, F('redeemed') - 1))
GiftCardTransaction.objects.filter(payment__in=self.payments.all()).update(payment=None)
GiftCardTransaction.objects.filter(refund__in=self.refunds.all()).update(refund=None)
GiftCardTransaction.objects.filter(order=self).update(order=None)
GiftCard.objects.filter(issued_in__in=self.positions.all()).update(issued_in=None)
Membership.objects.filter(granted_in__order=self, testmode=True).update(granted_in=None)
OrderPosition.all.filter(order=self, addon_to__isnull=False).delete()
OrderPosition.all.filter(order=self).delete()
OrderFee.all.filter(order=self).delete()
Transaction.objects.filter(order=self).delete()
self.refunds.all().delete()
self.payments.all().delete()
self.event.cache.delete('complain_testmode_orders')
self.delete()
def email_confirm_secret(self): def email_confirm_secret(self):
return self.tagged_secret("email_confirm", 9) return self.tagged_secret("email_confirm", 9)
@@ -1697,7 +1675,7 @@ class AbstractPosition(RoundingCorrectionMixin, models.Model):
self.company, self.company,
self.street, self.street,
(self.zipcode or '') + ' ' + (self.city or '') + ' ' + (self.state_for_address or ''), (self.zipcode or '') + ' ' + (self.city or '') + ' ' + (self.state_for_address or ''),
self.country.name if self.country else '' self.country.name
] ]
lines = [r.strip() for r in lines if r] lines = [r.strip() for r in lines if r]
return '\n'.join(lines).strip() return '\n'.join(lines).strip()
@@ -3438,7 +3416,7 @@ class InvoiceAddress(models.Model):
self.name, self.name,
self.street, self.street,
(self.zipcode or '') + ' ' + (self.city or '') + ' ' + (self.state_for_address or ''), (self.zipcode or '') + ' ' + (self.city or '') + ' ' + (self.state_for_address or ''),
self.country.name if self.country else '', self.country.name,
self.vat_id, self.vat_id,
self.custom_field, self.custom_field,
self.internal_reference, self.internal_reference,
-7
View File
@@ -35,7 +35,6 @@ import operator
import string import string
from datetime import date, datetime, time from datetime import date, datetime, time
from functools import reduce from functools import reduce
from typing import TYPE_CHECKING
import pytz_deprecation_shim import pytz_deprecation_shim
from django.conf import settings from django.conf import settings
@@ -62,9 +61,6 @@ from ...helpers.permission_migration import (
from ..settings import settings_hierarkey from ..settings import settings_hierarkey
from .auth import User from .auth import User
if TYPE_CHECKING:
from hierarkey.proxy import HierarkeyProxy
@settings_hierarkey.add(cache_namespace='organizer') @settings_hierarkey.add(cache_namespace='organizer')
class Organizer(LoggedModel): class Organizer(LoggedModel):
@@ -82,9 +78,6 @@ class Organizer(LoggedModel):
""" """
settings_namespace = 'organizer' settings_namespace = 'organizer'
if TYPE_CHECKING:
settings: HierarkeyProxy
name = models.CharField(max_length=200, name = models.CharField(max_length=200,
verbose_name=_("Name")) verbose_name=_("Name"))
slug = models.CharField( slug = models.CharField(
+3 -6
View File
@@ -118,10 +118,7 @@ class SeatingPlan(LoggedModel):
for zi, z in enumerate(self.layout_data['zones']): for zi, z in enumerate(self.layout_data['zones']):
zpos = (z['position']['x'], z['position']['y']) zpos = (z['position']['x'], z['position']['y'])
for ri, r in enumerate(z['rows']): for ri, r in enumerate(z['rows']):
rpos = ( rpos = (zpos[0] + r['position']['x'], zpos[1] + r['position']['y'])
zpos[0] + r.get('position', {}).get('x', 0),
zpos[1] + r.get('position', {}).get('y', 0),
)
row_label = None row_label = None
if r.get('row_label'): if r.get('row_label'):
row_label = r['row_label'].replace("%s", r.get('row_number', str(ri))) row_label = r['row_label'].replace("%s", r.get('row_number', str(ri)))
@@ -150,8 +147,8 @@ class SeatingPlan(LoggedModel):
zone=z['name'], zone=z['name'],
category=s['category'], category=s['category'],
sorting_rank=rank, sorting_rank=rank,
x=rpos[0] + s.get('position', {}).get('x', 0), x=rpos[0] + s['position']['x'],
y=rpos[1] + s.get('position', {}).get('y', 0), y=rpos[1] + s['position']['y'],
) )
+2 -2
View File
@@ -43,7 +43,7 @@ from django.utils.translation import gettext_lazy as _, pgettext_lazy
from pretix.base.models import Event, LogEntry from pretix.base.models import Event, LogEntry
from pretix.base.signals import register_notification_types from pretix.base.signals import register_notification_types
from pretix.base.templatetags.money import money_filter from pretix.base.templatetags.money import money_filter
from pretix.helpers.urls import mainreverse_absolute from pretix.helpers.urls import build_absolute_uri
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
_ALL_TYPES = None _ALL_TYPES = None
@@ -170,7 +170,7 @@ class ParametrizedOrderNotificationType(NotificationType):
def build_notification(self, logentry: LogEntry): def build_notification(self, logentry: LogEntry):
order = logentry.content_object order = logentry.content_object
order_url = mainreverse_absolute( order_url = build_absolute_uri(
'control:event.order', 'control:event.order',
kwargs={ kwargs={
'organizer': logentry.event.organizer.slug, 'organizer': logentry.event.organizer.slug,
+2 -2
View File
@@ -71,7 +71,7 @@ from pretix.helpers import OF_SELF
from pretix.helpers.countries import CachedCountries from pretix.helpers.countries import CachedCountries
from pretix.helpers.format import format_map from pretix.helpers.format import format_map
from pretix.helpers.money import DecimalTextInput from pretix.helpers.money import DecimalTextInput
from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.presale.views import get_cart from pretix.presale.views import get_cart
from pretix.presale.views.cart import cart_session, get_or_create_cart_id from pretix.presale.views.cart import cart_session, get_or_create_cart_id
@@ -379,7 +379,7 @@ class BasePaymentProvider:
if not self.settings.get('_hidden_seed'): if not self.settings.get('_hidden_seed'):
self.settings.set('_hidden_seed', get_random_string(64)) self.settings.set('_hidden_seed', get_random_string(64))
hidden_url = eventreverse_absolute(self.event, 'presale:event.payment.unlock', kwargs={ hidden_url = build_absolute_uri(self.event, 'presale:event.payment.unlock', kwargs={
'hash': hashlib.sha256((self.settings._hidden_seed + self.event.slug).encode()).hexdigest(), 'hash': hashlib.sha256((self.settings._hidden_seed + self.event.slug).encode()).hexdigest(),
}) })
+1 -6
View File
@@ -372,11 +372,6 @@ DEFAULT_VARIABLES = OrderedDict((
"editor_sample": _("Atlantis"), "editor_sample": _("Atlantis"),
"evaluate": lambda op, order, ev: str(getattr(order.invoice_address.country, 'name', '')) if getattr(order, 'invoice_address', None) else '' "evaluate": lambda op, order, ev: str(getattr(order.invoice_address.country, 'name', '')) if getattr(order, 'invoice_address', None) else ''
}), }),
("invoice_custom_field", {
"label": _("Invoice custom recipient field"),
"editor_sample": _("Custom recipient field"),
"evaluate": lambda op, order, ev: order.invoice_address.custom_field if getattr(order, 'invoice_address', None) else ''
}),
("addons", { ("addons", {
"label": _("List of Add-Ons"), "label": _("List of Add-Ons"),
"editor_sample": _("Add-on 1\n2x Add-on 2"), "editor_sample": _("Add-on 1\n2x Add-on 2"),
@@ -1067,7 +1062,7 @@ class Renderer:
except: except:
logger.exception('Reshaping/Bidi fixes failed on string {}'.format(repr(text))) logger.exception('Reshaping/Bidi fixes failed on string {}'.format(repr(text)))
p = Paragraph(text, style=style) # not using AutoEscapeParagraph is safe as we escape above p = Paragraph(text, style=style)
return p, ad, lineheight return p, ad, lineheight
def _draw_textcontainer(self, canvas: Canvas, op: OrderPosition, order: Order, o: dict): def _draw_textcontainer(self, canvas: Canvas, op: OrderPosition, order: Order, o: dict):
+3 -3
View File
@@ -51,7 +51,7 @@ from pretix.base.signals import (
) )
from pretix.celery_app import app from pretix.celery_app import app
from pretix.helpers import OF_SELF, repeatable_reads_transaction from pretix.helpers import OF_SELF, repeatable_reads_transaction
from pretix.helpers.urls import mainreverse_absolute from pretix.helpers.urls import build_absolute_uri
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -455,7 +455,7 @@ def scheduled_organizer_export(self, organizer: Organizer, schedule: int) -> Non
schedule, schedule,
organizer, organizer,
exporter, exporter,
mainreverse_absolute( build_absolute_uri(
'control:organizer.export', 'control:organizer.export',
kwargs={ kwargs={
'organizer': organizer.slug, 'organizer': organizer.slug,
@@ -481,7 +481,7 @@ def scheduled_event_export(self, event: Event, schedule: int) -> None:
schedule, schedule,
event, event,
exporter, exporter,
mainreverse_absolute( build_absolute_uri(
'control:event.orders.export', 'control:event.orders.export',
kwargs={ kwargs={
'event': event.slug, 'event': event.slug,
+3 -3
View File
@@ -85,7 +85,7 @@ from pretix.helpers.format import (
FormattedString, PlainHtmlAlternativeString, SafeFormatter, format_map, FormattedString, PlainHtmlAlternativeString, SafeFormatter, format_map,
) )
from pretix.helpers.hierarkey import clean_filename from pretix.helpers.hierarkey import clean_filename
from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.presale.ical import get_private_icals from pretix.presale.ical import get_private_icals
logger = logging.getLogger('pretix.base.mail') logger = logging.getLogger('pretix.base.mail')
@@ -997,7 +997,7 @@ def _wrap_plain_body(content_plain, signature, event, order, position, no_order_
body_plain += _( body_plain += _(
"You can view your order details at the following URL:\n{orderurl}." "You can view your order details at the following URL:\n{orderurl}."
).replace("\n", "\r\n").format( ).replace("\n", "\r\n").format(
orderurl=eventreverse_absolute( orderurl=build_absolute_uri(
order.event, 'presale:event.order.position', kwargs={ order.event, 'presale:event.order.position', kwargs={
'order': order.code, 'order': order.code,
'secret': position.web_secret, 'secret': position.web_secret,
@@ -1013,7 +1013,7 @@ def _wrap_plain_body(content_plain, signature, event, order, position, no_order_
body_plain += _( body_plain += _(
"You can view your order details at the following URL:\n{orderurl}." "You can view your order details at the following URL:\n{orderurl}."
).replace("\n", "\r\n").format( ).replace("\n", "\r\n").format(
event=event.name, orderurl=eventreverse_absolute( event=event.name, orderurl=build_absolute_uri(
order.event, 'presale:event.order.open', kwargs={ order.event, 'presale:event.order.open', kwargs={
'order': order.code, 'order': order.code,
'secret': order.secret, 'secret': order.secret,
+3 -33
View File
@@ -26,9 +26,8 @@ from typing import List
from django.conf import settings as django_settings from django.conf import settings as django_settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import transaction from django.db import transaction
from django.db.utils import IntegrityError
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import gettext as _, ngettext from django.utils.translation import gettext as _
from pretix.base.i18n import language from pretix.base.i18n import language
from pretix.base.modelimport import DataImportError, ImportColumn, parse_csv from pretix.base.modelimport import DataImportError, ImportColumn, parse_csv
@@ -261,7 +260,6 @@ def import_vouchers(event: Event, fileid: str, settings: dict, locale: str, user
# Prepare model objects. Yes, this might consume lots of RAM, but allows us to make the actual SQL transaction # Prepare model objects. Yes, this might consume lots of RAM, but allows us to make the actual SQL transaction
# shorter. We'll see what works better in reality… # shorter. We'll see what works better in reality…
vouchers = [] vouchers = []
codes = set()
lock_seats = [] lock_seats = []
for i, record in enumerate(data): for i, record in enumerate(data):
try: try:
@@ -270,14 +268,6 @@ def import_vouchers(event: Event, fileid: str, settings: dict, locale: str, user
if not record.get("code"): if not record.get("code"):
raise ValidationError(_('A voucher cannot be created without a code.')) raise ValidationError(_('A voucher cannot be created without a code.'))
code = record.get("code")
if code.upper() in codes:
raise ValidationError(
_('Voucher codes must be unique. Code "{code}" already exists in this import.').format(
code=code,
)
)
codes.add(code.upper())
Voucher.clean_item_properties( Voucher.clean_item_properties(
record, record,
event, event,
@@ -296,22 +286,8 @@ def import_vouchers(event: Event, fileid: str, settings: dict, locale: str, user
lock_seats.append(voucher.seat) lock_seats.append(voucher.seat)
except (ValidationError, ImportError) as e: except (ValidationError, ImportError) as e:
raise DataImportError( raise DataImportError(
_('Invalid data in row {row}: {message}').format(row=i + 1, message=str(e)) _('Invalid data in row {row}: {message}').format(row=i, message=str(e))
) )
existing_codes = Voucher.objects.filter(
event=event,
code__in=codes,
).values_list("code", flat=True)
if len(existing_codes):
raise DataImportError(
ngettext(
'Voucher codes must be unique. Import contains existing voucher code {code}.',
'Voucher codes must be unique. Import contains existing voucher codes {code}.',
len(existing_codes)
).format(
code=", ".join(existing_codes)
)
)
with transaction.atomic(): with transaction.atomic():
# We don't support quotas here, so we only need to lock if seats are in use # We don't support quotas here, so we only need to lock if seats are in use
@@ -324,13 +300,7 @@ def import_vouchers(event: Event, fileid: str, settings: dict, locale: str, user
save_logentries = [] save_logentries = []
for v in vouchers: for v in vouchers:
try: v.save()
v.save()
except IntegrityError:
# should not happen as we check existing codes before, but we did not lock so we might have a race-condition
raise DataImportError(
_('Vouchers could not be imported, probably due to a voucher code already being in use.')
)
save_logentries.append(v.log_action( save_logentries.append(v.log_action(
'pretix.voucher.added', 'pretix.voucher.added',
user=user, user=user,
+3 -3
View File
@@ -37,7 +37,7 @@ from pretix.base.services.tasks import ProfiledTask, TransactionAwareTask
from pretix.base.signals import notification from pretix.base.signals import notification
from pretix.celery_app import app from pretix.celery_app import app
from pretix.helpers.celery import get_task_priority from pretix.helpers.celery import get_task_priority
from pretix.helpers.urls import mainreverse_absolute from pretix.helpers.urls import build_absolute_uri
@app.task(base=TransactionAwareTask, acks_late=True, max_retries=9, default_retry_delay=900) @app.task(base=TransactionAwareTask, acks_late=True, max_retries=9, default_retry_delay=900)
@@ -136,10 +136,10 @@ def send_notification_mail(notification: Notification, user: User):
'site_url': settings.SITE_URL, 'site_url': settings.SITE_URL,
'color': settings.PRETIX_PRIMARY_COLOR, 'color': settings.PRETIX_PRIMARY_COLOR,
'notification': notification, 'notification': notification,
'settings_url': mainreverse_absolute( 'settings_url': build_absolute_uri(
'control:user.settings.notifications', 'control:user.settings.notifications',
), ),
'disable_url': mainreverse_absolute( 'disable_url': build_absolute_uri(
'control:user.settings.notifications.off', 'control:user.settings.notifications.off',
kwargs={ kwargs={
'token': user.notifications_token, 'token': user.notifications_token,
+29 -29
View File
@@ -327,7 +327,7 @@ def get_best_name(position_or_address, parts=False):
@receiver(register_text_placeholders, dispatch_uid="pretixbase_register_text_placeholders") @receiver(register_text_placeholders, dispatch_uid="pretixbase_register_text_placeholders")
def base_placeholders(sender, **kwargs): def base_placeholders(sender, **kwargs):
from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.multidomain.urlreverse import build_absolute_uri
def _event_sample(event): def _event_sample(event):
if event.has_subevents: if event.has_subevents:
@@ -388,14 +388,14 @@ def base_placeholders(sender, **kwargs):
lambda event: LazyDate(now() + timedelta(days=15)) lambda event: LazyDate(now() + timedelta(days=15))
), ),
SimpleFunctionalTextPlaceholder( SimpleFunctionalTextPlaceholder(
'url', ['order', 'event'], lambda order, event: eventreverse_absolute( 'url', ['order', 'event'], lambda order, event: build_absolute_uri(
event, event,
'presale:event.order.open', kwargs={ 'presale:event.order.open', kwargs={
'order': order.code, 'order': order.code,
'secret': order.secret, 'secret': order.secret,
'hash': order.email_confirm_secret() 'hash': order.email_confirm_secret()
} }
), lambda event: eventreverse_absolute( ), lambda event: build_absolute_uri(
event, event,
'presale:event.order.open', kwargs={ 'presale:event.order.open', kwargs={
'order': 'F8VVL', 'order': 'F8VVL',
@@ -406,7 +406,7 @@ def base_placeholders(sender, **kwargs):
), ),
SimpleButtonPlaceholder( SimpleButtonPlaceholder(
'url_button', ['order', 'event'], 'url_button', ['order', 'event'],
url_func=lambda order, event: eventreverse_absolute( url_func=lambda order, event: build_absolute_uri(
event, event,
'presale:event.order.open', kwargs={ 'presale:event.order.open', kwargs={
'order': order.code, 'order': order.code,
@@ -415,7 +415,7 @@ def base_placeholders(sender, **kwargs):
} }
), ),
text_func=lambda order, event: _("View order details"), text_func=lambda order, event: _("View order details"),
sample_url_func=lambda event: eventreverse_absolute( sample_url_func=lambda event: build_absolute_uri(
event, event,
'presale:event.order.open', kwargs={ 'presale:event.order.open', kwargs={
'order': 'F8VVL', 'order': 'F8VVL',
@@ -426,13 +426,13 @@ def base_placeholders(sender, **kwargs):
sample_text_func=lambda event: _("View order details"), sample_text_func=lambda event: _("View order details"),
), ),
SimpleFunctionalTextPlaceholder( SimpleFunctionalTextPlaceholder(
'url_info_change', ['order', 'event'], lambda order, event: eventreverse_absolute( 'url_info_change', ['order', 'event'], lambda order, event: build_absolute_uri(
event, event,
'presale:event.order.modify', kwargs={ 'presale:event.order.modify', kwargs={
'order': order.code, 'order': order.code,
'secret': order.secret, 'secret': order.secret,
} }
), lambda event: eventreverse_absolute( ), lambda event: build_absolute_uri(
event, event,
'presale:event.order.modify', kwargs={ 'presale:event.order.modify', kwargs={
'order': 'F8VVL', 'order': 'F8VVL',
@@ -441,13 +441,13 @@ def base_placeholders(sender, **kwargs):
), ),
), ),
SimpleFunctionalTextPlaceholder( SimpleFunctionalTextPlaceholder(
'url_products_change', ['order', 'event'], lambda order, event: eventreverse_absolute( 'url_products_change', ['order', 'event'], lambda order, event: build_absolute_uri(
event, event,
'presale:event.order.change', kwargs={ 'presale:event.order.change', kwargs={
'order': order.code, 'order': order.code,
'secret': order.secret, 'secret': order.secret,
} }
), lambda event: eventreverse_absolute( ), lambda event: build_absolute_uri(
event, event,
'presale:event.order.change', kwargs={ 'presale:event.order.change', kwargs={
'order': 'F8VVL', 'order': 'F8VVL',
@@ -456,13 +456,13 @@ def base_placeholders(sender, **kwargs):
), ),
), ),
SimpleFunctionalTextPlaceholder( SimpleFunctionalTextPlaceholder(
'url_cancel', ['order', 'event'], lambda order, event: eventreverse_absolute( 'url_cancel', ['order', 'event'], lambda order, event: build_absolute_uri(
event, event,
'presale:event.order.cancel', kwargs={ 'presale:event.order.cancel', kwargs={
'order': order.code, 'order': order.code,
'secret': order.secret, 'secret': order.secret,
} }
), lambda event: eventreverse_absolute( ), lambda event: build_absolute_uri(
event, event,
'presale:event.order.cancel', kwargs={ 'presale:event.order.cancel', kwargs={
'order': 'F8VVL', 'order': 'F8VVL',
@@ -471,7 +471,7 @@ def base_placeholders(sender, **kwargs):
), ),
), ),
SimpleFunctionalTextPlaceholder( SimpleFunctionalTextPlaceholder(
'url', ['event', 'position'], lambda event, position: eventreverse_absolute( 'url', ['event', 'position'], lambda event, position: build_absolute_uri(
event, event,
'presale:event.order.position', 'presale:event.order.position',
kwargs={ kwargs={
@@ -480,7 +480,7 @@ def base_placeholders(sender, **kwargs):
'position': position.positionid 'position': position.positionid
} }
), ),
lambda event: eventreverse_absolute( lambda event: build_absolute_uri(
event, event,
'presale:event.order.position', kwargs={ 'presale:event.order.position', kwargs={
'order': 'F8VVL', 'order': 'F8VVL',
@@ -491,7 +491,7 @@ def base_placeholders(sender, **kwargs):
), ),
SimpleButtonPlaceholder( SimpleButtonPlaceholder(
'url_button', ['event', 'position'], 'url_button', ['event', 'position'],
url_func=lambda event, position: eventreverse_absolute( url_func=lambda event, position: build_absolute_uri(
event, event,
'presale:event.order.position', kwargs={ 'presale:event.order.position', kwargs={
'order': position.order.code, 'order': position.order.code,
@@ -500,7 +500,7 @@ def base_placeholders(sender, **kwargs):
} }
), ),
text_func=lambda event, position: _("View registration details"), text_func=lambda event, position: _("View registration details"),
sample_url_func=lambda event: eventreverse_absolute( sample_url_func=lambda event: build_absolute_uri(
event, event,
'presale:event.order.position', kwargs={ 'presale:event.order.position', kwargs={
'order': 'F8VVL', 'order': 'F8VVL',
@@ -511,14 +511,14 @@ def base_placeholders(sender, **kwargs):
sample_text_func=lambda event: _("View registration details"), sample_text_func=lambda event: _("View registration details"),
), ),
SimpleFunctionalTextPlaceholder( SimpleFunctionalTextPlaceholder(
'url_info_change', ['position', 'event'], lambda position, event: eventreverse_absolute( 'url_info_change', ['position', 'event'], lambda position, event: build_absolute_uri(
event, event,
'presale:event.order.position.modify', kwargs={ 'presale:event.order.position.modify', kwargs={
'order': position.order.code, 'order': position.order.code,
'secret': position.web_secret, 'secret': position.web_secret,
'position': position.positionid 'position': position.positionid
} }
), lambda event: eventreverse_absolute( ), lambda event: build_absolute_uri(
event, event,
'presale:event.order.position.modify', kwargs={ 'presale:event.order.position.modify', kwargs={
'order': 'F8VVL', 'order': 'F8VVL',
@@ -528,14 +528,14 @@ def base_placeholders(sender, **kwargs):
), ),
), ),
SimpleFunctionalTextPlaceholder( SimpleFunctionalTextPlaceholder(
'url_products_change', ['position', 'event'], lambda position, event: eventreverse_absolute( 'url_products_change', ['position', 'event'], lambda position, event: build_absolute_uri(
event, event,
'presale:event.order.position.change', kwargs={ 'presale:event.order.position.change', kwargs={
'order': position.order.code, 'order': position.order.code,
'secret': position.web_secret, 'secret': position.web_secret,
'position': position.positionid 'position': position.positionid
} }
), lambda event: eventreverse_absolute( ), lambda event: build_absolute_uri(
event, event,
'presale:event.order.position.change', kwargs={ 'presale:event.order.position.change', kwargs={
'order': 'F8VVL', 'order': 'F8VVL',
@@ -581,20 +581,20 @@ def base_placeholders(sender, **kwargs):
), ),
SimpleFunctionalTextPlaceholder( SimpleFunctionalTextPlaceholder(
'url_remove', ['waiting_list_voucher', 'event'], 'url_remove', ['waiting_list_voucher', 'event'],
lambda waiting_list_voucher, event: eventreverse_absolute( lambda waiting_list_voucher, event: build_absolute_uri(
event, 'presale:event.waitinglist.remove' event, 'presale:event.waitinglist.remove'
) + '?voucher=' + waiting_list_voucher.code, ) + '?voucher=' + waiting_list_voucher.code,
lambda event: eventreverse_absolute( lambda event: build_absolute_uri(
event, event,
'presale:event.waitinglist.remove', 'presale:event.waitinglist.remove',
) + '?voucher=68CYU2H6ZTP3WLK5', ) + '?voucher=68CYU2H6ZTP3WLK5',
), ),
SimpleFunctionalTextPlaceholder( SimpleFunctionalTextPlaceholder(
'url', ['waiting_list_voucher', 'event'], 'url', ['waiting_list_voucher', 'event'],
lambda waiting_list_voucher, event: eventreverse_absolute( lambda waiting_list_voucher, event: build_absolute_uri(
event, 'presale:event.redeem' event, 'presale:event.redeem'
) + '?voucher=' + waiting_list_voucher.code, ) + '?voucher=' + waiting_list_voucher.code,
lambda event: eventreverse_absolute( lambda event: build_absolute_uri(
event, event,
'presale:event.redeem', 'presale:event.redeem',
) + '?voucher=68CYU2H6ZTP3WLK5', ) + '?voucher=68CYU2H6ZTP3WLK5',
@@ -611,7 +611,7 @@ def base_placeholders(sender, **kwargs):
'orders', ['event', 'orders'], lambda event, orders: '\n' + '\n\n'.join( 'orders', ['event', 'orders'], lambda event, orders: '\n' + '\n\n'.join(
'* {} - {}'.format( '* {} - {}'.format(
order.full_code, order.full_code,
eventreverse_absolute(event, 'presale:event.order.open', kwargs={ build_absolute_uri(event, 'presale:event.order.open', kwargs={
'event': event.slug, 'event': event.slug,
'organizer': event.organizer.slug, 'organizer': event.organizer.slug,
'order': order.code, 'order': order.code,
@@ -623,7 +623,7 @@ def base_placeholders(sender, **kwargs):
), lambda event: '\n' + '\n\n'.join( ), lambda event: '\n' + '\n\n'.join(
'* {} - {}'.format( '* {} - {}'.format(
'{}-{}'.format(event.slug.upper(), order['code']), '{}-{}'.format(event.slug.upper(), order['code']),
eventreverse_absolute(event, 'presale:event.order.open', kwargs={ build_absolute_uri(event, 'presale:event.order.open', kwargs={
'event': event.slug, 'event': event.slug,
'organizer': event.organizer.slug, 'organizer': event.organizer.slug,
'order': order['code'], 'order': order['code'],
@@ -662,13 +662,13 @@ def base_placeholders(sender, **kwargs):
# join vouchers with two spaces at end of line so markdown-parser inserts a <br> # join vouchers with two spaces at end of line so markdown-parser inserts a <br>
'voucher_url_list', ['event', 'voucher_list'], 'voucher_url_list', ['event', 'voucher_list'],
lambda event, voucher_list: ' \n'.join([ lambda event, voucher_list: ' \n'.join([
eventreverse_absolute( build_absolute_uri(
event, 'presale:event.redeem' event, 'presale:event.redeem'
) + '?voucher=' + c ) + '?voucher=' + c
for c in voucher_list for c in voucher_list
]), ]),
lambda event: ' \n'.join([ lambda event: ' \n'.join([
eventreverse_absolute( build_absolute_uri(
event, 'presale:event.redeem' event, 'presale:event.redeem'
) + '?voucher=' + c ) + '?voucher=' + c
for c in ['68CYU2H6ZTP3WLK5', '7MB94KKPVEPSMVF2'] for c in ['68CYU2H6ZTP3WLK5', '7MB94KKPVEPSMVF2']
@@ -676,10 +676,10 @@ def base_placeholders(sender, **kwargs):
inline=False, inline=False,
), ),
SimpleFunctionalTextPlaceholder( SimpleFunctionalTextPlaceholder(
'url', ['event', 'voucher_list'], lambda event, voucher_list: eventreverse_absolute(event, 'presale:event.index', kwargs={ 'url', ['event', 'voucher_list'], lambda event, voucher_list: build_absolute_uri(event, 'presale:event.index', kwargs={
'event': event.slug, 'event': event.slug,
'organizer': event.organizer.slug, 'organizer': event.organizer.slug,
}), lambda event: eventreverse_absolute(event, 'presale:event.index', kwargs={ }), lambda event: build_absolute_uri(event, 'presale:event.index', kwargs={
'event': event.slug, 'event': event.slug,
'organizer': event.organizer.slug, 'organizer': event.organizer.slug,
}) })
+2 -2
View File
@@ -37,7 +37,7 @@ from pretix.base.services.mail import mail
from pretix.base.settings import GlobalSettingsObject from pretix.base.settings import GlobalSettingsObject
from pretix.base.signals import periodic_task from pretix.base.signals import periodic_task
from pretix.celery_app import app from pretix.celery_app import app
from pretix.helpers.urls import mainreverse_absolute from pretix.helpers.urls import build_absolute_uri
@receiver(signal=periodic_task) @receiver(signal=periodic_task)
@@ -121,7 +121,7 @@ def send_update_notification_email():
) )
), ),
{ {
'url': mainreverse_absolute('control:global.update') 'url': build_absolute_uri('control:global.update')
}, },
) )
+2
View File
@@ -1924,6 +1924,8 @@ DEFAULTS = {
'serializer_class': serializers.BooleanField, 'serializer_class': serializers.BooleanField,
'form_kwargs': dict( 'form_kwargs': dict(
label=_("Hide all past dates from calendar"), label=_("Hide all past dates from calendar"),
help_text=_("This option currently only affects the calendar of this event series, not the organizer-wide "
"calendar.")
) )
}, },
'allow_modifications': { 'allow_modifications': {
+1 -1
View File
@@ -11,7 +11,6 @@
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="utf-8"> <meta charset="utf-8">
<link rel="icon" href="{% static "pretixbase/img/favicon.ico" %}"> <link rel="icon" href="{% static "pretixbase/img/favicon.ico" %}">
<script type="text/javascript" src="{% static "pretixbase/js/errors.js" %}"></script>
{% block custom_header %}{% endblock %} {% block custom_header %}{% endblock %}
{% if css_theme %} {% if css_theme %}
<link rel="stylesheet" type="text/css" href="{{ css_theme }}" /> <link rel="stylesheet" type="text/css" href="{{ css_theme }}" />
@@ -21,5 +20,6 @@
<div class="container"> <div class="container">
{% block content %}{% endblock %} {% block content %}{% endblock %}
</div> </div>
<script src="{% static "pretixbase/js/errors.js" %}"></script>
</body> </body>
</html> </html>
@@ -1,28 +0,0 @@
{% extends "error.html" %}
{% load i18n %}
{% load eventurl %}
{% load urlreplace %}
{% load static %}
{% block content %}
<h1>{% trans "Please continue in a new tab" %}</h1>
<p class="larger">
{% blocktrans trimmed %}
For security reasons, the following step is only possible in a new tab.
{% endblocktrans %}
</p>
<p class="larger">
{% blocktrans trimmed %}
If the new tab did not open automatically, please click the following button:
{% endblocktrans %}
</p>
<div class="text-center">
<a href="{{ url }}"
class="btn btn-primary btn-lg" target="_blank">
<span class="fa fa-external-link-square"></span>
{% trans "Continue in new tab" %}
</a>
{{ url|json_script:"framebreak-url" }}
<script type="text/javascript" src="{% static "pretixbase/js/framebreak.js" %}"></script>
</div>
{% endblock %}
@@ -2,14 +2,13 @@
{% load i18n %} {% load i18n %}
{% load rich_text %} {% load rich_text %}
{% load static %} {% load static %}
{% load wrap_in %}
{% block title %}{% trans "Redirect" %}{% endblock %} {% block title %}{% trans "Redirect" %}{% endblock %}
{% block content %} {% block content %}
<i class="fa fa-link fa-fw big-icon"></i> <i class="fa fa-link fa-fw big-icon"></i>
<div class="error-details"> <div class="error-details">
<h1>{% trans "Redirect" %}</h1> <h1>{% trans "Redirect" %}</h1>
<h3> <h3>
{% blocktrans trimmed with host=hostname|wrap_in:'strong' %} {% blocktrans trimmed with host="<strong>"|add:hostname|add:"</strong>"|safe %}
The link you clicked on wants to redirect you to a destination on the website {{ host }}. The link you clicked on wants to redirect you to a destination on the website {{ host }}.
{% endblocktrans %} {% endblocktrans %}
{% blocktrans trimmed %} {% blocktrans trimmed %}
+4 -2
View File
@@ -42,6 +42,8 @@ from bleach import DEFAULT_CALLBACKS, html5lib_shim
from bleach.linkifier import build_email_re from bleach.linkifier import build_email_re
from django import template from django import template
from django.conf import settings from django.conf import settings
from django.core import signing
from django.urls import reverse
from django.utils.functional import SimpleLazyObject from django.utils.functional import SimpleLazyObject
from django.utils.html import escape from django.utils.html import escape
from django.utils.http import url_has_allowed_host_and_scheme from django.utils.http import url_has_allowed_host_and_scheme
@@ -52,7 +54,6 @@ from markdown.postprocessors import Postprocessor
from markdown.treeprocessors import UnescapeTreeprocessor from markdown.treeprocessors import UnescapeTreeprocessor
from tlds import tld_set from tlds import tld_set
from pretix.base.views.redirect import safelink
from pretix.helpers.format import SafeFormatter, format_map from pretix.helpers.format import SafeFormatter, format_map
register = template.Library() register = template.Library()
@@ -157,7 +158,8 @@ def safelink_callback(attrs, new=False):
""" """
url = html.unescape(attrs.get((None, 'href'), '/')) url = html.unescape(attrs.get((None, 'href'), '/'))
if not url_has_allowed_host_and_scheme(url, allowed_hosts=None) and not url.startswith('mailto:') and not url.startswith('tel:'): if not url_has_allowed_host_and_scheme(url, allowed_hosts=None) and not url.startswith('mailto:') and not url.startswith('tel:'):
attrs[None, 'href'] = safelink(url) signer = signing.Signer(salt='safe-redirect')
attrs[None, 'href'] = reverse('redirect') + '?url=' + urllib.parse.quote(signer.sign(url))
attrs[None, 'target'] = '_blank' attrs[None, 'target'] = '_blank'
attrs[None, 'rel'] = 'noopener' attrs[None, 'rel'] = 'noopener'
return attrs return attrs
+6 -29
View File
@@ -19,7 +19,6 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see # You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>. # <https://www.gnu.org/licenses/>.
# #
import logging
import urllib.parse import urllib.parse
from django.core import signing from django.core import signing
@@ -27,8 +26,6 @@ from django.http import HttpResponseBadRequest, HttpResponseRedirect
from django.shortcuts import render from django.shortcuts import render
from django.urls import reverse from django.urls import reverse
logger = logging.getLogger(__name__)
def _is_samesite_referer(request): def _is_samesite_referer(request):
referer = request.headers.get('referer') referer = request.headers.get('referer')
@@ -45,16 +42,11 @@ def _is_samesite_referer(request):
def redir_view(request): def redir_view(request):
framebreak = "framebreak" in request.GET signer = signing.Signer(salt='safe-redirect')
salt = 'framebreak-safelink-url' if framebreak else 'safelink-url'
try: try:
url = signing.Signer(salt=salt).unsign(request.GET.get('url', '')) url = signer.unsign(request.GET.get('url', ''))
except signing.BadSignature: except signing.BadSignature:
try: return HttpResponseBadRequest('Invalid parameter')
# Backwards-compatibility for a change in 2026-06, remove after a while
url = signing.Signer(salt='safe-redirect').unsign(request.GET.get('url', ''))
except signing.BadSignature:
return HttpResponseBadRequest('Invalid parameter')
if not _is_samesite_referer(request): if not _is_samesite_referer(request):
u = urllib.parse.urlparse(url) u = urllib.parse.urlparse(url)
@@ -63,26 +55,11 @@ def redir_view(request):
'url': url, 'url': url,
}) })
if framebreak:
r = render(request, 'pretixbase/framebreak.html', {
'url': url,
})
r.xframe_options_exempt = True
return r
r = HttpResponseRedirect(url) r = HttpResponseRedirect(url)
r['X-Robots-Tag'] = 'noindex' r['X-Robots-Tag'] = 'noindex'
return r return r
def safelink(url, framebreak=False): def safelink(url):
url = str(url) signer = signing.Signer(salt='safe-redirect')
if not (url.startswith('https://') or url.startswith('http://') or url.startswith("/")): return reverse('redirect') + '?url=' + urllib.parse.quote(signer.sign(url))
logger.warning('Invalid URL passed to safelink: %r', url)
return '#invalid-url'
salt = 'framebreak-safelink-url' if framebreak else 'safelink-url'
signer = signing.Signer(salt=salt)
u = reverse('redirect') + '?url=' + urllib.parse.quote(signer.sign(url))
if framebreak:
u += "&framebreak=true"
return u
+2 -2
View File
@@ -80,7 +80,7 @@ from pretix.control.forms.widgets import Select2
from pretix.helpers.countries import CachedCountries from pretix.helpers.countries import CachedCountries
from pretix.multidomain.models import AlternativeDomainAssignment, KnownDomain from pretix.multidomain.models import AlternativeDomainAssignment, KnownDomain
from pretix.multidomain.urlreverse import ( from pretix.multidomain.urlreverse import (
eventreverse_absolute, get_organizer_domain, build_absolute_uri, get_organizer_domain,
) )
from pretix.plugins.banktransfer.payment import BankTransfer from pretix.plugins.banktransfer.payment import BankTransfer
from pretix.presale.style import get_fonts from pretix.presale.style import get_fonts
@@ -219,7 +219,7 @@ class EventWizardBasicsForm(I18nModelForm):
self.fields['location'].widget.attrs['placeholder'] = _( self.fields['location'].widget.attrs['placeholder'] = _(
'Sample Conference Center\nHeidelberg, Germany' 'Sample Conference Center\nHeidelberg, Germany'
) )
self.fields['slug'].widget.prefix = eventreverse_absolute(self.organizer, 'presale:organizer.index') self.fields['slug'].widget.prefix = build_absolute_uri(self.organizer, 'presale:organizer.index')
self.fields['tax_rate']._required = True # Do not render as optional because it is conditionally required self.fields['tax_rate']._required = True # Do not render as optional because it is conditionally required
if self.has_subevents: if self.has_subevents:
del self.fields['presale_start'] del self.fields['presale_start']
+1 -7
View File
@@ -1342,13 +1342,7 @@ class QuestionAnswerFilterForm(forms.Form):
opqs = opqs.filter(canceled=False) opqs = opqs.filter(canceled=False)
if fdata.get("item", "") != "": if fdata.get("item", "") != "":
i = fdata.get("item", "") i = fdata.get("item", "")
if '-' in i: opqs = opqs.filter(item_id__in=(i,))
opqs = opqs.filter(
item_id=i.split('-')[0],
variation_id=i.split('-')[1],
)
else:
opqs = opqs.filter(item_id=i)
return opqs return opqs
+2 -2
View File
@@ -88,7 +88,7 @@ from pretix.control.forms.event import (
) )
from pretix.control.forms.widgets import Select2, Select2Multiple from pretix.control.forms.widgets import Select2, Select2Multiple
from pretix.multidomain.models import KnownDomain from pretix.multidomain.models import KnownDomain
from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.multidomain.urlreverse import build_absolute_uri
class OrganizerForm(I18nModelForm): class OrganizerForm(I18nModelForm):
@@ -791,7 +791,7 @@ class MailSettingsForm(SettingsForm):
} }
if 'url' in base_parameters: if 'url' in base_parameters:
placeholders['url'] = eventreverse_absolute( placeholders['url'] = build_absolute_uri(
self.organizer, self.organizer,
'presale:organizer.customer.activate' 'presale:organizer.customer.activate'
) + '?token=' + get_random_string(30) ) + '?token=' + get_random_string(30)
+7 -11
View File
@@ -36,7 +36,6 @@ from urllib.parse import quote, urljoin, urlparse
from django.conf import settings from django.conf import settings
from django.contrib.auth import REDIRECT_FIELD_NAME, logout from django.contrib.auth import REDIRECT_FIELD_NAME, logout
from django.contrib.auth.views import redirect_to_login
from django.http import Http404 from django.http import Http404
from django.shortcuts import get_object_or_404, resolve_url from django.shortcuts import get_object_or_404, resolve_url
from django.template.response import TemplateResponse from django.template.response import TemplateResponse
@@ -213,17 +212,14 @@ class AuditLogMiddleware:
if request.path.startswith(get_script_prefix() + 'control') and request.user.is_authenticated: if request.path.startswith(get_script_prefix() + 'control') and request.user.is_authenticated:
if getattr(request.user, "is_hijacked", False): if getattr(request.user, "is_hijacked", False):
hijack_history = request.session.get('hijack_history', False) hijack_history = request.session.get('hijack_history', False)
hijacker = get_object_or_404(User, pk=hijack_history[0]["user"]) hijacker = get_object_or_404(User, pk=hijack_history[0])
ss = hijacker.get_active_staff_session(request.session.get('hijacker_session')) ss = hijacker.get_active_staff_session(request.session.get('hijacker_session'))
if not ss: if ss:
# Staff session expired or not found ss.logs.create(
logout(request) url=request.path,
return redirect_to_login(request.get_full_path()) method=request.method,
ss.logs.create( impersonating=request.user
url=request.path, )
method=request.method,
impersonating=request.user
)
else: else:
ss = request.user.get_active_staff_session(request.session.session_key) ss = request.user.get_active_staff_session(request.session.session_key)
if ss: if ss:
+22 -23
View File
@@ -38,7 +38,6 @@ from pretix import __version__
from pretix.base.models import Order, OrderPayment, Transaction from pretix.base.models import Order, OrderPayment, Transaction
from pretix.base.plugins import get_all_plugins from pretix.base.plugins import get_all_plugins
from pretix.base.templatetags.money import money_filter from pretix.base.templatetags.money import money_filter
from pretix.helpers.reportlab import PlainTextParagraph
from pretix.plugins.reports.exporters import ReportlabExportMixin from pretix.plugins.reports.exporters import ReportlabExportMixin
from pretix.settings import DATA_DIR from pretix.settings import DATA_DIR
@@ -80,23 +79,23 @@ class SysReport(ReportlabExportMixin):
style_small.fontSize = 6 style_small.fontSize = 6
story = [ story = [
PlainTextParagraph("System report", headlinestyle), Paragraph("System report", headlinestyle),
Spacer(1, 5 * mm), Spacer(1, 5 * mm),
PlainTextParagraph("Usage", subheadlinestyle), Paragraph("Usage", subheadlinestyle),
Spacer(1, 5 * mm), Spacer(1, 5 * mm),
self._usage_table(), self._usage_table(),
Spacer(1, 5 * mm), Spacer(1, 5 * mm),
PlainTextParagraph("Installed versions", subheadlinestyle), Paragraph("Installed versions", subheadlinestyle),
Spacer(1, 5 * mm), Spacer(1, 5 * mm),
self._tech_table(), self._tech_table(),
Spacer(1, 5 * mm), Spacer(1, 5 * mm),
PlainTextParagraph("Plugins", subheadlinestyle), Paragraph("Plugins", subheadlinestyle),
Spacer(1, 5 * mm), Spacer(1, 5 * mm),
PlainTextParagraph(self._get_plugin_versions(), style_small), Paragraph(self._get_plugin_versions(), style_small),
Spacer(1, 5 * mm), Spacer(1, 5 * mm),
PlainTextParagraph("Custom templates", subheadlinestyle), Paragraph("Custom templates", subheadlinestyle),
Spacer(1, 5 * mm), Spacer(1, 5 * mm),
PlainTextParagraph(self._get_custom_templates(), style_small), Paragraph(self._get_custom_templates(), style_small),
Spacer(1, 5 * mm), Spacer(1, 5 * mm),
] ]
@@ -122,13 +121,13 @@ class SysReport(ReportlabExportMixin):
("RIGHTPADDING", (-1, 0), (-1, -1), 0), ("RIGHTPADDING", (-1, 0), (-1, -1), 0),
] ]
tdata = [ tdata = [
[PlainTextParagraph("Site URL:", style), Paragraph(settings.SITE_URL, style)], [Paragraph("Site URL:", style), Paragraph(settings.SITE_URL, style)],
[PlainTextParagraph("pretix version:", style), Paragraph(__version__, style)], [Paragraph("pretix version:", style), Paragraph(__version__, style)],
[PlainTextParagraph("Python version:", style), Paragraph(sys.version, style)], [Paragraph("Python version:", style), Paragraph(sys.version, style)],
[PlainTextParagraph("Platform:", style), Paragraph(platform.platform(), style)], [Paragraph("Platform:", style), Paragraph(platform.platform(), style)],
[ [
PlainTextParagraph("Database engine:", style), Paragraph("Database engine:", style),
PlainTextParagraph(settings.DATABASES["default"]["ENGINE"], style), Paragraph(settings.DATABASES["default"]["ENGINE"], style),
], ],
] ]
table = Table(tdata, colWidths=colwidths, repeatRows=0) table = Table(tdata, colWidths=colwidths, repeatRows=0)
@@ -207,7 +206,7 @@ class SysReport(ReportlabExportMixin):
year_last = now().year year_last = now().year
tdata = [ tdata = [
[ [
PlainTextParagraph(l, style_small_head) Paragraph(l, style_small_head)
for l in ( for l in (
"Time frame", "Time frame",
"Currency", "Currency",
@@ -258,19 +257,19 @@ class SysReport(ReportlabExportMixin):
tdata.append( tdata.append(
( (
PlainTextParagraph( Paragraph(
date_format(first_day, "M Y") date_format(first_day, "M Y")
+ " " + " "
+ date_format(after_day - timedelta(days=1), "M Y"), + date_format(after_day - timedelta(days=1), "M Y"),
style_small, style_small,
), ),
PlainTextParagraph(c, style_small), Paragraph(c, style_small),
PlainTextParagraph(str(orders_count), style_small) if i == 0 else "", Paragraph(str(orders_count), style_small) if i == 0 else "",
PlainTextParagraph(money_filter(revenue_data.get("s_net") or 0, c), style_small), Paragraph(money_filter(revenue_data.get("s_net") or 0, c), style_small),
PlainTextParagraph(str(testmode_count), style_small) if i == 0 else "", Paragraph(str(testmode_count), style_small) if i == 0 else "",
PlainTextParagraph(str(unconfirmed_count), style_small) if i == 0 else "", Paragraph(str(unconfirmed_count), style_small) if i == 0 else "",
PlainTextParagraph(str(revenue_data.get("c") or 0), style_small), Paragraph(str(revenue_data.get("c") or 0), style_small),
PlainTextParagraph(money_filter(revenue_data.get("s_gross") or 0, c), style_small), Paragraph(money_filter(revenue_data.get("s_gross") or 0, c), style_small),
) )
) )
@@ -66,7 +66,6 @@
<script type="text/javascript" src="{% static "lightbox/js/lightbox.js" %}"></script> <script type="text/javascript" src="{% static "lightbox/js/lightbox.js" %}"></script>
<script type="text/javascript" src="{% static "are-you-sure/jquery.are-you-sure.js" %}"></script> <script type="text/javascript" src="{% static "are-you-sure/jquery.are-you-sure.js" %}"></script>
<script type="text/javascript" src="{% static "pretixbase/js/addressform.js" %}"></script> <script type="text/javascript" src="{% static "pretixbase/js/addressform.js" %}"></script>
<script type="text/javascript" src="{% static "pretixbase/js/errors.js" %}"></script>
{% endcompress %} {% endcompress %}
{{ html_head|safe }} {{ html_head|safe }}
@@ -19,7 +19,9 @@
{% endif %} {% endif %}
</h1> </h1>
{{ layout|json_script:"editor-data" }} <script type="application/json" id="editor-data">
{{ layout|safe }}
</script>
<div class="row"> <div class="row">
<div class="col-md-9"> <div class="col-md-9">
<div class="panel panel-default panel-pdf-editor"> <div class="panel panel-default panel-pdf-editor">
+7 -11
View File
@@ -41,7 +41,7 @@ from collections import OrderedDict, defaultdict
from decimal import Decimal from decimal import Decimal
from io import BytesIO from io import BytesIO
from itertools import groupby from itertools import groupby
from urllib.parse import urlsplit from urllib.parse import urlparse, urlsplit
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
import bleach import bleach
@@ -64,6 +64,7 @@ from django.shortcuts import get_object_or_404, redirect
from django.urls import NoReverseMatch, reverse from django.urls import NoReverseMatch, reverse
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.utils.html import conditional_escape, format_html from django.utils.html import conditional_escape, format_html
from django.utils.http import url_has_allowed_host_and_scheme
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import gettext, gettext_lazy as _, gettext_noop from django.utils.translation import gettext, gettext_lazy as _, gettext_noop
@@ -96,9 +97,7 @@ from pretix.control.permissions import EventPermissionRequiredMixin
from pretix.control.views.mailsetup import MailSettingsSetupView from pretix.control.views.mailsetup import MailSettingsSetupView
from pretix.control.views.user import RecentAuthenticationRequiredMixin from pretix.control.views.user import RecentAuthenticationRequiredMixin
from pretix.helpers.database import rolledback_transaction from pretix.helpers.database import rolledback_transaction
from pretix.multidomain.urlreverse import ( from pretix.multidomain.urlreverse import build_absolute_uri, get_event_domain
eventreverse_absolute, get_event_domain,
)
from pretix.presale.views.widget import ( from pretix.presale.views.widget import (
version_default as widget_version_default, version_default as widget_version_default,
) )
@@ -1149,11 +1148,8 @@ class EventLive(EventPermissionRequiredMixin, TemplateView):
if request.POST.get("delete") == "yes": if request.POST.get("delete") == "yes":
try: try:
with transaction.atomic(): with transaction.atomic():
Order.gracefully_delete_bulk( for order in request.event.orders.filter(testmode=True):
request.event, order.gracefully_delete(user=self.request.user)
request.event.orders.filter(testmode=True),
user=self.request.user
)
except ProtectedError: except ProtectedError:
messages.error(self.request, _('An order could not be deleted as some constraints (e.g. data ' messages.error(self.request, _('An order could not be deleted as some constraints (e.g. data '
'created by plug-ins) do not allow it.')) 'created by plug-ins) do not allow it.'))
@@ -1738,10 +1734,10 @@ class EventQRCode(EventPermissionRequiredMixin, View):
permission = None permission = None
def get(self, request, *args, filetype, **kwargs): def get(self, request, *args, filetype, **kwargs):
url = eventreverse_absolute(request.event, 'presale:event.index') url = build_absolute_uri(request.event, 'presale:event.index')
if "url" in request.GET: if "url" in request.GET:
if request.GET["url"].startswith(url): if url_has_allowed_host_and_scheme(request.GET["url"], allowed_hosts=[urlparse(url).netloc]):
url = request.GET["url"] url = request.GET["url"]
else: else:
raise PermissionDenied("Untrusted URL") raise PermissionDenied("Untrusted URL")
+4 -17
View File
@@ -139,7 +139,6 @@ from pretix.helpers import OF_SELF
from pretix.helpers.compat import CompatDeleteView from pretix.helpers.compat import CompatDeleteView
from pretix.helpers.format import SafeFormatter, format_map from pretix.helpers.format import SafeFormatter, format_map
from pretix.helpers.hierarkey import clean_filename from pretix.helpers.hierarkey import clean_filename
from pretix.helpers.iter import chunked_iterable
from pretix.helpers.json import CustomJSONEncoder from pretix.helpers.json import CustomJSONEncoder
from pretix.helpers.safedownload import check_token from pretix.helpers.safedownload import check_token
from pretix.presale.signals import question_form_fields from pretix.presale.signals import question_form_fields
@@ -241,7 +240,7 @@ class BaseOrderBulkActionView(OrderSearchMixin, EventPermissionRequiredMixin, As
raise NotImplementedError() raise NotImplementedError()
def execute_bulk(self, queryset: QuerySet, form: forms.Form): def execute_bulk(self, queryset: QuerySet, form: forms.Form):
qs = self.allowed_for(self.get_queryset()) qs = self.allowed_for(self.allowed_for(self.get_queryset()))
total = qs.count() total = qs.count()
orders_with_successful_action = 0 orders_with_successful_action = 0
for i, o in enumerate(qs): for i, o in enumerate(qs):
@@ -395,21 +394,9 @@ class OrderDeleteBulkActionView(BaseOrderBulkActionView):
testmode=True, testmode=True,
) )
def execute_bulk(self, queryset: QuerySet, form: forms.Form): def execute_single(self, instance, form: forms.Form):
qs = self.allowed_for(self.get_queryset()) instance.gracefully_delete(user=self.request.user)
total = qs.count() return True
all_ids = list(qs.values_list("id", flat=True))
orders_with_successful_action = 0
for chunk in chunked_iterable(all_ids, 1000):
Order.gracefully_delete_bulk(
self.request.event,
qs.filter(id__in=chunk),
user=self.request.user,
)
orders_with_successful_action += len(chunk)
self.async_set_progress(orders_with_successful_action / total * 100)
return orders_with_successful_action, total
class OrderList(OrderSearchMixin, EventPermissionRequiredMixin, PaginationMixin, ListView): class OrderList(OrderSearchMixin, EventPermissionRequiredMixin, PaginationMixin, ListView):
+8 -10
View File
@@ -139,8 +139,8 @@ from pretix.helpers import OF_SELF, GroupConcat
from pretix.helpers.compat import CompatDeleteView from pretix.helpers.compat import CompatDeleteView
from pretix.helpers.dicts import merge_dicts from pretix.helpers.dicts import merge_dicts
from pretix.helpers.format import SafeFormatter, format_map from pretix.helpers.format import SafeFormatter, format_map
from pretix.helpers.urls import mainreverse_absolute from pretix.helpers.urls import build_absolute_uri as build_global_uri
from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.presale.forms.customer import TokenGenerator from pretix.presale.forms.customer import TokenGenerator
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -1039,7 +1039,7 @@ class TeamMemberView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin,
'user': self, 'user': self,
'organizer': self.request.organizer.name, 'organizer': self.request.organizer.name,
'team': instance.team.name, 'team': instance.team.name,
'url': mainreverse_absolute('control:auth.invite', kwargs={ 'url': build_global_uri('control:auth.invite', kwargs={
'token': instance.token 'token': instance.token
}) })
}, },
@@ -2851,12 +2851,10 @@ class SSOProviderUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequire
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
ctx['redirect_uri'] = eventreverse_absolute( ctx['redirect_uri'] = build_absolute_uri(self.request.organizer, 'presale:organizer.customer.login.return',
self.request.organizer, 'presale:organizer.customer.login.return', kwargs={
kwargs={ 'provider': self.object.pk
'provider': self.object.pk })
}
)
return ctx return ctx
def get_form_kwargs(self): def get_form_kwargs(self):
@@ -3087,7 +3085,7 @@ class CustomerDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi
self.customer.log_action('pretix.customer.password.resetrequested', {}, user=self.request.user) self.customer.log_action('pretix.customer.password.resetrequested', {}, user=self.request.user)
ctx = self.customer.get_email_context() ctx = self.customer.get_email_context()
token = TokenGenerator().make_token(self.customer) token = TokenGenerator().make_token(self.customer)
ctx['url'] = eventreverse_absolute( ctx['url'] = build_absolute_uri(
self.request.organizer, self.request.organizer,
'presale:organizer.customer.recoverpw' 'presale:organizer.customer.recoverpw'
) + '?id=' + self.customer.identifier + '&token=' + token ) + '?id=' + self.customer.identifier + '&token=' + token
+1 -1
View File
@@ -284,7 +284,7 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView):
ctx['pdf'] = self.get_current_background() ctx['pdf'] = self.get_current_background()
ctx['variables'] = self.get_variables() ctx['variables'] = self.get_variables()
ctx['images'] = self.get_images() ctx['images'] = self.get_images()
ctx['layout'] = self.get_current_layout() ctx['layout'] = json.dumps(self.get_current_layout())
ctx['title'] = self.title ctx['title'] = self.title
ctx['locales'] = [p for p in settings.LANGUAGES if p[0] in self.request.event.settings.locales] ctx['locales'] = [p for p in settings.LANGUAGES if p[0] in self.request.event.settings.locales]
ctx['maxfilesize'] = self.maxfilesize ctx['maxfilesize'] = self.maxfilesize
-1
View File
@@ -537,7 +537,6 @@ class SubEventDetail(EventPermissionRequiredMixin, DetailView):
pcnt=Subquery( pcnt=Subquery(
OrderPosition.objects.filter( OrderPosition.objects.filter(
subevent=self.object, subevent=self.object,
order_id=OuterRef("id"),
).values("subevent").annotate(c=Count("*")).values("c") ).values("subevent").annotate(c=Count("*")).values("c")
), ),
has_cancellation_request=Exists(CancellationRequest.objects.filter(order=OuterRef("pk"))), has_cancellation_request=Exists(CancellationRequest.objects.filter(order=OuterRef("pk"))),
+16 -56
View File
@@ -19,23 +19,19 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see # You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>. # <https://www.gnu.org/licenses/>.
# #
import hmac
import json import json
from contextlib import contextmanager from contextlib import contextmanager
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth import ( from django.contrib.auth import (
BACKEND_SESSION_KEY, HASH_SESSION_KEY, get_user_model, load_backend, login, BACKEND_SESSION_KEY, get_user_model, load_backend, login,
logout,
) )
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.views import redirect_to_login
from django.core.exceptions import PermissionDenied
from django.db import transaction from django.db import transaction
from django.shortcuts import get_object_or_404, redirect from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse from django.urls import reverse
from django.utils.crypto import get_random_string, salted_hmac from django.utils.crypto import get_random_string
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views import View from django.views import View
@@ -222,13 +218,11 @@ class UserImpersonateView(AdministratorPermissionRequiredMixin, RecentAuthentica
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
self.object = get_object_or_404(User, pk=self.kwargs.get("id")) self.object = get_object_or_404(User, pk=self.kwargs.get("id"))
staff_session = request.user.get_active_staff_session(request.session.session_key)
self.request.user.log_action('pretix.control.auth.user.impersonated', self.request.user.log_action('pretix.control.auth.user.impersonated',
user=request.user, user=request.user,
data={ data={
'other': self.kwargs.get("id"), 'other': self.kwargs.get("id"),
'other_email': self.object.email, 'other_email': self.object.email
'staff_session': staff_session.pk,
}) })
oldkey = request.session.session_key oldkey = request.session.session_key
@@ -236,15 +230,7 @@ class UserImpersonateView(AdministratorPermissionRequiredMixin, RecentAuthentica
hijacked = self.object hijacked = self.object
hijack_history = request.session.get("hijack_history", []) hijack_history = request.session.get("hijack_history", [])
hijack_history.append({ hijack_history.append(request.user._meta.pk.value_to_string(hijacker))
"user": request.user.pk,
# We include the auth_hash, because it is unguessable. So should an attacker gain an attack vector to
# modify hijack_history, they can't just insert or change a user that shouldn't be there. We HMAC it
# again, though, since we also do not want the auth_hash of the admin user to be in the session of an
# unprivileged user to contain the risk if there is some leak of session data.
"auth_hash": salted_hmac(key_salt=b"hijack-history-hash", value=request.session[HASH_SESSION_KEY],
algorithm="sha256", secret=settings.SECRET_KEY).hexdigest(),
})
backend = get_used_backend(request) backend = get_used_backend(request)
backend = f"{backend.__module__}.{backend.__class__.__name__}" backend = f"{backend.__module__}.{backend.__class__.__name__}"
@@ -252,12 +238,6 @@ class UserImpersonateView(AdministratorPermissionRequiredMixin, RecentAuthentica
with signals.no_update_last_login(), keep_session_age(request.session): with signals.no_update_last_login(), keep_session_age(request.session):
login(request, hijacked, backend=backend) login(request, hijacked, backend=backend)
request.session.save()
staff_session.logs.create(
method='(NOTE)',
url=f'Begin impersonating user #{hijacked.pk} (request session {oldkey[:8]} -> {request.session.session_key[:8]})',
)
request.session["hijack_history"] = hijack_history request.session["hijack_history"] = hijack_history
signals.hijack_started.send( signals.hijack_started.send(
@@ -274,28 +254,13 @@ class UserImpersonateView(AdministratorPermissionRequiredMixin, RecentAuthentica
class UserImpersonateStopView(LoginRequiredMixin, View): class UserImpersonateStopView(LoginRequiredMixin, View):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
staff_session_key = request.session['hijacker_session'] impersonated = request.user
prev_session_key = request.session.session_key
hijs = request.session['hijacker_session']
hijack_history = request.session.get("hijack_history", []) hijack_history = request.session.get("hijack_history", [])
hijacked = request.user hijacked = request.user
prev_session = hijack_history.pop() user_pk = hijack_history.pop()
hijacker = get_object_or_404(get_user_model(), pk=prev_session["user"]) hijacker = get_object_or_404(get_user_model(), pk=user_pk)
staff_session = hijacker.get_active_staff_session(staff_session_key)
if not staff_session:
raise PermissionDenied
expected_hash = salted_hmac(
key_salt=b"hijack-history-hash",
value=hijacker.get_session_auth_hash(),
algorithm="sha256",
secret=settings.SECRET_KEY
).hexdigest()
if not hmac.compare_digest(expected_hash, prev_session["auth_hash"]):
# Could be an attacker-controlled hijack history, but could also be e.g. a password change of the admin user
# that happened during the hijack session
logout(request)
return redirect_to_login(request.get_full_path())
backend = get_used_backend(request) backend = get_used_backend(request)
backend = f"{backend.__module__}.{backend.__class__.__name__}" backend = f"{backend.__module__}.{backend.__class__.__name__}"
with signals.no_update_last_login(), keep_session_age(request.session): with signals.no_update_last_login(), keep_session_age(request.session):
@@ -310,22 +275,17 @@ class UserImpersonateStopView(LoginRequiredMixin, View):
hijacked=hijacked, hijacked=hijacked,
) )
request.session.save() ss = request.user.get_active_staff_session(hijs)
staff_session.session_key = request.session.session_key if ss:
staff_session.save() request.session.save()
ss.session_key = request.session.session_key
staff_session.logs.create( ss.save()
method='(NOTE)',
url=f'Stop impersonating user #{hijacked.pk} (request session {prev_session_key[:8]}, '
f'staff session {staff_session_key[:8]} -> {request.session.session_key[:8]})',
)
request.user.log_action('pretix.control.auth.user.impersonate_stopped', request.user.log_action('pretix.control.auth.user.impersonate_stopped',
user=request.user, user=request.user,
data={ data={
'other': hijacked.pk, 'other': impersonated.pk,
'other_email': hijacked.email, 'other_email': impersonated.email
'staff_session': staff_session.pk,
}) })
return redirect(reverse('control:index')) return redirect(reverse('control:index'))
+2 -2
View File
@@ -77,7 +77,7 @@ from pretix.control.views import PaginationMixin
from pretix.helpers.compat import CompatDeleteView from pretix.helpers.compat import CompatDeleteView
from pretix.helpers.format import SafeFormatter, format_map from pretix.helpers.format import SafeFormatter, format_map
from pretix.helpers.models import modelcopy from pretix.helpers.models import modelcopy
from pretix.multidomain.urlreverse import eventreverse_absolute from pretix.multidomain.urlreverse import build_absolute_uri
class VoucherList(PaginationMixin, EventPermissionRequiredMixin, ListView): class VoucherList(PaginationMixin, EventPermissionRequiredMixin, ListView):
@@ -338,7 +338,7 @@ class VoucherUpdate(EventPermissionRequiredMixin, UpdateView):
} }
if self.object.subevent_id: if self.object.subevent_id:
url_params['subevent'] = self.object.subevent_id url_params['subevent'] = self.object.subevent_id
ctx['url'] = eventreverse_absolute(self.request.event, "presale:event.redeem") + "?" + urlencode(url_params) ctx['url'] = build_absolute_uri(self.request.event, "presale:event.redeem") + "?" + urlencode(url_params)
return ctx return ctx
-5
View File
@@ -29,8 +29,3 @@ class PretixHelpersConfig(AppConfig):
def ready(self): def ready(self):
from .monkeypatching import monkeypatch_all_at_ready from .monkeypatching import monkeypatch_all_at_ready
monkeypatch_all_at_ready() monkeypatch_all_at_ready()
# Ensure reportlab does not make any calls to the internet or the local disk
from reportlab import rl_config
rl_config.trustedHosts = []
rl_config.trustedSchemes = ['data']
-7
View File
@@ -46,13 +46,6 @@ class RequestIdFilter(logging.Filter):
return True return True
class SkipNotFoundFilter(logging.Filter):
# Drop the WARNING "Not Found: ..." records django.request emits for 404s
# We have different access logs for that
def filter(self, record):
return getattr(record, 'status_code', None) != 404
class RequestIdMiddleware: class RequestIdMiddleware:
def __init__(self, get_response): def __init__(self, get_response):
self.get_response = get_response self.get_response = get_response
+1 -23
View File
@@ -27,7 +27,6 @@ from datetime import datetime
from http import cookies from http import cookies
from django.conf import settings from django.conf import settings
from django.core.exceptions import SuspiciousFileOperation
from PIL import Image from PIL import Image
from requests.adapters import HTTPAdapter from requests.adapters import HTTPAdapter
from urllib3.connection import HTTPConnection, HTTPSConnection from urllib3.connection import HTTPConnection, HTTPSConnection
@@ -41,8 +40,6 @@ from urllib3.util.connection import (
) )
from urllib3.util.timeout import _DEFAULT_TIMEOUT from urllib3.util.timeout import _DEFAULT_TIMEOUT
from pretix.helpers.reportlab import ThumbnailingImageReader
_cgnat_net = ipaddress.ip_network('100.64.0.0/10') _cgnat_net = ipaddress.ip_network('100.64.0.0/10')
@@ -151,14 +148,13 @@ def monkeypatch_urllib3_ssrf_protection():
if not getattr(settings, "ALLOW_HTTP_TO_PRIVATE_NETWORKS", False): if not getattr(settings, "ALLOW_HTTP_TO_PRIVATE_NETWORKS", False):
ip_addr = ipaddress.ip_address(sa[0]) ip_addr = ipaddress.ip_address(sa[0])
check_ip4 = ip_addr.ipv4_mapped if getattr(ip_addr, "ipv4_mapped", None) else ip_addr
if ip_addr.is_multicast: if ip_addr.is_multicast:
raise HTTPError(f"Request to multicast address {sa[0]} blocked") raise HTTPError(f"Request to multicast address {sa[0]} blocked")
if ip_addr.is_loopback or ip_addr.is_link_local: if ip_addr.is_loopback or ip_addr.is_link_local:
raise HTTPError(f"Request to local address {sa[0]} blocked") raise HTTPError(f"Request to local address {sa[0]} blocked")
if ip_addr.is_private: if ip_addr.is_private:
raise HTTPError(f"Request to private address {sa[0]} blocked") raise HTTPError(f"Request to private address {sa[0]} blocked")
if check_ip4 in _cgnat_net: if ip_addr in _cgnat_net:
raise HTTPError(f"Request to RFC 6598 address {sa[0]} blocked") raise HTTPError(f"Request to RFC 6598 address {sa[0]} blocked")
sock = None sock = None
@@ -234,27 +230,9 @@ def monkeypatch_cookie_morsel():
cookies.Morsel._reserved.setdefault("partitioned", "Partitioned") cookies.Morsel._reserved.setdefault("partitioned", "Partitioned")
def monkeypatch_reportlab_imagereader():
from reportlab.lib import utils
old_init = utils.ImageReader.__init__
def new_init(self, fileName, ident=None): # noqa
if not isinstance(fileName, Image.Image) and not hasattr(fileName, 'read') and not hasattr(fileName, 'str'):
if not isinstance(self, ThumbnailingImageReader):
# ThumbnailingImageReader is only used by us explicitly and not by using <img> in html, so it is safe
raise SuspiciousFileOperation("reportlab should not be reading images from disk")
return types.MethodType(old_init, self)(
fileName, ident
)
utils.ImageReader.__init__ = new_init
def monkeypatch_all_at_ready(): def monkeypatch_all_at_ready():
monkeypatch_vobject_performance() monkeypatch_vobject_performance()
monkeypatch_pillow_safer() monkeypatch_pillow_safer()
monkeypatch_requests_timeout() monkeypatch_requests_timeout()
monkeypatch_urllib3_ssrf_protection() monkeypatch_urllib3_ssrf_protection()
monkeypatch_cookie_morsel() monkeypatch_cookie_morsel()
monkeypatch_reportlab_imagereader()
-39
View File
@@ -20,19 +20,14 @@
# <https://www.gnu.org/licenses/>. # <https://www.gnu.org/licenses/>.
# #
import logging import logging
import re
import unicodedata
from arabic_reshaper import ArabicReshaper from arabic_reshaper import ArabicReshaper
from bidi import get_display
from django.conf import settings from django.conf import settings
from django.utils.functional import SimpleLazyObject from django.utils.functional import SimpleLazyObject
from django.utils.html import escape
from PIL import Image from PIL import Image
from reportlab.lib.styles import ParagraphStyle from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.utils import ImageReader from reportlab.lib.utils import ImageReader
from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.platypus import Paragraph from reportlab.platypus import Paragraph
from pretix.presale.style import get_fonts from pretix.presale.style import get_fonts
@@ -75,20 +70,6 @@ reshaper = SimpleLazyObject(lambda: ArabicReshaper(configuration={
})) }))
def normalize_text(text: str) -> str:
# reportlab does not support unicode combination characters
# It's important we do this before we use ArabicReshaper
text = unicodedata.normalize("NFKC", text)
# reportlab does not support RTL, ligature-heavy scripts like Arabic. Therefore, we use ArabicReshaper
# to resolve all ligatures and python-bidi to switch RTL texts.
try:
text = "\n".join(get_display(reshaper.reshape(l)) for l in re.split("\n", text))
except:
logger.exception('Reshaping/Bidi fixes failed on string {}'.format(repr(text)))
return text
class FontFallbackParagraph(Paragraph): class FontFallbackParagraph(Paragraph):
def __init__(self, text, style=None, *args, **kwargs): def __init__(self, text, style=None, *args, **kwargs):
if style is None: if style is None:
@@ -106,8 +87,6 @@ class FontFallbackParagraph(Paragraph):
if not text: if not text:
return True return True
font = pdfmetrics.getFont(font_name) font = pdfmetrics.getFont(font_name)
if not isinstance(font, TTFont):
return True
return all( return all(
ord(c) in font.face.charToGlyph or not c.isprintable() ord(c) in font.face.charToGlyph or not c.isprintable()
for c in text for c in text
@@ -123,24 +102,6 @@ class FontFallbackParagraph(Paragraph):
return family return family
class PlainTextParagraph(FontFallbackParagraph):
def __init__(self, text, style=None, linebreaks=True, *args, **kwargs):
if not isinstance(text, str):
if hasattr(text, '__html__'):
raise ValueError("It is contradictory to pass escaped content to PlainTextParagraph")
text = str(text)
# Normalize unicode and apply reshaping
text = normalize_text(text)
# Escape any HTML in the text
text = escape(text)
if linebreaks:
text = text.strip().replace("\n", "<br />\n")
super().__init__(text, style, *args, **kwargs)
def register_ttf_font_if_new(name, path): def register_ttf_font_if_new(name, path):
from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfbase.ttfonts import TTFont
+2 -2
View File
@@ -35,7 +35,7 @@ from geoip2.errors import AddressNotFoundError
from pretix.base.i18n import language from pretix.base.i18n import language
from pretix.base.services.mail import mail from pretix.base.services.mail import mail
from pretix.helpers.http import get_client_ip from pretix.helpers.http import get_client_ip
from pretix.helpers.urls import mainreverse_absolute from pretix.helpers.urls import build_absolute_uri
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -175,7 +175,7 @@ def handle_login_source(user, request):
'source': src, 'source': src,
'country': Country(str(country)).name if country else _('Unknown country'), 'country': Country(str(country)).name if country else _('Unknown country'),
'instance': settings.PRETIX_INSTANCE_NAME, 'instance': settings.PRETIX_INSTANCE_NAME,
'url': mainreverse_absolute('control:user.settings') 'url': build_absolute_uri('control:user.settings')
}, },
event=None, event=None,
user=user, user=user,
@@ -1,33 +0,0 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-today pretix GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/license>.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
import logging
from django import template
from django.utils.html import format_html
register = template.Library()
logger = logging.getLogger(__name__)
@register.filter
def wrap_in(content, tag_name):
return format_html(f'<{tag_name}>{{}}</{tag_name}>', content)
-10
View File
@@ -19,7 +19,6 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see # You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>. # <https://www.gnu.org/licenses/>.
# #
import warnings
from urllib.parse import urljoin from urllib.parse import urljoin
from django.conf import settings from django.conf import settings
@@ -27,15 +26,6 @@ from django.urls import reverse
def build_absolute_uri(urlname, args=None, kwargs=None): def build_absolute_uri(urlname, args=None, kwargs=None):
warnings.warn(
'Usage of build_absolute_uri is confusing since there are many functions with that name. '
'Replace this usage with ',
DeprecationWarning
)
return mainreverse_absolute(urlname, args, kwargs)
def mainreverse_absolute(urlname, args=None, kwargs=None):
from pretix.multidomain import maindomain_urlconf from pretix.multidomain import maindomain_urlconf
return urljoin(settings.SITE_URL, reverse(urlname, args=args, kwargs=kwargs, urlconf=maindomain_urlconf)) return urljoin(settings.SITE_URL, reverse(urlname, args=args, kwargs=kwargs, urlconf=maindomain_urlconf))
File diff suppressed because it is too large Load Diff
+23 -423
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-28 15:49+0000\n" "POT-Creation-Date: 2026-05-27 14:47+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -130,7 +130,6 @@ msgid "Mercado Pago"
msgstr "" msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167 #: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:54
#: pretix/static/pretixpresale/js/ui/cart.js:89 #: pretix/static/pretixpresale/js/ui/cart.js:89
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
@@ -184,172 +183,6 @@ msgstr ""
msgid "Contacting your bank …" msgid "Contacting your bank …"
msgstr "" msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:34
msgid "Select a check-in list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:35
msgid "No active check-in lists found."
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:36
msgid "Switch check-in list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:37
msgid "Search results"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:38
msgid "No tickets found"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:39
msgid "Result"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:40
msgid "This ticket requires special attention"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:41
msgid "Switch direction"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:42
msgid "Entry"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:43
msgid "Exit"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:44
msgid "Scan a ticket or search and press return…"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:45
msgid "Load more"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:46
msgid "Valid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:47
msgid "Unpaid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:48
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:49
msgid "Canceled"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:50
msgid "Confirmed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:51
msgid "Approval pending"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:52
msgid "Redeemed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:53
msgid "Cancel"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:55
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:64
msgid "Ticket not paid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:56
msgid "This ticket is not yet paid. Do you want to continue anyways?"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:57
msgid "Additional information required"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:58
msgid "Valid ticket"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:59
msgid "Exit recorded"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:60
msgid "Ticket already used"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:61
msgid "Information required"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:62
msgid "Unknown ticket"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:63
msgid "Ticket type not allowed here"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:65
msgid "Entry not allowed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:66
msgid "Ticket code revoked/changed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:67
msgid "Ticket blocked"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:68
msgid "Ticket not valid at this time"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:69
msgid "Order canceled"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:70
msgid "Ticket code is ambiguous on list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:71
msgid "Order not approved"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:72
msgid "Checked-in Tickets"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:73
msgid "Valid Tickets"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:74
msgid "Currently inside"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:75
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:76
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
#: pretix/static/lightbox/js/lightbox.js:96 #: pretix/static/lightbox/js/lightbox.js:96
msgid "close" msgid "close"
msgstr "" msgstr ""
@@ -377,8 +210,8 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:135 #: pretix/static/pretixbase/js/asynctask.js:135
#: pretix/static/pretixbase/js/asynctask.js:193 #: pretix/static/pretixbase/js/asynctask.js:192
#: pretix/static/pretixbase/js/asynctask.js:197 #: pretix/static/pretixbase/js/asynctask.js:196
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
@@ -394,28 +227,28 @@ msgstr ""
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:199 #: pretix/static/pretixbase/js/asynctask.js:198
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:227 #: pretix/static/pretixbase/js/asynctask.js:226
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:230 #: pretix/static/pretixbase/js/asynctask.js:229
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:287 #: pretix/static/pretixbase/js/asynctask.js:286
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:342 #: pretix/static/pretixbase/js/asynctask.js:341
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -427,165 +260,6 @@ msgstr ""
msgid "Press Ctrl-C to copy!" msgid "Press Ctrl-C to copy!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:80
msgid "Edit"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:86
msgid "Visualize"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:96
msgid ""
"Your rule always filters by product or variation, but the following products "
"or variations are not contained in any of your rule parts so people with "
"these tickets will not get in:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:99
msgid "Please double-check if this was intentional."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:4
msgid "All of the conditions below (AND)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:5
msgid "At least one of the conditions below (OR)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:6
msgid "Event start"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:7
msgid "Event end"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:8
msgid "Event admission"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:9
msgid "custom date and time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:10
msgid "custom time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:11
msgid "Tolerance (minutes)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:12
msgid "Add condition"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:13
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:14
msgid "Duplicate"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:15
msgctxt "entry_status"
msgid "present"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:16
msgctxt "entry_status"
msgid "absent"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:29
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:35
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:41
msgid "is one of"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:47
msgid "is before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:51
msgid "is after"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:57
msgid "="
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:117
msgid "Product"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:121
msgid "Product variation"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:125
msgid "Gate"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:129
msgid "Current date and time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:133
msgid "Current day of the week (1 = Monday, 7 = Sunday)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:137
msgid "Current entry status"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:141
msgid "Number of previous entries"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:145
msgid "Number of previous entries since midnight"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:149
msgid "Number of previous entries since"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:153
msgid "Number of previous entries before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:157
msgid "Number of days with a previous entry"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:161
msgid "Number of days with a previous entry since"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:165
msgid "Number of days with a previous entry before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:169
msgid "Minutes since last entry (-1 on first entry)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:173
msgid "Minutes since first entry (-1 on first entry)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:47
msgid "Error: Product not found!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:54
msgid "Error: Variation not found!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:171 #: pretix/static/pretixcontrol/js/ui/editor.js:171
msgid "Check-in QR" msgid "Check-in QR"
msgstr "" msgstr ""
@@ -684,23 +358,23 @@ msgstr ""
msgid "Selected only" msgid "Selected only"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:844 #: pretix/static/pretixcontrol/js/ui/main.js:842
msgid "Enter page number between 1 and %(max)s." msgid "Enter page number between 1 and %(max)s."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:847 #: pretix/static/pretixcontrol/js/ui/main.js:845
msgid "Invalid page number." msgid "Invalid page number."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1005 #: pretix/static/pretixcontrol/js/ui/main.js:1003
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1045 #: pretix/static/pretixcontrol/js/ui/main.js:1043
msgid "Click to close" msgid "Click to close"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1126 #: pretix/static/pretixcontrol/js/ui/main.js:1124
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -720,6 +394,16 @@ msgstr ""
msgid "Count" msgid "Count"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:112 #: pretix/static/pretixcontrol/js/ui/subevent.js:112
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
@@ -786,196 +470,164 @@ msgid "Google Pay"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:16 #: pretix/static/pretixpresale/js/widget/widget.js:16
#: pretix/static/pretixpresale/widget/src/i18n.ts:30
msgctxt "widget" msgctxt "widget"
msgid "Quantity" msgid "Quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:17 #: pretix/static/pretixpresale/js/widget/widget.js:17
#: pretix/static/pretixpresale/widget/src/i18n.ts:31
msgctxt "widget" msgctxt "widget"
msgid "Decrease quantity" msgid "Decrease quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:18 #: pretix/static/pretixpresale/js/widget/widget.js:18
#: pretix/static/pretixpresale/widget/src/i18n.ts:32
msgctxt "widget" msgctxt "widget"
msgid "Increase quantity" msgid "Increase quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:19 #: pretix/static/pretixpresale/js/widget/widget.js:19
#: pretix/static/pretixpresale/widget/src/i18n.ts:33
msgctxt "widget" msgctxt "widget"
msgid "Filter events by" msgid "Filter events by"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20 #: pretix/static/pretixpresale/js/widget/widget.js:20
#: pretix/static/pretixpresale/widget/src/i18n.ts:34
msgctxt "widget" msgctxt "widget"
msgid "Filter" msgid "Filter"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21 #: pretix/static/pretixpresale/js/widget/widget.js:21
#: pretix/static/pretixpresale/widget/src/i18n.ts:35
msgctxt "widget" msgctxt "widget"
msgid "Price" msgid "Price"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22 #: pretix/static/pretixpresale/js/widget/widget.js:22
#: pretix/static/pretixpresale/widget/src/i18n.ts:36
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Original price: %s" msgid "Original price: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:23 #: pretix/static/pretixpresale/js/widget/widget.js:23
#: pretix/static/pretixpresale/widget/src/i18n.ts:37
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "New price: %s" msgid "New price: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:24 #: pretix/static/pretixpresale/js/widget/widget.js:24
#: pretix/static/pretixpresale/widget/src/i18n.ts:38
msgctxt "widget" msgctxt "widget"
msgid "Select" msgid "Select"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:25 #: pretix/static/pretixpresale/js/widget/widget.js:25
#: pretix/static/pretixpresale/widget/src/i18n.ts:39
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Select %s" msgid "Select %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:26 #: pretix/static/pretixpresale/js/widget/widget.js:26
#: pretix/static/pretixpresale/widget/src/i18n.ts:40
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Select variant %s" msgid "Select variant %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:27 #: pretix/static/pretixpresale/js/widget/widget.js:27
#: pretix/static/pretixpresale/widget/src/i18n.ts:41
msgctxt "widget" msgctxt "widget"
msgid "Sold out" msgid "Sold out"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:28 #: pretix/static/pretixpresale/js/widget/widget.js:28
#: pretix/static/pretixpresale/widget/src/i18n.ts:42
msgctxt "widget" msgctxt "widget"
msgid "Buy" msgid "Buy"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:29 #: pretix/static/pretixpresale/js/widget/widget.js:29
#: pretix/static/pretixpresale/widget/src/i18n.ts:43
msgctxt "widget" msgctxt "widget"
msgid "Register" msgid "Register"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:30 #: pretix/static/pretixpresale/js/widget/widget.js:30
#: pretix/static/pretixpresale/widget/src/i18n.ts:44
msgctxt "widget" msgctxt "widget"
msgid "Reserved" msgid "Reserved"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:31 #: pretix/static/pretixpresale/js/widget/widget.js:31
#: pretix/static/pretixpresale/widget/src/i18n.ts:45
msgctxt "widget" msgctxt "widget"
msgid "FREE" msgid "FREE"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:32 #: pretix/static/pretixpresale/js/widget/widget.js:32
#: pretix/static/pretixpresale/widget/src/i18n.ts:46
msgctxt "widget" msgctxt "widget"
msgid "from %(currency)s %(price)s" msgid "from %(currency)s %(price)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:33 #: pretix/static/pretixpresale/js/widget/widget.js:33
#: pretix/static/pretixpresale/widget/src/i18n.ts:47
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Image of %s" msgid "Image of %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:34 #: pretix/static/pretixpresale/js/widget/widget.js:34
#: pretix/static/pretixpresale/widget/src/i18n.ts:48
msgctxt "widget" msgctxt "widget"
msgid "incl. %(rate)s% %(taxname)s" msgid "incl. %(rate)s% %(taxname)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:35 #: pretix/static/pretixpresale/js/widget/widget.js:35
#: pretix/static/pretixpresale/widget/src/i18n.ts:49
msgctxt "widget" msgctxt "widget"
msgid "plus %(rate)s% %(taxname)s" msgid "plus %(rate)s% %(taxname)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:36 #: pretix/static/pretixpresale/js/widget/widget.js:36
#: pretix/static/pretixpresale/widget/src/i18n.ts:50
msgctxt "widget" msgctxt "widget"
msgid "incl. taxes" msgid "incl. taxes"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:37 #: pretix/static/pretixpresale/js/widget/widget.js:37
#: pretix/static/pretixpresale/widget/src/i18n.ts:51
msgctxt "widget" msgctxt "widget"
msgid "plus taxes" msgid "plus taxes"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:38 #: pretix/static/pretixpresale/js/widget/widget.js:38
#: pretix/static/pretixpresale/widget/src/i18n.ts:52
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "currently available: %s" msgid "currently available: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:39 #: pretix/static/pretixpresale/js/widget/widget.js:39
#: pretix/static/pretixpresale/widget/src/i18n.ts:53
msgctxt "widget" msgctxt "widget"
msgid "Only available with a voucher" msgid "Only available with a voucher"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:40 #: pretix/static/pretixpresale/js/widget/widget.js:40
#: pretix/static/pretixpresale/js/widget/widget.js:43 #: pretix/static/pretixpresale/js/widget/widget.js:43
#: pretix/static/pretixpresale/widget/src/i18n.ts:54
#: pretix/static/pretixpresale/widget/src/i18n.ts:57
msgctxt "widget" msgctxt "widget"
msgid "Not yet available" msgid "Not yet available"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:41 #: pretix/static/pretixpresale/js/widget/widget.js:41
#: pretix/static/pretixpresale/widget/src/i18n.ts:55
msgctxt "widget" msgctxt "widget"
msgid "Not available anymore" msgid "Not available anymore"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:42 #: pretix/static/pretixpresale/js/widget/widget.js:42
#: pretix/static/pretixpresale/widget/src/i18n.ts:56
msgctxt "widget" msgctxt "widget"
msgid "Currently not available" msgid "Currently not available"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:44 #: pretix/static/pretixpresale/js/widget/widget.js:44
#: pretix/static/pretixpresale/widget/src/i18n.ts:58
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "minimum amount to order: %s" msgid "minimum amount to order: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:45 #: pretix/static/pretixpresale/js/widget/widget.js:45
#: pretix/static/pretixpresale/widget/src/i18n.ts:59
msgctxt "widget" msgctxt "widget"
msgid "Close ticket shop" msgid "Close ticket shop"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:46 #: pretix/static/pretixpresale/js/widget/widget.js:46
#: pretix/static/pretixpresale/widget/src/i18n.ts:60
msgctxt "widget" msgctxt "widget"
msgid "The ticket shop could not be loaded." msgid "The ticket shop could not be loaded."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:47 #: pretix/static/pretixpresale/js/widget/widget.js:47
#: pretix/static/pretixpresale/widget/src/i18n.ts:61
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"There are currently a lot of users in this ticket shop. Please open the shop " "There are currently a lot of users in this ticket shop. Please open the shop "
@@ -983,25 +635,21 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:49 #: pretix/static/pretixpresale/js/widget/widget.js:49
#: pretix/static/pretixpresale/widget/src/i18n.ts:62
msgctxt "widget" msgctxt "widget"
msgid "Open ticket shop" msgid "Open ticket shop"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:50 #: pretix/static/pretixpresale/js/widget/widget.js:50
#: pretix/static/pretixpresale/widget/src/i18n.ts:63
msgctxt "widget" msgctxt "widget"
msgid "Checkout" msgid "Checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:51 #: pretix/static/pretixpresale/js/widget/widget.js:51
#: pretix/static/pretixpresale/widget/src/i18n.ts:64
msgctxt "widget" msgctxt "widget"
msgid "The cart could not be created. Please try again later" msgid "The cart could not be created. Please try again later"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:52 #: pretix/static/pretixpresale/js/widget/widget.js:52
#: pretix/static/pretixpresale/widget/src/i18n.ts:65
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"We could not create your cart, since there are currently too many users in " "We could not create your cart, since there are currently too many users in "
@@ -1009,13 +657,11 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:54 #: pretix/static/pretixpresale/js/widget/widget.js:54
#: pretix/static/pretixpresale/widget/src/i18n.ts:66
msgctxt "widget" msgctxt "widget"
msgid "Waiting list" msgid "Waiting list"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:55 #: pretix/static/pretixpresale/js/widget/widget.js:55
#: pretix/static/pretixpresale/widget/src/i18n.ts:67
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"You currently have an active cart for this event. If you select more " "You currently have an active cart for this event. If you select more "
@@ -1023,115 +669,96 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:57 #: pretix/static/pretixpresale/js/widget/widget.js:57
#: pretix/static/pretixpresale/widget/src/i18n.ts:68
msgctxt "widget" msgctxt "widget"
msgid "Resume checkout" msgid "Resume checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:58 #: pretix/static/pretixpresale/js/widget/widget.js:58
#: pretix/static/pretixpresale/widget/src/i18n.ts:69
msgctxt "widget" msgctxt "widget"
msgid "Redeem a voucher" msgid "Redeem a voucher"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:59 #: pretix/static/pretixpresale/js/widget/widget.js:59
#: pretix/static/pretixpresale/widget/src/i18n.ts:70
msgctxt "widget" msgctxt "widget"
msgid "Redeem" msgid "Redeem"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:60 #: pretix/static/pretixpresale/js/widget/widget.js:60
#: pretix/static/pretixpresale/widget/src/i18n.ts:71
msgctxt "widget" msgctxt "widget"
msgid "Voucher code" msgid "Voucher code"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:61 #: pretix/static/pretixpresale/js/widget/widget.js:61
#: pretix/static/pretixpresale/widget/src/i18n.ts:72
msgctxt "widget" msgctxt "widget"
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:62 #: pretix/static/pretixpresale/js/widget/widget.js:62
#: pretix/static/pretixpresale/widget/src/i18n.ts:73
msgctxt "widget" msgctxt "widget"
msgid "Close checkout" msgid "Close checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:63 #: pretix/static/pretixpresale/js/widget/widget.js:63
#: pretix/static/pretixpresale/widget/src/i18n.ts:74
msgctxt "widget" msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish." msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:64 #: pretix/static/pretixpresale/js/widget/widget.js:64
#: pretix/static/pretixpresale/widget/src/i18n.ts:75
msgctxt "widget" msgctxt "widget"
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:65 #: pretix/static/pretixpresale/js/widget/widget.js:65
#: pretix/static/pretixpresale/widget/src/i18n.ts:76
msgctxt "widget" msgctxt "widget"
msgid "Show variants" msgid "Show variants"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:66 #: pretix/static/pretixpresale/js/widget/widget.js:66
#: pretix/static/pretixpresale/widget/src/i18n.ts:77
msgctxt "widget" msgctxt "widget"
msgid "Hide variants" msgid "Hide variants"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:67 #: pretix/static/pretixpresale/js/widget/widget.js:67
#: pretix/static/pretixpresale/widget/src/i18n.ts:78
msgctxt "widget" msgctxt "widget"
msgid "Choose a different event" msgid "Choose a different event"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:68 #: pretix/static/pretixpresale/js/widget/widget.js:68
#: pretix/static/pretixpresale/widget/src/i18n.ts:79
msgctxt "widget" msgctxt "widget"
msgid "Choose a different date" msgid "Choose a different date"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:69 #: pretix/static/pretixpresale/js/widget/widget.js:69
#: pretix/static/pretixpresale/widget/src/i18n.ts:80
msgctxt "widget" msgctxt "widget"
msgid "Back" msgid "Back"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:70 #: pretix/static/pretixpresale/js/widget/widget.js:70
#: pretix/static/pretixpresale/widget/src/i18n.ts:81
msgctxt "widget" msgctxt "widget"
msgid "Next month" msgid "Next month"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:71 #: pretix/static/pretixpresale/js/widget/widget.js:71
#: pretix/static/pretixpresale/widget/src/i18n.ts:82
msgctxt "widget" msgctxt "widget"
msgid "Previous month" msgid "Previous month"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:72 #: pretix/static/pretixpresale/js/widget/widget.js:72
#: pretix/static/pretixpresale/widget/src/i18n.ts:83
msgctxt "widget" msgctxt "widget"
msgid "Next week" msgid "Next week"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:73 #: pretix/static/pretixpresale/js/widget/widget.js:73
#: pretix/static/pretixpresale/widget/src/i18n.ts:84
msgctxt "widget" msgctxt "widget"
msgid "Previous week" msgid "Previous week"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:74 #: pretix/static/pretixpresale/js/widget/widget.js:74
#: pretix/static/pretixpresale/widget/src/i18n.ts:85
msgctxt "widget" msgctxt "widget"
msgid "Open seat selection" msgid "Open seat selection"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:75 #: pretix/static/pretixpresale/js/widget/widget.js:75
#: pretix/static/pretixpresale/widget/src/i18n.ts:86
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"Some or all ticket categories are currently sold out. If you want, you can " "Some or all ticket categories are currently sold out. If you want, you can "
@@ -1140,137 +767,110 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:76 #: pretix/static/pretixpresale/js/widget/widget.js:76
#: pretix/static/pretixpresale/widget/src/i18n.ts:87
msgctxt "widget" msgctxt "widget"
msgid "Load more" msgid "Load more"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:78 #: pretix/static/pretixpresale/js/widget/widget.js:78
#: pretix/static/pretixpresale/widget/src/i18n.ts:89
msgid "Mo" msgid "Mo"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:79 #: pretix/static/pretixpresale/js/widget/widget.js:79
#: pretix/static/pretixpresale/widget/src/i18n.ts:90
msgid "Tu" msgid "Tu"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:80 #: pretix/static/pretixpresale/js/widget/widget.js:80
#: pretix/static/pretixpresale/widget/src/i18n.ts:91
msgid "We" msgid "We"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:81 #: pretix/static/pretixpresale/js/widget/widget.js:81
#: pretix/static/pretixpresale/widget/src/i18n.ts:92
msgid "Th" msgid "Th"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:82 #: pretix/static/pretixpresale/js/widget/widget.js:82
#: pretix/static/pretixpresale/widget/src/i18n.ts:93
msgid "Fr" msgid "Fr"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:83 #: pretix/static/pretixpresale/js/widget/widget.js:83
#: pretix/static/pretixpresale/widget/src/i18n.ts:94
msgid "Sa" msgid "Sa"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:84 #: pretix/static/pretixpresale/js/widget/widget.js:84
#: pretix/static/pretixpresale/widget/src/i18n.ts:95
msgid "Su" msgid "Su"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:85 #: pretix/static/pretixpresale/js/widget/widget.js:85
#: pretix/static/pretixpresale/widget/src/i18n.ts:96
msgid "Monday" msgid "Monday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:86 #: pretix/static/pretixpresale/js/widget/widget.js:86
#: pretix/static/pretixpresale/widget/src/i18n.ts:97
msgid "Tuesday" msgid "Tuesday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:87 #: pretix/static/pretixpresale/js/widget/widget.js:87
#: pretix/static/pretixpresale/widget/src/i18n.ts:98
msgid "Wednesday" msgid "Wednesday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:88 #: pretix/static/pretixpresale/js/widget/widget.js:88
#: pretix/static/pretixpresale/widget/src/i18n.ts:99
msgid "Thursday" msgid "Thursday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:89 #: pretix/static/pretixpresale/js/widget/widget.js:89
#: pretix/static/pretixpresale/widget/src/i18n.ts:100
msgid "Friday" msgid "Friday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:90 #: pretix/static/pretixpresale/js/widget/widget.js:90
#: pretix/static/pretixpresale/widget/src/i18n.ts:101
msgid "Saturday" msgid "Saturday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:91 #: pretix/static/pretixpresale/js/widget/widget.js:91
#: pretix/static/pretixpresale/widget/src/i18n.ts:102
msgid "Sunday" msgid "Sunday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:94 #: pretix/static/pretixpresale/js/widget/widget.js:94
#: pretix/static/pretixpresale/widget/src/i18n.ts:105
msgid "January" msgid "January"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:95 #: pretix/static/pretixpresale/js/widget/widget.js:95
#: pretix/static/pretixpresale/widget/src/i18n.ts:106
msgid "February" msgid "February"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:96 #: pretix/static/pretixpresale/js/widget/widget.js:96
#: pretix/static/pretixpresale/widget/src/i18n.ts:107
msgid "March" msgid "March"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:97 #: pretix/static/pretixpresale/js/widget/widget.js:97
#: pretix/static/pretixpresale/widget/src/i18n.ts:108
msgid "April" msgid "April"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:98 #: pretix/static/pretixpresale/js/widget/widget.js:98
#: pretix/static/pretixpresale/widget/src/i18n.ts:109
msgid "May" msgid "May"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:99 #: pretix/static/pretixpresale/js/widget/widget.js:99
#: pretix/static/pretixpresale/widget/src/i18n.ts:110
msgid "June" msgid "June"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:100 #: pretix/static/pretixpresale/js/widget/widget.js:100
#: pretix/static/pretixpresale/widget/src/i18n.ts:111
msgid "July" msgid "July"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:101 #: pretix/static/pretixpresale/js/widget/widget.js:101
#: pretix/static/pretixpresale/widget/src/i18n.ts:112
msgid "August" msgid "August"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:102 #: pretix/static/pretixpresale/js/widget/widget.js:102
#: pretix/static/pretixpresale/widget/src/i18n.ts:113
msgid "September" msgid "September"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:103 #: pretix/static/pretixpresale/js/widget/widget.js:103
#: pretix/static/pretixpresale/widget/src/i18n.ts:114
msgid "October" msgid "October"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:104 #: pretix/static/pretixpresale/js/widget/widget.js:104
#: pretix/static/pretixpresale/widget/src/i18n.ts:115
msgid "November" msgid "November"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:105 #: pretix/static/pretixpresale/js/widget/widget.js:105
#: pretix/static/pretixpresale/widget/src/i18n.ts:116
msgid "December" msgid "December"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+23 -423
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-28 15:49+0000\n" "POT-Creation-Date: 2026-05-27 14:47+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -130,7 +130,6 @@ msgid "Mercado Pago"
msgstr "" msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167 #: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:54
#: pretix/static/pretixpresale/js/ui/cart.js:89 #: pretix/static/pretixpresale/js/ui/cart.js:89
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
@@ -184,172 +183,6 @@ msgstr ""
msgid "Contacting your bank …" msgid "Contacting your bank …"
msgstr "" msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:34
msgid "Select a check-in list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:35
msgid "No active check-in lists found."
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:36
msgid "Switch check-in list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:37
msgid "Search results"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:38
msgid "No tickets found"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:39
msgid "Result"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:40
msgid "This ticket requires special attention"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:41
msgid "Switch direction"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:42
msgid "Entry"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:43
msgid "Exit"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:44
msgid "Scan a ticket or search and press return…"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:45
msgid "Load more"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:46
msgid "Valid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:47
msgid "Unpaid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:48
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:49
msgid "Canceled"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:50
msgid "Confirmed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:51
msgid "Approval pending"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:52
msgid "Redeemed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:53
msgid "Cancel"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:55
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:64
msgid "Ticket not paid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:56
msgid "This ticket is not yet paid. Do you want to continue anyways?"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:57
msgid "Additional information required"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:58
msgid "Valid ticket"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:59
msgid "Exit recorded"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:60
msgid "Ticket already used"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:61
msgid "Information required"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:62
msgid "Unknown ticket"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:63
msgid "Ticket type not allowed here"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:65
msgid "Entry not allowed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:66
msgid "Ticket code revoked/changed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:67
msgid "Ticket blocked"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:68
msgid "Ticket not valid at this time"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:69
msgid "Order canceled"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:70
msgid "Ticket code is ambiguous on list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:71
msgid "Order not approved"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:72
msgid "Checked-in Tickets"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:73
msgid "Valid Tickets"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:74
msgid "Currently inside"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:75
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:76
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
#: pretix/static/lightbox/js/lightbox.js:96 #: pretix/static/lightbox/js/lightbox.js:96
msgid "close" msgid "close"
msgstr "" msgstr ""
@@ -377,8 +210,8 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:135 #: pretix/static/pretixbase/js/asynctask.js:135
#: pretix/static/pretixbase/js/asynctask.js:193 #: pretix/static/pretixbase/js/asynctask.js:192
#: pretix/static/pretixbase/js/asynctask.js:197 #: pretix/static/pretixbase/js/asynctask.js:196
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
@@ -394,28 +227,28 @@ msgstr ""
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:199 #: pretix/static/pretixbase/js/asynctask.js:198
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:227 #: pretix/static/pretixbase/js/asynctask.js:226
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:230 #: pretix/static/pretixbase/js/asynctask.js:229
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:287 #: pretix/static/pretixbase/js/asynctask.js:286
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:342 #: pretix/static/pretixbase/js/asynctask.js:341
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -427,165 +260,6 @@ msgstr ""
msgid "Press Ctrl-C to copy!" msgid "Press Ctrl-C to copy!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:80
msgid "Edit"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:86
msgid "Visualize"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:96
msgid ""
"Your rule always filters by product or variation, but the following products "
"or variations are not contained in any of your rule parts so people with "
"these tickets will not get in:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:99
msgid "Please double-check if this was intentional."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:4
msgid "All of the conditions below (AND)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:5
msgid "At least one of the conditions below (OR)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:6
msgid "Event start"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:7
msgid "Event end"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:8
msgid "Event admission"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:9
msgid "custom date and time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:10
msgid "custom time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:11
msgid "Tolerance (minutes)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:12
msgid "Add condition"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:13
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:14
msgid "Duplicate"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:15
msgctxt "entry_status"
msgid "present"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:16
msgctxt "entry_status"
msgid "absent"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:29
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:35
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:41
msgid "is one of"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:47
msgid "is before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:51
msgid "is after"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:57
msgid "="
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:117
msgid "Product"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:121
msgid "Product variation"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:125
msgid "Gate"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:129
msgid "Current date and time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:133
msgid "Current day of the week (1 = Monday, 7 = Sunday)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:137
msgid "Current entry status"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:141
msgid "Number of previous entries"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:145
msgid "Number of previous entries since midnight"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:149
msgid "Number of previous entries since"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:153
msgid "Number of previous entries before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:157
msgid "Number of days with a previous entry"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:161
msgid "Number of days with a previous entry since"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:165
msgid "Number of days with a previous entry before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:169
msgid "Minutes since last entry (-1 on first entry)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:173
msgid "Minutes since first entry (-1 on first entry)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:47
msgid "Error: Product not found!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:54
msgid "Error: Variation not found!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:171 #: pretix/static/pretixcontrol/js/ui/editor.js:171
msgid "Check-in QR" msgid "Check-in QR"
msgstr "" msgstr ""
@@ -684,23 +358,23 @@ msgstr ""
msgid "Selected only" msgid "Selected only"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:844 #: pretix/static/pretixcontrol/js/ui/main.js:842
msgid "Enter page number between 1 and %(max)s." msgid "Enter page number between 1 and %(max)s."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:847 #: pretix/static/pretixcontrol/js/ui/main.js:845
msgid "Invalid page number." msgid "Invalid page number."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1005 #: pretix/static/pretixcontrol/js/ui/main.js:1003
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1045 #: pretix/static/pretixcontrol/js/ui/main.js:1043
msgid "Click to close" msgid "Click to close"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1126 #: pretix/static/pretixcontrol/js/ui/main.js:1124
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -720,6 +394,16 @@ msgstr ""
msgid "Count" msgid "Count"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:112 #: pretix/static/pretixcontrol/js/ui/subevent.js:112
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
@@ -786,196 +470,164 @@ msgid "Google Pay"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:16 #: pretix/static/pretixpresale/js/widget/widget.js:16
#: pretix/static/pretixpresale/widget/src/i18n.ts:30
msgctxt "widget" msgctxt "widget"
msgid "Quantity" msgid "Quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:17 #: pretix/static/pretixpresale/js/widget/widget.js:17
#: pretix/static/pretixpresale/widget/src/i18n.ts:31
msgctxt "widget" msgctxt "widget"
msgid "Decrease quantity" msgid "Decrease quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:18 #: pretix/static/pretixpresale/js/widget/widget.js:18
#: pretix/static/pretixpresale/widget/src/i18n.ts:32
msgctxt "widget" msgctxt "widget"
msgid "Increase quantity" msgid "Increase quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:19 #: pretix/static/pretixpresale/js/widget/widget.js:19
#: pretix/static/pretixpresale/widget/src/i18n.ts:33
msgctxt "widget" msgctxt "widget"
msgid "Filter events by" msgid "Filter events by"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20 #: pretix/static/pretixpresale/js/widget/widget.js:20
#: pretix/static/pretixpresale/widget/src/i18n.ts:34
msgctxt "widget" msgctxt "widget"
msgid "Filter" msgid "Filter"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21 #: pretix/static/pretixpresale/js/widget/widget.js:21
#: pretix/static/pretixpresale/widget/src/i18n.ts:35
msgctxt "widget" msgctxt "widget"
msgid "Price" msgid "Price"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22 #: pretix/static/pretixpresale/js/widget/widget.js:22
#: pretix/static/pretixpresale/widget/src/i18n.ts:36
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Original price: %s" msgid "Original price: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:23 #: pretix/static/pretixpresale/js/widget/widget.js:23
#: pretix/static/pretixpresale/widget/src/i18n.ts:37
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "New price: %s" msgid "New price: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:24 #: pretix/static/pretixpresale/js/widget/widget.js:24
#: pretix/static/pretixpresale/widget/src/i18n.ts:38
msgctxt "widget" msgctxt "widget"
msgid "Select" msgid "Select"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:25 #: pretix/static/pretixpresale/js/widget/widget.js:25
#: pretix/static/pretixpresale/widget/src/i18n.ts:39
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Select %s" msgid "Select %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:26 #: pretix/static/pretixpresale/js/widget/widget.js:26
#: pretix/static/pretixpresale/widget/src/i18n.ts:40
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Select variant %s" msgid "Select variant %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:27 #: pretix/static/pretixpresale/js/widget/widget.js:27
#: pretix/static/pretixpresale/widget/src/i18n.ts:41
msgctxt "widget" msgctxt "widget"
msgid "Sold out" msgid "Sold out"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:28 #: pretix/static/pretixpresale/js/widget/widget.js:28
#: pretix/static/pretixpresale/widget/src/i18n.ts:42
msgctxt "widget" msgctxt "widget"
msgid "Buy" msgid "Buy"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:29 #: pretix/static/pretixpresale/js/widget/widget.js:29
#: pretix/static/pretixpresale/widget/src/i18n.ts:43
msgctxt "widget" msgctxt "widget"
msgid "Register" msgid "Register"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:30 #: pretix/static/pretixpresale/js/widget/widget.js:30
#: pretix/static/pretixpresale/widget/src/i18n.ts:44
msgctxt "widget" msgctxt "widget"
msgid "Reserved" msgid "Reserved"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:31 #: pretix/static/pretixpresale/js/widget/widget.js:31
#: pretix/static/pretixpresale/widget/src/i18n.ts:45
msgctxt "widget" msgctxt "widget"
msgid "FREE" msgid "FREE"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:32 #: pretix/static/pretixpresale/js/widget/widget.js:32
#: pretix/static/pretixpresale/widget/src/i18n.ts:46
msgctxt "widget" msgctxt "widget"
msgid "from %(currency)s %(price)s" msgid "from %(currency)s %(price)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:33 #: pretix/static/pretixpresale/js/widget/widget.js:33
#: pretix/static/pretixpresale/widget/src/i18n.ts:47
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Image of %s" msgid "Image of %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:34 #: pretix/static/pretixpresale/js/widget/widget.js:34
#: pretix/static/pretixpresale/widget/src/i18n.ts:48
msgctxt "widget" msgctxt "widget"
msgid "incl. %(rate)s% %(taxname)s" msgid "incl. %(rate)s% %(taxname)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:35 #: pretix/static/pretixpresale/js/widget/widget.js:35
#: pretix/static/pretixpresale/widget/src/i18n.ts:49
msgctxt "widget" msgctxt "widget"
msgid "plus %(rate)s% %(taxname)s" msgid "plus %(rate)s% %(taxname)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:36 #: pretix/static/pretixpresale/js/widget/widget.js:36
#: pretix/static/pretixpresale/widget/src/i18n.ts:50
msgctxt "widget" msgctxt "widget"
msgid "incl. taxes" msgid "incl. taxes"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:37 #: pretix/static/pretixpresale/js/widget/widget.js:37
#: pretix/static/pretixpresale/widget/src/i18n.ts:51
msgctxt "widget" msgctxt "widget"
msgid "plus taxes" msgid "plus taxes"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:38 #: pretix/static/pretixpresale/js/widget/widget.js:38
#: pretix/static/pretixpresale/widget/src/i18n.ts:52
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "currently available: %s" msgid "currently available: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:39 #: pretix/static/pretixpresale/js/widget/widget.js:39
#: pretix/static/pretixpresale/widget/src/i18n.ts:53
msgctxt "widget" msgctxt "widget"
msgid "Only available with a voucher" msgid "Only available with a voucher"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:40 #: pretix/static/pretixpresale/js/widget/widget.js:40
#: pretix/static/pretixpresale/js/widget/widget.js:43 #: pretix/static/pretixpresale/js/widget/widget.js:43
#: pretix/static/pretixpresale/widget/src/i18n.ts:54
#: pretix/static/pretixpresale/widget/src/i18n.ts:57
msgctxt "widget" msgctxt "widget"
msgid "Not yet available" msgid "Not yet available"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:41 #: pretix/static/pretixpresale/js/widget/widget.js:41
#: pretix/static/pretixpresale/widget/src/i18n.ts:55
msgctxt "widget" msgctxt "widget"
msgid "Not available anymore" msgid "Not available anymore"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:42 #: pretix/static/pretixpresale/js/widget/widget.js:42
#: pretix/static/pretixpresale/widget/src/i18n.ts:56
msgctxt "widget" msgctxt "widget"
msgid "Currently not available" msgid "Currently not available"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:44 #: pretix/static/pretixpresale/js/widget/widget.js:44
#: pretix/static/pretixpresale/widget/src/i18n.ts:58
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "minimum amount to order: %s" msgid "minimum amount to order: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:45 #: pretix/static/pretixpresale/js/widget/widget.js:45
#: pretix/static/pretixpresale/widget/src/i18n.ts:59
msgctxt "widget" msgctxt "widget"
msgid "Close ticket shop" msgid "Close ticket shop"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:46 #: pretix/static/pretixpresale/js/widget/widget.js:46
#: pretix/static/pretixpresale/widget/src/i18n.ts:60
msgctxt "widget" msgctxt "widget"
msgid "The ticket shop could not be loaded." msgid "The ticket shop could not be loaded."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:47 #: pretix/static/pretixpresale/js/widget/widget.js:47
#: pretix/static/pretixpresale/widget/src/i18n.ts:61
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"There are currently a lot of users in this ticket shop. Please open the shop " "There are currently a lot of users in this ticket shop. Please open the shop "
@@ -983,25 +635,21 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:49 #: pretix/static/pretixpresale/js/widget/widget.js:49
#: pretix/static/pretixpresale/widget/src/i18n.ts:62
msgctxt "widget" msgctxt "widget"
msgid "Open ticket shop" msgid "Open ticket shop"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:50 #: pretix/static/pretixpresale/js/widget/widget.js:50
#: pretix/static/pretixpresale/widget/src/i18n.ts:63
msgctxt "widget" msgctxt "widget"
msgid "Checkout" msgid "Checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:51 #: pretix/static/pretixpresale/js/widget/widget.js:51
#: pretix/static/pretixpresale/widget/src/i18n.ts:64
msgctxt "widget" msgctxt "widget"
msgid "The cart could not be created. Please try again later" msgid "The cart could not be created. Please try again later"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:52 #: pretix/static/pretixpresale/js/widget/widget.js:52
#: pretix/static/pretixpresale/widget/src/i18n.ts:65
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"We could not create your cart, since there are currently too many users in " "We could not create your cart, since there are currently too many users in "
@@ -1009,13 +657,11 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:54 #: pretix/static/pretixpresale/js/widget/widget.js:54
#: pretix/static/pretixpresale/widget/src/i18n.ts:66
msgctxt "widget" msgctxt "widget"
msgid "Waiting list" msgid "Waiting list"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:55 #: pretix/static/pretixpresale/js/widget/widget.js:55
#: pretix/static/pretixpresale/widget/src/i18n.ts:67
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"You currently have an active cart for this event. If you select more " "You currently have an active cart for this event. If you select more "
@@ -1023,115 +669,96 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:57 #: pretix/static/pretixpresale/js/widget/widget.js:57
#: pretix/static/pretixpresale/widget/src/i18n.ts:68
msgctxt "widget" msgctxt "widget"
msgid "Resume checkout" msgid "Resume checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:58 #: pretix/static/pretixpresale/js/widget/widget.js:58
#: pretix/static/pretixpresale/widget/src/i18n.ts:69
msgctxt "widget" msgctxt "widget"
msgid "Redeem a voucher" msgid "Redeem a voucher"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:59 #: pretix/static/pretixpresale/js/widget/widget.js:59
#: pretix/static/pretixpresale/widget/src/i18n.ts:70
msgctxt "widget" msgctxt "widget"
msgid "Redeem" msgid "Redeem"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:60 #: pretix/static/pretixpresale/js/widget/widget.js:60
#: pretix/static/pretixpresale/widget/src/i18n.ts:71
msgctxt "widget" msgctxt "widget"
msgid "Voucher code" msgid "Voucher code"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:61 #: pretix/static/pretixpresale/js/widget/widget.js:61
#: pretix/static/pretixpresale/widget/src/i18n.ts:72
msgctxt "widget" msgctxt "widget"
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:62 #: pretix/static/pretixpresale/js/widget/widget.js:62
#: pretix/static/pretixpresale/widget/src/i18n.ts:73
msgctxt "widget" msgctxt "widget"
msgid "Close checkout" msgid "Close checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:63 #: pretix/static/pretixpresale/js/widget/widget.js:63
#: pretix/static/pretixpresale/widget/src/i18n.ts:74
msgctxt "widget" msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish." msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:64 #: pretix/static/pretixpresale/js/widget/widget.js:64
#: pretix/static/pretixpresale/widget/src/i18n.ts:75
msgctxt "widget" msgctxt "widget"
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:65 #: pretix/static/pretixpresale/js/widget/widget.js:65
#: pretix/static/pretixpresale/widget/src/i18n.ts:76
msgctxt "widget" msgctxt "widget"
msgid "Show variants" msgid "Show variants"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:66 #: pretix/static/pretixpresale/js/widget/widget.js:66
#: pretix/static/pretixpresale/widget/src/i18n.ts:77
msgctxt "widget" msgctxt "widget"
msgid "Hide variants" msgid "Hide variants"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:67 #: pretix/static/pretixpresale/js/widget/widget.js:67
#: pretix/static/pretixpresale/widget/src/i18n.ts:78
msgctxt "widget" msgctxt "widget"
msgid "Choose a different event" msgid "Choose a different event"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:68 #: pretix/static/pretixpresale/js/widget/widget.js:68
#: pretix/static/pretixpresale/widget/src/i18n.ts:79
msgctxt "widget" msgctxt "widget"
msgid "Choose a different date" msgid "Choose a different date"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:69 #: pretix/static/pretixpresale/js/widget/widget.js:69
#: pretix/static/pretixpresale/widget/src/i18n.ts:80
msgctxt "widget" msgctxt "widget"
msgid "Back" msgid "Back"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:70 #: pretix/static/pretixpresale/js/widget/widget.js:70
#: pretix/static/pretixpresale/widget/src/i18n.ts:81
msgctxt "widget" msgctxt "widget"
msgid "Next month" msgid "Next month"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:71 #: pretix/static/pretixpresale/js/widget/widget.js:71
#: pretix/static/pretixpresale/widget/src/i18n.ts:82
msgctxt "widget" msgctxt "widget"
msgid "Previous month" msgid "Previous month"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:72 #: pretix/static/pretixpresale/js/widget/widget.js:72
#: pretix/static/pretixpresale/widget/src/i18n.ts:83
msgctxt "widget" msgctxt "widget"
msgid "Next week" msgid "Next week"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:73 #: pretix/static/pretixpresale/js/widget/widget.js:73
#: pretix/static/pretixpresale/widget/src/i18n.ts:84
msgctxt "widget" msgctxt "widget"
msgid "Previous week" msgid "Previous week"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:74 #: pretix/static/pretixpresale/js/widget/widget.js:74
#: pretix/static/pretixpresale/widget/src/i18n.ts:85
msgctxt "widget" msgctxt "widget"
msgid "Open seat selection" msgid "Open seat selection"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:75 #: pretix/static/pretixpresale/js/widget/widget.js:75
#: pretix/static/pretixpresale/widget/src/i18n.ts:86
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"Some or all ticket categories are currently sold out. If you want, you can " "Some or all ticket categories are currently sold out. If you want, you can "
@@ -1140,137 +767,110 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:76 #: pretix/static/pretixpresale/js/widget/widget.js:76
#: pretix/static/pretixpresale/widget/src/i18n.ts:87
msgctxt "widget" msgctxt "widget"
msgid "Load more" msgid "Load more"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:78 #: pretix/static/pretixpresale/js/widget/widget.js:78
#: pretix/static/pretixpresale/widget/src/i18n.ts:89
msgid "Mo" msgid "Mo"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:79 #: pretix/static/pretixpresale/js/widget/widget.js:79
#: pretix/static/pretixpresale/widget/src/i18n.ts:90
msgid "Tu" msgid "Tu"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:80 #: pretix/static/pretixpresale/js/widget/widget.js:80
#: pretix/static/pretixpresale/widget/src/i18n.ts:91
msgid "We" msgid "We"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:81 #: pretix/static/pretixpresale/js/widget/widget.js:81
#: pretix/static/pretixpresale/widget/src/i18n.ts:92
msgid "Th" msgid "Th"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:82 #: pretix/static/pretixpresale/js/widget/widget.js:82
#: pretix/static/pretixpresale/widget/src/i18n.ts:93
msgid "Fr" msgid "Fr"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:83 #: pretix/static/pretixpresale/js/widget/widget.js:83
#: pretix/static/pretixpresale/widget/src/i18n.ts:94
msgid "Sa" msgid "Sa"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:84 #: pretix/static/pretixpresale/js/widget/widget.js:84
#: pretix/static/pretixpresale/widget/src/i18n.ts:95
msgid "Su" msgid "Su"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:85 #: pretix/static/pretixpresale/js/widget/widget.js:85
#: pretix/static/pretixpresale/widget/src/i18n.ts:96
msgid "Monday" msgid "Monday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:86 #: pretix/static/pretixpresale/js/widget/widget.js:86
#: pretix/static/pretixpresale/widget/src/i18n.ts:97
msgid "Tuesday" msgid "Tuesday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:87 #: pretix/static/pretixpresale/js/widget/widget.js:87
#: pretix/static/pretixpresale/widget/src/i18n.ts:98
msgid "Wednesday" msgid "Wednesday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:88 #: pretix/static/pretixpresale/js/widget/widget.js:88
#: pretix/static/pretixpresale/widget/src/i18n.ts:99
msgid "Thursday" msgid "Thursday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:89 #: pretix/static/pretixpresale/js/widget/widget.js:89
#: pretix/static/pretixpresale/widget/src/i18n.ts:100
msgid "Friday" msgid "Friday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:90 #: pretix/static/pretixpresale/js/widget/widget.js:90
#: pretix/static/pretixpresale/widget/src/i18n.ts:101
msgid "Saturday" msgid "Saturday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:91 #: pretix/static/pretixpresale/js/widget/widget.js:91
#: pretix/static/pretixpresale/widget/src/i18n.ts:102
msgid "Sunday" msgid "Sunday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:94 #: pretix/static/pretixpresale/js/widget/widget.js:94
#: pretix/static/pretixpresale/widget/src/i18n.ts:105
msgid "January" msgid "January"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:95 #: pretix/static/pretixpresale/js/widget/widget.js:95
#: pretix/static/pretixpresale/widget/src/i18n.ts:106
msgid "February" msgid "February"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:96 #: pretix/static/pretixpresale/js/widget/widget.js:96
#: pretix/static/pretixpresale/widget/src/i18n.ts:107
msgid "March" msgid "March"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:97 #: pretix/static/pretixpresale/js/widget/widget.js:97
#: pretix/static/pretixpresale/widget/src/i18n.ts:108
msgid "April" msgid "April"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:98 #: pretix/static/pretixpresale/js/widget/widget.js:98
#: pretix/static/pretixpresale/widget/src/i18n.ts:109
msgid "May" msgid "May"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:99 #: pretix/static/pretixpresale/js/widget/widget.js:99
#: pretix/static/pretixpresale/widget/src/i18n.ts:110
msgid "June" msgid "June"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:100 #: pretix/static/pretixpresale/js/widget/widget.js:100
#: pretix/static/pretixpresale/widget/src/i18n.ts:111
msgid "July" msgid "July"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:101 #: pretix/static/pretixpresale/js/widget/widget.js:101
#: pretix/static/pretixpresale/widget/src/i18n.ts:112
msgid "August" msgid "August"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:102 #: pretix/static/pretixpresale/js/widget/widget.js:102
#: pretix/static/pretixpresale/widget/src/i18n.ts:113
msgid "September" msgid "September"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:103 #: pretix/static/pretixpresale/js/widget/widget.js:103
#: pretix/static/pretixpresale/widget/src/i18n.ts:114
msgid "October" msgid "October"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:104 #: pretix/static/pretixpresale/js/widget/widget.js:104
#: pretix/static/pretixpresale/widget/src/i18n.ts:115
msgid "November" msgid "November"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:105 #: pretix/static/pretixpresale/js/widget/widget.js:105
#: pretix/static/pretixpresale/widget/src/i18n.ts:116
msgid "December" msgid "December"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+23 -423
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-28 15:49+0000\n" "POT-Creation-Date: 2026-05-27 14:47+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -131,7 +131,6 @@ msgid "Mercado Pago"
msgstr "" msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167 #: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:54
#: pretix/static/pretixpresale/js/ui/cart.js:89 #: pretix/static/pretixpresale/js/ui/cart.js:89
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
@@ -185,172 +184,6 @@ msgstr ""
msgid "Contacting your bank …" msgid "Contacting your bank …"
msgstr "" msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:34
msgid "Select a check-in list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:35
msgid "No active check-in lists found."
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:36
msgid "Switch check-in list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:37
msgid "Search results"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:38
msgid "No tickets found"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:39
msgid "Result"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:40
msgid "This ticket requires special attention"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:41
msgid "Switch direction"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:42
msgid "Entry"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:43
msgid "Exit"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:44
msgid "Scan a ticket or search and press return…"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:45
msgid "Load more"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:46
msgid "Valid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:47
msgid "Unpaid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:48
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:49
msgid "Canceled"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:50
msgid "Confirmed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:51
msgid "Approval pending"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:52
msgid "Redeemed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:53
msgid "Cancel"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:55
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:64
msgid "Ticket not paid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:56
msgid "This ticket is not yet paid. Do you want to continue anyways?"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:57
msgid "Additional information required"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:58
msgid "Valid ticket"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:59
msgid "Exit recorded"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:60
msgid "Ticket already used"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:61
msgid "Information required"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:62
msgid "Unknown ticket"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:63
msgid "Ticket type not allowed here"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:65
msgid "Entry not allowed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:66
msgid "Ticket code revoked/changed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:67
msgid "Ticket blocked"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:68
msgid "Ticket not valid at this time"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:69
msgid "Order canceled"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:70
msgid "Ticket code is ambiguous on list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:71
msgid "Order not approved"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:72
msgid "Checked-in Tickets"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:73
msgid "Valid Tickets"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:74
msgid "Currently inside"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:75
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:76
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
#: pretix/static/lightbox/js/lightbox.js:96 #: pretix/static/lightbox/js/lightbox.js:96
msgid "close" msgid "close"
msgstr "" msgstr ""
@@ -378,8 +211,8 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:135 #: pretix/static/pretixbase/js/asynctask.js:135
#: pretix/static/pretixbase/js/asynctask.js:193 #: pretix/static/pretixbase/js/asynctask.js:192
#: pretix/static/pretixbase/js/asynctask.js:197 #: pretix/static/pretixbase/js/asynctask.js:196
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
@@ -395,28 +228,28 @@ msgstr ""
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:199 #: pretix/static/pretixbase/js/asynctask.js:198
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:227 #: pretix/static/pretixbase/js/asynctask.js:226
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:230 #: pretix/static/pretixbase/js/asynctask.js:229
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:287 #: pretix/static/pretixbase/js/asynctask.js:286
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:342 #: pretix/static/pretixbase/js/asynctask.js:341
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -428,165 +261,6 @@ msgstr ""
msgid "Press Ctrl-C to copy!" msgid "Press Ctrl-C to copy!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:80
msgid "Edit"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:86
msgid "Visualize"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:96
msgid ""
"Your rule always filters by product or variation, but the following products "
"or variations are not contained in any of your rule parts so people with "
"these tickets will not get in:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:99
msgid "Please double-check if this was intentional."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:4
msgid "All of the conditions below (AND)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:5
msgid "At least one of the conditions below (OR)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:6
msgid "Event start"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:7
msgid "Event end"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:8
msgid "Event admission"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:9
msgid "custom date and time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:10
msgid "custom time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:11
msgid "Tolerance (minutes)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:12
msgid "Add condition"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:13
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:14
msgid "Duplicate"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:15
msgctxt "entry_status"
msgid "present"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:16
msgctxt "entry_status"
msgid "absent"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:29
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:35
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:41
msgid "is one of"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:47
msgid "is before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:51
msgid "is after"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:57
msgid "="
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:117
msgid "Product"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:121
msgid "Product variation"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:125
msgid "Gate"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:129
msgid "Current date and time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:133
msgid "Current day of the week (1 = Monday, 7 = Sunday)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:137
msgid "Current entry status"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:141
msgid "Number of previous entries"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:145
msgid "Number of previous entries since midnight"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:149
msgid "Number of previous entries since"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:153
msgid "Number of previous entries before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:157
msgid "Number of days with a previous entry"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:161
msgid "Number of days with a previous entry since"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:165
msgid "Number of days with a previous entry before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:169
msgid "Minutes since last entry (-1 on first entry)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:173
msgid "Minutes since first entry (-1 on first entry)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:47
msgid "Error: Product not found!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:54
msgid "Error: Variation not found!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:171 #: pretix/static/pretixcontrol/js/ui/editor.js:171
msgid "Check-in QR" msgid "Check-in QR"
msgstr "" msgstr ""
@@ -685,23 +359,23 @@ msgstr ""
msgid "Selected only" msgid "Selected only"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:844 #: pretix/static/pretixcontrol/js/ui/main.js:842
msgid "Enter page number between 1 and %(max)s." msgid "Enter page number between 1 and %(max)s."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:847 #: pretix/static/pretixcontrol/js/ui/main.js:845
msgid "Invalid page number." msgid "Invalid page number."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1005 #: pretix/static/pretixcontrol/js/ui/main.js:1003
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1045 #: pretix/static/pretixcontrol/js/ui/main.js:1043
msgid "Click to close" msgid "Click to close"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1126 #: pretix/static/pretixcontrol/js/ui/main.js:1124
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -721,6 +395,16 @@ msgstr ""
msgid "Count" msgid "Count"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:112 #: pretix/static/pretixcontrol/js/ui/subevent.js:112
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
@@ -787,196 +471,164 @@ msgid "Google Pay"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:16 #: pretix/static/pretixpresale/js/widget/widget.js:16
#: pretix/static/pretixpresale/widget/src/i18n.ts:30
msgctxt "widget" msgctxt "widget"
msgid "Quantity" msgid "Quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:17 #: pretix/static/pretixpresale/js/widget/widget.js:17
#: pretix/static/pretixpresale/widget/src/i18n.ts:31
msgctxt "widget" msgctxt "widget"
msgid "Decrease quantity" msgid "Decrease quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:18 #: pretix/static/pretixpresale/js/widget/widget.js:18
#: pretix/static/pretixpresale/widget/src/i18n.ts:32
msgctxt "widget" msgctxt "widget"
msgid "Increase quantity" msgid "Increase quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:19 #: pretix/static/pretixpresale/js/widget/widget.js:19
#: pretix/static/pretixpresale/widget/src/i18n.ts:33
msgctxt "widget" msgctxt "widget"
msgid "Filter events by" msgid "Filter events by"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20 #: pretix/static/pretixpresale/js/widget/widget.js:20
#: pretix/static/pretixpresale/widget/src/i18n.ts:34
msgctxt "widget" msgctxt "widget"
msgid "Filter" msgid "Filter"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21 #: pretix/static/pretixpresale/js/widget/widget.js:21
#: pretix/static/pretixpresale/widget/src/i18n.ts:35
msgctxt "widget" msgctxt "widget"
msgid "Price" msgid "Price"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22 #: pretix/static/pretixpresale/js/widget/widget.js:22
#: pretix/static/pretixpresale/widget/src/i18n.ts:36
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Original price: %s" msgid "Original price: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:23 #: pretix/static/pretixpresale/js/widget/widget.js:23
#: pretix/static/pretixpresale/widget/src/i18n.ts:37
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "New price: %s" msgid "New price: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:24 #: pretix/static/pretixpresale/js/widget/widget.js:24
#: pretix/static/pretixpresale/widget/src/i18n.ts:38
msgctxt "widget" msgctxt "widget"
msgid "Select" msgid "Select"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:25 #: pretix/static/pretixpresale/js/widget/widget.js:25
#: pretix/static/pretixpresale/widget/src/i18n.ts:39
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Select %s" msgid "Select %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:26 #: pretix/static/pretixpresale/js/widget/widget.js:26
#: pretix/static/pretixpresale/widget/src/i18n.ts:40
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Select variant %s" msgid "Select variant %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:27 #: pretix/static/pretixpresale/js/widget/widget.js:27
#: pretix/static/pretixpresale/widget/src/i18n.ts:41
msgctxt "widget" msgctxt "widget"
msgid "Sold out" msgid "Sold out"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:28 #: pretix/static/pretixpresale/js/widget/widget.js:28
#: pretix/static/pretixpresale/widget/src/i18n.ts:42
msgctxt "widget" msgctxt "widget"
msgid "Buy" msgid "Buy"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:29 #: pretix/static/pretixpresale/js/widget/widget.js:29
#: pretix/static/pretixpresale/widget/src/i18n.ts:43
msgctxt "widget" msgctxt "widget"
msgid "Register" msgid "Register"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:30 #: pretix/static/pretixpresale/js/widget/widget.js:30
#: pretix/static/pretixpresale/widget/src/i18n.ts:44
msgctxt "widget" msgctxt "widget"
msgid "Reserved" msgid "Reserved"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:31 #: pretix/static/pretixpresale/js/widget/widget.js:31
#: pretix/static/pretixpresale/widget/src/i18n.ts:45
msgctxt "widget" msgctxt "widget"
msgid "FREE" msgid "FREE"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:32 #: pretix/static/pretixpresale/js/widget/widget.js:32
#: pretix/static/pretixpresale/widget/src/i18n.ts:46
msgctxt "widget" msgctxt "widget"
msgid "from %(currency)s %(price)s" msgid "from %(currency)s %(price)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:33 #: pretix/static/pretixpresale/js/widget/widget.js:33
#: pretix/static/pretixpresale/widget/src/i18n.ts:47
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Image of %s" msgid "Image of %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:34 #: pretix/static/pretixpresale/js/widget/widget.js:34
#: pretix/static/pretixpresale/widget/src/i18n.ts:48
msgctxt "widget" msgctxt "widget"
msgid "incl. %(rate)s% %(taxname)s" msgid "incl. %(rate)s% %(taxname)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:35 #: pretix/static/pretixpresale/js/widget/widget.js:35
#: pretix/static/pretixpresale/widget/src/i18n.ts:49
msgctxt "widget" msgctxt "widget"
msgid "plus %(rate)s% %(taxname)s" msgid "plus %(rate)s% %(taxname)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:36 #: pretix/static/pretixpresale/js/widget/widget.js:36
#: pretix/static/pretixpresale/widget/src/i18n.ts:50
msgctxt "widget" msgctxt "widget"
msgid "incl. taxes" msgid "incl. taxes"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:37 #: pretix/static/pretixpresale/js/widget/widget.js:37
#: pretix/static/pretixpresale/widget/src/i18n.ts:51
msgctxt "widget" msgctxt "widget"
msgid "plus taxes" msgid "plus taxes"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:38 #: pretix/static/pretixpresale/js/widget/widget.js:38
#: pretix/static/pretixpresale/widget/src/i18n.ts:52
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "currently available: %s" msgid "currently available: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:39 #: pretix/static/pretixpresale/js/widget/widget.js:39
#: pretix/static/pretixpresale/widget/src/i18n.ts:53
msgctxt "widget" msgctxt "widget"
msgid "Only available with a voucher" msgid "Only available with a voucher"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:40 #: pretix/static/pretixpresale/js/widget/widget.js:40
#: pretix/static/pretixpresale/js/widget/widget.js:43 #: pretix/static/pretixpresale/js/widget/widget.js:43
#: pretix/static/pretixpresale/widget/src/i18n.ts:54
#: pretix/static/pretixpresale/widget/src/i18n.ts:57
msgctxt "widget" msgctxt "widget"
msgid "Not yet available" msgid "Not yet available"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:41 #: pretix/static/pretixpresale/js/widget/widget.js:41
#: pretix/static/pretixpresale/widget/src/i18n.ts:55
msgctxt "widget" msgctxt "widget"
msgid "Not available anymore" msgid "Not available anymore"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:42 #: pretix/static/pretixpresale/js/widget/widget.js:42
#: pretix/static/pretixpresale/widget/src/i18n.ts:56
msgctxt "widget" msgctxt "widget"
msgid "Currently not available" msgid "Currently not available"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:44 #: pretix/static/pretixpresale/js/widget/widget.js:44
#: pretix/static/pretixpresale/widget/src/i18n.ts:58
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "minimum amount to order: %s" msgid "minimum amount to order: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:45 #: pretix/static/pretixpresale/js/widget/widget.js:45
#: pretix/static/pretixpresale/widget/src/i18n.ts:59
msgctxt "widget" msgctxt "widget"
msgid "Close ticket shop" msgid "Close ticket shop"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:46 #: pretix/static/pretixpresale/js/widget/widget.js:46
#: pretix/static/pretixpresale/widget/src/i18n.ts:60
msgctxt "widget" msgctxt "widget"
msgid "The ticket shop could not be loaded." msgid "The ticket shop could not be loaded."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:47 #: pretix/static/pretixpresale/js/widget/widget.js:47
#: pretix/static/pretixpresale/widget/src/i18n.ts:61
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"There are currently a lot of users in this ticket shop. Please open the shop " "There are currently a lot of users in this ticket shop. Please open the shop "
@@ -984,25 +636,21 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:49 #: pretix/static/pretixpresale/js/widget/widget.js:49
#: pretix/static/pretixpresale/widget/src/i18n.ts:62
msgctxt "widget" msgctxt "widget"
msgid "Open ticket shop" msgid "Open ticket shop"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:50 #: pretix/static/pretixpresale/js/widget/widget.js:50
#: pretix/static/pretixpresale/widget/src/i18n.ts:63
msgctxt "widget" msgctxt "widget"
msgid "Checkout" msgid "Checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:51 #: pretix/static/pretixpresale/js/widget/widget.js:51
#: pretix/static/pretixpresale/widget/src/i18n.ts:64
msgctxt "widget" msgctxt "widget"
msgid "The cart could not be created. Please try again later" msgid "The cart could not be created. Please try again later"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:52 #: pretix/static/pretixpresale/js/widget/widget.js:52
#: pretix/static/pretixpresale/widget/src/i18n.ts:65
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"We could not create your cart, since there are currently too many users in " "We could not create your cart, since there are currently too many users in "
@@ -1010,13 +658,11 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:54 #: pretix/static/pretixpresale/js/widget/widget.js:54
#: pretix/static/pretixpresale/widget/src/i18n.ts:66
msgctxt "widget" msgctxt "widget"
msgid "Waiting list" msgid "Waiting list"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:55 #: pretix/static/pretixpresale/js/widget/widget.js:55
#: pretix/static/pretixpresale/widget/src/i18n.ts:67
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"You currently have an active cart for this event. If you select more " "You currently have an active cart for this event. If you select more "
@@ -1024,115 +670,96 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:57 #: pretix/static/pretixpresale/js/widget/widget.js:57
#: pretix/static/pretixpresale/widget/src/i18n.ts:68
msgctxt "widget" msgctxt "widget"
msgid "Resume checkout" msgid "Resume checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:58 #: pretix/static/pretixpresale/js/widget/widget.js:58
#: pretix/static/pretixpresale/widget/src/i18n.ts:69
msgctxt "widget" msgctxt "widget"
msgid "Redeem a voucher" msgid "Redeem a voucher"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:59 #: pretix/static/pretixpresale/js/widget/widget.js:59
#: pretix/static/pretixpresale/widget/src/i18n.ts:70
msgctxt "widget" msgctxt "widget"
msgid "Redeem" msgid "Redeem"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:60 #: pretix/static/pretixpresale/js/widget/widget.js:60
#: pretix/static/pretixpresale/widget/src/i18n.ts:71
msgctxt "widget" msgctxt "widget"
msgid "Voucher code" msgid "Voucher code"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:61 #: pretix/static/pretixpresale/js/widget/widget.js:61
#: pretix/static/pretixpresale/widget/src/i18n.ts:72
msgctxt "widget" msgctxt "widget"
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:62 #: pretix/static/pretixpresale/js/widget/widget.js:62
#: pretix/static/pretixpresale/widget/src/i18n.ts:73
msgctxt "widget" msgctxt "widget"
msgid "Close checkout" msgid "Close checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:63 #: pretix/static/pretixpresale/js/widget/widget.js:63
#: pretix/static/pretixpresale/widget/src/i18n.ts:74
msgctxt "widget" msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish." msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:64 #: pretix/static/pretixpresale/js/widget/widget.js:64
#: pretix/static/pretixpresale/widget/src/i18n.ts:75
msgctxt "widget" msgctxt "widget"
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:65 #: pretix/static/pretixpresale/js/widget/widget.js:65
#: pretix/static/pretixpresale/widget/src/i18n.ts:76
msgctxt "widget" msgctxt "widget"
msgid "Show variants" msgid "Show variants"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:66 #: pretix/static/pretixpresale/js/widget/widget.js:66
#: pretix/static/pretixpresale/widget/src/i18n.ts:77
msgctxt "widget" msgctxt "widget"
msgid "Hide variants" msgid "Hide variants"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:67 #: pretix/static/pretixpresale/js/widget/widget.js:67
#: pretix/static/pretixpresale/widget/src/i18n.ts:78
msgctxt "widget" msgctxt "widget"
msgid "Choose a different event" msgid "Choose a different event"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:68 #: pretix/static/pretixpresale/js/widget/widget.js:68
#: pretix/static/pretixpresale/widget/src/i18n.ts:79
msgctxt "widget" msgctxt "widget"
msgid "Choose a different date" msgid "Choose a different date"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:69 #: pretix/static/pretixpresale/js/widget/widget.js:69
#: pretix/static/pretixpresale/widget/src/i18n.ts:80
msgctxt "widget" msgctxt "widget"
msgid "Back" msgid "Back"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:70 #: pretix/static/pretixpresale/js/widget/widget.js:70
#: pretix/static/pretixpresale/widget/src/i18n.ts:81
msgctxt "widget" msgctxt "widget"
msgid "Next month" msgid "Next month"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:71 #: pretix/static/pretixpresale/js/widget/widget.js:71
#: pretix/static/pretixpresale/widget/src/i18n.ts:82
msgctxt "widget" msgctxt "widget"
msgid "Previous month" msgid "Previous month"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:72 #: pretix/static/pretixpresale/js/widget/widget.js:72
#: pretix/static/pretixpresale/widget/src/i18n.ts:83
msgctxt "widget" msgctxt "widget"
msgid "Next week" msgid "Next week"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:73 #: pretix/static/pretixpresale/js/widget/widget.js:73
#: pretix/static/pretixpresale/widget/src/i18n.ts:84
msgctxt "widget" msgctxt "widget"
msgid "Previous week" msgid "Previous week"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:74 #: pretix/static/pretixpresale/js/widget/widget.js:74
#: pretix/static/pretixpresale/widget/src/i18n.ts:85
msgctxt "widget" msgctxt "widget"
msgid "Open seat selection" msgid "Open seat selection"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:75 #: pretix/static/pretixpresale/js/widget/widget.js:75
#: pretix/static/pretixpresale/widget/src/i18n.ts:86
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"Some or all ticket categories are currently sold out. If you want, you can " "Some or all ticket categories are currently sold out. If you want, you can "
@@ -1141,137 +768,110 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:76 #: pretix/static/pretixpresale/js/widget/widget.js:76
#: pretix/static/pretixpresale/widget/src/i18n.ts:87
msgctxt "widget" msgctxt "widget"
msgid "Load more" msgid "Load more"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:78 #: pretix/static/pretixpresale/js/widget/widget.js:78
#: pretix/static/pretixpresale/widget/src/i18n.ts:89
msgid "Mo" msgid "Mo"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:79 #: pretix/static/pretixpresale/js/widget/widget.js:79
#: pretix/static/pretixpresale/widget/src/i18n.ts:90
msgid "Tu" msgid "Tu"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:80 #: pretix/static/pretixpresale/js/widget/widget.js:80
#: pretix/static/pretixpresale/widget/src/i18n.ts:91
msgid "We" msgid "We"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:81 #: pretix/static/pretixpresale/js/widget/widget.js:81
#: pretix/static/pretixpresale/widget/src/i18n.ts:92
msgid "Th" msgid "Th"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:82 #: pretix/static/pretixpresale/js/widget/widget.js:82
#: pretix/static/pretixpresale/widget/src/i18n.ts:93
msgid "Fr" msgid "Fr"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:83 #: pretix/static/pretixpresale/js/widget/widget.js:83
#: pretix/static/pretixpresale/widget/src/i18n.ts:94
msgid "Sa" msgid "Sa"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:84 #: pretix/static/pretixpresale/js/widget/widget.js:84
#: pretix/static/pretixpresale/widget/src/i18n.ts:95
msgid "Su" msgid "Su"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:85 #: pretix/static/pretixpresale/js/widget/widget.js:85
#: pretix/static/pretixpresale/widget/src/i18n.ts:96
msgid "Monday" msgid "Monday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:86 #: pretix/static/pretixpresale/js/widget/widget.js:86
#: pretix/static/pretixpresale/widget/src/i18n.ts:97
msgid "Tuesday" msgid "Tuesday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:87 #: pretix/static/pretixpresale/js/widget/widget.js:87
#: pretix/static/pretixpresale/widget/src/i18n.ts:98
msgid "Wednesday" msgid "Wednesday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:88 #: pretix/static/pretixpresale/js/widget/widget.js:88
#: pretix/static/pretixpresale/widget/src/i18n.ts:99
msgid "Thursday" msgid "Thursday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:89 #: pretix/static/pretixpresale/js/widget/widget.js:89
#: pretix/static/pretixpresale/widget/src/i18n.ts:100
msgid "Friday" msgid "Friday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:90 #: pretix/static/pretixpresale/js/widget/widget.js:90
#: pretix/static/pretixpresale/widget/src/i18n.ts:101
msgid "Saturday" msgid "Saturday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:91 #: pretix/static/pretixpresale/js/widget/widget.js:91
#: pretix/static/pretixpresale/widget/src/i18n.ts:102
msgid "Sunday" msgid "Sunday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:94 #: pretix/static/pretixpresale/js/widget/widget.js:94
#: pretix/static/pretixpresale/widget/src/i18n.ts:105
msgid "January" msgid "January"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:95 #: pretix/static/pretixpresale/js/widget/widget.js:95
#: pretix/static/pretixpresale/widget/src/i18n.ts:106
msgid "February" msgid "February"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:96 #: pretix/static/pretixpresale/js/widget/widget.js:96
#: pretix/static/pretixpresale/widget/src/i18n.ts:107
msgid "March" msgid "March"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:97 #: pretix/static/pretixpresale/js/widget/widget.js:97
#: pretix/static/pretixpresale/widget/src/i18n.ts:108
msgid "April" msgid "April"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:98 #: pretix/static/pretixpresale/js/widget/widget.js:98
#: pretix/static/pretixpresale/widget/src/i18n.ts:109
msgid "May" msgid "May"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:99 #: pretix/static/pretixpresale/js/widget/widget.js:99
#: pretix/static/pretixpresale/widget/src/i18n.ts:110
msgid "June" msgid "June"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:100 #: pretix/static/pretixpresale/js/widget/widget.js:100
#: pretix/static/pretixpresale/widget/src/i18n.ts:111
msgid "July" msgid "July"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:101 #: pretix/static/pretixpresale/js/widget/widget.js:101
#: pretix/static/pretixpresale/widget/src/i18n.ts:112
msgid "August" msgid "August"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:102 #: pretix/static/pretixpresale/js/widget/widget.js:102
#: pretix/static/pretixpresale/widget/src/i18n.ts:113
msgid "September" msgid "September"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:103 #: pretix/static/pretixpresale/js/widget/widget.js:103
#: pretix/static/pretixpresale/widget/src/i18n.ts:114
msgid "October" msgid "October"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:104 #: pretix/static/pretixpresale/js/widget/widget.js:104
#: pretix/static/pretixpresale/widget/src/i18n.ts:115
msgid "November" msgid "November"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:105 #: pretix/static/pretixpresale/js/widget/widget.js:105
#: pretix/static/pretixpresale/widget/src/i18n.ts:116
msgid "December" msgid "December"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1799 -2040
View File
File diff suppressed because it is too large Load Diff
+13 -13
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-28 14:44+0000\n" "POT-Creation-Date: 2026-05-27 15:49+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -210,8 +210,8 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:135 #: pretix/static/pretixbase/js/asynctask.js:135
#: pretix/static/pretixbase/js/asynctask.js:193 #: pretix/static/pretixbase/js/asynctask.js:192
#: pretix/static/pretixbase/js/asynctask.js:197 #: pretix/static/pretixbase/js/asynctask.js:196
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
@@ -227,28 +227,28 @@ msgstr ""
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:199 #: pretix/static/pretixbase/js/asynctask.js:198
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:227 #: pretix/static/pretixbase/js/asynctask.js:226
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:230 #: pretix/static/pretixbase/js/asynctask.js:229
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:287 #: pretix/static/pretixbase/js/asynctask.js:286
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:342 #: pretix/static/pretixbase/js/asynctask.js:341
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -358,23 +358,23 @@ msgstr ""
msgid "Selected only" msgid "Selected only"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:844 #: pretix/static/pretixcontrol/js/ui/main.js:842
msgid "Enter page number between 1 and %(max)s." msgid "Enter page number between 1 and %(max)s."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:847 #: pretix/static/pretixcontrol/js/ui/main.js:845
msgid "Invalid page number." msgid "Invalid page number."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1005 #: pretix/static/pretixcontrol/js/ui/main.js:1003
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1045 #: pretix/static/pretixcontrol/js/ui/main.js:1043
msgid "Click to close" msgid "Click to close"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1126 #: pretix/static/pretixcontrol/js/ui/main.js:1124
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+23 -423
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-28 15:49+0000\n" "POT-Creation-Date: 2026-05-27 14:47+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -130,7 +130,6 @@ msgid "Mercado Pago"
msgstr "" msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167 #: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:54
#: pretix/static/pretixpresale/js/ui/cart.js:89 #: pretix/static/pretixpresale/js/ui/cart.js:89
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
@@ -184,172 +183,6 @@ msgstr ""
msgid "Contacting your bank …" msgid "Contacting your bank …"
msgstr "" msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:34
msgid "Select a check-in list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:35
msgid "No active check-in lists found."
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:36
msgid "Switch check-in list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:37
msgid "Search results"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:38
msgid "No tickets found"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:39
msgid "Result"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:40
msgid "This ticket requires special attention"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:41
msgid "Switch direction"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:42
msgid "Entry"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:43
msgid "Exit"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:44
msgid "Scan a ticket or search and press return…"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:45
msgid "Load more"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:46
msgid "Valid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:47
msgid "Unpaid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:48
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:49
msgid "Canceled"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:50
msgid "Confirmed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:51
msgid "Approval pending"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:52
msgid "Redeemed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:53
msgid "Cancel"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:55
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:64
msgid "Ticket not paid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:56
msgid "This ticket is not yet paid. Do you want to continue anyways?"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:57
msgid "Additional information required"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:58
msgid "Valid ticket"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:59
msgid "Exit recorded"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:60
msgid "Ticket already used"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:61
msgid "Information required"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:62
msgid "Unknown ticket"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:63
msgid "Ticket type not allowed here"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:65
msgid "Entry not allowed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:66
msgid "Ticket code revoked/changed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:67
msgid "Ticket blocked"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:68
msgid "Ticket not valid at this time"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:69
msgid "Order canceled"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:70
msgid "Ticket code is ambiguous on list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:71
msgid "Order not approved"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:72
msgid "Checked-in Tickets"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:73
msgid "Valid Tickets"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:74
msgid "Currently inside"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:75
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:76
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
#: pretix/static/lightbox/js/lightbox.js:96 #: pretix/static/lightbox/js/lightbox.js:96
msgid "close" msgid "close"
msgstr "" msgstr ""
@@ -377,8 +210,8 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:135 #: pretix/static/pretixbase/js/asynctask.js:135
#: pretix/static/pretixbase/js/asynctask.js:193 #: pretix/static/pretixbase/js/asynctask.js:192
#: pretix/static/pretixbase/js/asynctask.js:197 #: pretix/static/pretixbase/js/asynctask.js:196
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
@@ -394,28 +227,28 @@ msgstr ""
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:199 #: pretix/static/pretixbase/js/asynctask.js:198
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:227 #: pretix/static/pretixbase/js/asynctask.js:226
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:230 #: pretix/static/pretixbase/js/asynctask.js:229
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:287 #: pretix/static/pretixbase/js/asynctask.js:286
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:342 #: pretix/static/pretixbase/js/asynctask.js:341
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -427,165 +260,6 @@ msgstr ""
msgid "Press Ctrl-C to copy!" msgid "Press Ctrl-C to copy!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:80
msgid "Edit"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:86
msgid "Visualize"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:96
msgid ""
"Your rule always filters by product or variation, but the following products "
"or variations are not contained in any of your rule parts so people with "
"these tickets will not get in:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:99
msgid "Please double-check if this was intentional."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:4
msgid "All of the conditions below (AND)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:5
msgid "At least one of the conditions below (OR)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:6
msgid "Event start"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:7
msgid "Event end"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:8
msgid "Event admission"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:9
msgid "custom date and time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:10
msgid "custom time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:11
msgid "Tolerance (minutes)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:12
msgid "Add condition"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:13
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:14
msgid "Duplicate"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:15
msgctxt "entry_status"
msgid "present"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:16
msgctxt "entry_status"
msgid "absent"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:29
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:35
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:41
msgid "is one of"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:47
msgid "is before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:51
msgid "is after"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:57
msgid "="
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:117
msgid "Product"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:121
msgid "Product variation"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:125
msgid "Gate"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:129
msgid "Current date and time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:133
msgid "Current day of the week (1 = Monday, 7 = Sunday)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:137
msgid "Current entry status"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:141
msgid "Number of previous entries"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:145
msgid "Number of previous entries since midnight"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:149
msgid "Number of previous entries since"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:153
msgid "Number of previous entries before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:157
msgid "Number of days with a previous entry"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:161
msgid "Number of days with a previous entry since"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:165
msgid "Number of days with a previous entry before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:169
msgid "Minutes since last entry (-1 on first entry)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:173
msgid "Minutes since first entry (-1 on first entry)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:47
msgid "Error: Product not found!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:54
msgid "Error: Variation not found!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:171 #: pretix/static/pretixcontrol/js/ui/editor.js:171
msgid "Check-in QR" msgid "Check-in QR"
msgstr "" msgstr ""
@@ -684,23 +358,23 @@ msgstr ""
msgid "Selected only" msgid "Selected only"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:844 #: pretix/static/pretixcontrol/js/ui/main.js:842
msgid "Enter page number between 1 and %(max)s." msgid "Enter page number between 1 and %(max)s."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:847 #: pretix/static/pretixcontrol/js/ui/main.js:845
msgid "Invalid page number." msgid "Invalid page number."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1005 #: pretix/static/pretixcontrol/js/ui/main.js:1003
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1045 #: pretix/static/pretixcontrol/js/ui/main.js:1043
msgid "Click to close" msgid "Click to close"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1126 #: pretix/static/pretixcontrol/js/ui/main.js:1124
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -720,6 +394,16 @@ msgstr ""
msgid "Count" msgid "Count"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:112 #: pretix/static/pretixcontrol/js/ui/subevent.js:112
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
@@ -786,196 +470,164 @@ msgid "Google Pay"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:16 #: pretix/static/pretixpresale/js/widget/widget.js:16
#: pretix/static/pretixpresale/widget/src/i18n.ts:30
msgctxt "widget" msgctxt "widget"
msgid "Quantity" msgid "Quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:17 #: pretix/static/pretixpresale/js/widget/widget.js:17
#: pretix/static/pretixpresale/widget/src/i18n.ts:31
msgctxt "widget" msgctxt "widget"
msgid "Decrease quantity" msgid "Decrease quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:18 #: pretix/static/pretixpresale/js/widget/widget.js:18
#: pretix/static/pretixpresale/widget/src/i18n.ts:32
msgctxt "widget" msgctxt "widget"
msgid "Increase quantity" msgid "Increase quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:19 #: pretix/static/pretixpresale/js/widget/widget.js:19
#: pretix/static/pretixpresale/widget/src/i18n.ts:33
msgctxt "widget" msgctxt "widget"
msgid "Filter events by" msgid "Filter events by"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20 #: pretix/static/pretixpresale/js/widget/widget.js:20
#: pretix/static/pretixpresale/widget/src/i18n.ts:34
msgctxt "widget" msgctxt "widget"
msgid "Filter" msgid "Filter"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21 #: pretix/static/pretixpresale/js/widget/widget.js:21
#: pretix/static/pretixpresale/widget/src/i18n.ts:35
msgctxt "widget" msgctxt "widget"
msgid "Price" msgid "Price"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22 #: pretix/static/pretixpresale/js/widget/widget.js:22
#: pretix/static/pretixpresale/widget/src/i18n.ts:36
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Original price: %s" msgid "Original price: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:23 #: pretix/static/pretixpresale/js/widget/widget.js:23
#: pretix/static/pretixpresale/widget/src/i18n.ts:37
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "New price: %s" msgid "New price: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:24 #: pretix/static/pretixpresale/js/widget/widget.js:24
#: pretix/static/pretixpresale/widget/src/i18n.ts:38
msgctxt "widget" msgctxt "widget"
msgid "Select" msgid "Select"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:25 #: pretix/static/pretixpresale/js/widget/widget.js:25
#: pretix/static/pretixpresale/widget/src/i18n.ts:39
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Select %s" msgid "Select %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:26 #: pretix/static/pretixpresale/js/widget/widget.js:26
#: pretix/static/pretixpresale/widget/src/i18n.ts:40
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Select variant %s" msgid "Select variant %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:27 #: pretix/static/pretixpresale/js/widget/widget.js:27
#: pretix/static/pretixpresale/widget/src/i18n.ts:41
msgctxt "widget" msgctxt "widget"
msgid "Sold out" msgid "Sold out"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:28 #: pretix/static/pretixpresale/js/widget/widget.js:28
#: pretix/static/pretixpresale/widget/src/i18n.ts:42
msgctxt "widget" msgctxt "widget"
msgid "Buy" msgid "Buy"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:29 #: pretix/static/pretixpresale/js/widget/widget.js:29
#: pretix/static/pretixpresale/widget/src/i18n.ts:43
msgctxt "widget" msgctxt "widget"
msgid "Register" msgid "Register"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:30 #: pretix/static/pretixpresale/js/widget/widget.js:30
#: pretix/static/pretixpresale/widget/src/i18n.ts:44
msgctxt "widget" msgctxt "widget"
msgid "Reserved" msgid "Reserved"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:31 #: pretix/static/pretixpresale/js/widget/widget.js:31
#: pretix/static/pretixpresale/widget/src/i18n.ts:45
msgctxt "widget" msgctxt "widget"
msgid "FREE" msgid "FREE"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:32 #: pretix/static/pretixpresale/js/widget/widget.js:32
#: pretix/static/pretixpresale/widget/src/i18n.ts:46
msgctxt "widget" msgctxt "widget"
msgid "from %(currency)s %(price)s" msgid "from %(currency)s %(price)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:33 #: pretix/static/pretixpresale/js/widget/widget.js:33
#: pretix/static/pretixpresale/widget/src/i18n.ts:47
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Image of %s" msgid "Image of %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:34 #: pretix/static/pretixpresale/js/widget/widget.js:34
#: pretix/static/pretixpresale/widget/src/i18n.ts:48
msgctxt "widget" msgctxt "widget"
msgid "incl. %(rate)s% %(taxname)s" msgid "incl. %(rate)s% %(taxname)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:35 #: pretix/static/pretixpresale/js/widget/widget.js:35
#: pretix/static/pretixpresale/widget/src/i18n.ts:49
msgctxt "widget" msgctxt "widget"
msgid "plus %(rate)s% %(taxname)s" msgid "plus %(rate)s% %(taxname)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:36 #: pretix/static/pretixpresale/js/widget/widget.js:36
#: pretix/static/pretixpresale/widget/src/i18n.ts:50
msgctxt "widget" msgctxt "widget"
msgid "incl. taxes" msgid "incl. taxes"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:37 #: pretix/static/pretixpresale/js/widget/widget.js:37
#: pretix/static/pretixpresale/widget/src/i18n.ts:51
msgctxt "widget" msgctxt "widget"
msgid "plus taxes" msgid "plus taxes"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:38 #: pretix/static/pretixpresale/js/widget/widget.js:38
#: pretix/static/pretixpresale/widget/src/i18n.ts:52
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "currently available: %s" msgid "currently available: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:39 #: pretix/static/pretixpresale/js/widget/widget.js:39
#: pretix/static/pretixpresale/widget/src/i18n.ts:53
msgctxt "widget" msgctxt "widget"
msgid "Only available with a voucher" msgid "Only available with a voucher"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:40 #: pretix/static/pretixpresale/js/widget/widget.js:40
#: pretix/static/pretixpresale/js/widget/widget.js:43 #: pretix/static/pretixpresale/js/widget/widget.js:43
#: pretix/static/pretixpresale/widget/src/i18n.ts:54
#: pretix/static/pretixpresale/widget/src/i18n.ts:57
msgctxt "widget" msgctxt "widget"
msgid "Not yet available" msgid "Not yet available"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:41 #: pretix/static/pretixpresale/js/widget/widget.js:41
#: pretix/static/pretixpresale/widget/src/i18n.ts:55
msgctxt "widget" msgctxt "widget"
msgid "Not available anymore" msgid "Not available anymore"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:42 #: pretix/static/pretixpresale/js/widget/widget.js:42
#: pretix/static/pretixpresale/widget/src/i18n.ts:56
msgctxt "widget" msgctxt "widget"
msgid "Currently not available" msgid "Currently not available"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:44 #: pretix/static/pretixpresale/js/widget/widget.js:44
#: pretix/static/pretixpresale/widget/src/i18n.ts:58
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "minimum amount to order: %s" msgid "minimum amount to order: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:45 #: pretix/static/pretixpresale/js/widget/widget.js:45
#: pretix/static/pretixpresale/widget/src/i18n.ts:59
msgctxt "widget" msgctxt "widget"
msgid "Close ticket shop" msgid "Close ticket shop"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:46 #: pretix/static/pretixpresale/js/widget/widget.js:46
#: pretix/static/pretixpresale/widget/src/i18n.ts:60
msgctxt "widget" msgctxt "widget"
msgid "The ticket shop could not be loaded." msgid "The ticket shop could not be loaded."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:47 #: pretix/static/pretixpresale/js/widget/widget.js:47
#: pretix/static/pretixpresale/widget/src/i18n.ts:61
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"There are currently a lot of users in this ticket shop. Please open the shop " "There are currently a lot of users in this ticket shop. Please open the shop "
@@ -983,25 +635,21 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:49 #: pretix/static/pretixpresale/js/widget/widget.js:49
#: pretix/static/pretixpresale/widget/src/i18n.ts:62
msgctxt "widget" msgctxt "widget"
msgid "Open ticket shop" msgid "Open ticket shop"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:50 #: pretix/static/pretixpresale/js/widget/widget.js:50
#: pretix/static/pretixpresale/widget/src/i18n.ts:63
msgctxt "widget" msgctxt "widget"
msgid "Checkout" msgid "Checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:51 #: pretix/static/pretixpresale/js/widget/widget.js:51
#: pretix/static/pretixpresale/widget/src/i18n.ts:64
msgctxt "widget" msgctxt "widget"
msgid "The cart could not be created. Please try again later" msgid "The cart could not be created. Please try again later"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:52 #: pretix/static/pretixpresale/js/widget/widget.js:52
#: pretix/static/pretixpresale/widget/src/i18n.ts:65
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"We could not create your cart, since there are currently too many users in " "We could not create your cart, since there are currently too many users in "
@@ -1009,13 +657,11 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:54 #: pretix/static/pretixpresale/js/widget/widget.js:54
#: pretix/static/pretixpresale/widget/src/i18n.ts:66
msgctxt "widget" msgctxt "widget"
msgid "Waiting list" msgid "Waiting list"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:55 #: pretix/static/pretixpresale/js/widget/widget.js:55
#: pretix/static/pretixpresale/widget/src/i18n.ts:67
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"You currently have an active cart for this event. If you select more " "You currently have an active cart for this event. If you select more "
@@ -1023,115 +669,96 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:57 #: pretix/static/pretixpresale/js/widget/widget.js:57
#: pretix/static/pretixpresale/widget/src/i18n.ts:68
msgctxt "widget" msgctxt "widget"
msgid "Resume checkout" msgid "Resume checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:58 #: pretix/static/pretixpresale/js/widget/widget.js:58
#: pretix/static/pretixpresale/widget/src/i18n.ts:69
msgctxt "widget" msgctxt "widget"
msgid "Redeem a voucher" msgid "Redeem a voucher"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:59 #: pretix/static/pretixpresale/js/widget/widget.js:59
#: pretix/static/pretixpresale/widget/src/i18n.ts:70
msgctxt "widget" msgctxt "widget"
msgid "Redeem" msgid "Redeem"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:60 #: pretix/static/pretixpresale/js/widget/widget.js:60
#: pretix/static/pretixpresale/widget/src/i18n.ts:71
msgctxt "widget" msgctxt "widget"
msgid "Voucher code" msgid "Voucher code"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:61 #: pretix/static/pretixpresale/js/widget/widget.js:61
#: pretix/static/pretixpresale/widget/src/i18n.ts:72
msgctxt "widget" msgctxt "widget"
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:62 #: pretix/static/pretixpresale/js/widget/widget.js:62
#: pretix/static/pretixpresale/widget/src/i18n.ts:73
msgctxt "widget" msgctxt "widget"
msgid "Close checkout" msgid "Close checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:63 #: pretix/static/pretixpresale/js/widget/widget.js:63
#: pretix/static/pretixpresale/widget/src/i18n.ts:74
msgctxt "widget" msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish." msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:64 #: pretix/static/pretixpresale/js/widget/widget.js:64
#: pretix/static/pretixpresale/widget/src/i18n.ts:75
msgctxt "widget" msgctxt "widget"
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:65 #: pretix/static/pretixpresale/js/widget/widget.js:65
#: pretix/static/pretixpresale/widget/src/i18n.ts:76
msgctxt "widget" msgctxt "widget"
msgid "Show variants" msgid "Show variants"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:66 #: pretix/static/pretixpresale/js/widget/widget.js:66
#: pretix/static/pretixpresale/widget/src/i18n.ts:77
msgctxt "widget" msgctxt "widget"
msgid "Hide variants" msgid "Hide variants"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:67 #: pretix/static/pretixpresale/js/widget/widget.js:67
#: pretix/static/pretixpresale/widget/src/i18n.ts:78
msgctxt "widget" msgctxt "widget"
msgid "Choose a different event" msgid "Choose a different event"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:68 #: pretix/static/pretixpresale/js/widget/widget.js:68
#: pretix/static/pretixpresale/widget/src/i18n.ts:79
msgctxt "widget" msgctxt "widget"
msgid "Choose a different date" msgid "Choose a different date"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:69 #: pretix/static/pretixpresale/js/widget/widget.js:69
#: pretix/static/pretixpresale/widget/src/i18n.ts:80
msgctxt "widget" msgctxt "widget"
msgid "Back" msgid "Back"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:70 #: pretix/static/pretixpresale/js/widget/widget.js:70
#: pretix/static/pretixpresale/widget/src/i18n.ts:81
msgctxt "widget" msgctxt "widget"
msgid "Next month" msgid "Next month"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:71 #: pretix/static/pretixpresale/js/widget/widget.js:71
#: pretix/static/pretixpresale/widget/src/i18n.ts:82
msgctxt "widget" msgctxt "widget"
msgid "Previous month" msgid "Previous month"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:72 #: pretix/static/pretixpresale/js/widget/widget.js:72
#: pretix/static/pretixpresale/widget/src/i18n.ts:83
msgctxt "widget" msgctxt "widget"
msgid "Next week" msgid "Next week"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:73 #: pretix/static/pretixpresale/js/widget/widget.js:73
#: pretix/static/pretixpresale/widget/src/i18n.ts:84
msgctxt "widget" msgctxt "widget"
msgid "Previous week" msgid "Previous week"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:74 #: pretix/static/pretixpresale/js/widget/widget.js:74
#: pretix/static/pretixpresale/widget/src/i18n.ts:85
msgctxt "widget" msgctxt "widget"
msgid "Open seat selection" msgid "Open seat selection"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:75 #: pretix/static/pretixpresale/js/widget/widget.js:75
#: pretix/static/pretixpresale/widget/src/i18n.ts:86
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"Some or all ticket categories are currently sold out. If you want, you can " "Some or all ticket categories are currently sold out. If you want, you can "
@@ -1140,137 +767,110 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:76 #: pretix/static/pretixpresale/js/widget/widget.js:76
#: pretix/static/pretixpresale/widget/src/i18n.ts:87
msgctxt "widget" msgctxt "widget"
msgid "Load more" msgid "Load more"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:78 #: pretix/static/pretixpresale/js/widget/widget.js:78
#: pretix/static/pretixpresale/widget/src/i18n.ts:89
msgid "Mo" msgid "Mo"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:79 #: pretix/static/pretixpresale/js/widget/widget.js:79
#: pretix/static/pretixpresale/widget/src/i18n.ts:90
msgid "Tu" msgid "Tu"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:80 #: pretix/static/pretixpresale/js/widget/widget.js:80
#: pretix/static/pretixpresale/widget/src/i18n.ts:91
msgid "We" msgid "We"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:81 #: pretix/static/pretixpresale/js/widget/widget.js:81
#: pretix/static/pretixpresale/widget/src/i18n.ts:92
msgid "Th" msgid "Th"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:82 #: pretix/static/pretixpresale/js/widget/widget.js:82
#: pretix/static/pretixpresale/widget/src/i18n.ts:93
msgid "Fr" msgid "Fr"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:83 #: pretix/static/pretixpresale/js/widget/widget.js:83
#: pretix/static/pretixpresale/widget/src/i18n.ts:94
msgid "Sa" msgid "Sa"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:84 #: pretix/static/pretixpresale/js/widget/widget.js:84
#: pretix/static/pretixpresale/widget/src/i18n.ts:95
msgid "Su" msgid "Su"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:85 #: pretix/static/pretixpresale/js/widget/widget.js:85
#: pretix/static/pretixpresale/widget/src/i18n.ts:96
msgid "Monday" msgid "Monday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:86 #: pretix/static/pretixpresale/js/widget/widget.js:86
#: pretix/static/pretixpresale/widget/src/i18n.ts:97
msgid "Tuesday" msgid "Tuesday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:87 #: pretix/static/pretixpresale/js/widget/widget.js:87
#: pretix/static/pretixpresale/widget/src/i18n.ts:98
msgid "Wednesday" msgid "Wednesday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:88 #: pretix/static/pretixpresale/js/widget/widget.js:88
#: pretix/static/pretixpresale/widget/src/i18n.ts:99
msgid "Thursday" msgid "Thursday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:89 #: pretix/static/pretixpresale/js/widget/widget.js:89
#: pretix/static/pretixpresale/widget/src/i18n.ts:100
msgid "Friday" msgid "Friday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:90 #: pretix/static/pretixpresale/js/widget/widget.js:90
#: pretix/static/pretixpresale/widget/src/i18n.ts:101
msgid "Saturday" msgid "Saturday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:91 #: pretix/static/pretixpresale/js/widget/widget.js:91
#: pretix/static/pretixpresale/widget/src/i18n.ts:102
msgid "Sunday" msgid "Sunday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:94 #: pretix/static/pretixpresale/js/widget/widget.js:94
#: pretix/static/pretixpresale/widget/src/i18n.ts:105
msgid "January" msgid "January"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:95 #: pretix/static/pretixpresale/js/widget/widget.js:95
#: pretix/static/pretixpresale/widget/src/i18n.ts:106
msgid "February" msgid "February"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:96 #: pretix/static/pretixpresale/js/widget/widget.js:96
#: pretix/static/pretixpresale/widget/src/i18n.ts:107
msgid "March" msgid "March"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:97 #: pretix/static/pretixpresale/js/widget/widget.js:97
#: pretix/static/pretixpresale/widget/src/i18n.ts:108
msgid "April" msgid "April"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:98 #: pretix/static/pretixpresale/js/widget/widget.js:98
#: pretix/static/pretixpresale/widget/src/i18n.ts:109
msgid "May" msgid "May"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:99 #: pretix/static/pretixpresale/js/widget/widget.js:99
#: pretix/static/pretixpresale/widget/src/i18n.ts:110
msgid "June" msgid "June"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:100 #: pretix/static/pretixpresale/js/widget/widget.js:100
#: pretix/static/pretixpresale/widget/src/i18n.ts:111
msgid "July" msgid "July"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:101 #: pretix/static/pretixpresale/js/widget/widget.js:101
#: pretix/static/pretixpresale/widget/src/i18n.ts:112
msgid "August" msgid "August"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:102 #: pretix/static/pretixpresale/js/widget/widget.js:102
#: pretix/static/pretixpresale/widget/src/i18n.ts:113
msgid "September" msgid "September"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:103 #: pretix/static/pretixpresale/js/widget/widget.js:103
#: pretix/static/pretixpresale/widget/src/i18n.ts:114
msgid "October" msgid "October"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:104 #: pretix/static/pretixpresale/js/widget/widget.js:104
#: pretix/static/pretixpresale/widget/src/i18n.ts:115
msgid "November" msgid "November"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:105 #: pretix/static/pretixpresale/js/widget/widget.js:105
#: pretix/static/pretixpresale/widget/src/i18n.ts:116
msgid "December" msgid "December"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+23 -423
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-28 15:49+0000\n" "POT-Creation-Date: 2026-05-27 14:47+0000\n"
"PO-Revision-Date: 2025-08-04 14:16+0200\n" "PO-Revision-Date: 2025-08-04 14:16+0200\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
@@ -131,7 +131,6 @@ msgid "Mercado Pago"
msgstr "" msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167 #: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:54
#: pretix/static/pretixpresale/js/ui/cart.js:89 #: pretix/static/pretixpresale/js/ui/cart.js:89
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
@@ -185,172 +184,6 @@ msgstr ""
msgid "Contacting your bank …" msgid "Contacting your bank …"
msgstr "" msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:34
msgid "Select a check-in list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:35
msgid "No active check-in lists found."
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:36
msgid "Switch check-in list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:37
msgid "Search results"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:38
msgid "No tickets found"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:39
msgid "Result"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:40
msgid "This ticket requires special attention"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:41
msgid "Switch direction"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:42
msgid "Entry"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:43
msgid "Exit"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:44
msgid "Scan a ticket or search and press return…"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:45
msgid "Load more"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:46
msgid "Valid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:47
msgid "Unpaid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:48
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:49
msgid "Canceled"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:50
msgid "Confirmed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:51
msgid "Approval pending"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:52
msgid "Redeemed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:53
msgid "Cancel"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:55
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:64
msgid "Ticket not paid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:56
msgid "This ticket is not yet paid. Do you want to continue anyways?"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:57
msgid "Additional information required"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:58
msgid "Valid ticket"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:59
msgid "Exit recorded"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:60
msgid "Ticket already used"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:61
msgid "Information required"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:62
msgid "Unknown ticket"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:63
msgid "Ticket type not allowed here"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:65
msgid "Entry not allowed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:66
msgid "Ticket code revoked/changed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:67
msgid "Ticket blocked"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:68
msgid "Ticket not valid at this time"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:69
msgid "Order canceled"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:70
msgid "Ticket code is ambiguous on list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:71
msgid "Order not approved"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:72
msgid "Checked-in Tickets"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:73
msgid "Valid Tickets"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:74
msgid "Currently inside"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:75
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:76
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
#: pretix/static/lightbox/js/lightbox.js:96 #: pretix/static/lightbox/js/lightbox.js:96
msgid "close" msgid "close"
msgstr "" msgstr ""
@@ -378,8 +211,8 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:135 #: pretix/static/pretixbase/js/asynctask.js:135
#: pretix/static/pretixbase/js/asynctask.js:193 #: pretix/static/pretixbase/js/asynctask.js:192
#: pretix/static/pretixbase/js/asynctask.js:197 #: pretix/static/pretixbase/js/asynctask.js:196
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
@@ -395,28 +228,28 @@ msgstr ""
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:199 #: pretix/static/pretixbase/js/asynctask.js:198
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:227 #: pretix/static/pretixbase/js/asynctask.js:226
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:230 #: pretix/static/pretixbase/js/asynctask.js:229
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:287 #: pretix/static/pretixbase/js/asynctask.js:286
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:342 #: pretix/static/pretixbase/js/asynctask.js:341
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -428,165 +261,6 @@ msgstr ""
msgid "Press Ctrl-C to copy!" msgid "Press Ctrl-C to copy!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:80
msgid "Edit"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:86
msgid "Visualize"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:96
msgid ""
"Your rule always filters by product or variation, but the following products "
"or variations are not contained in any of your rule parts so people with "
"these tickets will not get in:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:99
msgid "Please double-check if this was intentional."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:4
msgid "All of the conditions below (AND)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:5
msgid "At least one of the conditions below (OR)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:6
msgid "Event start"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:7
msgid "Event end"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:8
msgid "Event admission"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:9
msgid "custom date and time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:10
msgid "custom time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:11
msgid "Tolerance (minutes)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:12
msgid "Add condition"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:13
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:14
msgid "Duplicate"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:15
msgctxt "entry_status"
msgid "present"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:16
msgctxt "entry_status"
msgid "absent"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:29
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:35
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:41
msgid "is one of"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:47
msgid "is before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:51
msgid "is after"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:57
msgid "="
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:117
msgid "Product"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:121
msgid "Product variation"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:125
msgid "Gate"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:129
msgid "Current date and time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:133
msgid "Current day of the week (1 = Monday, 7 = Sunday)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:137
msgid "Current entry status"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:141
msgid "Number of previous entries"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:145
msgid "Number of previous entries since midnight"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:149
msgid "Number of previous entries since"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:153
msgid "Number of previous entries before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:157
msgid "Number of days with a previous entry"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:161
msgid "Number of days with a previous entry since"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:165
msgid "Number of days with a previous entry before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:169
msgid "Minutes since last entry (-1 on first entry)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:173
msgid "Minutes since first entry (-1 on first entry)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:47
msgid "Error: Product not found!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:54
msgid "Error: Variation not found!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:171 #: pretix/static/pretixcontrol/js/ui/editor.js:171
msgid "Check-in QR" msgid "Check-in QR"
msgstr "" msgstr ""
@@ -685,23 +359,23 @@ msgstr ""
msgid "Selected only" msgid "Selected only"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:844 #: pretix/static/pretixcontrol/js/ui/main.js:842
msgid "Enter page number between 1 and %(max)s." msgid "Enter page number between 1 and %(max)s."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:847 #: pretix/static/pretixcontrol/js/ui/main.js:845
msgid "Invalid page number." msgid "Invalid page number."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1005 #: pretix/static/pretixcontrol/js/ui/main.js:1003
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1045 #: pretix/static/pretixcontrol/js/ui/main.js:1043
msgid "Click to close" msgid "Click to close"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1126 #: pretix/static/pretixcontrol/js/ui/main.js:1124
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -721,6 +395,16 @@ msgstr ""
msgid "Count" msgid "Count"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:112 #: pretix/static/pretixcontrol/js/ui/subevent.js:112
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
@@ -787,196 +471,164 @@ msgid "Google Pay"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:16 #: pretix/static/pretixpresale/js/widget/widget.js:16
#: pretix/static/pretixpresale/widget/src/i18n.ts:30
msgctxt "widget" msgctxt "widget"
msgid "Quantity" msgid "Quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:17 #: pretix/static/pretixpresale/js/widget/widget.js:17
#: pretix/static/pretixpresale/widget/src/i18n.ts:31
msgctxt "widget" msgctxt "widget"
msgid "Decrease quantity" msgid "Decrease quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:18 #: pretix/static/pretixpresale/js/widget/widget.js:18
#: pretix/static/pretixpresale/widget/src/i18n.ts:32
msgctxt "widget" msgctxt "widget"
msgid "Increase quantity" msgid "Increase quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:19 #: pretix/static/pretixpresale/js/widget/widget.js:19
#: pretix/static/pretixpresale/widget/src/i18n.ts:33
msgctxt "widget" msgctxt "widget"
msgid "Filter events by" msgid "Filter events by"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20 #: pretix/static/pretixpresale/js/widget/widget.js:20
#: pretix/static/pretixpresale/widget/src/i18n.ts:34
msgctxt "widget" msgctxt "widget"
msgid "Filter" msgid "Filter"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21 #: pretix/static/pretixpresale/js/widget/widget.js:21
#: pretix/static/pretixpresale/widget/src/i18n.ts:35
msgctxt "widget" msgctxt "widget"
msgid "Price" msgid "Price"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22 #: pretix/static/pretixpresale/js/widget/widget.js:22
#: pretix/static/pretixpresale/widget/src/i18n.ts:36
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Original price: %s" msgid "Original price: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:23 #: pretix/static/pretixpresale/js/widget/widget.js:23
#: pretix/static/pretixpresale/widget/src/i18n.ts:37
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "New price: %s" msgid "New price: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:24 #: pretix/static/pretixpresale/js/widget/widget.js:24
#: pretix/static/pretixpresale/widget/src/i18n.ts:38
msgctxt "widget" msgctxt "widget"
msgid "Select" msgid "Select"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:25 #: pretix/static/pretixpresale/js/widget/widget.js:25
#: pretix/static/pretixpresale/widget/src/i18n.ts:39
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Select %s" msgid "Select %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:26 #: pretix/static/pretixpresale/js/widget/widget.js:26
#: pretix/static/pretixpresale/widget/src/i18n.ts:40
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Select variant %s" msgid "Select variant %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:27 #: pretix/static/pretixpresale/js/widget/widget.js:27
#: pretix/static/pretixpresale/widget/src/i18n.ts:41
msgctxt "widget" msgctxt "widget"
msgid "Sold out" msgid "Sold out"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:28 #: pretix/static/pretixpresale/js/widget/widget.js:28
#: pretix/static/pretixpresale/widget/src/i18n.ts:42
msgctxt "widget" msgctxt "widget"
msgid "Buy" msgid "Buy"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:29 #: pretix/static/pretixpresale/js/widget/widget.js:29
#: pretix/static/pretixpresale/widget/src/i18n.ts:43
msgctxt "widget" msgctxt "widget"
msgid "Register" msgid "Register"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:30 #: pretix/static/pretixpresale/js/widget/widget.js:30
#: pretix/static/pretixpresale/widget/src/i18n.ts:44
msgctxt "widget" msgctxt "widget"
msgid "Reserved" msgid "Reserved"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:31 #: pretix/static/pretixpresale/js/widget/widget.js:31
#: pretix/static/pretixpresale/widget/src/i18n.ts:45
msgctxt "widget" msgctxt "widget"
msgid "FREE" msgid "FREE"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:32 #: pretix/static/pretixpresale/js/widget/widget.js:32
#: pretix/static/pretixpresale/widget/src/i18n.ts:46
msgctxt "widget" msgctxt "widget"
msgid "from %(currency)s %(price)s" msgid "from %(currency)s %(price)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:33 #: pretix/static/pretixpresale/js/widget/widget.js:33
#: pretix/static/pretixpresale/widget/src/i18n.ts:47
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Image of %s" msgid "Image of %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:34 #: pretix/static/pretixpresale/js/widget/widget.js:34
#: pretix/static/pretixpresale/widget/src/i18n.ts:48
msgctxt "widget" msgctxt "widget"
msgid "incl. %(rate)s% %(taxname)s" msgid "incl. %(rate)s% %(taxname)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:35 #: pretix/static/pretixpresale/js/widget/widget.js:35
#: pretix/static/pretixpresale/widget/src/i18n.ts:49
msgctxt "widget" msgctxt "widget"
msgid "plus %(rate)s% %(taxname)s" msgid "plus %(rate)s% %(taxname)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:36 #: pretix/static/pretixpresale/js/widget/widget.js:36
#: pretix/static/pretixpresale/widget/src/i18n.ts:50
msgctxt "widget" msgctxt "widget"
msgid "incl. taxes" msgid "incl. taxes"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:37 #: pretix/static/pretixpresale/js/widget/widget.js:37
#: pretix/static/pretixpresale/widget/src/i18n.ts:51
msgctxt "widget" msgctxt "widget"
msgid "plus taxes" msgid "plus taxes"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:38 #: pretix/static/pretixpresale/js/widget/widget.js:38
#: pretix/static/pretixpresale/widget/src/i18n.ts:52
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "currently available: %s" msgid "currently available: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:39 #: pretix/static/pretixpresale/js/widget/widget.js:39
#: pretix/static/pretixpresale/widget/src/i18n.ts:53
msgctxt "widget" msgctxt "widget"
msgid "Only available with a voucher" msgid "Only available with a voucher"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:40 #: pretix/static/pretixpresale/js/widget/widget.js:40
#: pretix/static/pretixpresale/js/widget/widget.js:43 #: pretix/static/pretixpresale/js/widget/widget.js:43
#: pretix/static/pretixpresale/widget/src/i18n.ts:54
#: pretix/static/pretixpresale/widget/src/i18n.ts:57
msgctxt "widget" msgctxt "widget"
msgid "Not yet available" msgid "Not yet available"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:41 #: pretix/static/pretixpresale/js/widget/widget.js:41
#: pretix/static/pretixpresale/widget/src/i18n.ts:55
msgctxt "widget" msgctxt "widget"
msgid "Not available anymore" msgid "Not available anymore"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:42 #: pretix/static/pretixpresale/js/widget/widget.js:42
#: pretix/static/pretixpresale/widget/src/i18n.ts:56
msgctxt "widget" msgctxt "widget"
msgid "Currently not available" msgid "Currently not available"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:44 #: pretix/static/pretixpresale/js/widget/widget.js:44
#: pretix/static/pretixpresale/widget/src/i18n.ts:58
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "minimum amount to order: %s" msgid "minimum amount to order: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:45 #: pretix/static/pretixpresale/js/widget/widget.js:45
#: pretix/static/pretixpresale/widget/src/i18n.ts:59
msgctxt "widget" msgctxt "widget"
msgid "Close ticket shop" msgid "Close ticket shop"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:46 #: pretix/static/pretixpresale/js/widget/widget.js:46
#: pretix/static/pretixpresale/widget/src/i18n.ts:60
msgctxt "widget" msgctxt "widget"
msgid "The ticket shop could not be loaded." msgid "The ticket shop could not be loaded."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:47 #: pretix/static/pretixpresale/js/widget/widget.js:47
#: pretix/static/pretixpresale/widget/src/i18n.ts:61
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"There are currently a lot of users in this ticket shop. Please open the shop " "There are currently a lot of users in this ticket shop. Please open the shop "
@@ -984,25 +636,21 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:49 #: pretix/static/pretixpresale/js/widget/widget.js:49
#: pretix/static/pretixpresale/widget/src/i18n.ts:62
msgctxt "widget" msgctxt "widget"
msgid "Open ticket shop" msgid "Open ticket shop"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:50 #: pretix/static/pretixpresale/js/widget/widget.js:50
#: pretix/static/pretixpresale/widget/src/i18n.ts:63
msgctxt "widget" msgctxt "widget"
msgid "Checkout" msgid "Checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:51 #: pretix/static/pretixpresale/js/widget/widget.js:51
#: pretix/static/pretixpresale/widget/src/i18n.ts:64
msgctxt "widget" msgctxt "widget"
msgid "The cart could not be created. Please try again later" msgid "The cart could not be created. Please try again later"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:52 #: pretix/static/pretixpresale/js/widget/widget.js:52
#: pretix/static/pretixpresale/widget/src/i18n.ts:65
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"We could not create your cart, since there are currently too many users in " "We could not create your cart, since there are currently too many users in "
@@ -1010,13 +658,11 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:54 #: pretix/static/pretixpresale/js/widget/widget.js:54
#: pretix/static/pretixpresale/widget/src/i18n.ts:66
msgctxt "widget" msgctxt "widget"
msgid "Waiting list" msgid "Waiting list"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:55 #: pretix/static/pretixpresale/js/widget/widget.js:55
#: pretix/static/pretixpresale/widget/src/i18n.ts:67
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"You currently have an active cart for this event. If you select more " "You currently have an active cart for this event. If you select more "
@@ -1024,115 +670,96 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:57 #: pretix/static/pretixpresale/js/widget/widget.js:57
#: pretix/static/pretixpresale/widget/src/i18n.ts:68
msgctxt "widget" msgctxt "widget"
msgid "Resume checkout" msgid "Resume checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:58 #: pretix/static/pretixpresale/js/widget/widget.js:58
#: pretix/static/pretixpresale/widget/src/i18n.ts:69
msgctxt "widget" msgctxt "widget"
msgid "Redeem a voucher" msgid "Redeem a voucher"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:59 #: pretix/static/pretixpresale/js/widget/widget.js:59
#: pretix/static/pretixpresale/widget/src/i18n.ts:70
msgctxt "widget" msgctxt "widget"
msgid "Redeem" msgid "Redeem"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:60 #: pretix/static/pretixpresale/js/widget/widget.js:60
#: pretix/static/pretixpresale/widget/src/i18n.ts:71
msgctxt "widget" msgctxt "widget"
msgid "Voucher code" msgid "Voucher code"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:61 #: pretix/static/pretixpresale/js/widget/widget.js:61
#: pretix/static/pretixpresale/widget/src/i18n.ts:72
msgctxt "widget" msgctxt "widget"
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:62 #: pretix/static/pretixpresale/js/widget/widget.js:62
#: pretix/static/pretixpresale/widget/src/i18n.ts:73
msgctxt "widget" msgctxt "widget"
msgid "Close checkout" msgid "Close checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:63 #: pretix/static/pretixpresale/js/widget/widget.js:63
#: pretix/static/pretixpresale/widget/src/i18n.ts:74
msgctxt "widget" msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish." msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:64 #: pretix/static/pretixpresale/js/widget/widget.js:64
#: pretix/static/pretixpresale/widget/src/i18n.ts:75
msgctxt "widget" msgctxt "widget"
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:65 #: pretix/static/pretixpresale/js/widget/widget.js:65
#: pretix/static/pretixpresale/widget/src/i18n.ts:76
msgctxt "widget" msgctxt "widget"
msgid "Show variants" msgid "Show variants"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:66 #: pretix/static/pretixpresale/js/widget/widget.js:66
#: pretix/static/pretixpresale/widget/src/i18n.ts:77
msgctxt "widget" msgctxt "widget"
msgid "Hide variants" msgid "Hide variants"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:67 #: pretix/static/pretixpresale/js/widget/widget.js:67
#: pretix/static/pretixpresale/widget/src/i18n.ts:78
msgctxt "widget" msgctxt "widget"
msgid "Choose a different event" msgid "Choose a different event"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:68 #: pretix/static/pretixpresale/js/widget/widget.js:68
#: pretix/static/pretixpresale/widget/src/i18n.ts:79
msgctxt "widget" msgctxt "widget"
msgid "Choose a different date" msgid "Choose a different date"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:69 #: pretix/static/pretixpresale/js/widget/widget.js:69
#: pretix/static/pretixpresale/widget/src/i18n.ts:80
msgctxt "widget" msgctxt "widget"
msgid "Back" msgid "Back"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:70 #: pretix/static/pretixpresale/js/widget/widget.js:70
#: pretix/static/pretixpresale/widget/src/i18n.ts:81
msgctxt "widget" msgctxt "widget"
msgid "Next month" msgid "Next month"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:71 #: pretix/static/pretixpresale/js/widget/widget.js:71
#: pretix/static/pretixpresale/widget/src/i18n.ts:82
msgctxt "widget" msgctxt "widget"
msgid "Previous month" msgid "Previous month"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:72 #: pretix/static/pretixpresale/js/widget/widget.js:72
#: pretix/static/pretixpresale/widget/src/i18n.ts:83
msgctxt "widget" msgctxt "widget"
msgid "Next week" msgid "Next week"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:73 #: pretix/static/pretixpresale/js/widget/widget.js:73
#: pretix/static/pretixpresale/widget/src/i18n.ts:84
msgctxt "widget" msgctxt "widget"
msgid "Previous week" msgid "Previous week"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:74 #: pretix/static/pretixpresale/js/widget/widget.js:74
#: pretix/static/pretixpresale/widget/src/i18n.ts:85
msgctxt "widget" msgctxt "widget"
msgid "Open seat selection" msgid "Open seat selection"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:75 #: pretix/static/pretixpresale/js/widget/widget.js:75
#: pretix/static/pretixpresale/widget/src/i18n.ts:86
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"Some or all ticket categories are currently sold out. If you want, you can " "Some or all ticket categories are currently sold out. If you want, you can "
@@ -1141,137 +768,110 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:76 #: pretix/static/pretixpresale/js/widget/widget.js:76
#: pretix/static/pretixpresale/widget/src/i18n.ts:87
msgctxt "widget" msgctxt "widget"
msgid "Load more" msgid "Load more"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:78 #: pretix/static/pretixpresale/js/widget/widget.js:78
#: pretix/static/pretixpresale/widget/src/i18n.ts:89
msgid "Mo" msgid "Mo"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:79 #: pretix/static/pretixpresale/js/widget/widget.js:79
#: pretix/static/pretixpresale/widget/src/i18n.ts:90
msgid "Tu" msgid "Tu"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:80 #: pretix/static/pretixpresale/js/widget/widget.js:80
#: pretix/static/pretixpresale/widget/src/i18n.ts:91
msgid "We" msgid "We"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:81 #: pretix/static/pretixpresale/js/widget/widget.js:81
#: pretix/static/pretixpresale/widget/src/i18n.ts:92
msgid "Th" msgid "Th"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:82 #: pretix/static/pretixpresale/js/widget/widget.js:82
#: pretix/static/pretixpresale/widget/src/i18n.ts:93
msgid "Fr" msgid "Fr"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:83 #: pretix/static/pretixpresale/js/widget/widget.js:83
#: pretix/static/pretixpresale/widget/src/i18n.ts:94
msgid "Sa" msgid "Sa"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:84 #: pretix/static/pretixpresale/js/widget/widget.js:84
#: pretix/static/pretixpresale/widget/src/i18n.ts:95
msgid "Su" msgid "Su"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:85 #: pretix/static/pretixpresale/js/widget/widget.js:85
#: pretix/static/pretixpresale/widget/src/i18n.ts:96
msgid "Monday" msgid "Monday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:86 #: pretix/static/pretixpresale/js/widget/widget.js:86
#: pretix/static/pretixpresale/widget/src/i18n.ts:97
msgid "Tuesday" msgid "Tuesday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:87 #: pretix/static/pretixpresale/js/widget/widget.js:87
#: pretix/static/pretixpresale/widget/src/i18n.ts:98
msgid "Wednesday" msgid "Wednesday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:88 #: pretix/static/pretixpresale/js/widget/widget.js:88
#: pretix/static/pretixpresale/widget/src/i18n.ts:99
msgid "Thursday" msgid "Thursday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:89 #: pretix/static/pretixpresale/js/widget/widget.js:89
#: pretix/static/pretixpresale/widget/src/i18n.ts:100
msgid "Friday" msgid "Friday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:90 #: pretix/static/pretixpresale/js/widget/widget.js:90
#: pretix/static/pretixpresale/widget/src/i18n.ts:101
msgid "Saturday" msgid "Saturday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:91 #: pretix/static/pretixpresale/js/widget/widget.js:91
#: pretix/static/pretixpresale/widget/src/i18n.ts:102
msgid "Sunday" msgid "Sunday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:94 #: pretix/static/pretixpresale/js/widget/widget.js:94
#: pretix/static/pretixpresale/widget/src/i18n.ts:105
msgid "January" msgid "January"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:95 #: pretix/static/pretixpresale/js/widget/widget.js:95
#: pretix/static/pretixpresale/widget/src/i18n.ts:106
msgid "February" msgid "February"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:96 #: pretix/static/pretixpresale/js/widget/widget.js:96
#: pretix/static/pretixpresale/widget/src/i18n.ts:107
msgid "March" msgid "March"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:97 #: pretix/static/pretixpresale/js/widget/widget.js:97
#: pretix/static/pretixpresale/widget/src/i18n.ts:108
msgid "April" msgid "April"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:98 #: pretix/static/pretixpresale/js/widget/widget.js:98
#: pretix/static/pretixpresale/widget/src/i18n.ts:109
msgid "May" msgid "May"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:99 #: pretix/static/pretixpresale/js/widget/widget.js:99
#: pretix/static/pretixpresale/widget/src/i18n.ts:110
msgid "June" msgid "June"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:100 #: pretix/static/pretixpresale/js/widget/widget.js:100
#: pretix/static/pretixpresale/widget/src/i18n.ts:111
msgid "July" msgid "July"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:101 #: pretix/static/pretixpresale/js/widget/widget.js:101
#: pretix/static/pretixpresale/widget/src/i18n.ts:112
msgid "August" msgid "August"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:102 #: pretix/static/pretixpresale/js/widget/widget.js:102
#: pretix/static/pretixpresale/widget/src/i18n.ts:113
msgid "September" msgid "September"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:103 #: pretix/static/pretixpresale/js/widget/widget.js:103
#: pretix/static/pretixpresale/widget/src/i18n.ts:114
msgid "October" msgid "October"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:104 #: pretix/static/pretixpresale/js/widget/widget.js:104
#: pretix/static/pretixpresale/widget/src/i18n.ts:115
msgid "November" msgid "November"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:105 #: pretix/static/pretixpresale/js/widget/widget.js:105
#: pretix/static/pretixpresale/widget/src/i18n.ts:116
msgid "December" msgid "December"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+23 -423
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-28 15:49+0000\n" "POT-Creation-Date: 2026-05-27 14:47+0000\n"
"PO-Revision-Date: 2025-12-24 00:00+0000\n" "PO-Revision-Date: 2025-12-24 00:00+0000\n"
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n" "Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
"Language-Team: Estonian <https://translate.pretix.eu/projects/pretix/pretix-" "Language-Team: Estonian <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -131,7 +131,6 @@ msgid "Mercado Pago"
msgstr "" msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167 #: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:54
#: pretix/static/pretixpresale/js/ui/cart.js:89 #: pretix/static/pretixpresale/js/ui/cart.js:89
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
@@ -185,172 +184,6 @@ msgstr ""
msgid "Contacting your bank …" msgid "Contacting your bank …"
msgstr "" msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:34
msgid "Select a check-in list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:35
msgid "No active check-in lists found."
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:36
msgid "Switch check-in list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:37
msgid "Search results"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:38
msgid "No tickets found"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:39
msgid "Result"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:40
msgid "This ticket requires special attention"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:41
msgid "Switch direction"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:42
msgid "Entry"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:43
msgid "Exit"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:44
msgid "Scan a ticket or search and press return…"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:45
msgid "Load more"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:46
msgid "Valid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:47
msgid "Unpaid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:48
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:49
msgid "Canceled"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:50
msgid "Confirmed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:51
msgid "Approval pending"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:52
msgid "Redeemed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:53
msgid "Cancel"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:55
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:64
msgid "Ticket not paid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:56
msgid "This ticket is not yet paid. Do you want to continue anyways?"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:57
msgid "Additional information required"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:58
msgid "Valid ticket"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:59
msgid "Exit recorded"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:60
msgid "Ticket already used"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:61
msgid "Information required"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:62
msgid "Unknown ticket"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:63
msgid "Ticket type not allowed here"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:65
msgid "Entry not allowed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:66
msgid "Ticket code revoked/changed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:67
msgid "Ticket blocked"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:68
msgid "Ticket not valid at this time"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:69
msgid "Order canceled"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:70
msgid "Ticket code is ambiguous on list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:71
msgid "Order not approved"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:72
msgid "Checked-in Tickets"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:73
msgid "Valid Tickets"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:74
msgid "Currently inside"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:75
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:76
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
#: pretix/static/lightbox/js/lightbox.js:96 #: pretix/static/lightbox/js/lightbox.js:96
msgid "close" msgid "close"
msgstr "" msgstr ""
@@ -378,8 +211,8 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:135 #: pretix/static/pretixbase/js/asynctask.js:135
#: pretix/static/pretixbase/js/asynctask.js:193 #: pretix/static/pretixbase/js/asynctask.js:192
#: pretix/static/pretixbase/js/asynctask.js:197 #: pretix/static/pretixbase/js/asynctask.js:196
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
@@ -395,28 +228,28 @@ msgstr ""
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:199 #: pretix/static/pretixbase/js/asynctask.js:198
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:227 #: pretix/static/pretixbase/js/asynctask.js:226
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:230 #: pretix/static/pretixbase/js/asynctask.js:229
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:287 #: pretix/static/pretixbase/js/asynctask.js:286
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:342 #: pretix/static/pretixbase/js/asynctask.js:341
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -428,165 +261,6 @@ msgstr ""
msgid "Press Ctrl-C to copy!" msgid "Press Ctrl-C to copy!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:80
msgid "Edit"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:86
msgid "Visualize"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:96
msgid ""
"Your rule always filters by product or variation, but the following products "
"or variations are not contained in any of your rule parts so people with "
"these tickets will not get in:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:99
msgid "Please double-check if this was intentional."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:4
msgid "All of the conditions below (AND)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:5
msgid "At least one of the conditions below (OR)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:6
msgid "Event start"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:7
msgid "Event end"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:8
msgid "Event admission"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:9
msgid "custom date and time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:10
msgid "custom time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:11
msgid "Tolerance (minutes)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:12
msgid "Add condition"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:13
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:14
msgid "Duplicate"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:15
msgctxt "entry_status"
msgid "present"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:16
msgctxt "entry_status"
msgid "absent"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:29
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:35
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:41
msgid "is one of"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:47
msgid "is before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:51
msgid "is after"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:57
msgid "="
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:117
msgid "Product"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:121
msgid "Product variation"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:125
msgid "Gate"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:129
msgid "Current date and time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:133
msgid "Current day of the week (1 = Monday, 7 = Sunday)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:137
msgid "Current entry status"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:141
msgid "Number of previous entries"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:145
msgid "Number of previous entries since midnight"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:149
msgid "Number of previous entries since"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:153
msgid "Number of previous entries before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:157
msgid "Number of days with a previous entry"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:161
msgid "Number of days with a previous entry since"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:165
msgid "Number of days with a previous entry before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:169
msgid "Minutes since last entry (-1 on first entry)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:173
msgid "Minutes since first entry (-1 on first entry)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:47
msgid "Error: Product not found!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:54
msgid "Error: Variation not found!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:171 #: pretix/static/pretixcontrol/js/ui/editor.js:171
msgid "Check-in QR" msgid "Check-in QR"
msgstr "" msgstr ""
@@ -685,23 +359,23 @@ msgstr ""
msgid "Selected only" msgid "Selected only"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:844 #: pretix/static/pretixcontrol/js/ui/main.js:842
msgid "Enter page number between 1 and %(max)s." msgid "Enter page number between 1 and %(max)s."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:847 #: pretix/static/pretixcontrol/js/ui/main.js:845
msgid "Invalid page number." msgid "Invalid page number."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1005 #: pretix/static/pretixcontrol/js/ui/main.js:1003
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1045 #: pretix/static/pretixcontrol/js/ui/main.js:1043
msgid "Click to close" msgid "Click to close"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1126 #: pretix/static/pretixcontrol/js/ui/main.js:1124
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -721,6 +395,16 @@ msgstr ""
msgid "Count" msgid "Count"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:112 #: pretix/static/pretixcontrol/js/ui/subevent.js:112
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
@@ -787,196 +471,164 @@ msgid "Google Pay"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:16 #: pretix/static/pretixpresale/js/widget/widget.js:16
#: pretix/static/pretixpresale/widget/src/i18n.ts:30
msgctxt "widget" msgctxt "widget"
msgid "Quantity" msgid "Quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:17 #: pretix/static/pretixpresale/js/widget/widget.js:17
#: pretix/static/pretixpresale/widget/src/i18n.ts:31
msgctxt "widget" msgctxt "widget"
msgid "Decrease quantity" msgid "Decrease quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:18 #: pretix/static/pretixpresale/js/widget/widget.js:18
#: pretix/static/pretixpresale/widget/src/i18n.ts:32
msgctxt "widget" msgctxt "widget"
msgid "Increase quantity" msgid "Increase quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:19 #: pretix/static/pretixpresale/js/widget/widget.js:19
#: pretix/static/pretixpresale/widget/src/i18n.ts:33
msgctxt "widget" msgctxt "widget"
msgid "Filter events by" msgid "Filter events by"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20 #: pretix/static/pretixpresale/js/widget/widget.js:20
#: pretix/static/pretixpresale/widget/src/i18n.ts:34
msgctxt "widget" msgctxt "widget"
msgid "Filter" msgid "Filter"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21 #: pretix/static/pretixpresale/js/widget/widget.js:21
#: pretix/static/pretixpresale/widget/src/i18n.ts:35
msgctxt "widget" msgctxt "widget"
msgid "Price" msgid "Price"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22 #: pretix/static/pretixpresale/js/widget/widget.js:22
#: pretix/static/pretixpresale/widget/src/i18n.ts:36
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Original price: %s" msgid "Original price: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:23 #: pretix/static/pretixpresale/js/widget/widget.js:23
#: pretix/static/pretixpresale/widget/src/i18n.ts:37
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "New price: %s" msgid "New price: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:24 #: pretix/static/pretixpresale/js/widget/widget.js:24
#: pretix/static/pretixpresale/widget/src/i18n.ts:38
msgctxt "widget" msgctxt "widget"
msgid "Select" msgid "Select"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:25 #: pretix/static/pretixpresale/js/widget/widget.js:25
#: pretix/static/pretixpresale/widget/src/i18n.ts:39
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Select %s" msgid "Select %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:26 #: pretix/static/pretixpresale/js/widget/widget.js:26
#: pretix/static/pretixpresale/widget/src/i18n.ts:40
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Select variant %s" msgid "Select variant %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:27 #: pretix/static/pretixpresale/js/widget/widget.js:27
#: pretix/static/pretixpresale/widget/src/i18n.ts:41
msgctxt "widget" msgctxt "widget"
msgid "Sold out" msgid "Sold out"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:28 #: pretix/static/pretixpresale/js/widget/widget.js:28
#: pretix/static/pretixpresale/widget/src/i18n.ts:42
msgctxt "widget" msgctxt "widget"
msgid "Buy" msgid "Buy"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:29 #: pretix/static/pretixpresale/js/widget/widget.js:29
#: pretix/static/pretixpresale/widget/src/i18n.ts:43
msgctxt "widget" msgctxt "widget"
msgid "Register" msgid "Register"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:30 #: pretix/static/pretixpresale/js/widget/widget.js:30
#: pretix/static/pretixpresale/widget/src/i18n.ts:44
msgctxt "widget" msgctxt "widget"
msgid "Reserved" msgid "Reserved"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:31 #: pretix/static/pretixpresale/js/widget/widget.js:31
#: pretix/static/pretixpresale/widget/src/i18n.ts:45
msgctxt "widget" msgctxt "widget"
msgid "FREE" msgid "FREE"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:32 #: pretix/static/pretixpresale/js/widget/widget.js:32
#: pretix/static/pretixpresale/widget/src/i18n.ts:46
msgctxt "widget" msgctxt "widget"
msgid "from %(currency)s %(price)s" msgid "from %(currency)s %(price)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:33 #: pretix/static/pretixpresale/js/widget/widget.js:33
#: pretix/static/pretixpresale/widget/src/i18n.ts:47
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Image of %s" msgid "Image of %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:34 #: pretix/static/pretixpresale/js/widget/widget.js:34
#: pretix/static/pretixpresale/widget/src/i18n.ts:48
msgctxt "widget" msgctxt "widget"
msgid "incl. %(rate)s% %(taxname)s" msgid "incl. %(rate)s% %(taxname)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:35 #: pretix/static/pretixpresale/js/widget/widget.js:35
#: pretix/static/pretixpresale/widget/src/i18n.ts:49
msgctxt "widget" msgctxt "widget"
msgid "plus %(rate)s% %(taxname)s" msgid "plus %(rate)s% %(taxname)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:36 #: pretix/static/pretixpresale/js/widget/widget.js:36
#: pretix/static/pretixpresale/widget/src/i18n.ts:50
msgctxt "widget" msgctxt "widget"
msgid "incl. taxes" msgid "incl. taxes"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:37 #: pretix/static/pretixpresale/js/widget/widget.js:37
#: pretix/static/pretixpresale/widget/src/i18n.ts:51
msgctxt "widget" msgctxt "widget"
msgid "plus taxes" msgid "plus taxes"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:38 #: pretix/static/pretixpresale/js/widget/widget.js:38
#: pretix/static/pretixpresale/widget/src/i18n.ts:52
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "currently available: %s" msgid "currently available: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:39 #: pretix/static/pretixpresale/js/widget/widget.js:39
#: pretix/static/pretixpresale/widget/src/i18n.ts:53
msgctxt "widget" msgctxt "widget"
msgid "Only available with a voucher" msgid "Only available with a voucher"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:40 #: pretix/static/pretixpresale/js/widget/widget.js:40
#: pretix/static/pretixpresale/js/widget/widget.js:43 #: pretix/static/pretixpresale/js/widget/widget.js:43
#: pretix/static/pretixpresale/widget/src/i18n.ts:54
#: pretix/static/pretixpresale/widget/src/i18n.ts:57
msgctxt "widget" msgctxt "widget"
msgid "Not yet available" msgid "Not yet available"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:41 #: pretix/static/pretixpresale/js/widget/widget.js:41
#: pretix/static/pretixpresale/widget/src/i18n.ts:55
msgctxt "widget" msgctxt "widget"
msgid "Not available anymore" msgid "Not available anymore"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:42 #: pretix/static/pretixpresale/js/widget/widget.js:42
#: pretix/static/pretixpresale/widget/src/i18n.ts:56
msgctxt "widget" msgctxt "widget"
msgid "Currently not available" msgid "Currently not available"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:44 #: pretix/static/pretixpresale/js/widget/widget.js:44
#: pretix/static/pretixpresale/widget/src/i18n.ts:58
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "minimum amount to order: %s" msgid "minimum amount to order: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:45 #: pretix/static/pretixpresale/js/widget/widget.js:45
#: pretix/static/pretixpresale/widget/src/i18n.ts:59
msgctxt "widget" msgctxt "widget"
msgid "Close ticket shop" msgid "Close ticket shop"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:46 #: pretix/static/pretixpresale/js/widget/widget.js:46
#: pretix/static/pretixpresale/widget/src/i18n.ts:60
msgctxt "widget" msgctxt "widget"
msgid "The ticket shop could not be loaded." msgid "The ticket shop could not be loaded."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:47 #: pretix/static/pretixpresale/js/widget/widget.js:47
#: pretix/static/pretixpresale/widget/src/i18n.ts:61
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"There are currently a lot of users in this ticket shop. Please open the shop " "There are currently a lot of users in this ticket shop. Please open the shop "
@@ -984,25 +636,21 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:49 #: pretix/static/pretixpresale/js/widget/widget.js:49
#: pretix/static/pretixpresale/widget/src/i18n.ts:62
msgctxt "widget" msgctxt "widget"
msgid "Open ticket shop" msgid "Open ticket shop"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:50 #: pretix/static/pretixpresale/js/widget/widget.js:50
#: pretix/static/pretixpresale/widget/src/i18n.ts:63
msgctxt "widget" msgctxt "widget"
msgid "Checkout" msgid "Checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:51 #: pretix/static/pretixpresale/js/widget/widget.js:51
#: pretix/static/pretixpresale/widget/src/i18n.ts:64
msgctxt "widget" msgctxt "widget"
msgid "The cart could not be created. Please try again later" msgid "The cart could not be created. Please try again later"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:52 #: pretix/static/pretixpresale/js/widget/widget.js:52
#: pretix/static/pretixpresale/widget/src/i18n.ts:65
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"We could not create your cart, since there are currently too many users in " "We could not create your cart, since there are currently too many users in "
@@ -1010,13 +658,11 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:54 #: pretix/static/pretixpresale/js/widget/widget.js:54
#: pretix/static/pretixpresale/widget/src/i18n.ts:66
msgctxt "widget" msgctxt "widget"
msgid "Waiting list" msgid "Waiting list"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:55 #: pretix/static/pretixpresale/js/widget/widget.js:55
#: pretix/static/pretixpresale/widget/src/i18n.ts:67
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"You currently have an active cart for this event. If you select more " "You currently have an active cart for this event. If you select more "
@@ -1024,115 +670,96 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:57 #: pretix/static/pretixpresale/js/widget/widget.js:57
#: pretix/static/pretixpresale/widget/src/i18n.ts:68
msgctxt "widget" msgctxt "widget"
msgid "Resume checkout" msgid "Resume checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:58 #: pretix/static/pretixpresale/js/widget/widget.js:58
#: pretix/static/pretixpresale/widget/src/i18n.ts:69
msgctxt "widget" msgctxt "widget"
msgid "Redeem a voucher" msgid "Redeem a voucher"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:59 #: pretix/static/pretixpresale/js/widget/widget.js:59
#: pretix/static/pretixpresale/widget/src/i18n.ts:70
msgctxt "widget" msgctxt "widget"
msgid "Redeem" msgid "Redeem"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:60 #: pretix/static/pretixpresale/js/widget/widget.js:60
#: pretix/static/pretixpresale/widget/src/i18n.ts:71
msgctxt "widget" msgctxt "widget"
msgid "Voucher code" msgid "Voucher code"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:61 #: pretix/static/pretixpresale/js/widget/widget.js:61
#: pretix/static/pretixpresale/widget/src/i18n.ts:72
msgctxt "widget" msgctxt "widget"
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:62 #: pretix/static/pretixpresale/js/widget/widget.js:62
#: pretix/static/pretixpresale/widget/src/i18n.ts:73
msgctxt "widget" msgctxt "widget"
msgid "Close checkout" msgid "Close checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:63 #: pretix/static/pretixpresale/js/widget/widget.js:63
#: pretix/static/pretixpresale/widget/src/i18n.ts:74
msgctxt "widget" msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish." msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:64 #: pretix/static/pretixpresale/js/widget/widget.js:64
#: pretix/static/pretixpresale/widget/src/i18n.ts:75
msgctxt "widget" msgctxt "widget"
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:65 #: pretix/static/pretixpresale/js/widget/widget.js:65
#: pretix/static/pretixpresale/widget/src/i18n.ts:76
msgctxt "widget" msgctxt "widget"
msgid "Show variants" msgid "Show variants"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:66 #: pretix/static/pretixpresale/js/widget/widget.js:66
#: pretix/static/pretixpresale/widget/src/i18n.ts:77
msgctxt "widget" msgctxt "widget"
msgid "Hide variants" msgid "Hide variants"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:67 #: pretix/static/pretixpresale/js/widget/widget.js:67
#: pretix/static/pretixpresale/widget/src/i18n.ts:78
msgctxt "widget" msgctxt "widget"
msgid "Choose a different event" msgid "Choose a different event"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:68 #: pretix/static/pretixpresale/js/widget/widget.js:68
#: pretix/static/pretixpresale/widget/src/i18n.ts:79
msgctxt "widget" msgctxt "widget"
msgid "Choose a different date" msgid "Choose a different date"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:69 #: pretix/static/pretixpresale/js/widget/widget.js:69
#: pretix/static/pretixpresale/widget/src/i18n.ts:80
msgctxt "widget" msgctxt "widget"
msgid "Back" msgid "Back"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:70 #: pretix/static/pretixpresale/js/widget/widget.js:70
#: pretix/static/pretixpresale/widget/src/i18n.ts:81
msgctxt "widget" msgctxt "widget"
msgid "Next month" msgid "Next month"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:71 #: pretix/static/pretixpresale/js/widget/widget.js:71
#: pretix/static/pretixpresale/widget/src/i18n.ts:82
msgctxt "widget" msgctxt "widget"
msgid "Previous month" msgid "Previous month"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:72 #: pretix/static/pretixpresale/js/widget/widget.js:72
#: pretix/static/pretixpresale/widget/src/i18n.ts:83
msgctxt "widget" msgctxt "widget"
msgid "Next week" msgid "Next week"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:73 #: pretix/static/pretixpresale/js/widget/widget.js:73
#: pretix/static/pretixpresale/widget/src/i18n.ts:84
msgctxt "widget" msgctxt "widget"
msgid "Previous week" msgid "Previous week"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:74 #: pretix/static/pretixpresale/js/widget/widget.js:74
#: pretix/static/pretixpresale/widget/src/i18n.ts:85
msgctxt "widget" msgctxt "widget"
msgid "Open seat selection" msgid "Open seat selection"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:75 #: pretix/static/pretixpresale/js/widget/widget.js:75
#: pretix/static/pretixpresale/widget/src/i18n.ts:86
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"Some or all ticket categories are currently sold out. If you want, you can " "Some or all ticket categories are currently sold out. If you want, you can "
@@ -1141,137 +768,110 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:76 #: pretix/static/pretixpresale/js/widget/widget.js:76
#: pretix/static/pretixpresale/widget/src/i18n.ts:87
msgctxt "widget" msgctxt "widget"
msgid "Load more" msgid "Load more"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:78 #: pretix/static/pretixpresale/js/widget/widget.js:78
#: pretix/static/pretixpresale/widget/src/i18n.ts:89
msgid "Mo" msgid "Mo"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:79 #: pretix/static/pretixpresale/js/widget/widget.js:79
#: pretix/static/pretixpresale/widget/src/i18n.ts:90
msgid "Tu" msgid "Tu"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:80 #: pretix/static/pretixpresale/js/widget/widget.js:80
#: pretix/static/pretixpresale/widget/src/i18n.ts:91
msgid "We" msgid "We"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:81 #: pretix/static/pretixpresale/js/widget/widget.js:81
#: pretix/static/pretixpresale/widget/src/i18n.ts:92
msgid "Th" msgid "Th"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:82 #: pretix/static/pretixpresale/js/widget/widget.js:82
#: pretix/static/pretixpresale/widget/src/i18n.ts:93
msgid "Fr" msgid "Fr"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:83 #: pretix/static/pretixpresale/js/widget/widget.js:83
#: pretix/static/pretixpresale/widget/src/i18n.ts:94
msgid "Sa" msgid "Sa"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:84 #: pretix/static/pretixpresale/js/widget/widget.js:84
#: pretix/static/pretixpresale/widget/src/i18n.ts:95
msgid "Su" msgid "Su"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:85 #: pretix/static/pretixpresale/js/widget/widget.js:85
#: pretix/static/pretixpresale/widget/src/i18n.ts:96
msgid "Monday" msgid "Monday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:86 #: pretix/static/pretixpresale/js/widget/widget.js:86
#: pretix/static/pretixpresale/widget/src/i18n.ts:97
msgid "Tuesday" msgid "Tuesday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:87 #: pretix/static/pretixpresale/js/widget/widget.js:87
#: pretix/static/pretixpresale/widget/src/i18n.ts:98
msgid "Wednesday" msgid "Wednesday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:88 #: pretix/static/pretixpresale/js/widget/widget.js:88
#: pretix/static/pretixpresale/widget/src/i18n.ts:99
msgid "Thursday" msgid "Thursday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:89 #: pretix/static/pretixpresale/js/widget/widget.js:89
#: pretix/static/pretixpresale/widget/src/i18n.ts:100
msgid "Friday" msgid "Friday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:90 #: pretix/static/pretixpresale/js/widget/widget.js:90
#: pretix/static/pretixpresale/widget/src/i18n.ts:101
msgid "Saturday" msgid "Saturday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:91 #: pretix/static/pretixpresale/js/widget/widget.js:91
#: pretix/static/pretixpresale/widget/src/i18n.ts:102
msgid "Sunday" msgid "Sunday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:94 #: pretix/static/pretixpresale/js/widget/widget.js:94
#: pretix/static/pretixpresale/widget/src/i18n.ts:105
msgid "January" msgid "January"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:95 #: pretix/static/pretixpresale/js/widget/widget.js:95
#: pretix/static/pretixpresale/widget/src/i18n.ts:106
msgid "February" msgid "February"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:96 #: pretix/static/pretixpresale/js/widget/widget.js:96
#: pretix/static/pretixpresale/widget/src/i18n.ts:107
msgid "March" msgid "March"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:97 #: pretix/static/pretixpresale/js/widget/widget.js:97
#: pretix/static/pretixpresale/widget/src/i18n.ts:108
msgid "April" msgid "April"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:98 #: pretix/static/pretixpresale/js/widget/widget.js:98
#: pretix/static/pretixpresale/widget/src/i18n.ts:109
msgid "May" msgid "May"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:99 #: pretix/static/pretixpresale/js/widget/widget.js:99
#: pretix/static/pretixpresale/widget/src/i18n.ts:110
msgid "June" msgid "June"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:100 #: pretix/static/pretixpresale/js/widget/widget.js:100
#: pretix/static/pretixpresale/widget/src/i18n.ts:111
msgid "July" msgid "July"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:101 #: pretix/static/pretixpresale/js/widget/widget.js:101
#: pretix/static/pretixpresale/widget/src/i18n.ts:112
msgid "August" msgid "August"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:102 #: pretix/static/pretixpresale/js/widget/widget.js:102
#: pretix/static/pretixpresale/widget/src/i18n.ts:113
msgid "September" msgid "September"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:103 #: pretix/static/pretixpresale/js/widget/widget.js:103
#: pretix/static/pretixpresale/widget/src/i18n.ts:114
msgid "October" msgid "October"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:104 #: pretix/static/pretixpresale/js/widget/widget.js:104
#: pretix/static/pretixpresale/widget/src/i18n.ts:115
msgid "November" msgid "November"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:105 #: pretix/static/pretixpresale/js/widget/widget.js:105
#: pretix/static/pretixpresale/widget/src/i18n.ts:116
msgid "December" msgid "December"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+23 -423
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-28 15:49+0000\n" "POT-Creation-Date: 2026-05-27 14:47+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -130,7 +130,6 @@ msgid "Mercado Pago"
msgstr "" msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167 #: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:54
#: pretix/static/pretixpresale/js/ui/cart.js:89 #: pretix/static/pretixpresale/js/ui/cart.js:89
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
@@ -184,172 +183,6 @@ msgstr ""
msgid "Contacting your bank …" msgid "Contacting your bank …"
msgstr "" msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:34
msgid "Select a check-in list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:35
msgid "No active check-in lists found."
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:36
msgid "Switch check-in list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:37
msgid "Search results"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:38
msgid "No tickets found"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:39
msgid "Result"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:40
msgid "This ticket requires special attention"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:41
msgid "Switch direction"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:42
msgid "Entry"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:43
msgid "Exit"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:44
msgid "Scan a ticket or search and press return…"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:45
msgid "Load more"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:46
msgid "Valid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:47
msgid "Unpaid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:48
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:49
msgid "Canceled"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:50
msgid "Confirmed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:51
msgid "Approval pending"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:52
msgid "Redeemed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:53
msgid "Cancel"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:55
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:64
msgid "Ticket not paid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:56
msgid "This ticket is not yet paid. Do you want to continue anyways?"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:57
msgid "Additional information required"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:58
msgid "Valid ticket"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:59
msgid "Exit recorded"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:60
msgid "Ticket already used"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:61
msgid "Information required"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:62
msgid "Unknown ticket"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:63
msgid "Ticket type not allowed here"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:65
msgid "Entry not allowed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:66
msgid "Ticket code revoked/changed"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:67
msgid "Ticket blocked"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:68
msgid "Ticket not valid at this time"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:69
msgid "Order canceled"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:70
msgid "Ticket code is ambiguous on list"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:71
msgid "Order not approved"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:72
msgid "Checked-in Tickets"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:73
msgid "Valid Tickets"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:74
msgid "Currently inside"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:75
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts:76
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
#: pretix/static/lightbox/js/lightbox.js:96 #: pretix/static/lightbox/js/lightbox.js:96
msgid "close" msgid "close"
msgstr "" msgstr ""
@@ -377,8 +210,8 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:135 #: pretix/static/pretixbase/js/asynctask.js:135
#: pretix/static/pretixbase/js/asynctask.js:193 #: pretix/static/pretixbase/js/asynctask.js:192
#: pretix/static/pretixbase/js/asynctask.js:197 #: pretix/static/pretixbase/js/asynctask.js:196
#: pretix/static/pretixcontrol/js/ui/mail.js:24 #: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred." msgid "An error of type {code} occurred."
msgstr "" msgstr ""
@@ -394,28 +227,28 @@ msgstr ""
msgid "The request took too long. Please try again." msgid "The request took too long. Please try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:199 #: pretix/static/pretixbase/js/asynctask.js:198
#: pretix/static/pretixcontrol/js/ui/mail.js:26 #: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid "" msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}" "We currently cannot reach the server. Please try again. Error code: {code}"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:227 #: pretix/static/pretixbase/js/asynctask.js:226
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:230 #: pretix/static/pretixbase/js/asynctask.js:229
msgid "" msgid ""
"We are currently sending your request to the server. If this takes longer " "We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this " "than one minute, please check your internet connection and then reload this "
"page and try again." "page and try again."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:287 #: pretix/static/pretixbase/js/asynctask.js:286
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:342 #: pretix/static/pretixbase/js/asynctask.js:341
msgid "Close message" msgid "Close message"
msgstr "" msgstr ""
@@ -427,165 +260,6 @@ msgstr ""
msgid "Press Ctrl-C to copy!" msgid "Press Ctrl-C to copy!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:80
msgid "Edit"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:86
msgid "Visualize"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:96
msgid ""
"Your rule always filters by product or variation, but the following products "
"or variations are not contained in any of your rule parts so people with "
"these tickets will not get in:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:99
msgid "Please double-check if this was intentional."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:4
msgid "All of the conditions below (AND)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:5
msgid "At least one of the conditions below (OR)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:6
msgid "Event start"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:7
msgid "Event end"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:8
msgid "Event admission"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:9
msgid "custom date and time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:10
msgid "custom time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:11
msgid "Tolerance (minutes)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:12
msgid "Add condition"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:13
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:14
msgid "Duplicate"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:15
msgctxt "entry_status"
msgid "present"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:16
msgctxt "entry_status"
msgid "absent"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:29
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:35
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:41
msgid "is one of"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:47
msgid "is before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:51
msgid "is after"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:57
msgid "="
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:117
msgid "Product"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:121
msgid "Product variation"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:125
msgid "Gate"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:129
msgid "Current date and time"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:133
msgid "Current day of the week (1 = Monday, 7 = Sunday)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:137
msgid "Current entry status"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:141
msgid "Number of previous entries"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:145
msgid "Number of previous entries since midnight"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:149
msgid "Number of previous entries since"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:153
msgid "Number of previous entries before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:157
msgid "Number of days with a previous entry"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:161
msgid "Number of days with a previous entry since"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:165
msgid "Number of days with a previous entry before"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:169
msgid "Minutes since last entry (-1 on first entry)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:173
msgid "Minutes since first entry (-1 on first entry)"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:47
msgid "Error: Product not found!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts:54
msgid "Error: Variation not found!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:171 #: pretix/static/pretixcontrol/js/ui/editor.js:171
msgid "Check-in QR" msgid "Check-in QR"
msgstr "" msgstr ""
@@ -684,23 +358,23 @@ msgstr ""
msgid "Selected only" msgid "Selected only"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:844 #: pretix/static/pretixcontrol/js/ui/main.js:842
msgid "Enter page number between 1 and %(max)s." msgid "Enter page number between 1 and %(max)s."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:847 #: pretix/static/pretixcontrol/js/ui/main.js:845
msgid "Invalid page number." msgid "Invalid page number."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1005 #: pretix/static/pretixcontrol/js/ui/main.js:1003
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1045 #: pretix/static/pretixcontrol/js/ui/main.js:1043
msgid "Click to close" msgid "Click to close"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:1126 #: pretix/static/pretixcontrol/js/ui/main.js:1124
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -720,6 +394,16 @@ msgstr ""
msgid "Count" msgid "Count"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:112 #: pretix/static/pretixcontrol/js/ui/subevent.js:112
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
@@ -786,196 +470,164 @@ msgid "Google Pay"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:16 #: pretix/static/pretixpresale/js/widget/widget.js:16
#: pretix/static/pretixpresale/widget/src/i18n.ts:30
msgctxt "widget" msgctxt "widget"
msgid "Quantity" msgid "Quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:17 #: pretix/static/pretixpresale/js/widget/widget.js:17
#: pretix/static/pretixpresale/widget/src/i18n.ts:31
msgctxt "widget" msgctxt "widget"
msgid "Decrease quantity" msgid "Decrease quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:18 #: pretix/static/pretixpresale/js/widget/widget.js:18
#: pretix/static/pretixpresale/widget/src/i18n.ts:32
msgctxt "widget" msgctxt "widget"
msgid "Increase quantity" msgid "Increase quantity"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:19 #: pretix/static/pretixpresale/js/widget/widget.js:19
#: pretix/static/pretixpresale/widget/src/i18n.ts:33
msgctxt "widget" msgctxt "widget"
msgid "Filter events by" msgid "Filter events by"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20 #: pretix/static/pretixpresale/js/widget/widget.js:20
#: pretix/static/pretixpresale/widget/src/i18n.ts:34
msgctxt "widget" msgctxt "widget"
msgid "Filter" msgid "Filter"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21 #: pretix/static/pretixpresale/js/widget/widget.js:21
#: pretix/static/pretixpresale/widget/src/i18n.ts:35
msgctxt "widget" msgctxt "widget"
msgid "Price" msgid "Price"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22 #: pretix/static/pretixpresale/js/widget/widget.js:22
#: pretix/static/pretixpresale/widget/src/i18n.ts:36
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Original price: %s" msgid "Original price: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:23 #: pretix/static/pretixpresale/js/widget/widget.js:23
#: pretix/static/pretixpresale/widget/src/i18n.ts:37
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "New price: %s" msgid "New price: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:24 #: pretix/static/pretixpresale/js/widget/widget.js:24
#: pretix/static/pretixpresale/widget/src/i18n.ts:38
msgctxt "widget" msgctxt "widget"
msgid "Select" msgid "Select"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:25 #: pretix/static/pretixpresale/js/widget/widget.js:25
#: pretix/static/pretixpresale/widget/src/i18n.ts:39
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Select %s" msgid "Select %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:26 #: pretix/static/pretixpresale/js/widget/widget.js:26
#: pretix/static/pretixpresale/widget/src/i18n.ts:40
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Select variant %s" msgid "Select variant %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:27 #: pretix/static/pretixpresale/js/widget/widget.js:27
#: pretix/static/pretixpresale/widget/src/i18n.ts:41
msgctxt "widget" msgctxt "widget"
msgid "Sold out" msgid "Sold out"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:28 #: pretix/static/pretixpresale/js/widget/widget.js:28
#: pretix/static/pretixpresale/widget/src/i18n.ts:42
msgctxt "widget" msgctxt "widget"
msgid "Buy" msgid "Buy"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:29 #: pretix/static/pretixpresale/js/widget/widget.js:29
#: pretix/static/pretixpresale/widget/src/i18n.ts:43
msgctxt "widget" msgctxt "widget"
msgid "Register" msgid "Register"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:30 #: pretix/static/pretixpresale/js/widget/widget.js:30
#: pretix/static/pretixpresale/widget/src/i18n.ts:44
msgctxt "widget" msgctxt "widget"
msgid "Reserved" msgid "Reserved"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:31 #: pretix/static/pretixpresale/js/widget/widget.js:31
#: pretix/static/pretixpresale/widget/src/i18n.ts:45
msgctxt "widget" msgctxt "widget"
msgid "FREE" msgid "FREE"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:32 #: pretix/static/pretixpresale/js/widget/widget.js:32
#: pretix/static/pretixpresale/widget/src/i18n.ts:46
msgctxt "widget" msgctxt "widget"
msgid "from %(currency)s %(price)s" msgid "from %(currency)s %(price)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:33 #: pretix/static/pretixpresale/js/widget/widget.js:33
#: pretix/static/pretixpresale/widget/src/i18n.ts:47
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "Image of %s" msgid "Image of %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:34 #: pretix/static/pretixpresale/js/widget/widget.js:34
#: pretix/static/pretixpresale/widget/src/i18n.ts:48
msgctxt "widget" msgctxt "widget"
msgid "incl. %(rate)s% %(taxname)s" msgid "incl. %(rate)s% %(taxname)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:35 #: pretix/static/pretixpresale/js/widget/widget.js:35
#: pretix/static/pretixpresale/widget/src/i18n.ts:49
msgctxt "widget" msgctxt "widget"
msgid "plus %(rate)s% %(taxname)s" msgid "plus %(rate)s% %(taxname)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:36 #: pretix/static/pretixpresale/js/widget/widget.js:36
#: pretix/static/pretixpresale/widget/src/i18n.ts:50
msgctxt "widget" msgctxt "widget"
msgid "incl. taxes" msgid "incl. taxes"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:37 #: pretix/static/pretixpresale/js/widget/widget.js:37
#: pretix/static/pretixpresale/widget/src/i18n.ts:51
msgctxt "widget" msgctxt "widget"
msgid "plus taxes" msgid "plus taxes"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:38 #: pretix/static/pretixpresale/js/widget/widget.js:38
#: pretix/static/pretixpresale/widget/src/i18n.ts:52
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "currently available: %s" msgid "currently available: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:39 #: pretix/static/pretixpresale/js/widget/widget.js:39
#: pretix/static/pretixpresale/widget/src/i18n.ts:53
msgctxt "widget" msgctxt "widget"
msgid "Only available with a voucher" msgid "Only available with a voucher"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:40 #: pretix/static/pretixpresale/js/widget/widget.js:40
#: pretix/static/pretixpresale/js/widget/widget.js:43 #: pretix/static/pretixpresale/js/widget/widget.js:43
#: pretix/static/pretixpresale/widget/src/i18n.ts:54
#: pretix/static/pretixpresale/widget/src/i18n.ts:57
msgctxt "widget" msgctxt "widget"
msgid "Not yet available" msgid "Not yet available"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:41 #: pretix/static/pretixpresale/js/widget/widget.js:41
#: pretix/static/pretixpresale/widget/src/i18n.ts:55
msgctxt "widget" msgctxt "widget"
msgid "Not available anymore" msgid "Not available anymore"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:42 #: pretix/static/pretixpresale/js/widget/widget.js:42
#: pretix/static/pretixpresale/widget/src/i18n.ts:56
msgctxt "widget" msgctxt "widget"
msgid "Currently not available" msgid "Currently not available"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:44 #: pretix/static/pretixpresale/js/widget/widget.js:44
#: pretix/static/pretixpresale/widget/src/i18n.ts:58
#, javascript-format #, javascript-format
msgctxt "widget" msgctxt "widget"
msgid "minimum amount to order: %s" msgid "minimum amount to order: %s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:45 #: pretix/static/pretixpresale/js/widget/widget.js:45
#: pretix/static/pretixpresale/widget/src/i18n.ts:59
msgctxt "widget" msgctxt "widget"
msgid "Close ticket shop" msgid "Close ticket shop"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:46 #: pretix/static/pretixpresale/js/widget/widget.js:46
#: pretix/static/pretixpresale/widget/src/i18n.ts:60
msgctxt "widget" msgctxt "widget"
msgid "The ticket shop could not be loaded." msgid "The ticket shop could not be loaded."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:47 #: pretix/static/pretixpresale/js/widget/widget.js:47
#: pretix/static/pretixpresale/widget/src/i18n.ts:61
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"There are currently a lot of users in this ticket shop. Please open the shop " "There are currently a lot of users in this ticket shop. Please open the shop "
@@ -983,25 +635,21 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:49 #: pretix/static/pretixpresale/js/widget/widget.js:49
#: pretix/static/pretixpresale/widget/src/i18n.ts:62
msgctxt "widget" msgctxt "widget"
msgid "Open ticket shop" msgid "Open ticket shop"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:50 #: pretix/static/pretixpresale/js/widget/widget.js:50
#: pretix/static/pretixpresale/widget/src/i18n.ts:63
msgctxt "widget" msgctxt "widget"
msgid "Checkout" msgid "Checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:51 #: pretix/static/pretixpresale/js/widget/widget.js:51
#: pretix/static/pretixpresale/widget/src/i18n.ts:64
msgctxt "widget" msgctxt "widget"
msgid "The cart could not be created. Please try again later" msgid "The cart could not be created. Please try again later"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:52 #: pretix/static/pretixpresale/js/widget/widget.js:52
#: pretix/static/pretixpresale/widget/src/i18n.ts:65
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"We could not create your cart, since there are currently too many users in " "We could not create your cart, since there are currently too many users in "
@@ -1009,13 +657,11 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:54 #: pretix/static/pretixpresale/js/widget/widget.js:54
#: pretix/static/pretixpresale/widget/src/i18n.ts:66
msgctxt "widget" msgctxt "widget"
msgid "Waiting list" msgid "Waiting list"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:55 #: pretix/static/pretixpresale/js/widget/widget.js:55
#: pretix/static/pretixpresale/widget/src/i18n.ts:67
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"You currently have an active cart for this event. If you select more " "You currently have an active cart for this event. If you select more "
@@ -1023,115 +669,96 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:57 #: pretix/static/pretixpresale/js/widget/widget.js:57
#: pretix/static/pretixpresale/widget/src/i18n.ts:68
msgctxt "widget" msgctxt "widget"
msgid "Resume checkout" msgid "Resume checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:58 #: pretix/static/pretixpresale/js/widget/widget.js:58
#: pretix/static/pretixpresale/widget/src/i18n.ts:69
msgctxt "widget" msgctxt "widget"
msgid "Redeem a voucher" msgid "Redeem a voucher"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:59 #: pretix/static/pretixpresale/js/widget/widget.js:59
#: pretix/static/pretixpresale/widget/src/i18n.ts:70
msgctxt "widget" msgctxt "widget"
msgid "Redeem" msgid "Redeem"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:60 #: pretix/static/pretixpresale/js/widget/widget.js:60
#: pretix/static/pretixpresale/widget/src/i18n.ts:71
msgctxt "widget" msgctxt "widget"
msgid "Voucher code" msgid "Voucher code"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:61 #: pretix/static/pretixpresale/js/widget/widget.js:61
#: pretix/static/pretixpresale/widget/src/i18n.ts:72
msgctxt "widget" msgctxt "widget"
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:62 #: pretix/static/pretixpresale/js/widget/widget.js:62
#: pretix/static/pretixpresale/widget/src/i18n.ts:73
msgctxt "widget" msgctxt "widget"
msgid "Close checkout" msgid "Close checkout"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:63 #: pretix/static/pretixpresale/js/widget/widget.js:63
#: pretix/static/pretixpresale/widget/src/i18n.ts:74
msgctxt "widget" msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish." msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:64 #: pretix/static/pretixpresale/js/widget/widget.js:64
#: pretix/static/pretixpresale/widget/src/i18n.ts:75
msgctxt "widget" msgctxt "widget"
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:65 #: pretix/static/pretixpresale/js/widget/widget.js:65
#: pretix/static/pretixpresale/widget/src/i18n.ts:76
msgctxt "widget" msgctxt "widget"
msgid "Show variants" msgid "Show variants"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:66 #: pretix/static/pretixpresale/js/widget/widget.js:66
#: pretix/static/pretixpresale/widget/src/i18n.ts:77
msgctxt "widget" msgctxt "widget"
msgid "Hide variants" msgid "Hide variants"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:67 #: pretix/static/pretixpresale/js/widget/widget.js:67
#: pretix/static/pretixpresale/widget/src/i18n.ts:78
msgctxt "widget" msgctxt "widget"
msgid "Choose a different event" msgid "Choose a different event"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:68 #: pretix/static/pretixpresale/js/widget/widget.js:68
#: pretix/static/pretixpresale/widget/src/i18n.ts:79
msgctxt "widget" msgctxt "widget"
msgid "Choose a different date" msgid "Choose a different date"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:69 #: pretix/static/pretixpresale/js/widget/widget.js:69
#: pretix/static/pretixpresale/widget/src/i18n.ts:80
msgctxt "widget" msgctxt "widget"
msgid "Back" msgid "Back"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:70 #: pretix/static/pretixpresale/js/widget/widget.js:70
#: pretix/static/pretixpresale/widget/src/i18n.ts:81
msgctxt "widget" msgctxt "widget"
msgid "Next month" msgid "Next month"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:71 #: pretix/static/pretixpresale/js/widget/widget.js:71
#: pretix/static/pretixpresale/widget/src/i18n.ts:82
msgctxt "widget" msgctxt "widget"
msgid "Previous month" msgid "Previous month"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:72 #: pretix/static/pretixpresale/js/widget/widget.js:72
#: pretix/static/pretixpresale/widget/src/i18n.ts:83
msgctxt "widget" msgctxt "widget"
msgid "Next week" msgid "Next week"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:73 #: pretix/static/pretixpresale/js/widget/widget.js:73
#: pretix/static/pretixpresale/widget/src/i18n.ts:84
msgctxt "widget" msgctxt "widget"
msgid "Previous week" msgid "Previous week"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:74 #: pretix/static/pretixpresale/js/widget/widget.js:74
#: pretix/static/pretixpresale/widget/src/i18n.ts:85
msgctxt "widget" msgctxt "widget"
msgid "Open seat selection" msgid "Open seat selection"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:75 #: pretix/static/pretixpresale/js/widget/widget.js:75
#: pretix/static/pretixpresale/widget/src/i18n.ts:86
msgctxt "widget" msgctxt "widget"
msgid "" msgid ""
"Some or all ticket categories are currently sold out. If you want, you can " "Some or all ticket categories are currently sold out. If you want, you can "
@@ -1140,137 +767,110 @@ msgid ""
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:76 #: pretix/static/pretixpresale/js/widget/widget.js:76
#: pretix/static/pretixpresale/widget/src/i18n.ts:87
msgctxt "widget" msgctxt "widget"
msgid "Load more" msgid "Load more"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:78 #: pretix/static/pretixpresale/js/widget/widget.js:78
#: pretix/static/pretixpresale/widget/src/i18n.ts:89
msgid "Mo" msgid "Mo"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:79 #: pretix/static/pretixpresale/js/widget/widget.js:79
#: pretix/static/pretixpresale/widget/src/i18n.ts:90
msgid "Tu" msgid "Tu"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:80 #: pretix/static/pretixpresale/js/widget/widget.js:80
#: pretix/static/pretixpresale/widget/src/i18n.ts:91
msgid "We" msgid "We"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:81 #: pretix/static/pretixpresale/js/widget/widget.js:81
#: pretix/static/pretixpresale/widget/src/i18n.ts:92
msgid "Th" msgid "Th"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:82 #: pretix/static/pretixpresale/js/widget/widget.js:82
#: pretix/static/pretixpresale/widget/src/i18n.ts:93
msgid "Fr" msgid "Fr"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:83 #: pretix/static/pretixpresale/js/widget/widget.js:83
#: pretix/static/pretixpresale/widget/src/i18n.ts:94
msgid "Sa" msgid "Sa"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:84 #: pretix/static/pretixpresale/js/widget/widget.js:84
#: pretix/static/pretixpresale/widget/src/i18n.ts:95
msgid "Su" msgid "Su"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:85 #: pretix/static/pretixpresale/js/widget/widget.js:85
#: pretix/static/pretixpresale/widget/src/i18n.ts:96
msgid "Monday" msgid "Monday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:86 #: pretix/static/pretixpresale/js/widget/widget.js:86
#: pretix/static/pretixpresale/widget/src/i18n.ts:97
msgid "Tuesday" msgid "Tuesday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:87 #: pretix/static/pretixpresale/js/widget/widget.js:87
#: pretix/static/pretixpresale/widget/src/i18n.ts:98
msgid "Wednesday" msgid "Wednesday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:88 #: pretix/static/pretixpresale/js/widget/widget.js:88
#: pretix/static/pretixpresale/widget/src/i18n.ts:99
msgid "Thursday" msgid "Thursday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:89 #: pretix/static/pretixpresale/js/widget/widget.js:89
#: pretix/static/pretixpresale/widget/src/i18n.ts:100
msgid "Friday" msgid "Friday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:90 #: pretix/static/pretixpresale/js/widget/widget.js:90
#: pretix/static/pretixpresale/widget/src/i18n.ts:101
msgid "Saturday" msgid "Saturday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:91 #: pretix/static/pretixpresale/js/widget/widget.js:91
#: pretix/static/pretixpresale/widget/src/i18n.ts:102
msgid "Sunday" msgid "Sunday"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:94 #: pretix/static/pretixpresale/js/widget/widget.js:94
#: pretix/static/pretixpresale/widget/src/i18n.ts:105
msgid "January" msgid "January"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:95 #: pretix/static/pretixpresale/js/widget/widget.js:95
#: pretix/static/pretixpresale/widget/src/i18n.ts:106
msgid "February" msgid "February"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:96 #: pretix/static/pretixpresale/js/widget/widget.js:96
#: pretix/static/pretixpresale/widget/src/i18n.ts:107
msgid "March" msgid "March"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:97 #: pretix/static/pretixpresale/js/widget/widget.js:97
#: pretix/static/pretixpresale/widget/src/i18n.ts:108
msgid "April" msgid "April"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:98 #: pretix/static/pretixpresale/js/widget/widget.js:98
#: pretix/static/pretixpresale/widget/src/i18n.ts:109
msgid "May" msgid "May"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:99 #: pretix/static/pretixpresale/js/widget/widget.js:99
#: pretix/static/pretixpresale/widget/src/i18n.ts:110
msgid "June" msgid "June"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:100 #: pretix/static/pretixpresale/js/widget/widget.js:100
#: pretix/static/pretixpresale/widget/src/i18n.ts:111
msgid "July" msgid "July"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:101 #: pretix/static/pretixpresale/js/widget/widget.js:101
#: pretix/static/pretixpresale/widget/src/i18n.ts:112
msgid "August" msgid "August"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:102 #: pretix/static/pretixpresale/js/widget/widget.js:102
#: pretix/static/pretixpresale/widget/src/i18n.ts:113
msgid "September" msgid "September"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:103 #: pretix/static/pretixpresale/js/widget/widget.js:103
#: pretix/static/pretixpresale/widget/src/i18n.ts:114
msgid "October" msgid "October"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:104 #: pretix/static/pretixpresale/js/widget/widget.js:104
#: pretix/static/pretixpresale/widget/src/i18n.ts:115
msgid "November" msgid "November"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:105 #: pretix/static/pretixpresale/js/widget/widget.js:105
#: pretix/static/pretixpresale/widget/src/i18n.ts:116
msgid "December" msgid "December"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More