Initial commit

This commit is contained in:
2024-08-27 20:33:44 +02:00
commit 1f1832267d
14794 changed files with 1599592 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class SimpleTranslationAppConfig(AppConfig):
name = "wagtail.contrib.simple_translation"
label = "simple_translation"
verbose_name = _("Wagtail simple translation")
default_auto_field = "django.db.models.AutoField"

View File

@@ -0,0 +1,132 @@
from django import forms
from django.urls import reverse
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy, ngettext
from wagtail.models import Locale, Page
class CheckboxSelectMultipleWithDisabledOptions(forms.CheckboxSelectMultiple):
option_template_name = "simple_translation/admin/input_option.html"
disabled_values = []
def create_option(self, *args, **kwargs):
option = super().create_option(*args, **kwargs)
if option["value"] in self.disabled_values:
option["attrs"]["disabled"] = True
else:
# Only set target/action if not disabled to ignore change on disabled items
option["attrs"]["data-action"] = "w-bulk#toggle"
option["attrs"]["data-w-bulk-target"] = "item"
return option
class SubmitTranslationForm(forms.Form):
# Note: We don't actually use select_all in Python, it is just the
# easiest way to add the widget to the form. It's controlled in JS.
select_all = forms.BooleanField(
label=gettext_lazy("Select all"),
required=False,
widget=forms.CheckboxInput(
attrs={
"data-action": "w-bulk#toggleAll",
"data-w-bulk-target": "all",
},
),
)
locales = forms.ModelMultipleChoiceField(
label=gettext_lazy("Locales"),
queryset=Locale.objects.none(),
widget=CheckboxSelectMultipleWithDisabledOptions,
)
include_subtree = forms.BooleanField(
required=False, help_text=gettext_lazy("All child pages will be created.")
)
def __init__(self, instance, *args, **kwargs):
super().__init__(*args, **kwargs)
hide_include_subtree = True
self.show_submit = True
if isinstance(instance, Page):
descendant_count = instance.get_descendants().count()
if descendant_count > 0:
hide_include_subtree = False
self.fields["include_subtree"].label = ngettext(
"Include subtree (%(descendant_count)s page)",
"Include subtree (%(descendant_count)s pages)",
descendant_count,
) % {"descendant_count": descendant_count}
if hide_include_subtree:
self.fields["include_subtree"].widget = forms.HiddenInput()
untranslated_locales = Locale.objects.exclude(
id__in=instance.get_translations(inclusive=True).values_list(
"locale_id", flat=True
)
)
self.fields["locales"].queryset = untranslated_locales
# For snippets, hide select all if there is one option.
# Using len() instead of count() here as we're going to evaluate this queryset
# anyway and it gets cached so it'll only have one query in the end.
hide_select_all = len(untranslated_locales) < 2
if isinstance(instance, Page):
parent = instance.get_parent()
# Find allowed locale options.
if parent.is_root():
# All locale options are allowed.
allowed_locale_ids = Locale.objects.all().values_list("id", flat=True)
else:
# Only the locale options that have a translated parent are allowed.
allowed_locale_ids = (
instance.get_parent()
.get_translations(inclusive=True)
.values_list("locale_id", flat=True)
)
# Get and set the locale options that are disabled.
disabled_locales = Locale.objects.exclude(
id__in=allowed_locale_ids
).values_list("id", flat=True)
self.fields["locales"].widget.disabled_values = disabled_locales
if disabled_locales:
# Display a help text.
url = reverse(
"simple_translation:submit_page_translation", args=[parent.id]
)
help_text = ngettext(
"A locale is disabled because a parent page is not translated.",
"Some locales are disabled because some parent pages are not translated.",
len(disabled_locales),
)
help_text += "<br>"
help_text += f'<a href="{url}">'
help_text += ngettext(
"Translate the parent page.",
"Translate the parent pages.",
len(disabled_locales),
)
help_text += "</a>"
self.fields["locales"].help_text = mark_safe(help_text)
# For pages, if there is one locale or all locales are disabled.
hide_select_all = (
len(untranslated_locales) == 1
or len(untranslated_locales) - len(disabled_locales) == 0
)
# Hide the submit if all untranslated locales are disabled.
# This property is used in the template.
if len(untranslated_locales) == len(disabled_locales):
self.show_submit = False
if hide_select_all:
self.fields["select_all"].widget = forms.HiddenInput()

View File

@@ -0,0 +1,26 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Younes Oumakhou, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Younes Oumakhou, 2022\n"
"Language-Team: Arabic (https://app.transifex.com/torchbox/teams/8009/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ar\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
msgid "Select all"
msgstr "تحديد الكل"

View File

@@ -0,0 +1,99 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Andrei Satsevich, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Andrei Satsevich, 2023\n"
"Language-Team: Belarusian (https://app.transifex.com/torchbox/teams/8009/"
"be/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: be\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || "
"(n%100>=11 && n%100<=14)? 2 : 3);\n"
msgid "Wagtail simple translation"
msgstr "Просты пераклад Wagtail "
msgid "Select all"
msgstr "Выбраць усе"
msgid "Locales"
msgstr "Лакалізацыі "
msgid "All child pages will be created."
msgstr "Будуць створаны ўсе даччыныя старонкі."
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Уключаючая дрэва (%(descendant_count)s старонаку)"
msgstr[1] "Уключаючая дрэва (%(descendant_count)s старонакі)"
msgstr[2] "Уключаючая дрэва (%(descendant_count)s старонак)"
msgstr[3] "Уключаючая дрэва (%(descendant_count)s старонак)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] "Лакаль адключана, паколькі бацькоўская старонка не перакладзеная."
msgstr[1] ""
"Некаторыя лакалі адключаны, паколькі некаторыя бацькоўскія старонкі не "
"перакладзены."
msgstr[2] ""
"Некаторыя лакалі адключаны, паколькі некаторыя бацькоўскія старонкі не "
"перакладзены."
msgstr[3] ""
"Некаторыя лакалі адключаны, паколькі некаторыя бацькоўскія старонкі не "
"перакладзены."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Перакласці бацькоўскую старонку."
msgstr[1] "Перакласці бацькоўскія старонкі."
msgstr[2] "Перакласці бацькоўскія старонкі."
msgstr[3] "Перакласці бацькоўскія старонкі."
msgid "Submit"
msgstr "Адправіць"
msgid "Translate"
msgstr "Перавесці"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s лакалізацыі"
msgid "Translate page"
msgstr "Перакласці старонку"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "Старонка '%(page_title)s ' была паспяхова створана ў %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Перакласці %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "Паспяхова створаны %(locales)s для %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Перакласці гэтую старонку"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Пераклад '%(title)s'"

View File

@@ -0,0 +1,91 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Roger Pons <rogerpons@gmail.com>, 2024
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Roger Pons <rogerpons@gmail.com>, 2024\n"
"Language-Team: Catalan (https://app.transifex.com/torchbox/teams/8009/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Wagtail simple translation"
msgstr "Traducció simple de Wagtail"
msgid "Select all"
msgstr "Seleccionar tot"
msgid "Locales"
msgstr "Configuracions regionals"
msgid "All child pages will be created."
msgstr "Seran creades totes les pàgines filles"
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Incloure subarbre (%(descendant_count)s pàgina)"
msgstr[1] "Incloure subarbre (%(descendant_count)s pàgines)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
"Una configuració regional està desactivada perquè una pàgina pare no està "
"traduïda."
msgstr[1] ""
"Algunes configuracions regionals estan desactivades perquè algunes pàgines "
"pare no estan traduïdes."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Traduir la pàgina pare"
msgstr[1] "Traduir les pàgines pare."
msgid "Can submit translations"
msgstr "Pot enviar traduccions"
msgid "Submit"
msgstr "Enviar"
msgid "Translate"
msgstr "Traduir"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s configuracions regionals"
msgid "Translate page"
msgstr "Traduir pàgina"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "S'ha creat correctament la pàgina '%(page_title)s' a %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Traduir %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "S'ha creat correctament %(locales)s per %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Traduir aquesta pàgina"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Traduir '%(title)s'"

View File

@@ -0,0 +1,69 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Mirek Zvolský <zvolsky@seznam.cz>, 2022
# Loic Teixeira, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Loic Teixeira, 2022\n"
"Language-Team: Czech (https://app.transifex.com/torchbox/teams/8009/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: cs\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n "
"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
msgid "Wagtail simple translation"
msgstr "Wagtail jednoduchý překlad"
msgid "Select all"
msgstr "Vybrat vše"
msgid "Locales"
msgstr "Místní nastavení (locales)"
msgid "All child pages will be created."
msgstr "Budou vytvořeny všechny podstránky."
msgid "Submit"
msgstr "Potvrdit"
msgid "Translate"
msgstr "Přeložit"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s místních nastavení (locales)"
msgid "Translate page"
msgstr "Přeložit stránku"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "Stránka '%(page_title)s' byla úspěšně vytvořena v %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Přeložit %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "Úspěšně vytvořeno %(locales)s pro %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Přeložit tuto stránku"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Přeložit '%(title)s'"

View File

@@ -0,0 +1,93 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Philip Crisp, 2022
# Loic Teixeira, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Loic Teixeira, 2022\n"
"Language-Team: Welsh (https://app.transifex.com/torchbox/teams/8009/cy/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: cy\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != "
"11) ? 2 : 3;\n"
msgid "Wagtail simple translation"
msgstr "Cyfieithiad Wagtail syml"
msgid "Select all"
msgstr "Dewiswch bob un"
msgid "Locales"
msgstr "Locales"
msgid "All child pages will be created."
msgstr "Bydd holl dudalennau plentyn yn cael eu creu."
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
"Mae locale wedi'i analluogi oherwydd nad yw tudalen rhiant yn cael ei "
"chyfieithu."
msgstr[1] ""
"Mae rhai locales wedi'u hanalluogi oherwydd nad yw rhai tudalennau rhiant yn "
"cael eu cyfieithu."
msgstr[2] ""
"Mae rhai locales wedi'u hanalluogi oherwydd nad yw rhai tudalennau rhiant yn "
"cael eu cyfieithu."
msgstr[3] ""
"Mae rhai locales wedi'u hanalluogi oherwydd nad yw rhai tudalennau rhiant yn "
"cael eu cyfieithu."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Cyfieithwch y tudalen rhiant."
msgstr[1] "Cyfieithwch y tudalennau rhiant."
msgstr[2] "Cyfieithwch y tudalennau rhiant."
msgstr[3] "Cyfieithwch y tudalennau rhiant."
msgid "Submit"
msgstr "Cyflwyno"
msgid "Translate"
msgstr "Cyfieithu"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s locales"
msgid "Translate page"
msgstr "Cyfieithu tudalen"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "Crëwyd y dudalen '%(page_title)s' yn llwyddiannus yn %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Cyfieithu %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr ""
"Wedi creu %(locales)s yn llwyddiannus ar gyfer %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Gyfieithu'r tudalen hon"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Cyfieithu '%(title)s'"

View File

@@ -0,0 +1,93 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Oliver Engel <codeangel@posteo.de>, 2022
# Loic Teixeira, 2022
# Stefan Hammer <stefan@hammerworxx.com>, 2024
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Stefan Hammer <stefan@hammerworxx.com>, 2024\n"
"Language-Team: German (https://app.transifex.com/torchbox/teams/8009/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Wagtail simple translation"
msgstr "Wagtail einfache Übersetzung"
msgid "Select all"
msgstr "Alles auswählen"
msgid "Locales"
msgstr "Locale"
msgid "All child pages will be created."
msgstr "Alle Unterseiten werden erstellt."
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Teilbaum (%(descendant_count)s Seite) einbeziehen"
msgstr[1] "Teilbaum (%(descendant_count)s Seiten) einbeziehen"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
"Eine Locale ist deaktiviert, weil eine übergeordnete Seite nicht übersetzt "
"ist."
msgstr[1] ""
"Einige Locales sind deaktiviert, weil manche übergeordneten Seiten nicht "
"übersetzt sind."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Die übergeordnete Seite übersetzen"
msgstr[1] "Die übergeordneten Seiten übersetzen"
msgid "Can submit translations"
msgstr "Kann Übersetzungen einreichen"
msgid "Submit"
msgstr "Absenden"
msgid "Translate"
msgstr "Übersetzen"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s locale"
msgid "Translate page"
msgstr "Seite übersetzen"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "Die Seite '%(page_title)s' wurde erfolgreich in %(locales)s erstellt"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Übersetze %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "Erfolgreich erstellt %(locales)s für %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Diese Seite übersetzen"
#, python-format
msgid "Translate '%(title)s'"
msgstr "%(title)s' übersetzen"

View File

