ホームページ >バックエンド開発 >Python チュートリアル >セキレイはプログラムでページ翻訳を作成します

セキレイはプログラムでページ翻訳を作成します

Linda Hamilton
Linda Hamiltonオリジナル
2024-09-30 12:15:02533ブラウズ

Wagtail programmatically create page translation

ページ翻訳を作成するためのプログラム インターフェイスが見つかりません。すべてのロジックは wagtail.contrib.simple_translation.views.

の SubmitTranslationView に実装されているようです。

したがって、これらにプログラム的にアクセスする唯一の方法は、ビューにアクセスするリクエストをシミュレートすることです。これをtranslate_page()という関数でラップしました。ページを翻訳するには、この関数を次のように呼び出すことができます:-

page_ja = translate_page(user, page, "ja")

または、オプションのパラメータ include_subtree:-
を渡すこともできます。

page_ja = translate_page(user, page, "ja", include_subtree=True)

関数は次のように定義されます:-

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

translate_snippet() という別の関数があります。唯一の違いは、送信する URL だけであり、include_subtree パラメーターがないことです。

ページツリーの注意点

当社のすべてのサイトには、一部の投稿とその翻訳を自動的に入力するセットアップ スクリプトが用意されているため、開発者はサンプル ページを手動で作成することなく、すぐに作業を開始できます。

私たちのページ構造は次のようなものです:-

HomePage ==> BlogIndexPage ==> BlogPage

セットアップ スクリプトは次のことを行います:-

  • ルート管理者ユーザーを作成します。これをユーザー 1 と呼びます。
  • HomePage のインスタンスを作成します
  • HomePage を新しいルート ページとして添付します
  • HomePageの日本語翻訳を作成
  • BlogIndexPage のインスタンスを作成します
  • ブログページにサンプル投稿を入力し、BlogIndexPage の下に添付します
  • include_subtree=True を使用して BlogIndexPage を翻訳する

これは、ページ構造が次のような新しいサイトを設定するまではすべてうまく機能します。-

BlogIndexPage ==> BlogPage

このサイトは主にブログであるため、HomePage (これは悪い考えだと思いますが、別のトピックにとっておきます) を省略しました。セットアップ スクリプトを実行した後に最初に気づくのは、BlogIndexPage を翻訳するときに include_subtree をすでに渡しているにもかかわらず、作成されたブログ投稿が翻訳されていないことです。

私の最初の直感的な反応は、セキレイの新しいバージョンでは何らかの変更が加えられているのではないかというものでした。私たちのサイトのほとんどは数年前に作成されており、まだセキレイ 5 を使用していますが、この新しいサイトでは、最新であるためセキレイ 6 から始めます。

しかし、セキレイの simple_translation views.py のコミット ログを見ると、コードが最後に変更されたのは 3 年前です。そして、セキレイ 5 と 6 のコードは基本的に同じであることがわかります。

上記のtranslate_page関数の問題は、エラーがチェックされないことです。エラーをキャッチするには、リクエストの応答を解析してエラー文字列を取得する必要があるためです。しかし、コード フローを追跡すると、フォームが検証されていないためにコードが実行されていないことがわかります。

form.errors を印刷すると、無効なロケールに関連するエラー メッセージが表示されました。これは奇妙です。なぜなら、上記のtranslate_page関数では、ロケールがまだ存在しない場合にロケールを作成していることがわかるからです。

そして、フォームの self.fields["locales"].choices を出力すると、ルートページを翻訳するときに、translate_page() を最初に呼び出したときの選択肢にロケールが含まれていますが、2 回目に呼び出したとき、選択肢は空でした。 BlogIndexPage を翻訳します。

フォームのコードを読み取ると、ロケール フィールドの選択肢が __init__ メソッドで動的に設定され、すでに翻訳されたページのロケールが削除されます。これが、2 回目の呼び出しでロケールが空になった理由である可能性があります。ただし、ページはまだ翻訳されていません!

プロセスを思い出してみましょう:-

  • BlogIndexPage を作成
  • BlogIndexPage をルート ページに添付します
  • ルートページをjaに翻訳します
  • BlogPage にデータを入力し、BlogIndexPage に添付します
  • BlogIndexPage を日本語に翻訳します

そして、ここで何時間ものデバッグを経て、電球 (?) が登場しました。元のスクリプトでは、まず HomePage を ja に変換し、次に BlogIndexPage とそのすべての子を変換します。ただし、この新しいスクリプトでは、ルート ページは BlogIndexPage です。したがって、translate_page を 2 回目に呼び出したときに、BlogIndexPage はすでに翻訳されています!

ロケールの選択肢が空になるのはこれが理由です。

以上がセキレイはプログラムでページ翻訳を作成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。