ページ翻訳を作成するためのプログラム インターフェイスが見つかりません。すべてのロジックは 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
セットアップ スクリプトは次のことを行います:-
これは、ページ構造が次のような新しいサイトを設定するまではすべてうまく機能します:-
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 回目の呼び出しでロケールが空になった理由である可能性があります。しかし、このページはまだ翻訳されていません!
プロセスを思い出してみましょう:-
そして、何時間ものデバッグを経て、ここで電球 (?) が登場しました。元のスクリプトでは、まず HomePage を ja に変換し、次に BlogIndexPage とそのすべての子を変換します。ただし、この新しいスクリプトでは、ルート ページは BlogIndexPage です。したがって、translate_page!
を 2 回目に呼び出したときに、BlogIndexPage はすでに翻訳されています。それが、ロケールの選択肢が空になる理由です。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3