@@ -0,0 +1,84 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Fauzaan Gasim, 2024
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Fauzaan Gasim, 2024\n"
"Language-Team: Divehi (https://app.transifex.com/torchbox/teams/8009/dv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: dv\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Wagtail simple translation"
msgstr "ވެގްޓޭލް އާއްމު ތަރުޖަމާ"
msgid "Select all"
msgstr "ހުރިހާއެއްޗެއް ސެލެކްޓް ކޮށްލާ"
msgid "Locales"
msgstr "ބަސްތައް"
msgid "All child pages will be created."
msgstr "ހުރިހާ ޗައިލްޑް ޕޭޖްތަކެއް ވެސް ހެދޭނެ"
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "ދަށު ގަސް ހިމަނާ ( %(descendant_count)s ސަފްހާ)"
msgstr[1] "ދަށު ގަސް ހިމަނާ (%(descendant_count)sސަފްހާތައް)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] "އެއް ބެލެނިވެރި ސަފްހާ ތަރުޖަމާ ކުރެވިފައި ނުވާތީ އެއް locales ވަނީ ޑިސޭބަލް ކޮށްލާފައި"
msgstr[1] "ބައެއް ބެލެނިވެރި ސަފްހާތައް ތަރުޖަމާ ކުރެވިފައި ނުވާތީ ބަައެއް ބަސްތައް ވަނީ ޑިސޭބަލް ކޮށްލާފައި"
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "ބެލެނިވެރި ޞަފްޙާ ތަރުޖަމާ ކުރޭ"
msgstr[1] "ބެލެނިވެރި ޞަފްޙާތައް ތަރުޖަމާ ކުރޭ"
msgid "Submit"
msgstr "ހުށައަޅާ"
msgid "Translate"
msgstr "ތަރުޖަމާ ކުރޭ"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s ބަސްތައް"
msgid "Translate page"
msgstr "ސަފްހާ ތަރުޖަމާ ކުރޭ"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "ސަފުހާ '%(page_title)s' ވަނީ %(locales)s އިން ކާމިޔާބުކަމާއެކީ އުފެއްދިފައި"
#, python-format
msgid "Translate %(model_name)s"
msgstr "%(model_name)sތަރުޖަމާ ކުރޭ"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "ކާމިޔާބުކަމާއެކީ %(model_name)s%(object)s އަށް %(locales)s އުފެއްދިއްޖެ "
msgid "Translate this page"
msgstr "މި ޞަފްޙާ ތަރުޖަމާ ކުރޭ"
#, python-format
msgid "Translate '%(title)s'"
msgstr " '%(title)s' ތަރުޖަމާ ކުރޭ"

View File

@@ -0,0 +1,25 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# fekioh, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: fekioh, 2022\n"
"Language-Team: Greek (https://app.transifex.com/torchbox/teams/8009/el/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: el\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Select all"
msgstr "Επιλογή όλων"

View File

@@ -0,0 +1,101 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-07 10:06+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:8
msgid "Wagtail simple translation"
msgstr ""
#: forms.py:28
msgid "Select all"
msgstr ""
#: forms.py:39
msgid "Locales"
msgstr ""
#: forms.py:44
msgid "All child pages will be created."
msgstr ""
#: forms.py:59
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] ""
msgstr[1] ""
#: forms.py:106
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
msgstr[1] ""
#: forms.py:113
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] ""
msgstr[1] ""
#: models.py:21
msgid "Can submit translations"
msgstr ""
#: templates/simple_translation/admin/submit_translation.html:26
msgid "Submit"
msgstr ""
#: views.py:22 wagtail_hooks.py:63 wagtail_hooks.py:80 wagtail_hooks.py:111
msgid "Translate"
msgstr ""
#. Translators: always plural
#: views.py:78
#, python-format
msgid "%(locales_count)s locales"
msgstr ""
#: views.py:98
msgid "Translate page"
msgstr ""
#: views.py:122
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr ""
#: views.py:128
#, python-format
msgid "Translate %(model_name)s"
msgstr ""
#: views.py:157
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr ""
#: wagtail_hooks.py:84
msgid "Translate this page"
msgstr ""
#: wagtail_hooks.py:114
#, python-format
msgid "Translate '%(title)s'"
msgstr ""

View File

@@ -0,0 +1,87 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Amós Oviedo <amos.oviedo@gmail.com>, 2022
# Loic Teixeira, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Loic Teixeira, 2022\n"
"Language-Team: Spanish (https://app.transifex.com/torchbox/teams/8009/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es\n"
"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? "
"1 : 2;\n"
msgid "Wagtail simple translation"
msgstr "Traducción simple de Wagtail"
msgid "Select all"
msgstr "Seleccionar todo"
msgid "Locales"
msgstr "Regiones"
msgid "All child pages will be created."
msgstr "Todas las páginas hijas serán creadas."
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
"Una región está deshabilitada porque una página padre no está traducida."
msgstr[1] ""
"Algunas regiones están deshabilitadas porque algunas páginas padre no están "
"traducidas."
msgstr[2] ""
"Algunas regiones están deshabilitadas porque algunas páginas padre no están "
"traducidas."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Traduce la página padre."
msgstr[1] "Traduce las páginas padre."
msgstr[2] "Traduce las páginas padre."
msgid "Submit"
msgstr "Enviar"
msgid "Translate"
msgstr "Traducir"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s regiones"
msgid "Translate page"
msgstr "Traducir página"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "La página '%(page_title)s' fue creada con éxito en %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Traducir %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "Creado con éxito %(locales)s para %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Traducir esta página"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Traducir '%(title)s'"

View File

@@ -0,0 +1,27 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Rodrigo Yanez, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Rodrigo Yanez, 2023\n"
"Language-Team: Spanish (Latin America) (https://app.transifex.com/torchbox/"
"teams/8009/es_419/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es_419\n"
"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? "
"1 : 2;\n"
msgid "Select all"
msgstr "Seleccionar todo"

View File

@@ -0,0 +1,25 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Amir Mahmoodi, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Amir Mahmoodi, 2023\n"
"Language-Team: Persian (https://app.transifex.com/torchbox/teams/8009/fa/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fa\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
msgid "Select all"
msgstr "انتخاب همه"

View File

@@ -0,0 +1,62 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Jiri Grönroos <jiri.gronroos@iki.fi>, 2022
# Loic Teixeira, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Loic Teixeira, 2022\n"
"Language-Team: Finnish (https://app.transifex.com/torchbox/teams/8009/fi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fi\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Select all"
msgstr "Valitse kaikki"
msgid "Locales"
msgstr "Maa-asetustot"
msgid "All child pages will be created."
msgstr "Kaikki lapsisivut luodaan."
msgid "Submit"
msgstr "Lähetä"
msgid "Translate"
msgstr "Käännä"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s maa-asetustoa"
msgid "Translate page"
msgstr "Käännä sivu"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr ""
"Sivu '%(page_title)s' luotiin onnistuneesti maa-asetustoille %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Käännä %(model_name)s"
msgid "Translate this page"
msgstr "Käännä tämä sivu"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Käännä '%(title)s'"

View File

@@ -0,0 +1,98 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Loic Teixeira, 2022
# Sébastien Corbin <seb.corbin@gmail.com>, 2024
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Sébastien Corbin <seb.corbin@gmail.com>, 2024\n"
"Language-Team: French (https://app.transifex.com/torchbox/teams/8009/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % "
"1000000 == 0 ? 1 : 2;\n"
msgid "Wagtail simple translation"
msgstr "Traduction Simple Wagtail"
msgid "Select all"
msgstr "Tout sélectionner"
msgid "Locales"
msgstr "Régions"
msgid "All child pages will be created."
msgstr "Toutes les sous-pages seront crées."
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Inclure le sous-arbre (%(descendant_count)s page)"
msgstr[1] "Inclure le sous-arbre (%(descendant_count)s page)"
msgstr[2] "Inclure le sous-arbre (%(descendant_count)s page)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] "Une région est désactivée car une page parente n'est pas traduite."
msgstr[1] ""
"Certaines régions sont désactivées car certaines pages parentes ne sont pas "
"traduites."
msgstr[2] ""
"Certaines régions sont désactivées car certaines pages parentes ne sont pas "
"traduites."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Traduire la page parente."
msgstr[1] "Traduire les pages parentes."
msgstr[2] "Traduire les pages parentes."
msgid "Can submit translations"
msgstr "Peut soumettre des traductions"
msgid "Submit"
msgstr "Soumettre"
msgid "Translate"
msgstr "Traduire"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s régions"
msgid "Translate page"
msgstr "Traduire la page"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "La page '%(page_title)s' a été crée avec succès en %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Traduire %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr ""
"Les régions %(locales)s ont été créées avec succès pour %(model_name)s "
"'%(object)s'"
msgid "Translate this page"
msgstr "Traduire cette page"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Traduire '%(title)s'"

View File

@@ -0,0 +1,91 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Loic Teixeira, 2022
# X Bello <xbello@gmail.com>, 2024
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: X Bello <xbello@gmail.com>, 2024\n"
"Language-Team: Galician (https://app.transifex.com/torchbox/teams/8009/gl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: gl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Wagtail simple translation"
msgstr "Traducción simple de Wagtail"
msgid "Select all"
msgstr "Seleccionar todo"
msgid "Locales"
msgstr "Idiomas"
msgid "All child pages will be created."
msgstr "Vanse crear tódalas páxinas fillas."
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Incluir subárbore (%(descendant_count)s páxina)"
msgstr[1] "Incluir subárbore (%(descendant_count)s páxinas)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
"Deshabilitouse unha rexión porque unha páxina nai non está traducida."
msgstr[1] ""
"Deshabilitáronse algunhas rexións porque algunas páxinas nai non está "
"traducidas."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Traducir a páxina nai."
msgstr[1] "Traducir as páxinas nai."
msgid "Can submit translations"
msgstr "Pode enviar traducións"
msgid "Submit"
msgstr "Enviar"
msgid "Translate"
msgstr "Traducir"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s rexións"
msgid "Translate page"
msgstr "Traducir páxina"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "A páxina '%(page_title)s' creouse con éxito en %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Traducir %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "Creados con éxito %(locales)s para %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Traducir esta páxina"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Traducir '%(title)s'"

View File

@@ -0,0 +1,95 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Loic Teixeira, 2022
# Dino Aljević <dino8890@protonmail.com>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Dino Aljević <dino8890@protonmail.com>, 2023\n"
"Language-Team: Croatian (Croatia) (https://app.transifex.com/torchbox/"
"teams/8009/hr_HR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hr_HR\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
msgid "Wagtail simple translation"
msgstr "Wagtail jednostavno prevođenje"
msgid "Select all"
msgstr "Odaberi sve"
msgid "Locales"
msgstr "Lokaliteti"
msgid "All child pages will be created."
msgstr "Sve podstranice će biti stvorene."
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Uključi podstranice (%(descendant_count)s stranica)"
msgstr[1] "Uključi podstranice (%(descendant_count)s stranica)"
msgstr[2] "Uključi podstranice (%(descendant_count)s stranica)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
"Lokalitet je onemogućen budući da roditeljska stranica nije prevedena."
msgstr[1] ""
"Neki lokaliteti su onemogućeni budući da roditeljske stranice nisu prevedene."
msgstr[2] ""
"Neki lokaliteti su onemogućeni budući da roditeljske stranice nisu prevedene."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Prevedi roditeljsku stranicu."
msgstr[1] "Prevedi roditeljske stranice."
msgstr[2] "Prevedi roditeljske stranice."
msgid "Submit"
msgstr "Prevedi"
msgid "Translate"
msgstr "Prevedi"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s lokaliteti"
msgid "Translate page"
msgstr "Prevedi stranicu"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr ""
"Stranica '%(page_title)s' je uspješno stvorena u lokalitetu %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Prevedi %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr ""
"Uspješno stvoreni lokaliteti %(locales)s za %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Prevedi ovu stranicu"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Prevedi '%(title)s'"

View File

