」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Wagtail 以程式設計方式建立頁面翻譯

Wagtail 以程式設計方式建立頁面翻譯

發佈於2024-11-08
瀏覽:578

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

安裝腳本將執行以下操作:-

  • 建立root管理員用戶,我們稱之為用戶一。
  • 建立主頁實例
  • 附加主頁作為新的根頁
  • 創建主頁的日文翻譯
  • 建立 BlogIndexPage 的實例
  • 使用範例貼文填入 BlogPage 並將其附加到 BlogIndexPage
  • 使用 include_subtree=True 翻譯 BlogIndexPage

這一切都運作良好,直到我們設定頁面結構為的新網站:-

BlogIndexPage ==> BlogPage

所以我們省略了主頁(現在我認為這是一個壞主意,但讓我們將其保存到另一個主題),因為這個網站主要是一個博客。運行設定腳本後我注意到的第一件事是沒有創建部落格文章的翻譯,儘管我們在翻譯 BlogIndexPage 時已經傳遞了 include_subtree。

我的第一個直覺反應是新的鶺鴒版本可能會發生一些變化。我們的大多數網站都是幾年前創建的,仍然使用 wagtail 5,但對於這個新網站,我們將從 wagtail 6 開始,因為它是最新的。

但查看 wagtail 的 simple_translation views.py 提交日誌,程式碼最後一次變更是在三年前。我們可以看到wagtail 5和6的程式碼基本上相同。

上面的translate_page函數的問題是它不檢查任何錯誤。因為捕獲錯誤意味著您必須解析請求的回應以取得某些錯誤字串。但是追蹤程式碼流將我帶到一個階段,我可以看到程式碼沒有執行,因為表單沒有經過驗證。

列印 form.errors 顯示與無效區域設定相關的錯誤訊息。這很奇怪,因為我們可以在上面的 translate_page 函數中看到我們正在建立語言環境(如果它尚不存在)。

並列印表單的 self.fields["locales"].choices 我可以在翻譯根頁面時第一次調用 translate_page() 時選擇區域設置,但第二次調用時選擇為空翻譯 BlogIndexPage。

閱讀表單的程式碼,區域設定欄位的選擇是在 __init__ 方法中動態設定的,其中已翻譯的頁面的區域設定將被刪除。這可能是第二次呼叫中區域設定為空的原因。但頁面還沒翻譯!

讓我們回顧一下過程:-

  • 建立部落格索引頁面
  • 將 BlogIndexPage 附加到根頁面
  • 將根頁翻譯為ja
  • 填入 BlogPage 並將其附加到 BlogIndexPage
  • 將 BlogIndexPage 翻譯為 ja

經過幾個小時的調試,這就是燈泡(?)出現的地方。在原始腳本中,我們首先將 HomePage 轉換為 ja,然後將 BlogIndexPage 及其所有子項轉換為 ja。但在這個新腳本中,根頁面是 BlogIndexPage。因此,BlogIndexPage 在我們第二次呼叫 translate_page 時已經翻譯了!

這就是區域設定選擇變成空的原因。

