ページ翻訳を作成するためのプログラム インターフェイスが見つかりません。すべてのロジックは 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 のコミット ログを見ると、コードが最後に変更されたのは 3 年前です。そして、セキレイ 5 と 6 のコードは基本的に同じであることがわかります。
上記のtranslate_page関数の問題は、エラーがチェックされないことです。エラーをキャッチするには、リクエストの応答を解析してエラー文字列を取得する必要があるためです。しかし、コード フローを追跡すると、フォームが検証されていないためにコードが実行されていないことがわかります。
form.errors を印刷すると、無効なロケールに関連するエラー メッセージが表示されました。これは奇妙です。なぜなら、上記のtranslate_page関数では、ロケールがまだ存在しない場合にロケールを作成していることがわかるからです。
そして、フォームの self.fields["locales"].choices を出力すると、ルートページを翻訳するときに、translate_page() を最初に呼び出したときの選択肢にロケールが含まれていますが、2 回目に呼び出したとき、選択肢は空でした。 BlogIndexPage を翻訳します。
フォームのコードを読み取ると、ロケール フィールドの選択肢が __init__ メソッドで動的に設定され、すでに翻訳されたページのロケールが削除されます。これが、2 回目の呼び出しでロケールが空になった理由である可能性があります。ただし、ページはまだ翻訳されていません!
プロセスを思い出してみましょう:-
そして、ここで何時間ものデバッグを経て、電球 (?) が登場しました。元のスクリプトでは、まず HomePage を ja に変換し、次に BlogIndexPage とそのすべての子を変換します。ただし、この新しいスクリプトでは、ルート ページは BlogIndexPage です。したがって、translate_page を 2 回目に呼び出したときに、BlogIndexPage はすでに翻訳されています!
ロケールの選択肢が空になるのはこれが理由です。
以上がセキレイはプログラムでページ翻訳を作成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。