@@ -0,0 +1,91 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Loic Teixeira, 2022
# Istvan Farkas <istvan.farkas@gmail.com>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Istvan Farkas <istvan.farkas@gmail.com>, 2023\n"
"Language-Team: Hungarian (https://app.transifex.com/torchbox/teams/8009/"
"hu/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Wagtail simple translation"
msgstr "Wagtail egyszerű fordítás"
msgid "Select all"
msgstr "Összes kiválasztása"
msgid "Locales"
msgstr "Nyelvek"
msgid "All child pages will be created."
msgstr "Minden gyermekoldal létre lesz hozva."
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Alatta lévőkkel együtt (%(descendant_count)s oldal)"
msgstr[1] "Alatta lévőkkel együtt (%(descendant_count)s oldal)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] "Egy nyelv le lett tiltva, mert egy szülőoldal nincs lefordítva."
msgstr[1] ""
"Néhány nyelv le van tiltva, mert egyes szülő oldalak nincsenek lefordítva."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Szülőoldal lefordítása."
msgstr[1] "Szülőoldalak lefordítása."
msgid "Submit"
msgstr "Mehet"
msgid "Translate"
msgstr "Fordítás"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s nyelv"
msgid "Translate page"
msgstr "Oldal fordítása"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr ""
"A(z) '%(page_title)s' oldal sikeresen létrehozva a következő nyelveken: "
"%(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "%(model_name)s fordítása"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr ""
"A(z) '%(object)s' %(model_name)s sikeresen létrehozva a következő nyelveken: "
"%(locales)s"
msgid "Translate this page"
msgstr "Oldal lefordítása"
#, python-format
msgid "Translate '%(title)s'"
msgstr "'%(title)s' lefordítása"

View File

@@ -0,0 +1,86 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Loic Teixeira, 2022
# Arnar Tumi Þorsteinsson <arnartumi@gmail.com>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Arnar Tumi Þorsteinsson <arnartumi@gmail.com>, 2023\n"
"Language-Team: Icelandic (Iceland) (https://app.transifex.com/torchbox/"
"teams/8009/is_IS/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: is_IS\n"
"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n"
msgid "Wagtail simple translation"
msgstr "Wagtail einfaldar þýðingar"
msgid "Select all"
msgstr "Velja allt"
msgid "Locales"
msgstr "Þýðingar"
msgid "All child pages will be created."
msgstr "Allar undirsíður verða búnar til"
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Innifela undirsíður (%(descendant_count)s síðu)"
msgstr[1] "Innifela undirsíður (%(descendant_count)s síður)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] "Tungumál er ekki aðgengilegt þar sem yfirsíða er ekki þýdd."
msgstr[1] "Sum tungumál eru ekki aðgengileg þar sem yfirsíður eru ekki þýddar."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Þýða yfirsíðuna"
msgstr[1] "Þýða yfirsíður."
msgid "Submit"
msgstr "Senda"
msgid "Translate"
msgstr "Þýða"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s þýðingar"
msgid "Translate page"
msgstr "Þýða síðu"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "Tókst að búa til síðuna '%(page_title)s' í %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Þýða %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "Tókst að búa til %(locales)s fyrir %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Þýða þessa síðu"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Þýða '%(title)s'"

View File

@@ -0,0 +1,94 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Loic Teixeira, 2022
# Marco Badan <marco.badan@gmail.com>, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Marco Badan <marco.badan@gmail.com>, 2022\n"
"Language-Team: Italian (https://app.transifex.com/torchbox/teams/8009/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? "
"1 : 2;\n"
msgid "Wagtail simple translation"
msgstr "Wagtail traduzione semplificata"
msgid "Select all"
msgstr "Seleziona tutti"
msgid "Locales"
msgstr "Lingue"
msgid "All child pages will be created."
msgstr "Tutte le pagine figlio verranno create."
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Include sotto-albero (%(descendant_count)s pagina)"
msgstr[1] "Include sotto-albero (%(descendant_count)s pagine)"
msgstr[2] "Include sotto-albero (%(descendant_count)s pagine)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
"Una lingua è disabilitata perché una pagina genitore non è stata tradotta."
msgstr[1] ""
"Alcune lingue sono disabilitate perché alcune pagine genitore non sono state "
"tradotte."
msgstr[2] ""
"Alcune lingue sono disabilitate perché alcune pagine genitore non sono state "
"tradotte."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Traduci la pagina genitore."
msgstr[1] "Traduci le pagine genitori."
msgstr[2] "Traduci le pagine genitori."
msgid "Submit"
msgstr "Invia"
msgid "Translate"
msgstr "Traduci"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s lingue"
msgid "Translate page"
msgstr "Traduci pagina"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "La pagina '%(page_title)s' è stata creata con successo in %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Traduci %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "%(locales)s creato con successo per %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Traduci questa pagina"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Traduci '%(title)s'"

View File

@@ -0,0 +1,74 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Kyu Choi, 2022
# Loic Teixeira, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Loic Teixeira, 2022\n"
"Language-Team: Korean (https://app.transifex.com/torchbox/teams/8009/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ko\n"
"Plural-Forms: nplurals=1; plural=0;\n"
msgid "Wagtail simple translation"
msgstr "웨그테일 간단 번역"
msgid "Select all"
msgstr "모두 선택"
msgid "Locales"
msgstr "영역"
msgid "All child pages will be created."
msgstr "모든 하위 페이지가 생성될 것"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] "몇몇 상위 페이지가 번역되지 않아 몇몇 영역 사용불가"
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "상위 페이지 번역"
msgid "Submit"
msgstr "제출하다"
msgid "Translate"
msgstr "번역하다"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s영역"
msgid "Translate page"
msgstr "페이지 번역"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "페이지 '%(page_title)s'이 %(locales)s에서 생성되었습니다."
#, python-format
msgid "Translate %(model_name)s"
msgstr "%(model_name)s번역"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "%(model_name)s '%(object)s'에 대한 %(locales)s을 생성했습니다."
#, python-format
msgid "Translate '%(title)s'"
msgstr "'%(title)s'번역"

View File

@@ -0,0 +1,64 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Naglis Jonaitis, 2022
# Loic Teixeira, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Loic Teixeira, 2022\n"
"Language-Team: Lithuanian (https://app.transifex.com/torchbox/teams/8009/"
"lt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: lt\n"
"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < "
"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? "
"1 : n % 1 != 0 ? 2: 3);\n"
msgid "Select all"
msgstr "Pažymėti visas"
msgid "Locales"
msgstr "Lokalės"
msgid "All child pages will be created."
msgstr "Bus sukurti visi vidiniai puslapiai,"
msgid "Submit"
msgstr "Pateikti"
msgid "Translate"
msgstr "Versti"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s lokalės"
msgid "Translate page"
msgstr "Versti puslapį"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "'%(page_title)s' puslapis sėkminai sukurtas %(locales)s lokalėse"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Versti %(model_name)s"
msgid "Translate this page"
msgstr "Versti šį puslapį"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Versti '%(title)s'"

View File

@@ -0,0 +1,25 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Awatea Randall <awatea@octave.nz>, 2021
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Awatea Randall <awatea@octave.nz>, 2021\n"
"Language-Team: Maori (https://app.transifex.com/torchbox/teams/8009/mi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: mi\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
msgid "Locales"
msgstr "Rohe"

View File

@@ -0,0 +1,26 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# visual, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: visual, 2022\n"
"Language-Team: Mongolian (https://app.transifex.com/torchbox/teams/8009/"
"mn/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: mn\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Select all"
msgstr "Бүгдийг сонгох"

View File

@@ -0,0 +1,26 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Jonathan D, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Jonathan D, 2023\n"
"Language-Team: Norwegian Bokmål (https://app.transifex.com/torchbox/"
"teams/8009/nb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nb\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Select all"
msgstr "Velg alle"

View File

@@ -0,0 +1,95 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Loic Teixeira, 2022
# Storm Heg <storm@stormbase.digital>, 2024
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Storm Heg <storm@stormbase.digital>, 2024\n"
"Language-Team: Dutch (https://app.transifex.com/torchbox/teams/8009/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Wagtail simple translation"
msgstr "Wagtail simpele vertalingen"
msgid "Select all"
msgstr "Selecteer alles"
msgid "Locales"
msgstr "Taalregio's"
msgid "All child pages will be created."
msgstr "Alle onderliggende pagina's zullen worden aangemaakt."
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Neem onderliggende boomstructuur mee (%(descendant_count)s pagina)"
msgstr[1] ""
"Neem onderliggende boomstructuur mee (%(descendant_count)s pagina's)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
"Een taalregio is uitgeschakeld omdat een bovenliggende pagina niet vertaald "
"is."
msgstr[1] ""
"Sommige taalregio's zijn uitgeschakeld omdat bovenliggende pagina's niet "
"vertaald zijn."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Vertaal de bovenliggende pagina."
msgstr[1] "Vertaal de bovenliggende paginas."
msgid "Can submit translations"
msgstr "Kan vertalingen indienen"
msgid "Submit"
msgstr "Verzenden"
msgid "Translate"
msgstr "Vertaal"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s taalregio's"
msgid "Translate page"
msgstr "Vertaal pagina"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "De pagina '%(page_title)s' is succesvol aangemaakt in %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Vertaal %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr ""
"Vertalingen in %(locales)s voor %(model_name)s '%(object)s' zijn succesvol "
"aangemaakt"
msgid "Translate this page"
msgstr "Vertaal deze pagina"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Vertaal '%(title)s'"

View File

@@ -0,0 +1,101 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Dominik Lech, 2022
# Loic Teixeira, 2022
# Miłosz Miśkiewicz, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Miłosz Miśkiewicz, 2023\n"
"Language-Team: Polish (https://app.transifex.com/torchbox/teams/8009/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pl\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && "
"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && "
"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
msgid "Wagtail simple translation"
msgstr "Proste tłumaczenie Wagtail"
msgid "Select all"
msgstr "Zaznacz wszystkie"
msgid "Locales"
msgstr "Lokalizacje"
msgid "All child pages will be created."
msgstr "Wszystkie strony podrzędne zostaną utworzone."
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Uwzględnij poddrzewo (%(descendant_count)s strona)"
msgstr[1] "Uwzględnij poddrzewo (%(descendant_count)s stron)"
msgstr[2] "Uwzględnij poddrzewo (%(descendant_count)s stron)"
msgstr[3] "Uwzględnij poddrzewo (%(descendant_count)s stron)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
"Tłumaczenie jest wyłączone ponieważ strona nadrzędna nie jest przetłumaczona."
msgstr[1] ""
"Niektóre tłumaczenia są wyłączone ponieważ niektóre strony nadrzędne nie są "
"przetłumaczone."
msgstr[2] ""
"Niektóre tłumaczenia są wyłączone ponieważ niektóre strony nadrzędne nie są "
"przetłumaczone."
msgstr[3] ""
"Niektóre tłumaczenia są wyłączone ponieważ niektóre strony nadrzędne nie są "
"przetłumaczone."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Przetłumacz stronę nadrzędną"
msgstr[1] "Przetłumacz strony nadrzędne"
msgstr[2] "Przetłumacz strony nadrzędne"
msgstr[3] "Przetłumacz strony nadrzędne"
msgid "Submit"
msgstr "Wyślij"
msgid "Translate"
msgstr "Tłumacz"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s tłumaczeń"
msgid "Translate page"
msgstr "Przetłumacz stronę"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "Strona '%(page_title)s' została pomyślnie utworzona w %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Przetłumacz %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "Pomyślnie utworzono %(locales)s dla %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Przetłumacz tę stronę"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Przetłumacz '%(title)s'"

View File

@@ -0,0 +1,98 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Ed Wurch <ewurch@gmail.com>, 2021
# Rodrigo Sottomaior Macedo <sottomaiormacedotec@sottomaiormacedo.tech>, 2021
# Iuri L. Machado, 2022
# Loic Teixeira, 2022
# Luiz Boaretto <lboaretto@gmail.com>, 2024
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Luiz Boaretto <lboaretto@gmail.com>, 2024\n"
"Language-Team: Portuguese (Brazil) (https://app.transifex.com/torchbox/"
"teams/8009/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % "
"1000000 == 0 ? 1 : 2;\n"
msgid "Wagtail simple translation"
msgstr "Tradução simples do Wagtail"
msgid "Select all"
msgstr "Selecionar todos"
msgid "Locales"
msgstr "Localidades"
msgid "All child pages will be created."
msgstr "Todas páginas filho serão criadas"
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Incluir subárvore (%(descendant_count)s página)"
msgstr[1] "Incluir subárvore (%(descendant_count)s páginas)"
msgstr[2] "Incluir subárvore (%(descendant_count)s páginas)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
"Uma localidade está desativada porque uma página pai não foi traduzida."
msgstr[1] ""
"Algumas localidades estão desabilitadas porque algumas páginas-pai não foram "
"traduzidas."
msgstr[2] ""
"Algumas localidades estão desabilitadas porque algumas páginas-pai não foram "
"traduzidas."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Traduza a páginas principal."
msgstr[1] "Traduza as páginas principais."
msgstr[2] "Traduza as páginas principais."
msgid "Submit"
msgstr "Enviar"
msgid "Translate"
msgstr "Traduzir"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s localidades"
msgid "Translate page"
msgstr "Traduzir página"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "A página '%(page_title)s' foi criada com sucesso em %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Traduzir %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "%(locales)s Criadas com sucesso para %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Traduzir esta página"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Traduzir %(title)s"

View File