版本聲明 本文轉載於:https://dev.to/k4ml/wagtail-programmatically-create-page-translation-2814?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何使用 Python 檢索 Github 儲存庫數據
    如何使用 Python 檢索 Github 儲存庫數據
    您的組織是否擁有太多github 儲存庫,並且您需要一種簡單的方法來總結和記錄每個儲存庫的內容以用於報告、儀表板或審計目的?下面是一個使用 Github API 完成該操作的快速腳本。 功能: get_repo_info(所有者,回購): 取得 GitHub 儲存庫擁有者的使用者名...
    程式設計 發佈於2024-11-08
  • 使用 useState 的狀態更新方法
    使用 useState 的狀態更新方法
    React 是用於開發動態和互動式使用者介面的最受歡迎的 JavaScript 程式庫之一。在開發應用程式時,狀態管理對於效能和使用者體驗至關重要。在這種情況下,useState 掛鉤是管理元件狀態的最常見方法之一。在本文中,我們將深入研究 useState. 的狀態更新方法 狀態更...
    程式設計 發佈於2024-11-08
  • 考慮到 libcurl 的可用性,何時適合在 PHP 中啟用「allow_url_fopen」?
    考慮到 libcurl 的可用性,何時適合在 PHP 中啟用「allow_url_fopen」?
    在 PHP 中允許「allow_url_fopen」:平衡行為開發人員經常要求在 PHP 中啟動「allow_url_fopen」。在本文中,我們將檢查目前的行業規格並評估允許此功能是否仍然謹慎,特別是在 libcurl 可用的情況下。 當前行業規範對於大多數 Web 應用程序,啟用“allow_u...
    程式設計 發佈於2024-11-08
  • 何時在 jQuery.parseJSON 中使用單引號和雙引號?
    何時在 jQuery.parseJSON 中使用單引號和雙引號?
    jQuery.parseJSON 中的單引號與雙引號使用jQuery 的parseJSON 方法時,使用者可能會遇到行為差異,具體取決於是單引號還是雙引號雙引號用於將JSON 字串括起來。在本文中,我們將探討這些差異。 雙引號:標準方法根據 JSON 標準,雙引號被認為是括起的首選方法JSON 字串...
    程式設計 發佈於2024-11-08
  • 如何處理多處理 Python 應用程式中的日誌記錄?
    如何處理多處理 Python 應用程式中的日誌記錄?
    Python 中的多處理日誌記錄使用Python 的多處理模組時,重要的是要考慮日誌記錄實踐,以避免因多個進程寫入而導致錯誤同時處理相同的檔案句柄。預設情況下,mp.get_logger() 提供的多處理感知記錄器可確保 sys.stderr 中正確的鎖定機制。 但是,不支援多處理感知的模組可能需要...
    程式設計 發佈於2024-11-08
  • 答:我如何運行特定的phinx seeder並在phpunit中取得產生的記錄?
    答:我如何運行特定的phinx seeder並在phpunit中取得產生的記錄?
    這個答案解決了我遇到的一個問題:在 phpunit 上運行 Phinx 播種者: 回答回覆:我如何運行特定的phinx seeder並在phpunit中取得產生的記錄? ...
    程式設計 發佈於2024-11-08
  • 如何以程式設計方式為 LinearLayout 中的按鈕新增邊距?
    如何以程式設計方式為 LinearLayout 中的按鈕新增邊距?
    LinearLayout 中的動態邊距LinearLayout 中的動態邊距在Android 開發中,佈局在組織和顯示使用者介面元素方面發揮著至關重要的作用。佈局的一個常見要求是能夠指定元素之間的邊距。雖然 XML 提供了一種直觀的方式來定義邊距,但開發人員可能需要以程式設計方式建立佈局以確保靈活性...
    程式設計 發佈於2024-11-08
  • 如何使用 PowerMock 和 Mockito 有效模擬私有方法?
    如何使用 PowerMock 和 Mockito 有效模擬私有方法?
    使用PowerMock 模擬私有方法的替代解決方案儘管最初提出的使用PowerMock 的解決方案遇到了困難,但事實證明,另一種方法是成功的。使用 Mockito 和 PowerMock 的組合,可以有效地模擬私有方法。 如提供的程式碼片段所示,類別 CodeWithPrivateMethod 擁有...
    程式設計 發佈於2024-11-08
  • 如何在 PHP 中將列式資料結構轉換為基於行的格式?
    如何在 PHP 中將列式資料結構轉換為基於行的格式?
    將多維列式資料重新排序為基於行的結構給定一個具有面向列資料的關聯數組,任務是將其轉置為由行組成的多維數組。原始數組中的資料按列排列,目標是將同一列的值合併到行中。 原始陣列:$where = [ 'id' => [ 12, 13, 14 ...
    程式設計 發佈於2024-11-08
  • Next.JS 或 Nuxt.JS 哪個最好
    Next.JS 或 Nuxt.JS 哪個最好
    The ability to build scalable and seamless web applications quickly is the dream of every web developer. As a result, the importance of frameworks in ...
    程式設計 發佈於2024-11-08
  • 了解 RESTful API 和 Web 服務:主要差異和用例
    了解 RESTful API 和 Web 服務:主要差異和用例
    在現代軟體開發領域,RESTful API 和 Web 服務都是實現不同系統之間無縫通訊的基礎。雖然這些術語經常互換使用,但它們代表具有獨特特徵和用例的不同概念。對於旨在建立高效、可互通且可擴展的應用程式的開發人員來說,掌握 RESTful API 和 Web 服務 之間的差異至關重要。在本節中,我...
    程式設計 發佈於2024-11-08
  • React 應用程式的基本設計模式:升級您的組件遊戲
    React 應用程式的基本設計模式:升級您的組件遊戲
    如果您已经进入 React 世界一段时间,您可能听说过“这只是 JavaScript”这句话。虽然这是事实,但这并不意味着我们不能从一些经过验证的模式中受益,使我们的 React 应用程序更易于维护、可重用并且使用起来更加愉快。让我们深入研究一些基本的设计模式,这些模式可以让你的 React 组件从...
    程式設計 發佈於2024-11-08
  • 使用 PHP 建立 API 和 Web 服務
    使用 PHP 建立 API 和 Web 服務
    使用 PHP 建立 API 和 Web 服務涉及以下步驟:建立 PHP 環境,安裝 PHP、Apache 伺服器和 mod_php 模組。建立 API,編寫 PHP 腳本處理請求並回傳回應。建立 Web 服務,使用 PHP 框架或純 PHP 來建立伺服器。實戰案例:建立用戶註冊 API,處理 POS...
    程式設計 發佈於2024-11-08
  • Restful 路由 - Flask API 範例
    Restful 路由 - Flask API 範例
    Restful 路由致力於使所有不同應用程式的路由保持一致。 REST 是表述性狀態轉移。它以一致的、人類可讀的、機器可讀的方式使用 HTTP。 標準是 GET、POST、PATCH、PUT 和 DELETE。 下面將給出 Flask API 資料庫中的幾個靜態路由的範例,用於從前端獲取/向前端...
    程式設計 發佈於2024-11-08
  • ## 如何在沒有反向引用的情況下匹配 Go 正規表示式中的重複字元?
    ## 如何在沒有反向引用的情況下匹配 Go 正規表示式中的重複字元?
    在Go 的正規表示式中符合重複字元在Go 的正規表示式中,符合重複字元可能是一個挑戰,因為不支援反向引用。這可能會令人沮喪,特別是當您需要執行複雜的模式匹配任務時。 要解決此限制,有兩種可能的解決方案:使用替代正則表達式庫:一種選擇是使用支援反向引用的第三方正規表示式庫。一個流行的選擇是“glenn...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3