Não consigo encontrar nenhuma interface programática para criar tradução de páginas. Toda a lógica parece estar sendo implementada em SubmitTranslationView em wagtail.contrib.simple_translation.views.
Portanto, a única maneira de acessá-los programaticamente é simulando a solicitação de acesso às visualizações. Envolvi isso em uma função chamada translate_page(). Para traduzir uma página, podemos chamar esta função como:-
page_ja = translate_page(user, page, "ja")
Ou podemos passar o parâmetro opcional include_subtree:-
page_ja = translate_page(user, page, "ja", include_subtree=True)
E a função é definida como:-
def translate_page(user, page, lang, include_subtree=False): locale, created = Locale.objects.get_or_create(language_code=lang) data = {"locales": [locale.id], "include_subtree": include_subtree} url = reverse( "simple_translation:submit_page_translation", kwargs={"page_id": page.id} ) factory = RequestFactory() request = factory.post(url) request.POST = data request.user = user get_response = lambda request: None middleware = SessionMiddleware(get_response) middleware.process_request(request) request.session.save() messages = FallbackStorage(request) setattr(request, "_messages", messages) SubmitPageTranslationView.model = type(page) SubmitPageTranslationView.as_view()(request, page_id=page.pk) page_translated = page.get_translations()[0].specific return page_translated
Eu tenho outra função chamada translate_snippet(). A única diferença é apenas o URL a ser enviado e nenhum parâmetro include_subtree.
Para todos os nossos sites, temos um script de configuração que preencherá automaticamente algumas postagens e sua tradução para que o desenvolvedor possa começar a trabalhar imediatamente, em vez de ter que criar páginas de amostra manualmente.
Nossa estrutura de página é assim:-
HomePage ==> BlogIndexPage ==> BlogPage
E o script de configuração fará o seguinte:-
Tudo isso funciona bem até definirmos um novo site onde a estrutura da página é:-
BlogIndexPage ==> BlogPage
Então omitimos a HomePage (que acho uma má ideia agora, mas vamos guardá-la para outro tópico) já que este site é principalmente um blog. A primeira coisa que noto depois de executar o script de configuração é que nenhuma tradução das postagens do blog foi criada, apesar de já termos passado include_subtree ao traduzir BlogIndexPage.
Minha primeira reação instintiva foi que poderia haver algumas mudanças nas novas versões da alvéola. A maioria dos nossos sites foi criada há alguns anos e ainda está no wagtail 5, mas para este novo site, começaremos com o wagtail 6, pois é o mais recente.
Mas olhando os logs de commit do wagtail para simple_translation views.py, as últimas alterações no código foram há três anos. E podemos ver o código basicamente o mesmo entre a alvéola 5 e 6.
O problema com a função translate_page acima é que ela não verifica se há erros. Porque capturar erros significa que você precisa analisar a resposta da solicitação em busca de alguma string de erro. Mas rastrear o fluxo do código me leva a um estágio em que posso ver que o código não foi executado porque o formulário não foi validado.
A impressão de form.errors mostrou mensagens de erro relacionadas à localidade inválida. Isso é estranho porque podemos ver na função translate_page acima que estamos criando o locale se ele ainda não existir.
E imprimindo o self.fields["locales"].choices do formulário, o local está lá na escolha durante a primeira chamada de translate_page() ao traduzir a página raiz, mas as opções estavam vazias ao chamá-lo pela segunda vez para traduzir BlogIndexPage.
Lendo o código do formulário, as escolhas do campo locales são definidas dinamicamente no método __init__, onde será removido o locale da página que já foi traduzida. Esse pode ser o motivo pelo qual o código do idioma estava vazio na segunda chamada. Mas a página ainda não foi traduzida!
Vamos relembrar o processo:-
E foi aí que a lâmpada (?) entrou, depois de horas de depuração. No script original, estamos traduzindo HomePage para ja primeiro e depois para BlogIndexPage com todos os seus filhos. Mas neste novo script, a página raiz é BlogIndexPage. Então BlogIndexPage já foi traduzido pela segunda vez que chamamos de translate_page!
Então é por isso que as opções de localidade ficam vazias.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3