@@ -0,0 +1,89 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Tiago Henriques <trinosauro@gmail.com>, 2022
# Luís Tiago Favas <traducoes@favas.eu>, 2022
# Loic Teixeira, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Loic Teixeira, 2022\n"
"Language-Team: Portuguese (Portugal) (https://app.transifex.com/torchbox/"
"teams/8009/pt_PT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_PT\n"
"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % "
"1000000 == 0 ? 1 : 2;\n"
msgid "Wagtail simple translation"
msgstr "Tradução simples Wagtail"
msgid "Select all"
msgstr "Selecionar tudo"
msgid "Locales"
msgstr "Regiões"
msgid "All child pages will be created."
msgstr "Todas as páginas-filha irão ser criadas."
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
"Uma região está desativada porque uma página-mãe ainda não foi traduzida."
msgstr[1] ""
"Algumas regiões estão desativadas porque algumas páginas-mãe ainda não foram "
"traduzidas."
msgstr[2] ""
"Algumas regiões estão desativadas porque algumas páginas-mãe ainda não foram "
"traduzidas."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Traduzir a página-mãe."
msgstr[1] "Traduzir as páginas-mãe."
msgstr[2] "Traduzir as páginas-mãe."
msgid "Submit"
msgstr "Enviar"
msgid "Translate"
msgstr "Traduzir"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s regiões"
msgid "Translate page"
msgstr "Traduzir página"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "A página '%(page_title)s' foi criada com sucesso em %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Traduzir %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "Criado com sucesso %(locales)s para %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Traduzir esta página"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Traduzir '%(title)s'"

View File

@@ -0,0 +1,96 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Julian C <jcuotpc@gmail.com>, 2021
# Dan Braghis, 2022
# Loic Teixeira, 2022
# Alex Morega, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Alex Morega, 2023\n"
"Language-Team: Romanian (https://app.transifex.com/torchbox/teams/8009/ro/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ro\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
"2:1));\n"
msgid "Wagtail simple translation"
msgstr "Wagtail traducere simplă"
msgid "Select all"
msgstr "Seleactază toate"
msgid "Locales"
msgstr "Localizări"
msgid "All child pages will be created."
msgstr "Toate paginile descendente vor fi create."
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Include pagini descendente (%(descendant_count)s pagină)"
msgstr[1] "Include pagini descendente (%(descendant_count)s pagini)"
msgstr[2] "Include pagini descendente (%(descendant_count)s de pagini)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
"O localizăre estea dezactivată deoarece o pagină părinte nu este tradusă."
msgstr[1] ""
"Unele localizări sunt dezactivate deoarece unele pagini părinte nu sunt "
"traduse."
msgstr[2] ""
"Unele localizări sunt dezactivate deoarece unele pagini părinte nu sunt "
"traduse."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Traduceți pagina părinte."
msgstr[1] "Traduceți paginile părinte."
msgstr[2] "Traduceți paginile părinte."
msgid "Submit"
msgstr "Trimite"
msgid "Translate"
msgstr "Traduce"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s localizări"
msgid "Translate page"
msgstr "Traduce pagină"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "Pagina '%(page_title)s' a fost creată în %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Tradu %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "%(locales)s creat cu success pentru %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Traduceți această pagină"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Traduce '%(title)s'"

View File

@@ -0,0 +1,105 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Anatoly <pandorinpan@gmail.com>, 2021
# Влад <integration.into.society@gmail.com>, 2022
# sergeybe <sergeybe@gmail.com>, 2022
# Loic Teixeira, 2022
# Andrei Satsevich, 2024
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Andrei Satsevich, 2024\n"
"Language-Team: Russian (https://app.transifex.com/torchbox/teams/8009/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || "
"(n%100>=11 && n%100<=14)? 2 : 3);\n"
msgid "Wagtail simple translation"
msgstr "Простой перевод Wagtail"
msgid "Select all"
msgstr "Выбрать все"
msgid "Locales"
msgstr "Локали"
msgid "All child pages will be created."
msgstr "Все дочерние страницы были созданы."
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Включить (%(descendant_count)s страницу) поддерева"
msgstr[1] "Включить (%(descendant_count)s страницы) поддерева"
msgstr[2] "Включить (%(descendant_count)s страницы) поддерева"
msgstr[3] "Включить (%(descendant_count)s страницы) поддерева"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] "Локаль отключена, поскольку родительская страница не переведена."
msgstr[1] ""
"Некоторые локали отключены, поскольку некоторые родительские страницы не "
"переведены."
msgstr[2] ""
"Некоторые локали отключены, поскольку некоторые родительские страницы не "
"переведены."
msgstr[3] ""
"Некоторые локали отключены, поскольку некоторые родительские страницы не "
"переведены."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Перевести родительскую страницу."
msgstr[1] "Перевести родительские страницы."
msgstr[2] "Перевести родительские страницы."
msgstr[3] "Перевести родительские страницы."
msgid "Can submit translations"
msgstr "Может представлять переводы"
msgid "Submit"
msgstr "Применить"
msgid "Translate"
msgstr "Перевести"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s локалей"
msgid "Translate page"
msgstr "Перевести страницу"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "Страница '%(page_title)s' была успешно создана в %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Перевести %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "Создано успешно %(locales)s для %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Перевести эту страницу"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Перевести '%(title)s'"

View File

@@ -0,0 +1,98 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# andrej55 <andrej.marsetic@gmail.com>, 2022
# Loic Teixeira, 2022
# Andrej Marsetič, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Andrej Marsetič, 2023\n"
"Language-Team: Slovenian (https://app.transifex.com/torchbox/teams/8009/"
"sl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sl\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
"n%100==4 ? 2 : 3);\n"
msgid "Wagtail simple translation"
msgstr "Wagtail preprost prevod"
msgid "Select all"
msgstr "Izberi vse"
msgid "Locales"
msgstr "Območja"
msgid "All child pages will be created."
msgstr "Vse podrejene strani bodo ustvarjene."
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Vključi poddrevo (%(descendant_count)s stran)"
msgstr[1] "Vključi poddrevo (%(descendant_count)s strani)"
msgstr[2] "Vključi poddrevo (%(descendant_count)s strani)"
msgstr[3] "Vključi poddrevo (%(descendant_count)s strani)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
"Področne nastavitve so onemogočene, ker nadrejena stran ni prevedena."
msgstr[1] ""
"Nekateri jeziki so onemogočeni, ker nekatere nadrejene strani niso prevedene."
msgstr[2] ""
"Nekateri jeziki so onemogočeni, ker nekatere nadrejene strani niso prevedene."
msgstr[3] ""
"Nekateri jeziki so onemogočeni, ker nekatere nadrejene strani niso prevedene."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Prevedite nadrejeno stran."
msgstr[1] "Prevedite nadrejeni strani."
msgstr[2] "Prevedite nadrejene strani."
msgstr[3] "Prevedite nadrejene strani."
msgid "Submit"
msgstr "Pošlji"
msgid "Translate"
msgstr "Prevedi"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s lokalizacij"
msgid "Translate page"
msgstr "Prevedi stran"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "Stran '%(page_title)s je bila uspešno kreirana v ' %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Prevesti %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "Uspešno ustvarjeno %(locales)s za %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Prevedi to stran"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Prevedite '%(title)s'"

View File

@@ -0,0 +1,88 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Thomas Kunambi <kunambi@gmail.com>, 2022
# Loic Teixeira, 2022
# Tomas Walch <tomas@alternaliv.se>, 2023
# Martin Sandström <martin@marteinn.se>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Martin Sandström <martin@marteinn.se>, 2023\n"
"Language-Team: Swedish (https://app.transifex.com/torchbox/teams/8009/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Wagtail simple translation"
msgstr "Wagtail förenklad översättning"
msgid "Select all"
msgstr "Välj alla"
msgid "Locales"
msgstr "Språk"
msgid "All child pages will be created."
msgstr "Alla undersidor kommer att skapas"
#, python-format
msgid "Include subtree (%(descendant_count)s page)"
msgid_plural "Include subtree (%(descendant_count)s pages)"
msgstr[0] "Inkludera underträd (%(descendant_count)s sida)"
msgstr[1] "Inkludera underträd (%(descendant_count)s sidor)"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] "Ett språk är avstängt pga en föräldrasida är inte översatt."
msgstr[1] ""
"Några språk är avstängda p g a att vissa föräldrasidor är inte översatta."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Översätt föräldrasidan."
msgstr[1] "Översätt föräldrasidorna."
msgid "Submit"
msgstr "Skicka"
msgid "Translate"
msgstr "Översätt"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s platser"
msgid "Translate page"
msgstr "Översätt sida"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "Sidan '%(page_title)s' skapades med framgång i %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Översätt %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "Skapade framgångsrikt %(locales)s för %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Översätt den här sidan"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Översätt '%(title)s'"

View File

@@ -0,0 +1,92 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# d55ee35323c0c760f088259cd23b1b6d_9e8a7d1 <5459f3ae99ecdd5ed0be0220acd46004_1019581>, 2021
# Anastasiia La, 2022
# Loic Teixeira, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Loic Teixeira, 2022\n"
"Language-Team: Ukrainian (https://app.transifex.com/torchbox/teams/8009/"
"uk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: uk\n"
"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != "
"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % "
"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || "
"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
msgid "Wagtail simple translation"
msgstr "Простий переклад Wagtail"
msgid "Select all"
msgstr "Обрати все"
msgid "Locales"
msgstr "Локалі"
msgid "All child pages will be created."
msgstr "Всі дочірні сторінки буде створено."
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] ""
"Деякі локалі вимкнено, оскільки батьківська сторінка не перекладена."
msgstr[1] ""
"Деякі локалі вимкнено, оскільки деякі батьківські сторінки не перекладені."
msgstr[2] ""
"Деякі локалі вимкнено, оскільки деякі батьківські сторінки не перекладені."
msgstr[3] ""
"Деякі локалі вимкнено, оскільки деякі батьківські сторінки не перекладені."
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "Перекласти батьківську сторінку."
msgstr[1] "Перекласти батьківські сторінки."
msgstr[2] "Перекласти батьківські сторінки."
msgstr[3] "Перекласти батьківські сторінки."
msgid "Submit"
msgstr "Застосувати"
msgid "Translate"
msgstr "Перекласти"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s локалі"
msgid "Translate page"
msgstr "Перекласти сторінку"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "Сторінка '%(page_title)s' була успішно створена в %(locales)s"
#, python-format
msgid "Translate %(model_name)s"
msgstr "Перекласти %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "Успішно створено %(locales)s для %(model_name)s '%(object)s'"
msgid "Translate this page"
msgstr "Перекладіть цю сторінку"
#, python-format
msgid "Translate '%(title)s'"
msgstr "Перекладено %(title)s"

View File

@@ -0,0 +1,29 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Vu Pham, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Vu Pham, 2022\n"
"Language-Team: Vietnamese (https://app.transifex.com/torchbox/teams/8009/"
"vi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: vi\n"
"Plural-Forms: nplurals=1; plural=0;\n"
msgid "Select all"
msgstr "Chọn tất cả"
msgid "Translate"
msgstr "Dịch"

View File

@@ -0,0 +1,80 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Yin Guanhao <sopium@mysterious.site>, 2021
# Favo Yang <favoyang@gmail.com>, 2021
# Ford Guo <agile.guo@gmail.com>, 2022
# Loic Teixeira, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Loic Teixeira, 2022\n"
"Language-Team: Chinese (China) (https://app.transifex.com/torchbox/"
"teams/8009/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
msgid "Wagtail simple translation"
msgstr "Wagtail 简单翻译"
msgid "Select all"
msgstr "全选"
msgid "Locales"
msgstr "区域"
msgid "All child pages will be created."
msgstr "所有的子页面将被创建。"
msgid "A locale is disabled because a parent page is not translated."
msgid_plural ""
"Some locales are disabled because some parent pages are not translated."
msgstr[0] "某些区域是无效的因为某个父页面还没有被翻译。"
msgid "Translate the parent page."
msgid_plural "Translate the parent pages."
msgstr[0] "翻译这些父页面。"
msgid "Submit"
msgstr "提交"
msgid "Translate"
msgstr "翻译"
#. Translators: always plural
#, python-format
msgid "%(locales_count)s locales"
msgstr "%(locales_count)s 区域"
msgid "Translate page"
msgstr "翻译页面"
#, python-format
msgid "The page '%(page_title)s' was successfully created in %(locales)s"
msgstr "页面“%(page_title)s”已在%(locales)s成功创建"
#, python-format
msgid "Translate %(model_name)s"
msgstr "翻译 %(model_name)s"
#, python-format
msgid "Successfully created %(locales)s for %(model_name)s '%(object)s'"
msgstr "成功为%(model_name)s“%(object)s”创建了%(locales)s"
msgid "Translate this page"
msgstr "翻译此页"
#, python-format
msgid "Translate '%(title)s'"
msgstr "翻译“%(title)s”"

