diff --git a/.travis.sh b/.travis.sh index 5cee1168f..e507bb219 100755 --- a/.travis.sh +++ b/.travis.sh @@ -25,7 +25,7 @@ if [ "$1" == "doctests" ]; then cd doc make doctest fi -if [ "$1" == "spelling" ]; then +if [ "$1" == "doc-spelling" ]; then XDG_CACHE_HOME=/cache pip3 install -Ur doc/requirements.txt cd doc make spelling @@ -33,6 +33,11 @@ if [ "$1" == "spelling" ]; then exit 1 fi fi +if [ "$1" == "translation-spelling" ]; then + XDG_CACHE_HOME=/cache pip3 install -Ur src/requirements/dev.txt + cd src + potypo +fi if [ "$1" == "tests" ]; then pip3 install -r src/requirements.txt -Ur src/requirements/dev.txt -r src/requirements/py34.txt cd src diff --git a/.travis.yml b/.travis.yml index a53476926..9398bcd6f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,12 +37,16 @@ matrix: - python: 3.6 env: JOB=plugins - python: 3.6 - env: JOB=spelling + env: JOB=doc-spelling + - python: 3.6 + env: JOB=translation-spelling addons: postgresql: "9.4" apt: packages: - enchant + - myspell-de-de + - aspell-en branches: except: - /^weblate-.*/ diff --git a/src/pretix/base/models/auth.py b/src/pretix/base/models/auth.py index f0428009b..965cdedd2 100644 --- a/src/pretix/base/models/auth.py +++ b/src/pretix/base/models/auth.py @@ -93,7 +93,7 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin): verbose_name=_('Timezone')) require_2fa = models.BooleanField( default=False, - verbose_name=_('Two-factor authentification is required to log in') + verbose_name=_('Two-factor authentication is required to log in') ) notifications_send = models.BooleanField( default=True, diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 66cb63fb1..e97ad3c33 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -679,7 +679,7 @@ class OrderChangeManager: 'no quota is available.'), 'paid_price_change': _('Currently, paid orders can only be changed in a way that does not change the total ' 'price of the order as partial payments or refunds are not yet supported.'), - 'addon_to_required': _('This is an addon product, please select the base position it should be added to.'), + 'addon_to_required': _('This is an add-on product, please select the base position it should be added to.'), 'addon_invalid': _('The selected base position does not allow you to add this product as an add-on.'), 'subevent_required': _('You need to choose a subevent for the new position.'), } diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index a6517a1db..245e25fbd 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -430,8 +430,8 @@ class PaymentSettingsForm(SettingsForm): ) payment_term_weekdays = forms.BooleanField( label=_('Only end payment terms on weekdays'), - help_text=_("If this is activated and the payment term of any order ends on a saturday or sunday, it will be " - "moved to the next monday instead. This is required in some countries by civil law. This will " + help_text=_("If this is activated and the payment term of any order ends on a Saturday or Sunday, it will be " + "moved to the next Monday instead. This is required in some countries by civil law. This will " "not effect the last date of payments configured above."), required=False, ) diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 2c4ebaecb..b30b8b040 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -348,7 +348,7 @@ class ItemVariationsFormSet(I18nFormSet): f.fields['DELETE'].disabled = True raise ValidationError( message=_('The variation "%s" cannot be deleted because it has already been ordered by a user or ' - 'currently is in a users\'s cart. Please set the variation as "inactive" instead.'), + 'currently is in a user\'s cart. Please set the variation as "inactive" instead.'), params=(str(f.instance),) ) diff --git a/src/pretix/control/templates/pretixcontrol/auth/login_2fa.html b/src/pretix/control/templates/pretixcontrol/auth/login_2fa.html index f5f0b565f..e06e531b4 100644 --- a/src/pretix/control/templates/pretixcontrol/auth/login_2fa.html +++ b/src/pretix/control/templates/pretixcontrol/auth/login_2fa.html @@ -8,7 +8,7 @@ {% csrf_token %}

{% trans "Welcome back!" %}

- {% trans "You configured your account to require authentification with a second medium, e.g. your phone. Please enter your verification code here:" %} + {% trans "You configured your account to require authentication with a second medium, e.g. your phone. Please enter your verification code here:" %}

