「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > セキレイはプログラムでページ翻訳を作成します

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

2024 年 11 月 8 日に公開
ブラウズ:761

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

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

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

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

BlogIndexPage ==> BlogPage

このサイトは主にブログであるため、HomePage は省略しました (これは悪い考えだと思いますが、別のトピックに取っておきます)。セットアップ スクリプトを実行した後に最初に気づくのは、BlogIndexPage.

を翻訳するときに include_subtree をすでに渡しているにもかかわらず、作成されたブログ投稿が翻訳されていないことです。

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

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

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

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

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

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

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

  • ブログインデックスページを作成
  • BlogIndexPage をルート ページに添付します
  • ルートページをjaに翻訳
  • BlogPage を作成し、BlogIndexPage に添付します
  • BlogIndexPage を日本語に翻訳

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

を 2 回目に呼び出したときに、BlogIndexPage はすでに翻訳されています。

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

リリースステートメント この記事は次の場所に転載されています: https://dev.to/k4ml/wagtail-programmatically-create-page-translation-2814?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3