View File

@@ -0,0 +1,26 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Chih Wang <ihcgno@icloud.com>, 2021
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-19 16:26+0100\n"
"PO-Revision-Date: 2021-04-21 08:38+0000\n"
"Last-Translator: Chih Wang <ihcgno@icloud.com>, 2021\n"
"Language-Team: Chinese Traditional (https://app.transifex.com/torchbox/"
"teams/8009/zh-Hant/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh-Hant\n"
"Plural-Forms: nplurals=1; plural=0;\n"
msgid "Select all"
msgstr "全選"

View File

@@ -0,0 +1,31 @@
# Generated by Django 2.2.16 on 2021-04-12 20:22
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name="SimpleTranslation",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
],
options={
"permissions": [("submit_translation", "Can submit translations")],
"default_permissions": [],
},
),
]

View File

@@ -0,0 +1,41 @@
from django.conf import settings
from django.db.models import Model
from django.utils.translation import gettext_lazy as _
from wagtail import hooks
from wagtail.models import Locale
class SimpleTranslation(Model):
"""
SimpleTranslation, dummy model to create the `submit_translation` permission.
We need this model to be concrete or the following management commands will misbehave:
- `remove_stale_contenttypes`, will drop the perm
- `dump_data`, will complain about the missing table
"""
class Meta:
default_permissions = []
permissions = [
("submit_translation", _("Can submit translations")),
]
@hooks.register("after_create_page")
def after_create_page(request, page):
"""Creates page aliases in other locales when a page is created.
Whenever a page is created under a specific locale, this signal handler
creates an alias page for that page under the other locales.
e.g. When an editor creates the page "blog/my-blog-post" under the English
tree, this signal handler creates an alias of that page called
"blog/my-blog-post" under the other locales' trees.
"""
if getattr(settings, "WAGTAILSIMPLETRANSLATION_SYNC_PAGE_TREE", False):
# Check if the source tree needs to be synchronised into any other trees
# Create aliases in all those locales
for locale in Locale.objects.exclude(pk=page.locale_id):
if not page.has_translation(locale):
page.copy_for_translation(locale, copy_parents=True, alias=True)

View File

@@ -0,0 +1,7 @@
{% if widget.wrap_label %}
<label{% if widget.attrs.id %} for="{{ widget.attrs.id }}"{% endif %}{% if widget.attrs.disabled %} class="disabled"{% endif %}>
{% include "django/forms/widgets/input.html" %} {{ widget.label }}
</label>
{% else %}
{% include "django/forms/widgets/input.html" %} {{ widget.label }}
{% endif %}

View File

@@ -0,0 +1,32 @@
{% extends "wagtailadmin/base.html" %}
{% load i18n wagtailadmin_tags %}
{% block titletag %}{{ view.get_title }} {{ view.get_subtitle }}{% endblock %}
{% block content %}
{% include "wagtailadmin/shared/header.html" with title=view.get_title subtitle=view.get_subtitle icon="doc-empty-inverse" %}
<div class="nice-padding">
<form method="POST" data-controller="w-bulk">
{% csrf_token %}
{% if next_url %}
<input type="hidden" name="next" value="{{ next_url }}">
{% endif %}
{% for field in form.hidden_fields %}{{ field }}{% endfor %}
<ul class="fields">
{% block visible_fields %}
{% for field in form.visible_fields %}
<li>{% formattedfield field %}</li>
{% endfor %}
{% endblock %}
{% if form.show_submit %}
<li>
<input type="submit" value="{% trans 'Submit' %}" class="button" />
</li>
{% endif %}
</ul>
</form>
</div>
{% endblock %}

View File

@@ -0,0 +1,140 @@
from django.forms import CheckboxInput, HiddenInput
from django.test import TestCase, override_settings
from wagtail.contrib.simple_translation.forms import SubmitTranslationForm
from wagtail.models import Locale, Page
from wagtail.test.i18n.models import TestPage
from wagtail.test.utils import WagtailTestUtils
@override_settings(
LANGUAGES=[
("en", "English"),
("fr", "French"),
("de", "German"),
],
WAGTAIL_CONTENT_LANGUAGES=[
("en", "English"),
("fr", "French"),
("de", "German"),
],
)
class TestSubmitPageTranslation(WagtailTestUtils, TestCase):
def setUp(self):
self.en_locale = Locale.objects.first()
self.fr_locale = Locale.objects.create(language_code="fr")
self.de_locale = Locale.objects.create(language_code="de")
self.en_homepage = Page.objects.get(depth=2)
self.fr_homepage = self.en_homepage.copy_for_translation(self.fr_locale)
self.de_homepage = self.en_homepage.copy_for_translation(self.de_locale)
self.en_blog_index = TestPage(title="Blog", slug="blog")
self.en_homepage.add_child(instance=self.en_blog_index)
self.en_blog_post = TestPage(title="Blog post", slug="blog-post")
self.en_blog_index.add_child(instance=self.en_blog_post)
def test_include_subtree(self):
form = SubmitTranslationForm(instance=self.en_blog_post)
self.assertIsInstance(form.fields["include_subtree"].widget, HiddenInput)
form = SubmitTranslationForm(instance=self.en_blog_index)
self.assertIsInstance(form.fields["include_subtree"].widget, CheckboxInput)
self.assertEqual(
form.fields["include_subtree"].label, "Include subtree (1 page)"
)
form = SubmitTranslationForm(instance=self.en_homepage)
self.assertEqual(
form.fields["include_subtree"].label, "Include subtree (2 pages)"
)
def test_locales_queryset(self):
# Homepage is translated to all locales.
form = SubmitTranslationForm(instance=self.en_homepage)
self.assertEqual(
list(
form.fields["locales"].queryset.values_list("language_code", flat=True)
),
[],
)
# Blog index can be translated to `de` and `fr`.
form = SubmitTranslationForm(instance=self.en_blog_index)
self.assertEqual(
list(
form.fields["locales"].queryset.values_list("language_code", flat=True)
),
["de", "fr"],
)
# Blog post can be translated to `de` and `fr`.
form = SubmitTranslationForm(instance=self.en_blog_post)
self.assertEqual(
list(
form.fields["locales"].queryset.values_list("language_code", flat=True)
),
["de", "fr"],
)
def test_select_all(self):
form = SubmitTranslationForm(instance=self.en_homepage)
# Homepage is translated to all locales.
self.assertIsInstance(form.fields["select_all"].widget, HiddenInput)
form = SubmitTranslationForm(instance=self.en_blog_index)
# Blog post can be translated to `de` and `fr`.
self.assertIsInstance(form.fields["select_all"].widget, CheckboxInput)
def test_locale_disabled(self):
form = SubmitTranslationForm(instance=self.en_blog_post)
# The parent (blog_index) is translated to English.
# German and French are disabled.
self.assertEqual(
list(form.fields["locales"].widget.disabled_values),
[self.de_locale.id, self.fr_locale.id],
)
label = f"""
<label class="disabled">
<input type="checkbox" name="None" value="{self.de_locale.id}" disabled>
German
</label>
"""
self.assertInHTML(label, form.fields["locales"].widget.render(None, None))
def test_locale_help_text(self):
# German and French are disabled.
# The help_text is plural
form = SubmitTranslationForm(instance=self.en_blog_post)
help_text = f"""
Some locales are disabled because some parent pages are not translated.
<br>
<a href="/admin/translation/submit/page/{self.en_blog_index.id}/">
Translate the parent pages.
</a>
"""
self.assertHTMLEqual(form.fields["locales"].help_text, help_text)
# Add German translation
self.en_blog_index.copy_for_translation(self.de_locale)
# French is disabled.
# The help_text is singular.
form = SubmitTranslationForm(instance=self.en_blog_post)
help_text = f"""
A locale is disabled because a parent page is not translated.
<br>
<a href="/admin/translation/submit/page/{self.en_blog_index.id}/">
Translate the parent page.
</a>
"""
self.assertHTMLEqual(form.fields["locales"].help_text, help_text)
def test_hide_submit(self):
# German and French are disabled.
# There are no other pages to be translated.
# Submit is hidden.
form = SubmitTranslationForm(instance=self.en_blog_post)
self.assertFalse(form.show_submit)
# A parent is translated
self.en_blog_index.copy_for_translation(self.de_locale)
form = SubmitTranslationForm(instance=self.en_blog_post)
self.assertTrue(form.show_submit)

View File

@@ -0,0 +1,18 @@
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from wagtail.test.utils import TestCase
class TestMigrations(TestCase):
def test_content_type_exists(self):
self.assertTrue(
ContentType.objects.filter(
app_label="simple_translation", model="simpletranslation"
).exists()
)
def test_permission_exists(self):
self.assertTrue(
Permission.objects.filter(codename="submit_translation").exists()
)

View File