{% elif not widget.official %} - {% trans "Inofficial translation" %} + {% trans "Unofficial translation" %} {% endif %} diff --git a/src/pretix/control/templates/pretixcontrol/organizers/team_delete.html b/src/pretix/control/templates/pretixcontrol/organizers/team_delete.html index 526c4aa50..2cfc8ff8d 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/team_delete.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/team_delete.html @@ -4,7 +4,7 @@ {% block inner %}

{% trans "Delete team:" %} {{ team.name }}

{% if not possible %} -

{% blocktrans %}You cannot delete the team because there would be noone left who could change team permissions afterwards.{% endblocktrans %}

+

{% blocktrans %}You cannot delete the team because there would be no one left who could change team permissions afterwards.{% endblocktrans %}

{% trans "Cancel" %} diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 32ab347a2..3c78ca7f9 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -1006,7 +1006,7 @@ class ItemAddOns(ItemDetailMixin, EventPermissionRequiredMixin, TemplateView): def get(self, request, *args, **kwargs): if self.get_object().category and self.get_object().category.is_addon: - messages.error(self.request, _('You cannot add addons to a product that is only available as an add-on ' + messages.error(self.request, _('You cannot add add-ons to a product that is only available as an add-on ' 'itself.')) return redirect(self.get_previous_url()) diff --git a/src/pretix/control/views/organizer.py b/src/pretix/control/views/organizer.py index 712cc07af..c8c07969e 100644 --- a/src/pretix/control/views/organizer.py +++ b/src/pretix/control/views/organizer.py @@ -474,7 +474,7 @@ class TeamMemberView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, can_change_teams=True, members__isnull=False ).exists() if not other_admin_teams and self.object.can_change_teams and self.object.members.count() == 1: - messages.error(self.request, _('You cannot remove the last member from this team as noone would ' + messages.error(self.request, _('You cannot remove the last member from this team as no one would ' 'be left with the permission to change teams.')) return redirect(self.get_success_url()) else: diff --git a/src/pretix/locale/de/wordlist.txt b/src/pretix/locale/de/wordlist.txt new file mode 100644 index 000000000..71752c68d --- /dev/null +++ b/src/pretix/locale/de/wordlist.txt @@ -0,0 +1,148 @@ +Admin +Adminbereich +Alipay +and +App +Apps +ausgeklappt +auswahl +Authenticator +Bancontact +Banking +Beispielevent +Benachrichtigungs +Benachrichtigungsart +Benachrichtigungseinstellungen +Berechtigungs +Bestellbestätigungs +Bestellungsstatus +Bestätigungs +bez +Blackberry +Browsereinstellungen +bspw +chardet +charge +Checkout +Chrome +Cronjob +csv +Debug +Doe +Downloadseite +Drag +Droid +Drop +Edge +Einlassdatum +Einlassuhrzeit +Erweiterungs +etc +Event +Eventeingang +Eventfirma +evtl +Explorer +Footer +geht's +GENEXAMPLE +gescannt +giropay +Gutscheineinlöser +herunterscrollen +hochlädst +HTTPS +iCal +ID +iDEAL +Inc +inkl +Installations +invalidiert +iOS +iTunes +JavaScript +Kategoriebeschreibung +Konfigurations +loszulegen +Ltd +Meta +Metadaten +MwSt +Nr +Opera +Output +PayPal +PayPals +Play +Plugin +Plugins +prefix +pretix +pretixdesk +pretixdroid +Professional +pt +QR +Rechnungs +Referer +Registrierungsdatum +Request +Requests +Reservierungszeitraum +reverse +Revisionssicherheit +Rundungsdifferenzen +Scan +Scanergebnis +schiefgeht +Secret +SEPA +Shirts +SOFORT +SSL +STARTTLS +Steuerschuldnerschaft +Store +Stornobeleg +Strg +Stripe +Stripes +systemweiten +Tab +Teammitglied +Teamname +Tokengenerator +Toolbar +TOTP +unkategorisiert +untenstehende +untenstehenden +unzugeordnete +unzugeordneten +Ursprüngl +USt +Veranstaltereinstellungen +Veranstalterkonten +Veranstalterkonto +Veranstaltername +Veranstalterseite +Veranstaltungs +Verfügbarkeitsberechnung +Veröffentlichbarer +VIP +Webhook +Widget +Yubikey +Zahlungs +Zahlungsbestätigungs +zahlungspflichtig +Zahlungsplugins +zeitbasiert +zubuchbaren +zurückbuchen +zurückgeleitet +zzgl +überbuchen +überbucht +überbuchten diff --git a/src/pretix/locale/de_Informal/LC_MESSAGES/django.po b/src/pretix/locale/de_Informal/LC_MESSAGES/django.po index d994a0783..7db68cd76 100644 --- a/src/pretix/locale/de_Informal/LC_MESSAGES/django.po +++ b/src/pretix/locale/de_Informal/LC_MESSAGES/django.po @@ -6347,7 +6347,7 @@ msgstr "" #: pretix/control/permissions.py:29 pretix/control/permissions.py:66 #: pretix/control/permissions.py:97 pretix/control/permissions.py:114 msgid "You do not have permission to view this content." -msgstr "Du has keine Berechtigung, diese Inhalte aufzurufen." +msgstr "Du hast keine Berechtigung, diese Inhalte aufzurufen." #: pretix/control/templates/pretixcontrol/auth/forgot.html:14 msgid "Send recovery information" @@ -11946,7 +11946,7 @@ msgstr "Hier klicken um das Fenster zu öffnen." #: pretix/plugins/paypal/views.py:70 msgid "Invalid response from PayPal received." -msgstr "Paypal hat uns eine ungültige Antwort geschickt." +msgstr "PayPal hat uns eine ungültige Antwort geschickt." #: pretix/plugins/paypal/views.py:86 msgid "It looks like you canceled the PayPal payment" diff --git a/src/pretix/locale/de_Informal/wordlist.txt b/src/pretix/locale/de_Informal/wordlist.txt new file mode 100644 index 000000000..71752c68d --- /dev/null +++ b/src/pretix/locale/de_Informal/wordlist.txt @@ -0,0 +1,148 @@ +Admin +Adminbereich +Alipay +and +App +Apps +ausgeklappt +auswahl +Authenticator +Bancontact +Banking +Beispielevent +Benachrichtigungs +Benachrichtigungsart +Benachrichtigungseinstellungen +Berechtigungs +Bestellbestätigungs +Bestellungsstatus +Bestätigungs +bez +Blackberry +Browsereinstellungen +bspw +chardet +charge +Checkout +Chrome +Cronjob +csv +Debug +Doe +Downloadseite +Drag +Droid +Drop +Edge +Einlassdatum +Einlassuhrzeit +Erweiterungs +etc +Event +Eventeingang +Eventfirma +evtl +Explorer +Footer +geht's +GENEXAMPLE +gescannt +giropay +Gutscheineinlöser +herunterscrollen +hochlädst +HTTPS +iCal +ID +iDEAL +Inc +inkl +Installations +invalidiert +iOS +iTunes +JavaScript +Kategoriebeschreibung +Konfigurations +loszulegen +Ltd +Meta +Metadaten +MwSt +Nr +Opera +Output +PayPal +PayPals +Play +Plugin +Plugins +prefix +pretix +pretixdesk +pretixdroid +Professional +pt +QR +Rechnungs +Referer +Registrierungsdatum +Request +Requests +Reservierungszeitraum +reverse +Revisionssicherheit +Rundungsdifferenzen +Scan +Scanergebnis +schiefgeht +Secret +SEPA +Shirts +SOFORT +SSL +STARTTLS +Steuerschuldnerschaft +Store +Stornobeleg +Strg +Stripe +Stripes +systemweiten +Tab +Teammitglied +Teamname +Tokengenerator +Toolbar +TOTP +unkategorisiert +untenstehende +untenstehenden +unzugeordnete +unzugeordneten +Ursprüngl +USt +Veranstaltereinstellungen +Veranstalterkonten +Veranstalterkonto +Veranstaltername +Veranstalterseite +Veranstaltungs +Verfügbarkeitsberechnung +Veröffentlichbarer +VIP +Webhook +Widget +Yubikey +Zahlungs +Zahlungsbestätigungs +zahlungspflichtig +Zahlungsplugins +zeitbasiert +zubuchbaren +zurückbuchen +zurückgeleitet +zzgl +überbuchen +überbucht +überbuchten diff --git a/src/pretix/locale/wordlist.txt b/src/pretix/locale/wordlist.txt new file mode 100644 index 000000000..77100f530 --- /dev/null +++ b/src/pretix/locale/wordlist.txt @@ -0,0 +1,55 @@ +Alipay +authenticator +availabilities +Bancontact +barcode +chardet +checkboxes +cronjob +CSRF +CSV +csv +Ctrl +datetime +filetype +frontend +frontpage +GENEXAMPLE +giropay +hostname +HTTPS +IBAN +iCal +iDEAL +iOS +LLC +multiline +prepended +presale +pretix +pretixdesk +pretixdroid +redemptions +Referer +renderer +Samplecity +Somecity +SEPA +smtp +SOFORT +SSL +STARTTLS +subevent +substracted +timeframe +timesaver +timezones +TOTP +trustable +uncategorized +unredeemed +waitinglist +webhook +webserver +whitespace +Yubikey diff --git a/src/pretix/plugins/pretixdroid/templates/pretixplugins/pretixdroid/configuration_code.html b/src/pretix/plugins/pretixdroid/templates/pretixplugins/pretixdroid/configuration_code.html index 81cf53cdc..7438f9489 100644 --- a/src/pretix/plugins/pretixdroid/templates/pretixplugins/pretixdroid/configuration_code.html +++ b/src/pretix/plugins/pretixdroid/templates/pretixplugins/pretixdroid/configuration_code.html @@ -55,7 +55,7 @@

{% blocktrans trimmed %} If this link does not open the pretixdesk application or if you want to set the application up on a - seperate device, copy the following code and paste it into the application: + separate device, copy the following code and paste it into the application: {% endblocktrans %}

diff --git a/src/pretix/plugins/stripe/views.py b/src/pretix/plugins/stripe/views.py index cf352084a..95b0f6b16 100644 --- a/src/pretix/plugins/stripe/views.py +++ b/src/pretix/plugins/stripe/views.py @@ -48,13 +48,13 @@ def redirect_view(request, *args, **kwargs): def oauth_return(request, *args, **kwargs): if 'payment_stripe_oauth_event' not in request.session: - messages.error(request, _('An error occured during connecting with Stripe, please try again.')) + messages.error(request, _('An error occurred during connecting with Stripe, please try again.')) return redirect(reverse('control:index')) event = get_object_or_404(Event, pk=request.session['payment_stripe_oauth_event']) if request.GET.get('state') != request.session['payment_stripe_oauth_token']: - messages.error(request, _('An error occured during connecting with Stripe, please try again.')) + messages.error(request, _('An error occurred during connecting with Stripe, please try again.')) return redirect(reverse('control:event.settings.payment.provider', kwargs={ 'organizer': event.organizer.slug, 'event': event.slug, @@ -81,7 +81,7 @@ def oauth_return(request, *args, **kwargs): ) except: logger.exception('Failed to obtain OAuth token') - messages.error(request, _('An error occured during connecting with Stripe, please try again.')) + messages.error(request, _('An error occurred during connecting with Stripe, please try again.')) else: if 'error' not in data and data['livemode']: try: @@ -93,7 +93,7 @@ def oauth_return(request, *args, **kwargs): testdata = testresp.json() except: logger.exception('Failed to obtain OAuth token') - messages.error(request, _('An error occured during connecting with Stripe, please try again.')) + messages.error(request, _('An error occurred during connecting with Stripe, please try again.')) return redirect(reverse('control:event.settings.payment.provider', kwargs={ 'organizer': event.organizer.slug, 'event': event.slug, diff --git a/src/requirements/dev.txt b/src/requirements/dev.txt index 2ce1a788c..a683fb1a7 100644 --- a/src/requirements/dev.txt +++ b/src/requirements/dev.txt @@ -16,3 +16,4 @@ pytest-warnings pytest-cache pytest-sugar responses +potypo diff --git a/src/setup.cfg b/src/setup.cfg index 2c75e359a..69f088e42 100644 --- a/src/setup.cfg +++ b/src/setup.cfg @@ -14,3 +14,38 @@ known_standard_library = typing,enum,mimetypes multi_line_output = 5 not_skip = __init__.py skip = make_testdata.py,wsgi.py,bootstrap,celery_app.py,settings.py + +[potypo] +default_language = en_US +locales_dir = pretix/locale +no_fail = + ar + cs + da + es + fr + it + nl + nl_BE + pt_BR +wl_dir = pretix/locale +edgecase_words = + add-ons + add-on's + same-origin"-requests + MT940 + MT940-Format + pre-selected + pretix.eu + pretix.eu-Blog + pretix.eu-Server + Prüf-Ergebnisse + translate.pretix.eu + 4th + 214th +phrases = + ticketing powered by + powered by + Stripe Connect +chunkers = enchant.tokenize.HTMLChunker +filters = PythonFormatFilter,enchant.tokenize.URLFilter,HTMLFilter