@@ -0,0 +1,440 @@
from django.contrib.admin.utils import quote
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from django.http import Http404
from django.test import RequestFactory, override_settings
from django.urls import reverse
from django.utils.translation import gettext_lazy
from wagtail import hooks
from wagtail.actions.copy_for_translation import ParentNotTranslatedError
from wagtail.contrib.simple_translation.forms import SubmitTranslationForm
from wagtail.contrib.simple_translation.models import after_create_page
from wagtail.contrib.simple_translation.views import (
SubmitPageTranslationView,
SubmitSnippetTranslationView,
SubmitTranslationView,
)
from wagtail.models import Locale, Page
from wagtail.test.i18n.models import TestPage
from wagtail.test.snippets.models import TranslatableSnippet
from wagtail.test.testapp.models import FullFeaturedSnippet
from wagtail.test.utils import TestCase, WagtailTestUtils
@override_settings(
LANGUAGES=[
("en", "English"),
("fr", "French"),
("de", "German"),
],
WAGTAIL_CONTENT_LANGUAGES=[
("en", "English"),
("fr", "French"),
("de", "German"),
],
)
class TestSubmitTranslationView(WagtailTestUtils, TestCase):
def setUp(self):
self.en_locale = Locale.objects.first()
self.fr_locale = Locale.objects.create(language_code="fr")
self.de_locale = Locale.objects.create(language_code="de")
self.en_homepage = Page.objects.get(depth=2)
self.factory = RequestFactory()
def test_template_name(self):
self.assertEqual(
SubmitTranslationView.template_name,
"simple_translation/admin/submit_translation.html",
)
def test_title(self):
self.assertEqual(SubmitTranslationView().title, gettext_lazy("Translate"))
self.assertEqual(SubmitTranslationView().get_title(), gettext_lazy("Translate"))
def test_subtitle(self):
view = SubmitTranslationView()
view.object = self.en_homepage
self.assertEqual(view.get_subtitle(), str(self.en_homepage))
def test_get_form(self):
view = SubmitTranslationView()
view.request = self.factory.get("/path/does/not/matter/")
view.object = self.en_homepage
form = view.get_form()
self.assertIsInstance(form, SubmitTranslationForm)
def test_get_success_url(self):
with self.assertRaises(NotImplementedError):
view = SubmitTranslationView()
view.object = self.en_homepage
view.get_success_url()
def test_get_context_data(self, **kwargs):
view = SubmitTranslationView()
view.request = self.factory.get("/path/does/not/matter/")
view.object = self.en_homepage
context = view.get_context_data()
self.assertIn("form", context.keys())
self.assertIsInstance(context["form"], SubmitTranslationForm)
def test_dispatch_as_anon(self):
url = reverse(
"simple_translation:submit_page_translation", args=(self.en_homepage.id,)
)
response = self.client.get(url)
self.assertEqual(response.status_code, 302)
self.assertEqual(response.url, f"/admin/login/?next={url}")
def test_dispatch_as_moderator(self):
url = reverse(
"simple_translation:submit_page_translation", args=(self.en_homepage.id,)
)
user = self.login()
group = Group.objects.get(name="Moderators")
user.groups.add(group)
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
def test_dispatch_as_user_with_perm(self):
url = reverse(
"simple_translation:submit_page_translation", args=(self.en_homepage.id,)
)
user = self.login()
permission = Permission.objects.get(codename="submit_translation")
user.user_permissions.add(permission)
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@override_settings(
LANGUAGES=[
("en", "English"),
("fr", "French"),
("de", "German"),
],
WAGTAIL_CONTENT_LANGUAGES=[
("en", "English"),
("fr", "French"),
("de", "German"),
],
)
class TestSubmitPageTranslationView(WagtailTestUtils, TestCase):
def setUp(self):
self.en_locale = Locale.objects.first()
self.fr_locale = Locale.objects.create(language_code="fr")
self.de_locale = Locale.objects.create(language_code="de")
self.en_homepage = Page.objects.get(depth=2)
self.fr_homepage = self.en_homepage.copy_for_translation(self.fr_locale)
self.de_homepage = self.en_homepage.copy_for_translation(self.de_locale)
self.en_blog_index = TestPage(title="Blog", slug="blog")
self.en_homepage.add_child(instance=self.en_blog_index)
self.en_blog_post = TestPage(title="Blog post", slug="blog-post")
self.en_blog_index.add_child(instance=self.en_blog_post)
def test_title(self):
self.assertEqual(SubmitPageTranslationView.title, "Translate page")
def test_get_subtitle(self):
view = SubmitPageTranslationView()
view.object = self.en_homepage
self.assertEqual(view.get_subtitle(), "Welcome to your new Wagtail site!")
def test_submit_page_translation_view_test_get(self):
url = reverse(
"simple_translation:submit_page_translation", args=(self.en_blog_index.id,)
)
self.login()
response = self.client.get(url)
assert isinstance(response.context["form"], SubmitTranslationForm)
def test_submit_page_translation_view_test_post_invalid(self):
url = reverse(
"simple_translation:submit_page_translation", args=(self.en_blog_index.id,)
)
self.login()
response = self.client.post(url, {})
assert response.status_code == 200
assert response.context["form"].errors == {
"locales": ["This field is required."]
}
def test_submit_page_translation_view_test_post_single_locale(self):
url = reverse(
"simple_translation:submit_page_translation", args=(self.en_blog_index.id,)
)
de = Locale.objects.get(language_code="de").id
data = {"locales": [de], "include_subtree": True}
self.login()
response = self.client.post(url, data, follow=True)
translated_page = self.en_blog_index.get_translation(de)
self.assertRedirects(
response, reverse("wagtailadmin_pages:edit", args=[translated_page.pk])
)
self.assertIn(
"The page 'Blog' was successfully created in German",
[msg.message for msg in response.context["messages"]],
)
def test_submit_page_translation_view_test_post_multiple_locales(self):
# Needs an extra page to hit recursive function
en_blog_post_sub = Page(title="Blog post sub", slug="blog-post-sub")
self.en_blog_post.add_child(instance=en_blog_post_sub)
url = reverse(
"simple_translation:submit_page_translation", args=(self.en_blog_post.id,)
)
de = Locale.objects.get(language_code="de").id
fr = Locale.objects.get(language_code="fr").id
data = {"locales": [de, fr], "include_subtree": True}
self.login()
with self.assertRaisesMessage(ParentNotTranslatedError, ""):
self.client.post(url, data)
url = reverse(
"simple_translation:submit_page_translation", args=(self.en_blog_index.id,)
)
response = self.client.post(url, data)
assert response.status_code == 302
assert response.url == f"/admin/pages/{self.en_blog_index.get_parent().id}/"
response = self.client.get(response.url) # follow the redirect
assert [msg.message for msg in response.context["messages"]] == [
"The page 'Blog' was successfully created in 2 locales"
]
@override_settings(
LANGUAGES=[
("en", "English"),
("fr", "French"),
("de", "German"),
],
WAGTAIL_CONTENT_LANGUAGES=[
("en", "English"),
("fr", "French"),
("de", "German"),
],
)
class TestSubmitSnippetTranslationView(WagtailTestUtils, TestCase):
def setUp(self):
self.en_locale = Locale.objects.first()
self.fr_locale = Locale.objects.create(language_code="fr")
self.en_snippet = TranslatableSnippet(text="Hello world", locale=self.en_locale)
self.en_snippet.save()
def test_get_title(self):
view = SubmitSnippetTranslationView()
view.object = self.en_snippet
self.assertEqual(view.get_title(), "Translate translatable snippet")
def test_get_object(self):
view = SubmitSnippetTranslationView()
view.object = self.en_snippet
view.kwargs = {
"app_label": "some_app",
"model_name": "some_model",
"pk": 1,
}
with self.assertRaises(Http404):
view.get_object()
content_type = ContentType.objects.get_for_model(self.en_snippet)
view.kwargs = {
"app_label": content_type.app_label,
"model_name": content_type.model,
"pk": str(self.en_snippet.pk),
}
self.assertEqual(view.get_object(), self.en_snippet)
def test_get_success_url(self):
view = SubmitSnippetTranslationView()
view.object = self.en_snippet
view.kwargs = {
"app_label": "snippetstests",
"model_name": "translatablesnippet",
"pk": 99,
}
self.assertEqual(
view.get_success_url(),
"/admin/snippets/snippetstests/translatablesnippet/edit/99/",
)
def test_get_success_url_for_single_locale(self):
view = SubmitSnippetTranslationView()
view.object = self.en_snippet
view.kwargs = {
"app_label": "snippetstests",
"model_name": "translatablesnippet",
"pk": 99,
}
self.assertEqual(
view.get_success_url(view.object),
reverse(
"wagtailsnippets_snippetstests_translatablesnippet:edit",
args=[view.object.pk],
),
)
def test_get_success_message(self):
view = SubmitSnippetTranslationView()
view.object = self.en_snippet
self.assertEqual(
view.get_success_message(self.fr_locale),
f"Successfully created French for translatable snippet 'TranslatableSnippet object ({self.en_snippet.id})'",
)
@override_settings(
LANGUAGES=[
("en", "English"),
("fr", "French"),
("de", "German"),
],
WAGTAIL_CONTENT_LANGUAGES=[
("en", "English"),
("fr", "French"),
("de", "German"),
],
WAGTAIL_I18N_ENABLED=True,
)
class TestSubmitSnippetTranslationWithDraftState(WagtailTestUtils, TestCase):
def setUp(self):
self.login()
self.en_locale = Locale.objects.first()
self.fr_locale = Locale.objects.create(language_code="fr")
self.de_locale = Locale.objects.create(language_code="de")
self.en_snippet = FullFeaturedSnippet.objects.create(
text="Hello world", locale=self.en_locale, live=False
)
self.en_snippet.save_revision().publish()
self.en_snippet.text = "It's edited"
self.en_snippet.save_revision()
self.en_snippet.refresh_from_db()
self.model_opts = self.en_snippet._meta
self.app_label = self.model_opts.app_label
self.model_name = self.model_opts.model_name
def get_submit_url(self):
return reverse(
"simple_translation:submit_snippet_translation",
args=(self.app_label, self.model_name, quote(self.en_snippet.pk)),
)
def get_snippet_url(self, view, snippet):
return reverse(
snippet.snippet_viewset.get_url_name(view),
args=(quote(snippet.pk),),
)
def test_submit_snippet_translation_view_test_get(self):
response = self.client.get(self.get_submit_url())
self.assertIsInstance(response.context["form"], SubmitTranslationForm)
def test_submit_snippet_translation_view_test_post_invalid(self):
response = self.client.post(self.get_submit_url(), {})
self.assertEqual(response.status_code, 200)
self.assertEqual(
response.context["form"].errors,
{"locales": ["This field is required."]},
)
def test_submit_snippet_translation_view_test_post_single_locale(self):
data = {"locales": [self.de_locale.id], "include_subtree": True}
response = self.client.post(self.get_submit_url(), data, follow=True)
translated_snippet = self.en_snippet.get_translation(self.de_locale.id)
self.assertRedirects(response, self.get_snippet_url("edit", translated_snippet))
self.assertContains(response, "It's edited", count=1)
self.assertContains(response, '<h3 id="status-sidebar-german"', count=1)
self.assertContains(
response,
f'<a href="{self.get_snippet_url("edit", self.en_snippet)}"',
count=1,
)
self.assertNotContains(
response,
f'<a href="{self.get_snippet_url("edit", translated_snippet)}"',
)
self.assertEqual(
[msg.message for msg in response.context["messages"]],
["Successfully created German for full-featured snippet 'It's edited'"],
)
def test_submit_snippet_translation_view_test_post_multiple_locales(self):
url = self.get_submit_url()
data = {"locales": [self.de_locale.id, self.fr_locale.id]}
response = self.client.post(url, data)
self.assertEqual(response.status_code, 302)
self.assertEqual(response.url, self.get_snippet_url("edit", self.en_snippet))
response = self.client.get(response.url) # follow the redirect
self.assertEqual(
[msg.message for msg in response.context["messages"]],
["Successfully created 2 locales for full-featured snippet 'It's edited'"],
)
@override_settings(
LANGUAGES=[
("en", "English"),
("fr", "French"),
("de", "German"),
],
WAGTAIL_CONTENT_LANGUAGES=[
("en", "English"),
("fr", "French"),
("de", "German"),
],
WAGTAILSIMPLETRANSLATION_SYNC_PAGE_TREE=True,
)
class TestPageTreeSync(WagtailTestUtils, TestCase):
def setUp(self):
self.en_locale = Locale.objects.first()
self.fr_locale = Locale.objects.create(language_code="fr")
self.de_locale = Locale.objects.create(language_code="de")
self.en_homepage = Page.objects.get(depth=2)
self.fr_homepage = self.en_homepage.copy_for_translation(self.fr_locale)
self.de_homepage = self.en_homepage.copy_for_translation(self.de_locale)
def test_hook_function_registered(self):
fns = hooks.get_hooks("after_create_page")
self.assertIn(after_create_page, fns)
def test_alias_created_after_page_saved(self):
en_blog_index = TestPage(title="Blog", slug="blog")
self.en_homepage.add_child(instance=en_blog_index)
after_create_page(None, en_blog_index)
fr_blog_index = en_blog_index.get_translation(self.fr_locale)
de_blog_index = en_blog_index.get_translation(self.de_locale)
self.assertEqual(fr_blog_index.alias_of.specific, en_blog_index)
self.assertEqual(de_blog_index.alias_of.specific, en_blog_index)
@override_settings(WAGTAILSIMPLETRANSLATION_SYNC_PAGE_TREE=False)
def test_page_sync_disabled(self):
en_blog_index = TestPage(title="Blog", slug="blog")
self.en_homepage.add_child(instance=en_blog_index)
after_create_page(None, en_blog_index)
self.assertFalse(en_blog_index.has_translation(self.fr_locale))
self.assertFalse(en_blog_index.has_translation(self.de_locale))

View File

@@ -0,0 +1,555 @@
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group, Permission
from django.test import TestCase, override_settings
from django.urls import reverse
from wagtail import hooks
from wagtail.actions.create_alias import CreatePageAliasAction
from wagtail.actions.move_page import MovePageAction
from wagtail.admin import widgets as wagtailadmin_widgets
from wagtail.contrib.simple_translation.wagtail_hooks import (
page_listing_more_buttons,
register_submit_translation_permission,
)
from wagtail.models import Locale, Page
from wagtail.test.i18n.models import TestPage
from wagtail.test.utils import WagtailTestUtils
class Utils(WagtailTestUtils, TestCase):
def setUp(self):
self.en_locale = Locale.objects.first()
self.fr_locale = Locale.objects.create(language_code="fr")
self.de_locale = Locale.objects.create(language_code="de")
self.en_homepage = Page.objects.get(depth=2)
self.fr_homepage = self.en_homepage.copy_for_translation(self.fr_locale)
self.de_homepage = self.en_homepage.copy_for_translation(self.de_locale)
self.en_blog_index = TestPage(title="Blog", slug="blog")
self.en_homepage.add_child(instance=self.en_blog_index)
self.en_blog_post = TestPage(title="Blog post", slug="blog-post")
self.en_blog_index.add_child(instance=self.en_blog_post)
class TestWagtailHooksURLs(TestCase):
def test_register_admin_urls_page(self):
self.assertEqual(
reverse("simple_translation:submit_page_translation", args=(1,)),
"/admin/translation/submit/page/1/",
)
def test_register_admin_urls_snippet(self):
app_label = "foo"
model_name = "bar"
pk = 1
self.assertEqual(
reverse(
"simple_translation:submit_snippet_translation",
args=(app_label, model_name, pk),
),
"/admin/translation/submit/snippet/foo/bar/1/",
)
class TestWagtailHooksPermission(Utils):
def test_register_submit_translation_permission(self):
assert list(
register_submit_translation_permission().values_list("id", flat=True)
) == [
Permission.objects.get(
content_type__app_label="simple_translation",
codename="submit_translation",
).id
]
class TestWagtailHooksButtons(Utils):
def test_page_listing_more_buttons(self):
# Root, no button
root_page = self.en_blog_index.get_root()
if get_user_model().USERNAME_FIELD == "email":
user = get_user_model().objects.create_user(email="jos@example.com")
else:
user = get_user_model().objects.create_user(username="jos")
assert list(page_listing_more_buttons(root_page, user)) == []
# No permissions, no button
home_page = self.en_homepage
assert list(page_listing_more_buttons(root_page, user)) == []
# Homepage is translated to all languages, no button
perm = Permission.objects.get(codename="submit_translation")
if get_user_model().USERNAME_FIELD == "email":
user = get_user_model().objects.create_user(email="henk@example.com")
else:
user = get_user_model().objects.create_user(username="henk")
# New user, to prevent permission cache.
user.user_permissions.add(perm)
group = Group.objects.get(name="Editors")
user.groups.add(group)
assert list(page_listing_more_buttons(home_page, user)) == []
# Page does not have translations yet... button!
blog_page = self.en_blog_post
assert isinstance(
list(page_listing_more_buttons(blog_page, user))[0],
wagtailadmin_widgets.Button,
)
class TestConstructSyncedPageTreeListHook(Utils):
def unpublish_hook(self, pages, action):
self.assertEqual(action, "unpublish")
self.assertIsInstance(pages, list)
def missing_hook_action(self, pages, action):
self.assertEqual(action, "")
self.assertIsInstance(pages, list)
def test_double_registered_hook(self):
# We should have two implementations of `construct_translated_pages_to_cascade_actions`
# One in simple_translation.wagtail_hooks and the other will be
# registered as a temporary hook.
with hooks.register_temporarily(
"construct_translated_pages_to_cascade_actions", self.unpublish_hook
):
defined_hooks = hooks.get_hooks(
"construct_translated_pages_to_cascade_actions"
)
self.assertEqual(len(defined_hooks), 2)
@override_settings(WAGTAILSIMPLETRANSLATION_SYNC_PAGE_TREE=True)
def test_page_tree_sync_on(self):
with hooks.register_temporarily(
"construct_translated_pages_to_cascade_actions", self.unpublish_hook
):
for fn in hooks.get_hooks("construct_translated_pages_to_cascade_actions"):
response = fn([self.en_homepage], "unpublish")
if response:
self.assertIsInstance(response, dict)
self.assertEqual(len(response.items()), 1)
@override_settings(WAGTAILSIMPLETRANSLATION_SYNC_PAGE_TREE=False)
def test_page_tree_sync_off(self):
with hooks.register_temporarily(
"construct_translated_pages_to_cascade_actions", self.unpublish_hook
):
for fn in hooks.get_hooks("construct_translated_pages_to_cascade_actions"):
response = fn([self.en_homepage], "unpublish")
self.assertIsNone(response)
@override_settings(WAGTAILSIMPLETRANSLATION_SYNC_PAGE_TREE=True)
def test_missing_hook_action(self):
with hooks.register_temporarily(
"construct_translated_pages_to_cascade_actions", self.missing_hook_action
):
for fn in hooks.get_hooks("construct_translated_pages_to_cascade_actions"):
response = fn([self.en_homepage], "")
if response is not None:
self.assertIsInstance(response, dict)
@override_settings(
WAGTAILSIMPLETRANSLATION_SYNC_PAGE_TREE=True, WAGTAIL_I18N_ENABLED=True
)
def test_other_l10n_pages_were_unpublished(self):
# Login to access the admin
self.login()
# Make sure the French homepage is published/live
self.fr_homepage.live = True
self.fr_homepage.save()
self.assertTrue(self.en_homepage.live)
self.assertTrue(self.fr_homepage.live)
response = self.client.post(
reverse("wagtailadmin_pages:unpublish", args=(self.en_homepage.id,)),
{"include_descendants": False},
follow=True,
)
self.assertEqual(response.status_code, 200)
# Refresh objects from the database
self.en_homepage.refresh_from_db()
self.fr_homepage.refresh_from_db()
# Test that both the English and French homepages are unpublished
self.assertFalse(self.en_homepage.live)
self.assertFalse(self.fr_homepage.live)
class TestMovingTranslatedPages(Utils):
@override_settings(
WAGTAILSIMPLETRANSLATION_SYNC_PAGE_TREE=True, WAGTAIL_I18N_ENABLED=True
)
def test_move_translated_pages(self):
self.login()
# BlogIndex needs translated pages before child pages can be translated
self.fr_blog_index = self.en_blog_index.copy_for_translation(self.fr_locale)
self.de_blog_index = self.en_blog_index.copy_for_translation(self.de_locale)
# Create blog_post copies for translation
self.fr_blog_post = self.en_blog_post.copy_for_translation(self.fr_locale)
self.de_blog_post = self.en_blog_post.copy_for_translation(self.de_locale)
# Confirm location of English blog post page before it is moved
# Should be living at /blog/blog-post/ right now. But will eventually
# exist at /blog-post/
self.assertEqual(self.en_blog_post.get_parent().id, self.en_blog_index.id)
# Check if fr and de blog post parent ids are in the translated list
# This is to make sure the fr blog_post is situated under /fr/blog/
# (same concept with /de/).
# We'll check these after the move to ensure they exist under /fr/ without
# the /blog/ parent page.
original_translated_parent_ids = [
p.id for p in self.en_blog_index.get_translations()
]
self.assertIn(self.fr_blog_post.get_parent().id, original_translated_parent_ids)
self.assertIn(self.de_blog_post.get_parent().id, original_translated_parent_ids)
response = self.client.post(
reverse(
"wagtailadmin_pages:move_confirm",
args=(
self.en_blog_post.id,
self.en_homepage.id,
),
),
follow=True,
)
self.assertEqual(response.status_code, 200)
self.fr_blog_post.refresh_from_db()
self.de_blog_post.refresh_from_db()
# Check if the new pages exist under their respective translated homepages
home_page_translation_ids = [p.id for p in self.en_homepage.get_translations()]
self.assertIn(
self.fr_blog_post.get_parent(update=True).id, home_page_translation_ids
)
self.assertIn(
self.de_blog_post.get_parent(update=True).id, home_page_translation_ids
)
@override_settings(WAGTAILSIMPLETRANSLATION_SYNC_PAGE_TREE=False)
def test_unmovable_translation_pages(self):
"""
Test that moving a page with WAGTAILSIMPLETRANSLATION_SYNC_PAGE_TREE
disabled doesn't apply to its translations.
"""
self.login()
# BlogIndex needs translated pages before child pages can be translated
self.fr_blog_index = self.en_blog_index.copy_for_translation(self.fr_locale)
self.de_blog_index = self.en_blog_index.copy_for_translation(self.de_locale)
# Create blog_post copies for translation
self.fr_blog_post = self.en_blog_post.copy_for_translation(self.fr_locale)
self.de_blog_post = self.en_blog_post.copy_for_translation(self.de_locale)
# Confirm location of English blog post page before it is moved
# Should be living at /blog/blog-post/ right now. But will eventually
# exist at /blog-post/
self.assertEqual(self.en_blog_post.get_parent().id, self.en_blog_index.id)
# Confirm the fr and de blog post pages are under the blog index page
# We'll confirm these have not moved after the POST request.
original_translated_parent_ids = [
p.id for p in self.en_blog_index.get_translations()
]
self.assertIn(self.fr_blog_post.get_parent().id, original_translated_parent_ids)
self.assertIn(self.de_blog_post.get_parent().id, original_translated_parent_ids)
response = self.client.post(
reverse(
"wagtailadmin_pages:move_confirm",
args=(
self.en_blog_post.id,
self.en_homepage.id,
),
),
follow=True,
)
self.assertEqual(response.status_code, 200)
self.en_blog_post.refresh_from_db()
self.fr_blog_post.refresh_from_db()
self.de_blog_post.refresh_from_db()
# Check that the en_blog_post page has moved directly under the home page.
self.assertEqual(
self.en_blog_post.get_parent(update=True).id, self.en_homepage.id
)
# Check if the fr and de pages exist under their original parent page (/blog/)
self.assertIn(
self.fr_blog_post.get_parent(update=True).id, original_translated_parent_ids
)
self.assertIn(
self.de_blog_post.get_parent(update=True).id, original_translated_parent_ids
)
@override_settings(
WAGTAILSIMPLETRANSLATION_SYNC_PAGE_TREE=True, WAGTAIL_I18N_ENABLED=True
)
def test_translation_count_in_context(self):
"""Test translation count is correct in the confirm_move.html template."""
self.login()
# BlogIndex needs translated pages before child pages can be translated
self.fr_blog_index = self.en_blog_index.copy_for_translation(self.fr_locale)
self.de_blog_index = self.en_blog_index.copy_for_translation(self.de_locale)
# create translation in FR tree
self.fr_blog_post = self.en_blog_post.copy_for_translation(self.fr_locale)
# create alias in DE tree
self.de_blog_post = self.en_blog_post.copy_for_translation(
self.de_locale, alias=True
)
response = self.client.get(
reverse(
"wagtailadmin_pages:move_confirm",
args=(
self.en_blog_post.id,
self.en_homepage.id,
),
),
follow=True,
)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context["translations_to_move_count"], 1)
self.assertIn(
"This will also move one translation of this page and its child pages",
response.content.decode("utf-8"),
)
@override_settings(
WAGTAILSIMPLETRANSLATION_SYNC_PAGE_TREE=True, WAGTAIL_I18N_ENABLED=True
)
class TestDeletingTranslatedPages(Utils):
def delete_hook(self, pages, action):
self.assertEqual(action, "delete")
self.assertIsInstance(pages, list)
def test_construct_translated_pages_to_cascade_actions_when_deleting(self):
with hooks.register_temporarily(
"construct_translated_pages_to_cascade_actions", self.delete_hook
):
for fn in hooks.get_hooks("construct_translated_pages_to_cascade_actions"):
response = fn([self.en_homepage], "delete")
if response is not None:
self.assertIsInstance(response, dict)
self.assertEqual(len(response.items()), 1)
def test_delete_translated_pages(self):
# Login to the Wagtail admin with a superuser account
self.login()
# BlogIndex needs translated pages before child pages can be translated
self.fr_blog_index = self.en_blog_index.copy_for_translation(self.fr_locale)
# Create a copy of the en_blog_post object as a translated page
self.fr_blog_post = self.en_blog_post.copy_for_translation(self.fr_locale)
# 1. Delete the en_blog_post by making a POST request to /delete/
response = self.client.post(
reverse(
"wagtailadmin_pages:delete",
args=(self.en_blog_post.id,),
),
follow=True,
)
self.assertEqual(response.status_code, 200)
# 2. Confirm fr_blog_post is deleted
self.assertIsNone(Page.objects.filter(pk=self.fr_blog_post.id).first())
def test_delete_confirmation_template(self):
"""Test the context info is correct in the confirm_delete.html template."""
self.login()
# BlogIndex needs translated pages before child pages can be translated
self.fr_blog_index = self.en_blog_index.copy_for_translation(self.fr_locale)
# Create a copy of the en_blog_post object as a translated page
self.fr_blog_post = self.en_blog_post.copy_for_translation(self.fr_locale)
# Create an alias page to test the `translations_to_move_count`
# in the template context
new_page = CreatePageAliasAction(
self.en_blog_post,
recursive=False,
parent=self.en_blog_index,
update_slug="alias-page-slug",
user=None,
)
new_page.execute(skip_permission_checks=True)
response = self.client.get(
reverse(
"wagtailadmin_pages:delete",
args=(self.en_blog_post.id,),
),
follow=True,
)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context["translation_count"], 1)
self.assertEqual(response.context["translation_descendant_count"], 0)
self.assertIn(
"Deleting this page will also delete 1 translation of this page.",
response.content.decode("utf-8"),
)
def test_deleting_page_with_divergent_translation_tree(self):
self.login()
# New parent to eventually hold the fr_blog_post object.
self.en_new_parent = TestPage(title="Test Parent", slug="test-parent")
self.en_homepage.add_child(instance=self.en_new_parent)
# Copy the /blog/ and French /blog-post/ pages.
self.fr_blog_index = self.en_blog_index.copy_for_translation(self.fr_locale)
self.fr_blog_post = self.en_blog_post.copy_for_translation(self.fr_locale)
# Copy the en new parent to be a french page
self.fr_new_parent = self.en_new_parent.copy_for_translation(self.fr_locale)
# Manually move the fr_blog_post to live under fr_new_parent
# Because this does not go through the POST request in pages/move.py
# this action will create a diverged tree scnenario where en_blog_post
# and fr_blog_post don't mirror their original positions in the tree.
action = MovePageAction(
self.fr_blog_post,
self.fr_new_parent,
pos="last-child",
user=None,
)
action.execute(skip_permission_checks=True)
self.fr_blog_post.refresh_from_db()
self.en_blog_post.refresh_from_db()
# Confirm fr_blog_post parent id is the fr_new_parent id.
# Confirm en_blog_post parent id is the en_blog_index id
self.assertEqual(
self.fr_blog_post.get_parent(update=True).id, self.fr_new_parent.id
)
self.assertEqual(
self.en_blog_post.get_parent(update=True).id, self.en_blog_index.id
)
# Make a post request to move the en_blog_post to live under en_homepage
response = self.client.post(
reverse(
"wagtailadmin_pages:delete",
args=(self.en_blog_post.id,),
),
follow=True,
)
self.assertEqual(response.status_code, 200)
# Confirm that the en_blog_post object no longer exists.
self.assertFalse(Page.objects.filter(pk=self.en_blog_post.id).exists())
# Confirm that the fr_blog_post object stll exists, because it was moved
self.assertTrue(Page.objects.filter(pk=self.fr_blog_post.id).exists())
# Confirm the fr_blog_post parent id matches the new_parent_page id
# This confirms is hasn't moved and hasn't been deleted.
# to a different location in the tree.
self.fr_blog_post.refresh_from_db()
self.assertEqual(
self.fr_blog_post.get_parent(update=True).id, self.fr_new_parent.id
)
def test_alias_pages_when_deleting_source_page(self):
"""
When deleting a page that has an alias page in the same tree, the alias page
should continue to exist while the original page should be deleted
while using the `construct_translated_pages_to_cascade_actions` hook is active.
"""
self.login()
# Test the source page exists in the right tree location
self.assertEqual(self.en_blog_post.get_parent().id, self.en_blog_index.id)
# Create an alias page from en_blog_post
action = CreatePageAliasAction(
self.en_blog_post,
recursive=False,
parent=self.en_blog_index,
update_slug="sample-slug",
user=None,
)
new_page = action.execute(skip_permission_checks=True)
# Make sure the alias page is an alias of the en_blog_post
# and exists under the same parent page.
self.assertEqual(new_page.get_parent().id, self.en_blog_index.id)
# Test alias of source page
self.assertEqual(new_page.alias_of_id, self.en_blog_post.id)
# Delete the en_blog_post page and make sure the alias page is kept in tact.
response = self.client.post(
reverse(
"wagtailadmin_pages:delete",
args=(self.en_blog_post.id,),
),
follow=True,
)
self.assertEqual(response.status_code, 200)
self.assertFalse(Page.objects.filter(pk=self.en_blog_post.id).exists())
self.assertTrue(Page.objects.filter(pk=new_page.id).exists())
def test_translation_alias_pages_when_deleting_source_page(self):
"""
When deleting a page that has an alias page, the alias page
should be deleted while using the `construct_translated_pages_to_cascade_actions`
hook is active.
"""
self.login()
# BlogIndex needs translated pages before child pages can be translated
self.fr_blog_index = self.en_blog_index.copy_for_translation(self.fr_locale)
# Create a copy of the en_blog_post object as a translated alias page
self.fr_blog_post = self.en_blog_post.copy_for_translation(
self.fr_locale, alias=True
)
self.assertEqual(self.fr_blog_post.alias_of_id, self.en_blog_post.id)
self.assertEqual(self.fr_blog_post.get_parent().id, self.fr_blog_index.id)
# Test that the fr_blog_post alias_id is in the list of translations, is a
# proper alias of en_blog_post, and is using the french locale (fr).
# Also check that the page is in the correct language tree
translation_ids = [p.id for p in self.fr_blog_post.get_translations()]
self.assertIn(self.fr_blog_post.alias_of_id, translation_ids)
self.assertEqual(self.fr_blog_post.alias_of_id, self.en_blog_post.id)
self.assertEqual(self.fr_blog_post.locale.language_code, "fr")
# Test the source is in the source tree root (source HomePage)
# Test that the translated alias is in the translated root (fr HomePage)
en_root = Page.objects.filter(depth__gt=1, locale=self.en_locale).first()
fr_root = Page.objects.filter(depth__gt=1, locale=self.fr_locale).first()
self.assertIn(self.en_blog_post, en_root.get_descendants().specific())
self.assertIn(self.fr_blog_post, fr_root.get_descendants().specific())
# Delete the en_blog_post page and make sure the alias page is kept in tact.
response = self.client.post(
reverse(
"wagtailadmin_pages:delete",
args=(self.en_blog_post.id,),
),
follow=True,
)
self.assertEqual(response.status_code, 200)
self.assertFalse(Page.objects.filter(pk=self.en_blog_post.id).exists())
self.assertFalse(Page.objects.filter(pk=self.fr_blog_post.id).exists())
# The source page continues to exist in the source tree root (HomePage)
self.assertNotIn(self.en_blog_post, en_root.get_descendants().specific())
# The alias should no longer be in the translated tree root (fr HomePage)
self.assertNotIn(self.fr_blog_post, fr_root.get_descendants().specific())

View File

@@ -0,0 +1,161 @@
from django.contrib import messages
from django.contrib.admin.utils import unquote
from django.core.exceptions import PermissionDenied
from django.db import transaction
from django.http import Http404
from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse
from django.utils.translation import gettext as _
from django.utils.translation import gettext_lazy
from django.views.generic import TemplateView
from django.views.generic.detail import SingleObjectMixin
from wagtail.actions.copy_for_translation import CopyPageForTranslationAction
from wagtail.models import DraftStateMixin, Page, TranslatableMixin
from wagtail.snippets.views.snippets import get_snippet_model_from_url_params
from .forms import SubmitTranslationForm
class SubmitTranslationView(SingleObjectMixin, TemplateView):
template_name = "simple_translation/admin/submit_translation.html"
title = gettext_lazy("Translate")
def get_title(self):
return self.title
def get_subtitle(self):
return str(self.object)
def get_form(self):
if self.request.method == "POST":
return SubmitTranslationForm(self.object, self.request.POST)
return SubmitTranslationForm(self.object)
def get_success_url(self, translated_object=None):
raise NotImplementedError
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update(
{
"form": self.get_form(),
}
)
return context
def post(self, request, **kwargs): # pragma: no mccabe
form = self.get_form()
if form.is_valid():
include_subtree = form.cleaned_data["include_subtree"]
user = request.user
with transaction.atomic():
for locale in form.cleaned_data["locales"]:
if isinstance(self.object, Page):
action = CopyPageForTranslationAction(
page=self.object,
locale=locale,
include_subtree=include_subtree,
user=user,
)
action.execute(skip_permission_checks=True)
else:
self.object.copy_for_translation(
locale
).save() # pragma: no cover
single_translated_object = None
if len(form.cleaned_data["locales"]) == 1:
locales = form.cleaned_data["locales"][0].get_display_name()
single_translated_object = self.object.get_translation(
form.cleaned_data["locales"][0]
)
else:
# Translators: always plural
locales = _("%(locales_count)s locales") % {
"locales_count": len(form.cleaned_data["locales"])
}
messages.success(self.request, self.get_success_message(locales))
return redirect(self.get_success_url(single_translated_object))
context = self.get_context_data(**kwargs)
return self.render_to_response(context)
def dispatch(self, request, *args, **kwargs):
if not request.user.has_perms(["simple_translation.submit_translation"]):
raise PermissionDenied
self.object = self.get_object()
return super().dispatch(request, *args, **kwargs)
class SubmitPageTranslationView(SubmitTranslationView):
title = gettext_lazy("Translate page")
def get_subtitle(self):
return self.object.get_admin_display_title()
def get_object(self):
page = get_object_or_404(Page, id=self.kwargs["page_id"]).specific
# Can't translate the root page
if page.is_root():
raise Http404
return page
def get_success_url(self, translated_page=None):
if translated_page:
# If the editor chose a single locale to translate to, redirect to
# the newly translated page's edit view.
return reverse("wagtailadmin_pages:edit", args=[translated_page.id])
return reverse("wagtailadmin_explore", args=[self.get_object().get_parent().id])
def get_success_message(self, locales):
return _(
"The page '%(page_title)s' was successfully created in %(locales)s"
) % {"page_title": self.object.get_admin_display_title(), "locales": locales}
class SubmitSnippetTranslationView(SubmitTranslationView):
def get_title(self):
return _("Translate %(model_name)s") % {
"model_name": self.object._meta.verbose_name
}
def get_object(self):
model = get_snippet_model_from_url_params(
self.kwargs["app_label"], self.kwargs["model_name"]
)
if not issubclass(model, TranslatableMixin):
raise Http404
object = get_object_or_404(model, pk=unquote(str(self.kwargs["pk"])))
if isinstance(object, DraftStateMixin):
object = object.get_latest_revision_as_object()
return object
def get_success_url(self, translated_snippet=None):
pk = self.kwargs["pk"]
if translated_snippet:
# If the editor chose a single locale to translate to, redirect to
# the newly translated snippet's edit view.
pk = translated_snippet.pk
return reverse(self.object.snippet_viewset.get_url_name("edit"), args=[pk])
def get_success_message(self, locales):
return _("Successfully created %(locales)s for %(model_name)s '%(object)s'") % {
"model_name": self.object._meta.verbose_name,
"object": str(self.object),
"locales": locales,
}

View File

@@ -0,0 +1,137 @@
from typing import List
from django.conf import settings
from django.contrib.admin.utils import quote
from django.contrib.auth.models import Permission
from django.urls import include, path, reverse
from django.utils.translation import gettext as _
from wagtail import hooks
from wagtail.admin import widgets as wagtailadmin_widgets
from wagtail.models import Locale, Page, TranslatableMixin
from wagtail.snippets.widgets import SnippetListingButton
from .views import SubmitPageTranslationView, SubmitSnippetTranslationView
@hooks.register("register_admin_urls")
def register_admin_urls():
urls = [
path(
"submit/page/<int:page_id>/",
SubmitPageTranslationView.as_view(),
name="submit_page_translation",
),
path(
"submit/snippet/<slug:app_label>/<slug:model_name>/<str:pk>/",
SubmitSnippetTranslationView.as_view(),
name="submit_snippet_translation",
),
]
return [
path(
"translation/",
include(
(urls, "simple_translation"),
namespace="simple_translation",
),
)
]
@hooks.register("register_permissions")
def register_submit_translation_permission():
return Permission.objects.filter(
content_type__app_label="simple_translation", codename="submit_translation"
)
@hooks.register("register_page_listing_more_buttons")
def page_listing_more_buttons(page, user, next_url=None):
if user.has_perm("simple_translation.submit_translation") and not page.is_root():
# If there's at least one locale that we haven't translated into yet,
# show "Translate this page" button
has_locale_to_translate_to = Locale.objects.exclude(
id__in=page.get_translations(inclusive=True).values_list(
"locale_id", flat=True
)
).exists()
if has_locale_to_translate_to:
url = reverse("simple_translation:submit_page_translation", args=[page.id])
yield wagtailadmin_widgets.Button(_("Translate"), url, priority=60)
@hooks.register("register_page_header_buttons")
def page_header_buttons(page, user, view_name, next_url=None):
if not page.is_root() and user.has_perm("simple_translation.submit_translation"):
# If there's at least one locale that we haven't translated into yet,
# show "Translate this page" button
has_locale_to_translate_to = Locale.objects.exclude(
id__in=page.get_translations(inclusive=True).values_list(
"locale_id", flat=True
)
).exists()
if has_locale_to_translate_to:
url = reverse("simple_translation:submit_page_translation", args=[page.id])
yield wagtailadmin_widgets.Button(
_("Translate"),
url,
icon_name="globe",
attrs={
"title": _("Translate this page")
% {"title": page.get_admin_display_title()}
},
priority=80,
)
@hooks.register("register_snippet_listing_buttons")
def register_snippet_listing_buttons(snippet, user, next_url=None):
model = type(snippet)
if issubclass(model, TranslatableMixin) and user.has_perm(
"simple_translation.submit_translation"
):
# If there's at least one locale that we haven't translated into yet, show "Translate" button
has_locale_to_translate_to = Locale.objects.exclude(
id__in=snippet.get_translations(inclusive=True).values_list(
"locale_id", flat=True
)
).exists()
if has_locale_to_translate_to:
url = reverse(
"simple_translation:submit_snippet_translation",
args=[model._meta.app_label, model._meta.model_name, quote(snippet.pk)],
)
yield SnippetListingButton(
_("Translate"),
url,
attrs={
"aria-label": _("Translate '%(title)s'") % {"title": str(snippet)}
},
priority=100,
)
@hooks.register("construct_translated_pages_to_cascade_actions")
def construct_translated_pages_to_cascade_actions(pages: List[Page], action: str):
if not getattr(settings, "WAGTAILSIMPLETRANSLATION_SYNC_PAGE_TREE", False):
return
page_list = {}
if action == "unpublish":
# Only return non-alias translations of the page
for page in pages:
page_list[page] = Page.objects.translation_of(page, inclusive=False).filter(
alias_of__isnull=True
)
elif action == "move" or action == "delete":
# Return all translations or aliases in other trees
for page in pages:
page_list[page] = Page.objects.translation_of(page, inclusive=False)
return page_list